diff --git a/drizzle/0013_clever_monster_badoon.sql b/drizzle/0013_clever_monster_badoon.sql new file mode 100644 index 0000000..334a5e4 --- /dev/null +++ b/drizzle/0013_clever_monster_badoon.sql @@ -0,0 +1,3 @@ +ALTER TABLE "categories" DROP COLUMN IF EXISTS "external_id";--> statement-breakpoint +ALTER TABLE "mechanics" DROP COLUMN IF EXISTS "external_id";--> statement-breakpoint +ALTER TABLE "publishers" DROP COLUMN IF EXISTS "external_id"; \ No newline at end of file diff --git a/drizzle/0014_organic_morlocks.sql b/drizzle/0014_organic_morlocks.sql new file mode 100644 index 0000000..c0b6604 --- /dev/null +++ b/drizzle/0014_organic_morlocks.sql @@ -0,0 +1 @@ +DROP TABLE "expansions_to_external_ids"; \ No newline at end of file diff --git a/drizzle/meta/0013_snapshot.json b/drizzle/meta/0013_snapshot.json new file mode 100644 index 0000000..6f8cea3 --- /dev/null +++ b/drizzle/meta/0013_snapshot.json @@ -0,0 +1,1328 @@ +{ + "id": "453ae1fd-7b1f-4256-8323-cdb2da05902a", + "prevId": "58f18282-0b26-4fee-a68d-08867b5729df", + "version": "5", + "dialect": "pg", + "tables": { + "categories": { + "name": "categories", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "categories_to_external_ids": { + "name": "categories_to_external_ids", + "schema": "", + "columns": { + "category_id": { + "name": "category_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "categories_to_external_ids_category_id_categories_id_fk": { + "name": "categories_to_external_ids_category_id_categories_id_fk", + "tableFrom": "categories_to_external_ids", + "tableTo": "categories", + "columnsFrom": [ + "category_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "categories_to_external_ids_external_id_external_ids_id_fk": { + "name": "categories_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "categories_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "categories_to_external_ids_category_id_external_id_pk": { + "name": "categories_to_external_ids_category_id_external_id_pk", + "columns": [ + "category_id", + "external_id" + ] + } + }, + "uniqueConstraints": {} + }, + "categories_to_games": { + "name": "categories_to_games", + "schema": "", + "columns": { + "category_id": { + "name": "category_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "categories_to_games_category_id_categories_id_fk": { + "name": "categories_to_games_category_id_categories_id_fk", + "tableFrom": "categories_to_games", + "tableTo": "categories", + "columnsFrom": [ + "category_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "categories_to_games_game_id_games_id_fk": { + "name": "categories_to_games_game_id_games_id_fk", + "tableFrom": "categories_to_games", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "categories_to_games_category_id_game_id_pk": { + "name": "categories_to_games_category_id_game_id_pk", + "columns": [ + "category_id", + "game_id" + ] + } + }, + "uniqueConstraints": {} + }, + "collection_items": { + "name": "collection_items", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "collection_id": { + "name": "collection_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "times_played": { + "name": "times_played", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "collection_items_collection_id_collections_id_fk": { + "name": "collection_items_collection_id_collections_id_fk", + "tableFrom": "collection_items", + "tableTo": "collections", + "columnsFrom": [ + "collection_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "collection_items_game_id_games_id_fk": { + "name": "collection_items_game_id_games_id_fk", + "tableFrom": "collection_items", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "collections": { + "name": "collections", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "collections_user_id_users_id_fk": { + "name": "collections_user_id_users_id_fk", + "tableFrom": "collections", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "expansions": { + "name": "expansions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "base_game_id": { + "name": "base_game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "expansions_base_game_id_games_id_fk": { + "name": "expansions_base_game_id_games_id_fk", + "tableFrom": "expansions", + "tableTo": "games", + "columnsFrom": [ + "base_game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "expansions_game_id_games_id_fk": { + "name": "expansions_game_id_games_id_fk", + "tableFrom": "expansions", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "expansions_to_external_ids": { + "name": "expansions_to_external_ids", + "schema": "", + "columns": { + "expansion_id": { + "name": "expansion_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "expansions_to_external_ids_expansion_id_expansions_id_fk": { + "name": "expansions_to_external_ids_expansion_id_expansions_id_fk", + "tableFrom": "expansions_to_external_ids", + "tableTo": "expansions", + "columnsFrom": [ + "expansion_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "expansions_to_external_ids_external_id_external_ids_id_fk": { + "name": "expansions_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "expansions_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "expansions_to_external_ids_expansion_id_external_id_pk": { + "name": "expansions_to_external_ids_expansion_id_external_id_pk", + "columns": [ + "expansion_id", + "external_id" + ] + } + }, + "uniqueConstraints": {} + }, + "external_ids": { + "name": "external_ids", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "external_id_type", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "games": { + "name": "games", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "year_published": { + "name": "year_published", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_players": { + "name": "min_players", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "max_players": { + "name": "max_players", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "playtime": { + "name": "playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_playtime": { + "name": "min_playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "max_playtime": { + "name": "max_playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_age": { + "name": "min_age", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "image_url": { + "name": "image_url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "thumb_url": { + "name": "thumb_url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "url": { + "name": "url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "text_searchable_index": { + "name": "text_searchable_index", + "type": "tsvector", + "primaryKey": false, + "notNull": false + }, + "last_sync_at": { + "name": "last_sync_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": { + "text_searchable_idx": { + "name": "text_searchable_idx", + "columns": [ + "text_searchable_index" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "games_to_external_ids": { + "name": "games_to_external_ids", + "schema": "", + "columns": { + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "games_to_external_ids_game_id_games_id_fk": { + "name": "games_to_external_ids_game_id_games_id_fk", + "tableFrom": "games_to_external_ids", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "games_to_external_ids_external_id_external_ids_id_fk": { + "name": "games_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "games_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "games_to_external_ids_game_id_external_id_pk": { + "name": "games_to_external_ids_game_id_external_id_pk", + "columns": [ + "game_id", + "external_id" + ] + } + }, + "uniqueConstraints": {} + }, + "mechanics": { + "name": "mechanics", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "mechanics_to_external_ids": { + "name": "mechanics_to_external_ids", + "schema": "", + "columns": { + "mechanic_id": { + "name": "mechanic_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "mechanics_to_external_ids_mechanic_id_mechanics_id_fk": { + "name": "mechanics_to_external_ids_mechanic_id_mechanics_id_fk", + "tableFrom": "mechanics_to_external_ids", + "tableTo": "mechanics", + "columnsFrom": [ + "mechanic_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "mechanics_to_external_ids_external_id_external_ids_id_fk": { + "name": "mechanics_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "mechanics_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "mechanics_to_external_ids_mechanic_id_external_id_pk": { + "name": "mechanics_to_external_ids_mechanic_id_external_id_pk", + "columns": [ + "mechanic_id", + "external_id" + ] + } + }, + "uniqueConstraints": {} + }, + "mechanics_to_games": { + "name": "mechanics_to_games", + "schema": "", + "columns": { + "mechanic_id": { + "name": "mechanic_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "mechanics_to_games_mechanic_id_mechanics_id_fk": { + "name": "mechanics_to_games_mechanic_id_mechanics_id_fk", + "tableFrom": "mechanics_to_games", + "tableTo": "mechanics", + "columnsFrom": [ + "mechanic_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "mechanics_to_games_game_id_games_id_fk": { + "name": "mechanics_to_games_game_id_games_id_fk", + "tableFrom": "mechanics_to_games", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "mechanics_to_games_mechanic_id_game_id_pk": { + "name": "mechanics_to_games_mechanic_id_game_id_pk", + "columns": [ + "mechanic_id", + "game_id" + ] + } + }, + "uniqueConstraints": {} + }, + "publishers": { + "name": "publishers", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "publishers_to_external_ids": { + "name": "publishers_to_external_ids", + "schema": "", + "columns": { + "publisher_id": { + "name": "publisher_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "publishers_to_external_ids_publisher_id_publishers_id_fk": { + "name": "publishers_to_external_ids_publisher_id_publishers_id_fk", + "tableFrom": "publishers_to_external_ids", + "tableTo": "publishers", + "columnsFrom": [ + "publisher_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "publishers_to_external_ids_external_id_external_ids_id_fk": { + "name": "publishers_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "publishers_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "publishers_to_external_ids_publisher_id_external_id_pk": { + "name": "publishers_to_external_ids_publisher_id_external_id_pk", + "columns": [ + "publisher_id", + "external_id" + ] + } + }, + "uniqueConstraints": {} + }, + "publishers_to_games": { + "name": "publishers_to_games", + "schema": "", + "columns": { + "publisher_id": { + "name": "publisher_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "publishers_to_games_publisher_id_publishers_id_fk": { + "name": "publishers_to_games_publisher_id_publishers_id_fk", + "tableFrom": "publishers_to_games", + "tableTo": "publishers", + "columnsFrom": [ + "publisher_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "publishers_to_games_game_id_games_id_fk": { + "name": "publishers_to_games_game_id_games_id_fk", + "tableFrom": "publishers_to_games", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "publishers_to_games_publisher_id_game_id_pk": { + "name": "publishers_to_games_publisher_id_game_id_pk", + "columns": [ + "publisher_id", + "game_id" + ] + } + }, + "uniqueConstraints": {} + }, + "roles": { + "name": "roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "roles_name_unique": { + "name": "roles_name_unique", + "nullsNotDistinct": false, + "columns": [ + "name" + ] + } + } + }, + "sessions": { + "name": "sessions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "ip_country": { + "name": "ip_country", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "ip_address": { + "name": "ip_address", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "sessions_user_id_users_id_fk": { + "name": "sessions_user_id_users_id_fk", + "tableFrom": "sessions", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "user_roles": { + "name": "user_roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "role_id": { + "name": "role_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "user_roles_user_id_users_id_fk": { + "name": "user_roles_user_id_users_id_fk", + "tableFrom": "user_roles", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_roles_role_id_roles_id_fk": { + "name": "user_roles_role_id_roles_id_fk", + "tableFrom": "user_roles", + "tableTo": "roles", + "columnsFrom": [ + "role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "username": { + "name": "username", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "hashed_password": { + "name": "hashed_password", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "first_name": { + "name": "first_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "last_name": { + "name": "last_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "verified": { + "name": "verified", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "receive_email": { + "name": "receive_email", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "theme": { + "name": "theme", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "default": "'system'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_username_unique": { + "name": "users_username_unique", + "nullsNotDistinct": false, + "columns": [ + "username" + ] + }, + "users_email_unique": { + "name": "users_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + } + }, + "wishlist_items": { + "name": "wishlist_items", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "wishlist_id": { + "name": "wishlist_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "wishlist_items_wishlist_id_wishlists_id_fk": { + "name": "wishlist_items_wishlist_id_wishlists_id_fk", + "tableFrom": "wishlist_items", + "tableTo": "wishlists", + "columnsFrom": [ + "wishlist_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "wishlist_items_game_id_games_id_fk": { + "name": "wishlist_items_game_id_games_id_fk", + "tableFrom": "wishlist_items", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "wishlists": { + "name": "wishlists", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "wishlists_user_id_users_id_fk": { + "name": "wishlists_user_id_users_id_fk", + "tableFrom": "wishlists", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": { + "external_id_type": { + "name": "external_id_type", + "values": { + "game": "game", + "category": "category", + "mechanic": "mechanic", + "publisher": "publisher", + "designer": "designer", + "artist": "artist" + } + } + }, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/0014_snapshot.json b/drizzle/meta/0014_snapshot.json new file mode 100644 index 0000000..8d11ec3 --- /dev/null +++ b/drizzle/meta/0014_snapshot.json @@ -0,0 +1,1271 @@ +{ + "id": "2743a62f-6523-44af-8c31-b69fe40c749f", + "prevId": "453ae1fd-7b1f-4256-8323-cdb2da05902a", + "version": "5", + "dialect": "pg", + "tables": { + "categories": { + "name": "categories", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "categories_to_external_ids": { + "name": "categories_to_external_ids", + "schema": "", + "columns": { + "category_id": { + "name": "category_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "categories_to_external_ids_category_id_categories_id_fk": { + "name": "categories_to_external_ids_category_id_categories_id_fk", + "tableFrom": "categories_to_external_ids", + "tableTo": "categories", + "columnsFrom": [ + "category_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "categories_to_external_ids_external_id_external_ids_id_fk": { + "name": "categories_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "categories_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "categories_to_external_ids_category_id_external_id_pk": { + "name": "categories_to_external_ids_category_id_external_id_pk", + "columns": [ + "category_id", + "external_id" + ] + } + }, + "uniqueConstraints": {} + }, + "categories_to_games": { + "name": "categories_to_games", + "schema": "", + "columns": { + "category_id": { + "name": "category_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "categories_to_games_category_id_categories_id_fk": { + "name": "categories_to_games_category_id_categories_id_fk", + "tableFrom": "categories_to_games", + "tableTo": "categories", + "columnsFrom": [ + "category_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "categories_to_games_game_id_games_id_fk": { + "name": "categories_to_games_game_id_games_id_fk", + "tableFrom": "categories_to_games", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "categories_to_games_category_id_game_id_pk": { + "name": "categories_to_games_category_id_game_id_pk", + "columns": [ + "category_id", + "game_id" + ] + } + }, + "uniqueConstraints": {} + }, + "collection_items": { + "name": "collection_items", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "collection_id": { + "name": "collection_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "times_played": { + "name": "times_played", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "collection_items_collection_id_collections_id_fk": { + "name": "collection_items_collection_id_collections_id_fk", + "tableFrom": "collection_items", + "tableTo": "collections", + "columnsFrom": [ + "collection_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "collection_items_game_id_games_id_fk": { + "name": "collection_items_game_id_games_id_fk", + "tableFrom": "collection_items", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "collections": { + "name": "collections", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "collections_user_id_users_id_fk": { + "name": "collections_user_id_users_id_fk", + "tableFrom": "collections", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "expansions": { + "name": "expansions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "base_game_id": { + "name": "base_game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "expansions_base_game_id_games_id_fk": { + "name": "expansions_base_game_id_games_id_fk", + "tableFrom": "expansions", + "tableTo": "games", + "columnsFrom": [ + "base_game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "expansions_game_id_games_id_fk": { + "name": "expansions_game_id_games_id_fk", + "tableFrom": "expansions", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "external_ids": { + "name": "external_ids", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "external_id_type", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "games": { + "name": "games", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "year_published": { + "name": "year_published", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_players": { + "name": "min_players", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "max_players": { + "name": "max_players", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "playtime": { + "name": "playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_playtime": { + "name": "min_playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "max_playtime": { + "name": "max_playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_age": { + "name": "min_age", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "image_url": { + "name": "image_url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "thumb_url": { + "name": "thumb_url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "url": { + "name": "url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "text_searchable_index": { + "name": "text_searchable_index", + "type": "tsvector", + "primaryKey": false, + "notNull": false + }, + "last_sync_at": { + "name": "last_sync_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": { + "text_searchable_idx": { + "name": "text_searchable_idx", + "columns": [ + "text_searchable_index" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "games_to_external_ids": { + "name": "games_to_external_ids", + "schema": "", + "columns": { + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "games_to_external_ids_game_id_games_id_fk": { + "name": "games_to_external_ids_game_id_games_id_fk", + "tableFrom": "games_to_external_ids", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "games_to_external_ids_external_id_external_ids_id_fk": { + "name": "games_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "games_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "games_to_external_ids_game_id_external_id_pk": { + "name": "games_to_external_ids_game_id_external_id_pk", + "columns": [ + "game_id", + "external_id" + ] + } + }, + "uniqueConstraints": {} + }, + "mechanics": { + "name": "mechanics", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "mechanics_to_external_ids": { + "name": "mechanics_to_external_ids", + "schema": "", + "columns": { + "mechanic_id": { + "name": "mechanic_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "mechanics_to_external_ids_mechanic_id_mechanics_id_fk": { + "name": "mechanics_to_external_ids_mechanic_id_mechanics_id_fk", + "tableFrom": "mechanics_to_external_ids", + "tableTo": "mechanics", + "columnsFrom": [ + "mechanic_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "mechanics_to_external_ids_external_id_external_ids_id_fk": { + "name": "mechanics_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "mechanics_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "mechanics_to_external_ids_mechanic_id_external_id_pk": { + "name": "mechanics_to_external_ids_mechanic_id_external_id_pk", + "columns": [ + "mechanic_id", + "external_id" + ] + } + }, + "uniqueConstraints": {} + }, + "mechanics_to_games": { + "name": "mechanics_to_games", + "schema": "", + "columns": { + "mechanic_id": { + "name": "mechanic_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "mechanics_to_games_mechanic_id_mechanics_id_fk": { + "name": "mechanics_to_games_mechanic_id_mechanics_id_fk", + "tableFrom": "mechanics_to_games", + "tableTo": "mechanics", + "columnsFrom": [ + "mechanic_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "mechanics_to_games_game_id_games_id_fk": { + "name": "mechanics_to_games_game_id_games_id_fk", + "tableFrom": "mechanics_to_games", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "mechanics_to_games_mechanic_id_game_id_pk": { + "name": "mechanics_to_games_mechanic_id_game_id_pk", + "columns": [ + "mechanic_id", + "game_id" + ] + } + }, + "uniqueConstraints": {} + }, + "publishers": { + "name": "publishers", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "publishers_to_external_ids": { + "name": "publishers_to_external_ids", + "schema": "", + "columns": { + "publisher_id": { + "name": "publisher_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "publishers_to_external_ids_publisher_id_publishers_id_fk": { + "name": "publishers_to_external_ids_publisher_id_publishers_id_fk", + "tableFrom": "publishers_to_external_ids", + "tableTo": "publishers", + "columnsFrom": [ + "publisher_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "publishers_to_external_ids_external_id_external_ids_id_fk": { + "name": "publishers_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "publishers_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "publishers_to_external_ids_publisher_id_external_id_pk": { + "name": "publishers_to_external_ids_publisher_id_external_id_pk", + "columns": [ + "publisher_id", + "external_id" + ] + } + }, + "uniqueConstraints": {} + }, + "publishers_to_games": { + "name": "publishers_to_games", + "schema": "", + "columns": { + "publisher_id": { + "name": "publisher_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "publishers_to_games_publisher_id_publishers_id_fk": { + "name": "publishers_to_games_publisher_id_publishers_id_fk", + "tableFrom": "publishers_to_games", + "tableTo": "publishers", + "columnsFrom": [ + "publisher_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + }, + "publishers_to_games_game_id_games_id_fk": { + "name": "publishers_to_games_game_id_games_id_fk", + "tableFrom": "publishers_to_games", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "publishers_to_games_publisher_id_game_id_pk": { + "name": "publishers_to_games_publisher_id_game_id_pk", + "columns": [ + "publisher_id", + "game_id" + ] + } + }, + "uniqueConstraints": {} + }, + "roles": { + "name": "roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "roles_name_unique": { + "name": "roles_name_unique", + "nullsNotDistinct": false, + "columns": [ + "name" + ] + } + } + }, + "sessions": { + "name": "sessions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "ip_country": { + "name": "ip_country", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "ip_address": { + "name": "ip_address", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "sessions_user_id_users_id_fk": { + "name": "sessions_user_id_users_id_fk", + "tableFrom": "sessions", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "user_roles": { + "name": "user_roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "role_id": { + "name": "role_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "user_roles_user_id_users_id_fk": { + "name": "user_roles_user_id_users_id_fk", + "tableFrom": "user_roles", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_roles_role_id_roles_id_fk": { + "name": "user_roles_role_id_roles_id_fk", + "tableFrom": "user_roles", + "tableTo": "roles", + "columnsFrom": [ + "role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "username": { + "name": "username", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "hashed_password": { + "name": "hashed_password", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "first_name": { + "name": "first_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "last_name": { + "name": "last_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "verified": { + "name": "verified", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "receive_email": { + "name": "receive_email", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "theme": { + "name": "theme", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "default": "'system'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_username_unique": { + "name": "users_username_unique", + "nullsNotDistinct": false, + "columns": [ + "username" + ] + }, + "users_email_unique": { + "name": "users_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + } + }, + "wishlist_items": { + "name": "wishlist_items", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "wishlist_id": { + "name": "wishlist_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "wishlist_items_wishlist_id_wishlists_id_fk": { + "name": "wishlist_items_wishlist_id_wishlists_id_fk", + "tableFrom": "wishlist_items", + "tableTo": "wishlists", + "columnsFrom": [ + "wishlist_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "wishlist_items_game_id_games_id_fk": { + "name": "wishlist_items_game_id_games_id_fk", + "tableFrom": "wishlist_items", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "wishlists": { + "name": "wishlists", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "wishlists_user_id_users_id_fk": { + "name": "wishlists_user_id_users_id_fk", + "tableFrom": "wishlists", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": { + "external_id_type": { + "name": "external_id_type", + "values": { + "game": "game", + "category": "category", + "mechanic": "mechanic", + "publisher": "publisher", + "designer": "designer", + "artist": "artist" + } + } + }, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json index d2134c5..0af48a6 100644 --- a/drizzle/meta/_journal.json +++ b/drizzle/meta/_journal.json @@ -92,6 +92,20 @@ "when": 1708330799655, "tag": "0012_dizzy_lethal_legion", "breakpoints": true + }, + { + "idx": 13, + "version": "5", + "when": 1708453431550, + "tag": "0013_clever_monster_badoon", + "breakpoints": true + }, + { + "idx": 14, + "version": "5", + "when": 1708479971410, + "tag": "0014_organic_morlocks", + "breakpoints": true } ] } \ No newline at end of file diff --git a/package.json b/package.json index f163b38..0109c03 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", "autoprefixer": "^10.4.17", - "dotenv": "^16.4.4", + "dotenv": "^16.4.5", "drizzle-kit": "^0.20.14", "eslint": "^8.56.0", "eslint-config-prettier": "^9.1.0", @@ -49,7 +49,7 @@ "postcss": "^8.4.35", "postcss-import": "^16.0.1", "postcss-load-config": "^5.0.3", - "postcss-preset-env": "^9.3.0", + "postcss-preset-env": "^9.4.0", "prettier": "^3.2.5", "prettier-plugin-svelte": "^3.2.1", "prisma": "^5.9.1", @@ -106,9 +106,9 @@ "just-kebab-case": "^4.2.0", "loader": "^2.1.1", "lucia": "3.0.1", - "lucide-svelte": "^0.323.0", + "lucide-svelte": "^0.335.0", "mysql2": "^3.9.1", - "nanoid": "^5.0.5", + "nanoid": "^5.0.6", "open-props": "^1.6.18", "oslo": "^1.1.2", "pg": "^8.11.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index efce8c2..40e1868 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -87,14 +87,14 @@ dependencies: specifier: 3.0.1 version: 3.0.1 lucide-svelte: - specifier: ^0.323.0 - version: 0.323.0(svelte@4.2.11) + specifier: ^0.335.0 + version: 0.335.0(svelte@4.2.11) mysql2: specifier: ^3.9.1 version: 3.9.1 nanoid: - specifier: ^5.0.5 - version: 5.0.5 + specifier: ^5.0.6 + version: 5.0.6 open-props: specifier: ^1.6.18 version: 1.6.18 @@ -173,8 +173,8 @@ devDependencies: specifier: ^10.4.17 version: 10.4.17(postcss@8.4.35) dotenv: - specifier: ^16.4.4 - version: 16.4.4 + specifier: ^16.4.5 + version: 16.4.5 drizzle-kit: specifier: ^0.20.14 version: 0.20.14 @@ -203,8 +203,8 @@ devDependencies: specifier: ^5.0.3 version: 5.0.3(postcss@8.4.35) postcss-preset-env: - specifier: ^9.3.0 - version: 9.3.0(postcss@8.4.35) + specifier: ^9.4.0 + version: 9.4.0(postcss@8.4.35) prettier: specifier: ^3.2.5 version: 3.2.5 @@ -344,122 +344,247 @@ packages: dependencies: '@jridgewell/trace-mapping': 0.3.9 - /@csstools/cascade-layer-name-parser@1.0.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1): - resolution: {integrity: sha512-v/5ODKNBMfBl0us/WQjlfsvSlYxfZLhNMVIsuCPib2ulTwGKYbKJbwqw671+qH9Y4wvWVnu7LBChvml/wBKjFg==} + /@csstools/cascade-layer-name-parser@1.0.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3): + resolution: {integrity: sha512-xHxXavWvXB5nAA9IvZtjEzkONM3hPXpxqYK4cEw60LcqPiFjq7ZlEFxOyYFPrG4UdANKtnucNtRVDy7frjq6AA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: - '@csstools/css-parser-algorithms': ^2.3.2 - '@csstools/css-tokenizer': ^2.2.1 + '@csstools/css-parser-algorithms': ^2.6.0 + '@csstools/css-tokenizer': ^2.2.3 dependencies: - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 dev: true - /@csstools/color-helpers@3.0.2: - resolution: {integrity: sha512-NMVs/l7Y9eIKL5XjbCHEgGcG8LOUT2qVcRjX6EzkCdlvftHVKr2tHIPzHavfrULRZ5Q2gxrJ9f44dAlj6fX97Q==} + /@csstools/color-helpers@4.0.0: + resolution: {integrity: sha512-wjyXB22/h2OvxAr3jldPB7R7kjTUEzopvjitS8jWtyd8fN6xJ8vy1HnHu0ZNfEkqpBJgQ76Q+sBDshWcMvTa/w==} engines: {node: ^14 || ^16 || >=18} dev: true - /@csstools/css-calc@1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1): - resolution: {integrity: sha512-ZV1TSmToiNcQL1P3hfzlzZzA02mmVkVmXGaUDUqpYUG84PmLhVSZpKX+KfxAuOcK7de04UXSQPBrAvaya6iiGg==} + /@csstools/css-calc@1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3): + resolution: {integrity: sha512-+7bUzB5I4cI97tKmBJA8ilTl/YRo6VAOdlrnd/4x2NyK60nvYurGKa5TZpE1zcgIrTC97iJRE0/V65feyFytuw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: - '@csstools/css-parser-algorithms': ^2.3.2 - '@csstools/css-tokenizer': ^2.2.1 + '@csstools/css-parser-algorithms': ^2.6.0 + '@csstools/css-tokenizer': ^2.2.3 dependencies: - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 dev: true - /@csstools/css-color-parser@1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1): - resolution: {integrity: sha512-SlGd8E6ron24JYQPQAIzu5tvmWi1H4sDKTdA7UDnwF45oJv7AVESbOlOO1YjfBhrQFuvLWUgKiOY9DwGoAxwTA==} + /@csstools/css-color-parser@1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3): + resolution: {integrity: sha512-5GEkuuUxD5dael3xoWjyf7gAPAi4pwm8X8JW/nUMhxntGY4Wo4Lp7vKlex4V5ZgTfAoov14rZFsZyOantdTatg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: - '@csstools/css-parser-algorithms': ^2.3.2 - '@csstools/css-tokenizer': ^2.2.1 + '@csstools/css-parser-algorithms': ^2.6.0 + '@csstools/css-tokenizer': ^2.2.3 dependencies: - '@csstools/color-helpers': 3.0.2 - '@csstools/css-calc': 1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 + '@csstools/color-helpers': 4.0.0 + '@csstools/css-calc': 1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 dev: true - /@csstools/css-parser-algorithms@2.3.2(@csstools/css-tokenizer@2.2.1): - resolution: {integrity: sha512-sLYGdAdEY2x7TSw9FtmdaTrh2wFtRJO5VMbBrA8tEqEod7GEggFmxTSK9XqExib3yMuYNcvcTdCZIP6ukdjAIA==} + /@csstools/css-parser-algorithms@2.6.0(@csstools/css-tokenizer@2.2.3): + resolution: {integrity: sha512-YfEHq0eRH98ffb5/EsrrDspVWAuph6gDggAE74ZtjecsmyyWpW768hOyiONa8zwWGbIWYfa2Xp4tRTrpQQ00CQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: - '@csstools/css-tokenizer': ^2.2.1 + '@csstools/css-tokenizer': ^2.2.3 dependencies: - '@csstools/css-tokenizer': 2.2.1 + '@csstools/css-tokenizer': 2.2.3 dev: true - /@csstools/css-tokenizer@2.2.1: - resolution: {integrity: sha512-Zmsf2f/CaEPWEVgw29odOj+WEVoiJy9s9NOv5GgNY9mZ1CZ7394By6wONrONrTsnNDv6F9hR02nvFihrGVGHBg==} + /@csstools/css-tokenizer@2.2.3: + resolution: {integrity: sha512-pp//EvZ9dUmGuGtG1p+n17gTHEOqu9jO+FiCUjNN3BDmyhdA2Jq9QsVeR7K8/2QCK17HSsioPlTW9ZkzoWb3Lg==} engines: {node: ^14 || ^16 || >=18} dev: true - /@csstools/media-query-list-parser@2.1.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1): - resolution: {integrity: sha512-IxVBdYzR8pYe89JiyXQuYk4aVVoCPhMJkz6ElRwlVysjwURTsTk/bmY/z4FfeRE+CRBMlykPwXEVUg8lThv7AQ==} + /@csstools/media-query-list-parser@2.1.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3): + resolution: {integrity: sha512-DiD3vG5ciNzeuTEoh74S+JMjQDs50R3zlxHnBnfd04YYfA/kh2KiBCGhzqLxlJcNq+7yNQ3stuZZYLX6wK/U2g==} engines: {node: ^14 || ^16 || >=18} peerDependencies: - '@csstools/css-parser-algorithms': ^2.3.2 - '@csstools/css-tokenizer': ^2.2.1 + '@csstools/css-parser-algorithms': ^2.6.0 + '@csstools/css-tokenizer': ^2.2.3 dependencies: - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 dev: true - /@csstools/postcss-cascade-layers@4.0.1(postcss@8.4.35): - resolution: {integrity: sha512-UYFuFL9GgVnftg9v7tBvVEBRLaBeAD66euD+yYy5fYCUld9ZIWTJNCE30hm6STMEdt6FL5xzeVw1lAZ1tpvUEg==} + /@csstools/postcss-cascade-layers@4.0.3(postcss@8.4.35): + resolution: {integrity: sha512-RbkQoOH23yGhWVetgBTwFgIOHEyU2tKMN7blTz/YAKKabR6tr9pP7mYS23Q9snFY2hr8WSaV8Le64KdM9BtUSA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/selector-specificity': 3.0.0(postcss-selector-parser@6.0.13) + '@csstools/selector-specificity': 3.0.2(postcss-selector-parser@6.0.15) postcss: 8.4.35 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.15 dev: true - /@csstools/postcss-color-function@3.0.7(postcss@8.4.35): - resolution: {integrity: sha512-/PIB20G1TPCXmQlaJLWIYzTZRZpj6csT4ijgnshIj/kcmniIRroAfDa0xSWnfuO1eNo0NptIaPU7jzUukWn55Q==} + /@csstools/postcss-color-function@3.0.10(postcss@8.4.35): + resolution: {integrity: sha512-jxiXmSl4ZYX8KewFjL5ef6of9uW73VkaHeDb2tqb5q4ZDPYxjusNX1KJ8UXY8+7ydqS5QBo42tVMrSMGy+rDmw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-color-parser': 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.35) + '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 + '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) + '@csstools/utilities': 1.0.0(postcss@8.4.35) postcss: 8.4.35 dev: true - /@csstools/postcss-color-mix-function@2.0.7(postcss@8.4.35): - resolution: {integrity: sha512-57/g8aGo5eKFjEeJMiRKh8Qq43K2rCyk5ZZTvJ34TNl4zUtYU5DvLkIkOnhCtL8/a4z9oMA42aOnFPddRrScUQ==} + /@csstools/postcss-color-mix-function@2.0.10(postcss@8.4.35): + resolution: {integrity: sha512-zeD856+FDCUjB077pPS+Z9OnTQnqpiJrao3TW+sasCb/gJ3vZCX7sRSRFsRUo0/MntTtJu9hkKv9eMkFmfjydA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-color-parser': 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.35) + '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 + '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) + '@csstools/utilities': 1.0.0(postcss@8.4.35) postcss: 8.4.35 dev: true - /@csstools/postcss-exponential-functions@1.0.1(postcss@8.4.35): - resolution: {integrity: sha512-ZLK2iSK4DUxeypGce2PnQSdYugUqDTwxnhNiq1o6OyKMNYgYs4eKbvEhFG8JKr1sJWbeqBi5jRr0017l2EWVvg==} + /@csstools/postcss-exponential-functions@1.0.4(postcss@8.4.35): + resolution: {integrity: sha512-frMf0CFVnZoGEKAHlxLy3s4g/tpjyFn5+A+h895UJNm9Uc+ewGT7+EeK7Kh9IHH4pD4FkaGW1vOQtER00PLurQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-calc': 1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 + '@csstools/css-calc': 1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 postcss: 8.4.35 dev: true - /@csstools/postcss-font-format-keywords@3.0.0(postcss@8.4.35): - resolution: {integrity: sha512-ntkGj+1uDa/u6lpjPxnkPcjJn7ChO/Kcy08YxctOZI7vwtrdYvFhmE476dq8bj1yna306+jQ9gzXIG/SWfOaRg==} + /@csstools/postcss-font-format-keywords@3.0.2(postcss@8.4.35): + resolution: {integrity: sha512-E0xz2sjm4AMCkXLCFvI/lyl4XO6aN1NCSMMVEOngFDJ+k2rDwfr6NDjWljk1li42jiLNChVX+YFnmfGCigZKXw==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + '@csstools/utilities': 1.0.0(postcss@8.4.35) + postcss: 8.4.35 + postcss-value-parser: 4.2.0 + dev: true + + /@csstools/postcss-gamut-mapping@1.0.3(postcss@8.4.35): + resolution: {integrity: sha512-P0+ude1KyCy9LXOe2pHJmpcXK4q/OQbr2Sn2wQSssMw0rALGmny2MfHiCqEu8n6mf2cN6lWDZdzY8enBk8WHXQ==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 + postcss: 8.4.35 + dev: true + + /@csstools/postcss-gradients-interpolation-method@4.0.10(postcss@8.4.35): + resolution: {integrity: sha512-PwKOxVuX8lo52bPtPeKjaIp6oH2EzhcBxCndRcvGZKsqZYQ35k9A5G4yihZ+wp7PoxPqDNiXuhQsvQG2lqMpOA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 + '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) + '@csstools/utilities': 1.0.0(postcss@8.4.35) + postcss: 8.4.35 + dev: true + + /@csstools/postcss-hwb-function@3.0.9(postcss@8.4.35): + resolution: {integrity: sha512-S3/Z+mGHWIKAex7DLsHFDiku5lBEK34avT2My6sGPNCXB38TZjrKI0rd7JdN9oulem5sn+CU7oONyIftui24oQ==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 + '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) + '@csstools/utilities': 1.0.0(postcss@8.4.35) + postcss: 8.4.35 + dev: true + + /@csstools/postcss-ic-unit@3.0.4(postcss@8.4.35): + resolution: {integrity: sha512-OB6ojl33/TQHhjVx1NI+n3EnYbdUM6Q/mSUv3WFATdcz7IrH/CmBaZt7P1R6j1Xdp58thIa6jm4Je7saGs+2AA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) + '@csstools/utilities': 1.0.0(postcss@8.4.35) + postcss: 8.4.35 + postcss-value-parser: 4.2.0 + dev: true + + /@csstools/postcss-initial@1.0.1(postcss@8.4.35): + resolution: {integrity: sha512-wtb+IbUIrIf8CrN6MLQuFR7nlU5C7PwuebfeEXfjthUha1+XZj2RVi+5k/lukToA24sZkYAiSJfHM8uG/UZIdg==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.35 + dev: true + + /@csstools/postcss-is-pseudo-class@4.0.5(postcss@8.4.35): + resolution: {integrity: sha512-qG3MI7IN3KY9UwdaE9E7G7sFydscVW7nAj5OGwaBP9tQPEEVdxXTGI+l1ZW5EUpZFSj+u3q/22fH5+8HI72+Bg==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + '@csstools/selector-specificity': 3.0.2(postcss-selector-parser@6.0.15) + postcss: 8.4.35 + postcss-selector-parser: 6.0.15 + dev: true + + /@csstools/postcss-light-dark-function@1.0.0(postcss@8.4.35): + resolution: {integrity: sha512-KHo633V16DGo6tmpr1ARAwO73CPBNmDI3PfSQYe7ZBMiv60WEizbcEroK75fHjxKYJ4tj9uCCzp5sYG4cEUqqw==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 + '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) + '@csstools/utilities': 1.0.0(postcss@8.4.35) + postcss: 8.4.35 + dev: true + + /@csstools/postcss-logical-float-and-clear@2.0.1(postcss@8.4.35): + resolution: {integrity: sha512-SsrWUNaXKr+e/Uo4R/uIsqJYt3DaggIh/jyZdhy/q8fECoJSKsSMr7nObSLdvoULB69Zb6Bs+sefEIoMG/YfOA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.35 + dev: true + + /@csstools/postcss-logical-overflow@1.0.1(postcss@8.4.35): + resolution: {integrity: sha512-Kl4lAbMg0iyztEzDhZuQw8Sj9r2uqFDcU1IPl+AAt2nue8K/f1i7ElvKtXkjhIAmKiy5h2EY8Gt/Cqg0pYFDCw==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.35 + dev: true + + /@csstools/postcss-logical-overscroll-behavior@1.0.1(postcss@8.4.35): + resolution: {integrity: sha512-+kHamNxAnX8ojPCtV8WPcUP3XcqMFBSDuBuvT6MHgq7oX4IQxLIXKx64t7g9LiuJzE7vd06Q9qUYR6bh4YnGpQ==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.35 + dev: true + + /@csstools/postcss-logical-resize@2.0.1(postcss@8.4.35): + resolution: {integrity: sha512-W5Gtwz7oIuFcKa5SmBjQ2uxr8ZoL7M2bkoIf0T1WeNqljMkBrfw1DDA8/J83k57NQ1kcweJEjkJ04pUkmyee3A==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 @@ -468,103 +593,55 @@ packages: postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-gamut-mapping@1.0.0(postcss@8.4.35): - resolution: {integrity: sha512-6UQyK8l9YaG5Ao5rBDcCnKHrLsHiQ1E0zeFQuqDJqEtinVzAPb/MwSw3TenZXL1Rnd7th3tb+4CBFHBXdW5tbQ==} + /@csstools/postcss-logical-viewport-units@2.0.6(postcss@8.4.35): + resolution: {integrity: sha512-6hV0ngZh8J7HqNY3kyt+z5ABN/XE18qvrU7ne4YSkKfltrWDnQgGiW/Q+h7bdQz8/W5juAefcdCCAJUIBE7erg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-color-parser': 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 + '@csstools/css-tokenizer': 2.2.3 + '@csstools/utilities': 1.0.0(postcss@8.4.35) postcss: 8.4.35 dev: true - /@csstools/postcss-gradients-interpolation-method@4.0.7(postcss@8.4.35): - resolution: {integrity: sha512-GT1CzE/Tyr/ei4j5BwKESkHAgg+Gzys/0mAY7W+UiR+XrcYk5hDbOrE/YJIx1rflfO/7La1bDoZtA0YnLl4qNA==} + /@csstools/postcss-media-minmax@1.1.3(postcss@8.4.35): + resolution: {integrity: sha512-W9AFRQSLvT+Dxtp20AewzGTUxzkJ21XSKzqRALwQdAv0uJGXkR76qgdhkoX0L/tcV4gXtgDfVtGYL/x2Nz/M5Q==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-color-parser': 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.35) + '@csstools/css-calc': 1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 + '@csstools/media-query-list-parser': 2.1.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) postcss: 8.4.35 dev: true - /@csstools/postcss-hwb-function@3.0.6(postcss@8.4.35): - resolution: {integrity: sha512-uQgWt2Ho2yy2S6qthWY7mD5v57NKxi6dD1NB8nAybU5bJSsm+hLXRGm3/zbOH4xNrqO3Cl60DFSNlSrUME3Xjg==} + /@csstools/postcss-media-queries-aspect-ratio-number-values@2.0.6(postcss@8.4.35): + resolution: {integrity: sha512-awc2qenSDvx6r+w6G9xxENp+LsbvHC8mMMV23KYmk4pR3YL8JxeKPDSiDhmqd93FQ9nNNDc/CaCQEcvP+GV4rw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-color-parser': 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 + '@csstools/media-query-list-parser': 2.1.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) postcss: 8.4.35 dev: true - /@csstools/postcss-ic-unit@3.0.2(postcss@8.4.35): - resolution: {integrity: sha512-n28Er7W9qc48zNjJnvTKuVHY26/+6YlA9WzJRksIHiAWOMxSH5IksXkw7FpkIOd+jLi59BMrX/BWrZMgjkLBHg==} + /@csstools/postcss-nested-calc@3.0.2(postcss@8.4.35): + resolution: {integrity: sha512-ySUmPyawiHSmBW/VI44+IObcKH0v88LqFe0d09Sb3w4B1qjkaROc6d5IA3ll9kjD46IIX/dbO5bwFN/swyoyZA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.35) + '@csstools/utilities': 1.0.0(postcss@8.4.35) postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-initial@1.0.0(postcss@8.4.35): - resolution: {integrity: sha512-1l7iHHjIl5qmVeGItugr4ZOlCREDP71mNKqoEyxlosIoiu3Os1nPWMHpuCvDLCLiWI/ONTOg3nzJh7gwHOrqUA==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - dependencies: - postcss: 8.4.35 - dev: true - - /@csstools/postcss-is-pseudo-class@4.0.3(postcss@8.4.35): - resolution: {integrity: sha512-/dt5M9Ty/x3Yiq0Nm/5PJJzwkVFchJgdjKVnryBPtoMCb9ohb/nDIJOwr/Wr3hK3FDs1EA1GE6PyRYsUmQPS8Q==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - dependencies: - '@csstools/selector-specificity': 3.0.0(postcss-selector-parser@6.0.13) - postcss: 8.4.35 - postcss-selector-parser: 6.0.13 - dev: true - - /@csstools/postcss-logical-float-and-clear@2.0.0(postcss@8.4.35): - resolution: {integrity: sha512-Wki4vxsF6icRvRz8eF9bPpAvwaAt0RHwhVOyzfoFg52XiIMjb6jcbHkGxwpJXP4DVrnFEwpwmrz5aTRqOW82kg==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - dependencies: - postcss: 8.4.35 - dev: true - - /@csstools/postcss-logical-overflow@1.0.0(postcss@8.4.35): - resolution: {integrity: sha512-cIrZ8f7bGGvr+W53nEuMspcwaeaI2YTmz6LZ4yiAO5z14/PQgOOv+Pn+qjvPOPoadeY2BmpaoTzZKvdAQuM17w==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - dependencies: - postcss: 8.4.35 - dev: true - - /@csstools/postcss-logical-overscroll-behavior@1.0.0(postcss@8.4.35): - resolution: {integrity: sha512-e89S2LWjnxf0SB2wNUAbqDyFb/Fow/tlOe1XqOLbNx4rf3LrQokM9qldVx7sarnddml3ORE5LDUmlKpPOOeJTA==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - dependencies: - postcss: 8.4.35 - dev: true - - /@csstools/postcss-logical-resize@2.0.0(postcss@8.4.35): - resolution: {integrity: sha512-lCQ1aX8c5+WI4t5EoYf3alTzJNNocMqTb+u1J9CINdDhFh1fjovqK+0aHalUHsNstZmzFPNzIkU4Mb3eM9U8SA==} + /@csstools/postcss-normalize-display-values@3.0.2(postcss@8.4.35): + resolution: {integrity: sha512-fCapyyT/dUdyPtrelQSIV+d5HqtTgnNP/BEG9IuhgXHt93Wc4CfC1bQ55GzKAjWrZbgakMQ7MLfCXEf3rlZJOw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 @@ -573,43 +650,22 @@ packages: postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-logical-viewport-units@2.0.3(postcss@8.4.35): - resolution: {integrity: sha512-xeVxqND5rlQyqLGdH7rX34sIm/JbbQKxpKQP8oD1YQqUHHCLQR9NUS57WqJKajxKN6AcNAMWJhb5LUH5RfPcyA==} + /@csstools/postcss-oklab-function@3.0.10(postcss@8.4.35): + resolution: {integrity: sha512-s9trs1c+gUMtaTtwrrIpdVQkUbRuwi6bQ9rBHaqwt4kd3kEnEYfP85uLY1inFx6Rt8OM2XVg3PSYbfnFSAO51A==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-tokenizer': 2.2.1 + '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 + '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) + '@csstools/utilities': 1.0.0(postcss@8.4.35) postcss: 8.4.35 dev: true - /@csstools/postcss-media-minmax@1.1.0(postcss@8.4.35): - resolution: {integrity: sha512-t5Li/DPC5QmW/6VFLfUvsw/4dNYYseWR0tOXDeJg/9EKUodBgNawz5tuk5vYKtNvoj+Q08odMuXcpS5YJj0AFA==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - dependencies: - '@csstools/css-calc': 1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 - '@csstools/media-query-list-parser': 2.1.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - postcss: 8.4.35 - dev: true - - /@csstools/postcss-media-queries-aspect-ratio-number-values@2.0.3(postcss@8.4.35): - resolution: {integrity: sha512-IPL8AvnwMYW+cWtp+j8cW3MFN0RyXNT4hLOvs6Rf2N+NcbvXhSyKxZuE3W9Cv4KjaNoNoGx1d0UhT6tktq6tUw==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - dependencies: - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 - '@csstools/media-query-list-parser': 2.1.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - postcss: 8.4.35 - dev: true - - /@csstools/postcss-nested-calc@3.0.0(postcss@8.4.35): - resolution: {integrity: sha512-HsB66aDWAouOwD/GcfDTS0a7wCuVWaTpXcjl5VKP0XvFxDiU+r0T8FG7xgb6ovZNZ+qzvGIwRM+CLHhDgXrYgQ==} + /@csstools/postcss-progressive-custom-properties@3.1.0(postcss@8.4.35): + resolution: {integrity: sha512-Mfb1T1BHa6pktLI+poMEHI7Q+VYvAsdwJZPFsSkIB2ZUsawCiPxXLw06BKSVPITxFlaY/FEUzfpyOTfX9YCE2w==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 @@ -618,99 +674,67 @@ packages: postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-normalize-display-values@3.0.1(postcss@8.4.35): - resolution: {integrity: sha512-nUvRxI+ALJwkxZdPU4EDyuM380vP91sAGvI3jAOHs/sr3jfcCOzLkY6xKI1Mr526kZ3RivmMoYM/xq+XFyE/bw==} + /@csstools/postcss-relative-color-syntax@2.0.10(postcss@8.4.35): + resolution: {integrity: sha512-IkTIk9Eq2VegSN4lgsljGY8boyfX3l3Pw58e+R9oyPe/Ye7r3NwuiQ3w0nkXoQ+RC+d240V6n7eZme2mEPqQvg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: + '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 + '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) + '@csstools/utilities': 1.0.0(postcss@8.4.35) + postcss: 8.4.35 + dev: true + + /@csstools/postcss-scope-pseudo-class@3.0.1(postcss@8.4.35): + resolution: {integrity: sha512-3ZFonK2gfgqg29gUJ2w7xVw2wFJ1eNWVDONjbzGkm73gJHVCYK5fnCqlLr+N+KbEfv2XbWAO0AaOJCFB6Fer6A==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.35 + postcss-selector-parser: 6.0.15 + dev: true + + /@csstools/postcss-stepped-value-functions@3.0.5(postcss@8.4.35): + resolution: {integrity: sha512-B8K8RaTrYVZLxbNzVUvFO3SlCDJDaUTAO7KRth05fa7f01ufPvb6ztdBuxSoRwOtmNp8iROxPJHOemWo2kBBtA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + '@csstools/css-calc': 1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 + postcss: 8.4.35 + dev: true + + /@csstools/postcss-text-decoration-shorthand@3.0.4(postcss@8.4.35): + resolution: {integrity: sha512-yUZmbnUemgQmja7SpOZeU45+P49wNEgQguRdyTktFkZsHf7Gof+ZIYfvF6Cm+LsU1PwSupy4yUeEKKjX5+k6cQ==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + '@csstools/color-helpers': 4.0.0 postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-oklab-function@3.0.7(postcss@8.4.35): - resolution: {integrity: sha512-vBFTQD3CARB3u/XIGO44wWbcO7xG/4GsYqJlcPuUGRSK8mtxes6n4vvNFlIByyAZy2k4d4RY63nyvTbMpeNTaQ==} + /@csstools/postcss-trigonometric-functions@3.0.5(postcss@8.4.35): + resolution: {integrity: sha512-RhBfQ0TsBudyPuoo8pXKdfQuUiQxMU/Sc5GyV57bWk93JbUHXq6b4CdPx+B/tHUeFKvocVJn/e2jbu96rh0d3Q==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-color-parser': 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.35) + '@csstools/css-calc': 1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 postcss: 8.4.35 dev: true - /@csstools/postcss-progressive-custom-properties@3.0.2(postcss@8.4.35): - resolution: {integrity: sha512-YEvTozk1SxnV/PGL5DllBVDuLQ+jiQhyCSQiZJ6CwBMU5JQ9hFde3i1qqzZHuclZfptjrU0JjlX4ePsOhxNzHw==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - dependencies: - postcss: 8.4.35 - postcss-value-parser: 4.2.0 - dev: true - - /@csstools/postcss-relative-color-syntax@2.0.7(postcss@8.4.35): - resolution: {integrity: sha512-2AiFbJSVF4EyymLxme4JzSrbXykHolx8DdZECHjYKMhoulhKLltx5ccYgtrK3BmXGd3v3nJrWFCc8JM8bjuiOg==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - dependencies: - '@csstools/css-color-parser': 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.35) - postcss: 8.4.35 - dev: true - - /@csstools/postcss-scope-pseudo-class@3.0.0(postcss@8.4.35): - resolution: {integrity: sha512-GFNVsD97OuEcfHmcT0/DAZWAvTM/FFBDQndIOLawNc1Wq8YqpZwBdHa063Lq+Irk7azygTT+Iinyg3Lt76p7rg==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.13 - dev: true - - /@csstools/postcss-stepped-value-functions@3.0.2(postcss@8.4.35): - resolution: {integrity: sha512-I3wX44MZVv+tDuWfrd3BTvRB/YRIM2F5v1MBtTI89sxpFn47mNpTwpPYUOGPVCgKlRDfZSlxIUYhUQmqRQZZFQ==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - dependencies: - '@csstools/css-calc': 1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 - postcss: 8.4.35 - dev: true - - /@csstools/postcss-text-decoration-shorthand@3.0.3(postcss@8.4.35): - resolution: {integrity: sha512-d5J9m49HhqXRcw1S6vTZuviHi/iknUKGjBpChiNK1ARg9sSa3b8m5lsWz5Izs8ISORZdv2bZRwbw5Z2R6gQ9kQ==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - dependencies: - '@csstools/color-helpers': 3.0.2 - postcss: 8.4.35 - postcss-value-parser: 4.2.0 - dev: true - - /@csstools/postcss-trigonometric-functions@3.0.2(postcss@8.4.35): - resolution: {integrity: sha512-AwzNhF4QOKaLOKvMljwwFkeYXwufhRO15G+kKohHkyoNOL75xWkN+W2Y9ik9tSeAyDv+cYNlYaF+o/a79WjVjg==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - dependencies: - '@csstools/css-calc': 1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 - postcss: 8.4.35 - dev: true - - /@csstools/postcss-unset-value@3.0.0(postcss@8.4.35): - resolution: {integrity: sha512-P0JD1WHh3avVyKKRKjd0dZIjCEeaBer8t1BbwGMUDtSZaLhXlLNBqZ8KkqHzYWXOJgHleXAny2/sx8LYl6qhEA==} + /@csstools/postcss-unset-value@3.0.1(postcss@8.4.35): + resolution: {integrity: sha512-dbDnZ2ja2U8mbPP0Hvmt2RMEGBiF1H7oY6HYSpjteXJGihYwgxgTr6KRbbJ/V6c+4wd51M+9980qG4gKVn5ttg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 @@ -718,13 +742,22 @@ packages: postcss: 8.4.35 dev: true - /@csstools/selector-specificity@3.0.0(postcss-selector-parser@6.0.13): - resolution: {integrity: sha512-hBI9tfBtuPIi885ZsZ32IMEU/5nlZH/KOVYJCOh7gyMxaVLGmLedYqFN6Ui1LXkI8JlC8IsuC0rF0btcRZKd5g==} + /@csstools/selector-specificity@3.0.2(postcss-selector-parser@6.0.15): + resolution: {integrity: sha512-RpHaZ1h9LE7aALeQXmXrJkRG84ZxIsctEN2biEUmFyKpzFM3zZ35eUMcIzZFsw/2olQE6v69+esEqU2f1MKycg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss-selector-parser: ^6.0.13 dependencies: - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.15 + dev: true + + /@csstools/utilities@1.0.0(postcss@8.4.35): + resolution: {integrity: sha512-tAgvZQe/t2mlvpNosA4+CkMiZ2azISW5WPAcdSalZlEjQvUfghHxfQcrCiK/7/CrfAWVxyM88kGFYO82heIGDg==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.35 dev: true /@drizzle-team/studio@0.0.39: @@ -1768,7 +1801,7 @@ packages: '@internationalized/date': 3.5.1 dequal: 2.0.3 focus-trap: 7.5.4 - nanoid: 5.0.5 + nanoid: 5.0.6 svelte: 4.2.11 dev: false @@ -1782,7 +1815,7 @@ packages: '@internationalized/date': 3.5.2 dequal: 2.0.3 focus-trap: 7.5.4 - nanoid: 5.0.5 + nanoid: 5.0.6 svelte: 4.2.11 dev: true @@ -3462,7 +3495,7 @@ packages: hasBin: true dependencies: '@actions/core': 1.10.1 - dotenv: 16.4.4 + dotenv: 16.4.5 front-matter: 4.0.2 nanoid: 4.0.2 oslo: 1.1.2 @@ -3518,7 +3551,7 @@ packages: dependencies: '@internationalized/date': 3.5.1 '@melt-ui/svelte': 0.71.2(svelte@4.2.11) - nanoid: 5.0.5 + nanoid: 5.0.6 svelte: 4.2.11 dev: false @@ -3550,17 +3583,6 @@ packages: dependencies: fill-range: 7.0.1 - /browserslist@4.22.1: - resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001579 - electron-to-chromium: 1.4.576 - node-releases: 2.0.13 - update-browserslist-db: 1.0.13(browserslist@4.22.1) - dev: true - /browserslist@4.22.2: resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -3572,6 +3594,17 @@ packages: update-browserslist-db: 1.0.13(browserslist@4.22.2) dev: true + /browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001588 + electron-to-chromium: 1.4.677 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.23.0) + dev: true + /buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} @@ -3618,6 +3651,10 @@ packages: resolution: {integrity: sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA==} dev: true + /caniuse-lite@1.0.30001588: + resolution: {integrity: sha512-+hVY9jE44uKLkH0SrUTqxjxqNTOWHsbnQDIKjwkZ3lNTzUUVdBLBGXtj/q5Mp5u98r3droaZAewQuEDzjQdZlQ==} + dev: true + /chai@4.3.10: resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} engines: {node: '>=4'} @@ -3801,14 +3838,14 @@ packages: /css-background-parser@0.1.0: resolution: {integrity: sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA==} - /css-blank-pseudo@6.0.0(postcss@8.4.35): - resolution: {integrity: sha512-VbfLlOWO7sBHBTn6pwDQzc07Z0SDydgDBfNfCE0nvrehdBNv9RKsuupIRa/qal0+fBZhAALyQDPMKz5lnvcchw==} + /css-blank-pseudo@6.0.1(postcss@8.4.35): + resolution: {integrity: sha512-goSnEITByxTzU4Oh5oJZrEWudxTqk7L6IXj1UW69pO6Hv0UdX+Vsrt02FFu5DweRh2bLu6WpX/+zsQCu5O1gKw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: postcss: 8.4.35 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.15 dev: true /css-box-shadow@1.0.0-3: @@ -3818,20 +3855,20 @@ packages: resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} engines: {node: '>=4'} - /css-has-pseudo@6.0.0(postcss@8.4.35): - resolution: {integrity: sha512-X+r+JBuoO37FBOWVNhVJhxtSBUFHgHbrcc0CjFT28JEdOw1qaDwABv/uunyodUuSy2hMPe9j/HjssxSlvUmKjg==} + /css-has-pseudo@6.0.2(postcss@8.4.35): + resolution: {integrity: sha512-Z2Qm5yyOvJRTy6THdUlnGIX6PW/1wOc4FHWlfkcBkfkpZ3oz6lPdG+h+J7t1HZHT4uSSVR8XatXiMpqMUADXow==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/selector-specificity': 3.0.0(postcss-selector-parser@6.0.13) + '@csstools/selector-specificity': 3.0.2(postcss-selector-parser@6.0.15) postcss: 8.4.35 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.15 postcss-value-parser: 4.2.0 dev: true - /css-prefers-color-scheme@9.0.0(postcss@8.4.35): - resolution: {integrity: sha512-03QGAk/FXIRseDdLb7XAiu6gidQ0Nd8945xuM7VFVPpc6goJsG9uIO8xQjTxwbPdPIIV4o4AJoOJyt8gwDl67g==} + /css-prefers-color-scheme@9.0.1(postcss@8.4.35): + resolution: {integrity: sha512-iFit06ochwCKPRiWagbTa1OAWCvWWVdEnIFd8BaRrgO8YrrNh4RAWUQTFcYX5tdFZgFl1DJ3iiULchZyEbnF4g==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 @@ -3853,8 +3890,8 @@ packages: mdn-data: 2.0.30 source-map-js: 1.0.2 - /cssdb@7.9.0: - resolution: {integrity: sha512-WPMT9seTQq6fPAa1yN4zjgZZeoTriSN2LqW9C+otjar12DQIWA4LuSfFrvFJiKp4oD0xIk1vumDLw8K9ur4NBw==} + /cssdb@7.11.0: + resolution: {integrity: sha512-YUVAJhjDcTZzVD5XE49l3PQtGE29vvhzaL1bM3BtkvSmIRJeYENdfn1dn5jauBI7BBF+IyyiBS+oSVx3Hz/Gaw==} dev: true /cssesc@3.0.0: @@ -3973,8 +4010,8 @@ packages: esutils: 2.0.3 dev: true - /dotenv@16.4.4: - resolution: {integrity: sha512-XvPXc8XAQThSjAbY6cQ/9PcBXmFoWuw1sQ3b8HqUCR6ziGXjkTi//kB9SWa2UwqlgdAIuRqAa/9hVljzPehbYg==} + /dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} /dreamopt@0.8.0: @@ -4085,14 +4122,14 @@ packages: postgres: 3.4.3 dev: false - /electron-to-chromium@1.4.576: - resolution: {integrity: sha512-yXsZyXJfAqzWk1WKryr0Wl0MN2D47xodPvEEwlVePBnhU5E7raevLQR+E6b9JAD3GfL/7MbAL9ZtWQQPcLx7wA==} - dev: true - /electron-to-chromium@1.4.638: resolution: {integrity: sha512-gpmbAG2LbfPKcDaL5m9IKutKjUx4ZRkvGNkgL/8nKqxkXsBVYykVULboWlqCrHsh3razucgDJDuKoWJmGPdItA==} dev: true + /electron-to-chromium@1.4.677: + resolution: {integrity: sha512-erDa3CaDzwJOpyvfKhOiJjBVNnMM0qxHq47RheVVwsSQrgBA9ZSGV9kdaOfZDPXcHzhG7lBxhj6A7KvfLJBd6Q==} + dev: true + /emoji-regex@10.3.0: resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} @@ -5172,8 +5209,8 @@ packages: oslo: 1.0.1 dev: false - /lucide-svelte@0.323.0(svelte@4.2.11): - resolution: {integrity: sha512-3GEFk1vCwB8BtHTHZTocFJfX6AtTLQw9a74JSuihAGx+MzhxqeWk8W1TkM4WUlvE0x9UdONM2rJGRyx9IyjkJg==} + /lucide-svelte@0.335.0(svelte@4.2.11): + resolution: {integrity: sha512-paZUqH0Ei2LH9wC8UjEb5tVIiTWYa8J1tu0yHPrD0pSmtD98+MbPKUMQotFOh7t+2NS72PFQ0OJBrtzJcIwTpg==} peerDependencies: svelte: ^3 || ^4 || ^5.0.0-next.42 dependencies: @@ -5410,8 +5447,8 @@ packages: hasBin: true dev: false - /nanoid@5.0.5: - resolution: {integrity: sha512-/Veqm+QKsyMY3kqi4faWplnY1u+VuKO3dD2binyPIybP31DRO29bPF+1mszgLnrR2KqSLceFLBNw0zmvDzN1QQ==} + /nanoid@5.0.6: + resolution: {integrity: sha512-rRq0eMHoGZxlvaFOUdK1Ev83Bd1IgzzR+WJ3IbDJ7QOSdAxYjlurSPqFs9s4lJg29RT6nPwizFtJhQS6V5xgiA==} engines: {node: ^18 || >=20} hasBin: true @@ -5440,10 +5477,6 @@ packages: hasBin: true dev: false - /node-releases@2.0.13: - resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} - dev: true - /node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} dev: true @@ -5763,14 +5796,14 @@ packages: fsevents: 2.3.2 dev: true - /postcss-attribute-case-insensitive@6.0.2(postcss@8.4.35): - resolution: {integrity: sha512-IRuCwwAAQbgaLhxQdQcIIK0dCVXg3XDUnzgKD8iwdiYdwU4rMWRWyl/W9/0nA4ihVpq5pyALiHB2veBJ0292pw==} + /postcss-attribute-case-insensitive@6.0.3(postcss@8.4.35): + resolution: {integrity: sha512-KHkmCILThWBRtg+Jn1owTnHPnFit4OkqS+eKiGEOPIGke54DCeYGJ6r0Fx/HjfE9M9kznApCLcU0DvnPchazMQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: postcss: 8.4.35 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.15 dev: true /postcss-clamp@4.1.0(postcss@8.4.35): @@ -5783,115 +5816,122 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-color-functional-notation@6.0.2(postcss@8.4.35): - resolution: {integrity: sha512-FsjSmlSufuiFBsIqQ++VxFmvX7zKndZpBkHmfXr4wqhvzM92FTEkAh703iqWTl1U3faTgqioIqCbfqdWiFVwtw==} + /postcss-color-functional-notation@6.0.5(postcss@8.4.35): + resolution: {integrity: sha512-aTFsIy89ftjyclwUHRwvz1IxucLzVrzmmcXmtbPWT9GdyYeaJEKeAwbaZzOZn7AQlXg4xfwgkYhKsofC4aLIwg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.35) + '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 + '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) + '@csstools/utilities': 1.0.0(postcss@8.4.35) + postcss: 8.4.35 + dev: true + + /postcss-color-hex-alpha@9.0.4(postcss@8.4.35): + resolution: {integrity: sha512-XQZm4q4fNFqVCYMGPiBjcqDhuG7Ey2xrl99AnDJMyr5eDASsAGalndVgHZF8i97VFNy1GQeZc4q2ydagGmhelQ==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + '@csstools/utilities': 1.0.0(postcss@8.4.35) postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true - /postcss-color-hex-alpha@9.0.2(postcss@8.4.35): - resolution: {integrity: sha512-SfPjgr//VQ/DOCf80STIAsdAs7sbIbxATvVmd+Ec7JvR8onz9pjawhq3BJM3Pie40EE3TyB0P6hft16D33Nlyg==} + /postcss-color-rebeccapurple@9.0.3(postcss@8.4.35): + resolution: {integrity: sha512-ruBqzEFDYHrcVq3FnW3XHgwRqVMrtEPLBtD7K2YmsLKVc2jbkxzzNEctJKsPCpDZ+LeMHLKRDoSShVefGc+CkQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: + '@csstools/utilities': 1.0.0(postcss@8.4.35) postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true - /postcss-color-rebeccapurple@9.0.1(postcss@8.4.35): - resolution: {integrity: sha512-ds4cq5BjRieizVb2PnvbJ0omg9VCo2/KzluvoFZbxuGpsGJ5BQSD93CHBooinEtangCM5YqUOerGDl4xGmOb6Q==} + /postcss-custom-media@10.0.3(postcss@8.4.35): + resolution: {integrity: sha512-wfJ9nKpLn/Qy7LASKu0Rj9Iq2uMzlRt27P4FAE1889IKRMdYUgy8SqvdXfAOs7LJLQX9Fjm0mZ+TSFphD/mKwA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: + '@csstools/cascade-layer-name-parser': 1.0.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 + '@csstools/media-query-list-parser': 2.1.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + postcss: 8.4.35 + dev: true + + /postcss-custom-properties@13.3.5(postcss@8.4.35): + resolution: {integrity: sha512-xHg8DTCMfN2nrqs2CQTF+0m5jgnzKL5zrW5Y05KF6xBRO0uDPxiplBm/xcr1o49SLbyJXkMuaRJKhRzkrquKnQ==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + '@csstools/cascade-layer-name-parser': 1.0.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 + '@csstools/utilities': 1.0.0(postcss@8.4.35) postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true - /postcss-custom-media@10.0.2(postcss@8.4.35): - resolution: {integrity: sha512-zcEFNRmDm2fZvTPdI1pIW3W//UruMcLosmMiCdpQnrCsTRzWlKQPYMa1ud9auL0BmrryKK1+JjIGn19K0UjO/w==} + /postcss-custom-selectors@7.1.7(postcss@8.4.35): + resolution: {integrity: sha512-N19MpExaR+hYTXU59VO02xE42zLoAUYSVcupwkKlWWLteOb+sWCWHw5FhV7u7gVLTzaGULy7nZP3DNTHgOZAPA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/cascade-layer-name-parser': 1.0.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 - '@csstools/media-query-list-parser': 2.1.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) + '@csstools/cascade-layer-name-parser': 1.0.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 postcss: 8.4.35 + postcss-selector-parser: 6.0.15 dev: true - /postcss-custom-properties@13.3.2(postcss@8.4.35): - resolution: {integrity: sha512-2Coszybpo8lpLY24vy2CYv9AasiZ39/bs8Imv0pWMq55Gl8NWzfc24OAo3zIX7rc6uUJAqESnVOMZ6V6lpMjJA==} + /postcss-dir-pseudo-class@8.0.1(postcss@8.4.35): + resolution: {integrity: sha512-uULohfWBBVoFiZXgsQA24JV6FdKIidQ+ZqxOouhWwdE+qJlALbkS5ScB43ZTjPK+xUZZhlaO/NjfCt5h4IKUfw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/cascade-layer-name-parser': 1.0.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 + postcss: 8.4.35 + postcss-selector-parser: 6.0.15 + dev: true + + /postcss-double-position-gradients@5.0.4(postcss@8.4.35): + resolution: {integrity: sha512-xOH2QhazCPeYR+ziYaDcGlpo7Bpw8PVoggOFfU/xPkmBRUQH8MR2eWoPY1CZM93CB0WKs2mxq3ORo83QGIooLw==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) + '@csstools/utilities': 1.0.0(postcss@8.4.35) postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true - /postcss-custom-selectors@7.1.6(postcss@8.4.35): - resolution: {integrity: sha512-svsjWRaxqL3vAzv71dV0/65P24/FB8TbPX+lWyyf9SZ7aZm4S4NhCn7N3Bg+Z5sZunG3FS8xQ80LrCU9hb37cw==} + /postcss-focus-visible@9.0.1(postcss@8.4.35): + resolution: {integrity: sha512-N2VQ5uPz3Z9ZcqI5tmeholn4d+1H14fKXszpjogZIrFbhaq0zNAtq8sAnw6VLiqGbL8YBzsnu7K9bBkTqaRimQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/cascade-layer-name-parser': 1.0.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 postcss: 8.4.35 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.15 dev: true - /postcss-dir-pseudo-class@8.0.0(postcss@8.4.35): - resolution: {integrity: sha512-Oy5BBi0dWPwij/IA+yDYj+/OBMQ9EPqAzTHeSNUYrUWdll/PRJmcbiUj0MNcsBi681I1gcSTLvMERPaXzdbvJg==} + /postcss-focus-within@8.0.1(postcss@8.4.35): + resolution: {integrity: sha512-NFU3xcY/xwNaapVb+1uJ4n23XImoC86JNwkY/uduytSl2s9Ekc2EpzmRR63+ExitnW3Mab3Fba/wRPCT5oDILA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: postcss: 8.4.35 - postcss-selector-parser: 6.0.13 - dev: true - - /postcss-double-position-gradients@5.0.2(postcss@8.4.35): - resolution: {integrity: sha512-KTbvdOOy8z8zb0BTkEg4/1vqlRlApdvjw8/pFoehgQl0WVO+fezDGlvo0B8xRA+XccA7ohkQCULKNsiNOx70Cw==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - dependencies: - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.35) - postcss: 8.4.35 - postcss-value-parser: 4.2.0 - dev: true - - /postcss-focus-visible@9.0.0(postcss@8.4.35): - resolution: {integrity: sha512-zA4TbVaIaT8npZBEROhZmlc+GBKE8AELPHXE7i4TmIUEQhw/P/mSJfY9t6tBzpQ1rABeGtEOHYrW4SboQeONMQ==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.13 - dev: true - - /postcss-focus-within@8.0.0(postcss@8.4.35): - resolution: {integrity: sha512-E7+J9nuQzZaA37D/MUZMX1K817RZGDab8qw6pFwzAkDd/QtlWJ9/WTKmzewNiuxzeq6WWY7ATiRePVoDKp+DnA==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.15 dev: true /postcss-font-variant@5.0.0(postcss@8.4.35): @@ -5902,8 +5942,8 @@ packages: postcss: 8.4.35 dev: true - /postcss-gap-properties@5.0.0(postcss@8.4.35): - resolution: {integrity: sha512-YjsEEL6890P7MCv6fch6Am1yq0EhQCJMXyT4LBohiu87+4/WqR7y5W3RIv53WdA901hhytgRvjlrAhibhW4qsA==} + /postcss-gap-properties@5.0.1(postcss@8.4.35): + resolution: {integrity: sha512-k2z9Cnngc24c0KF4MtMuDdToROYqGMMUQGcE6V0odwjHyOHtaDBlLeRBV70y9/vF7KIbShrTRZ70JjsI1BZyWw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 @@ -5911,12 +5951,13 @@ packages: postcss: 8.4.35 dev: true - /postcss-image-set-function@6.0.1(postcss@8.4.35): - resolution: {integrity: sha512-VlZncC9hhZ5tg0JllY4g6Z28BeoPO8DIkelioEEkXL0AA0IORlqYpTi2L8TUnl4YQrlwvBgxVy+mdZJw5R/cIQ==} + /postcss-image-set-function@6.0.3(postcss@8.4.35): + resolution: {integrity: sha512-i2bXrBYzfbRzFnm+pVuxVePSTCRiNmlfssGI4H0tJQvDue+yywXwUxe68VyzXs7cGtMaH6MCLY6IbCShrSroCw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: + '@csstools/utilities': 1.0.0(postcss@8.4.35) postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true @@ -5953,16 +5994,17 @@ packages: camelcase-css: 2.0.1 postcss: 8.4.35 - /postcss-lab-function@6.0.7(postcss@8.4.35): - resolution: {integrity: sha512-4d1lhDVPukHFqkMv4G5vVcK+tgY52vwb5uR1SWKOaO5389r2q8fMxBWuXSW+YtbCOEGP0/X9KERi9E9le2pJuw==} + /postcss-lab-function@6.0.10(postcss@8.4.35): + resolution: {integrity: sha512-Csvw/CwwuwTojK2O3Ad0SvYKrfnAKy+uvT+1Fjk6igR+n8gHuJHIwdj1A2s46EZZojg3RkibdMBuv1vMvR6Sng==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/css-color-parser': 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) - '@csstools/css-tokenizer': 2.2.1 - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.35) + '@csstools/css-color-parser': 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + '@csstools/css-parser-algorithms': 2.6.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 + '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) + '@csstools/utilities': 1.0.0(postcss@8.4.35) postcss: 8.4.35 dev: true @@ -6018,8 +6060,8 @@ packages: yaml: 2.3.4 dev: true - /postcss-logical@7.0.0(postcss@8.4.35): - resolution: {integrity: sha512-zYf3vHkoW82f5UZTEXChTJvH49Yl9X37axTZsJGxrCG2kOUwtaAoz9E7tqYg0lsIoJLybaL8fk/2mOi81zVIUw==} + /postcss-logical@7.0.1(postcss@8.4.35): + resolution: {integrity: sha512-8GwUQZE0ri0K0HJHkDv87XOLC8DE0msc+HoWLeKdtjDZEwpZ5xuK3QdV6FhmHSQW40LPkg43QzvATRAI3LsRkg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 @@ -6037,15 +6079,15 @@ packages: postcss: 8.4.35 postcss-selector-parser: 6.0.13 - /postcss-nesting@12.0.1(postcss@8.4.35): - resolution: {integrity: sha512-6LCqCWP9pqwXw/njMvNK0hGY44Fxc4B2EsGbn6xDcxbNRzP8GYoxT7yabVVMLrX3quqOJ9hg2jYMsnkedOf8pA==} + /postcss-nesting@12.0.3(postcss@8.4.35): + resolution: {integrity: sha512-yrtMRPFNkfZMv9ikBvZ/Eh3RxhpMBKQ3KzD7LCY8+jYVlgju/Mdcxi4JY8bW2Y7ISXw8GTLuF/o+kFtp+yaVfQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/selector-specificity': 3.0.0(postcss-selector-parser@6.0.13) + '@csstools/selector-specificity': 3.0.2(postcss-selector-parser@6.0.15) postcss: 8.4.35 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.15 dev: true /postcss-opacity-percentage@2.0.0(postcss@8.4.35): @@ -6057,8 +6099,8 @@ packages: postcss: 8.4.35 dev: true - /postcss-overflow-shorthand@5.0.0(postcss@8.4.35): - resolution: {integrity: sha512-2rlxDyeSics/hC2FuMdPnWiP9WUPZ5x7FTuArXLFVpaSQ2woPSfZS4RD59HuEokbZhs/wPUQJ1E3MT6zVv94MQ==} + /postcss-overflow-shorthand@5.0.1(postcss@8.4.35): + resolution: {integrity: sha512-XzjBYKLd1t6vHsaokMV9URBt2EwC9a7nDhpQpjoPk2HRTSQfokPfyAS/Q7AOrzUu6q+vp/GnrDBGuj/FCaRqrQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 @@ -6075,8 +6117,8 @@ packages: postcss: 8.4.35 dev: true - /postcss-place@9.0.0(postcss@8.4.35): - resolution: {integrity: sha512-qLEPD9VPH5opDVemwmRaujODF9nExn24VOC3ghgVLEvfYN7VZLwJHes0q/C9YR5hI2UC3VgBE8Wkdp1TxCXhtg==} + /postcss-place@9.0.1(postcss@8.4.35): + resolution: {integrity: sha512-JfL+paQOgRQRMoYFc2f73pGuG/Aw3tt4vYMR6UA3cWVMxivviPTnMFnFTczUJOA4K2Zga6xgQVE+PcLs64WC8Q==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 @@ -6085,83 +6127,83 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-preset-env@9.3.0(postcss@8.4.35): - resolution: {integrity: sha512-ycw6doPrqV6QxDCtgiyGDef61bEfiSc59HGM4gOw/wxQxmKnhuEery61oOC/5ViENz/ycpRsuhTexs1kUBTvVw==} + /postcss-preset-env@9.4.0(postcss@8.4.35): + resolution: {integrity: sha512-5X2UA4Dn4xo7sJFCxlzW/dAGo71Oxh/K5DVls33hd2e3j06OKnW5FJQTw2hB0wTnGv0f6WcMaVBGFqcEfAgwlw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - '@csstools/postcss-cascade-layers': 4.0.1(postcss@8.4.35) - '@csstools/postcss-color-function': 3.0.7(postcss@8.4.35) - '@csstools/postcss-color-mix-function': 2.0.7(postcss@8.4.35) - '@csstools/postcss-exponential-functions': 1.0.1(postcss@8.4.35) - '@csstools/postcss-font-format-keywords': 3.0.0(postcss@8.4.35) - '@csstools/postcss-gamut-mapping': 1.0.0(postcss@8.4.35) - '@csstools/postcss-gradients-interpolation-method': 4.0.7(postcss@8.4.35) - '@csstools/postcss-hwb-function': 3.0.6(postcss@8.4.35) - '@csstools/postcss-ic-unit': 3.0.2(postcss@8.4.35) - '@csstools/postcss-initial': 1.0.0(postcss@8.4.35) - '@csstools/postcss-is-pseudo-class': 4.0.3(postcss@8.4.35) - '@csstools/postcss-logical-float-and-clear': 2.0.0(postcss@8.4.35) - '@csstools/postcss-logical-overflow': 1.0.0(postcss@8.4.35) - '@csstools/postcss-logical-overscroll-behavior': 1.0.0(postcss@8.4.35) - '@csstools/postcss-logical-resize': 2.0.0(postcss@8.4.35) - '@csstools/postcss-logical-viewport-units': 2.0.3(postcss@8.4.35) - '@csstools/postcss-media-minmax': 1.1.0(postcss@8.4.35) - '@csstools/postcss-media-queries-aspect-ratio-number-values': 2.0.3(postcss@8.4.35) - '@csstools/postcss-nested-calc': 3.0.0(postcss@8.4.35) - '@csstools/postcss-normalize-display-values': 3.0.1(postcss@8.4.35) - '@csstools/postcss-oklab-function': 3.0.7(postcss@8.4.35) - '@csstools/postcss-progressive-custom-properties': 3.0.2(postcss@8.4.35) - '@csstools/postcss-relative-color-syntax': 2.0.7(postcss@8.4.35) - '@csstools/postcss-scope-pseudo-class': 3.0.0(postcss@8.4.35) - '@csstools/postcss-stepped-value-functions': 3.0.2(postcss@8.4.35) - '@csstools/postcss-text-decoration-shorthand': 3.0.3(postcss@8.4.35) - '@csstools/postcss-trigonometric-functions': 3.0.2(postcss@8.4.35) - '@csstools/postcss-unset-value': 3.0.0(postcss@8.4.35) + '@csstools/postcss-cascade-layers': 4.0.3(postcss@8.4.35) + '@csstools/postcss-color-function': 3.0.10(postcss@8.4.35) + '@csstools/postcss-color-mix-function': 2.0.10(postcss@8.4.35) + '@csstools/postcss-exponential-functions': 1.0.4(postcss@8.4.35) + '@csstools/postcss-font-format-keywords': 3.0.2(postcss@8.4.35) + '@csstools/postcss-gamut-mapping': 1.0.3(postcss@8.4.35) + '@csstools/postcss-gradients-interpolation-method': 4.0.10(postcss@8.4.35) + '@csstools/postcss-hwb-function': 3.0.9(postcss@8.4.35) + '@csstools/postcss-ic-unit': 3.0.4(postcss@8.4.35) + '@csstools/postcss-initial': 1.0.1(postcss@8.4.35) + '@csstools/postcss-is-pseudo-class': 4.0.5(postcss@8.4.35) + '@csstools/postcss-light-dark-function': 1.0.0(postcss@8.4.35) + '@csstools/postcss-logical-float-and-clear': 2.0.1(postcss@8.4.35) + '@csstools/postcss-logical-overflow': 1.0.1(postcss@8.4.35) + '@csstools/postcss-logical-overscroll-behavior': 1.0.1(postcss@8.4.35) + '@csstools/postcss-logical-resize': 2.0.1(postcss@8.4.35) + '@csstools/postcss-logical-viewport-units': 2.0.6(postcss@8.4.35) + '@csstools/postcss-media-minmax': 1.1.3(postcss@8.4.35) + '@csstools/postcss-media-queries-aspect-ratio-number-values': 2.0.6(postcss@8.4.35) + '@csstools/postcss-nested-calc': 3.0.2(postcss@8.4.35) + '@csstools/postcss-normalize-display-values': 3.0.2(postcss@8.4.35) + '@csstools/postcss-oklab-function': 3.0.10(postcss@8.4.35) + '@csstools/postcss-progressive-custom-properties': 3.1.0(postcss@8.4.35) + '@csstools/postcss-relative-color-syntax': 2.0.10(postcss@8.4.35) + '@csstools/postcss-scope-pseudo-class': 3.0.1(postcss@8.4.35) + '@csstools/postcss-stepped-value-functions': 3.0.5(postcss@8.4.35) + '@csstools/postcss-text-decoration-shorthand': 3.0.4(postcss@8.4.35) + '@csstools/postcss-trigonometric-functions': 3.0.5(postcss@8.4.35) + '@csstools/postcss-unset-value': 3.0.1(postcss@8.4.35) autoprefixer: 10.4.17(postcss@8.4.35) - browserslist: 4.22.1 - css-blank-pseudo: 6.0.0(postcss@8.4.35) - css-has-pseudo: 6.0.0(postcss@8.4.35) - css-prefers-color-scheme: 9.0.0(postcss@8.4.35) - cssdb: 7.9.0 + browserslist: 4.23.0 + css-blank-pseudo: 6.0.1(postcss@8.4.35) + css-has-pseudo: 6.0.2(postcss@8.4.35) + css-prefers-color-scheme: 9.0.1(postcss@8.4.35) + cssdb: 7.11.0 postcss: 8.4.35 - postcss-attribute-case-insensitive: 6.0.2(postcss@8.4.35) + postcss-attribute-case-insensitive: 6.0.3(postcss@8.4.35) postcss-clamp: 4.1.0(postcss@8.4.35) - postcss-color-functional-notation: 6.0.2(postcss@8.4.35) - postcss-color-hex-alpha: 9.0.2(postcss@8.4.35) - postcss-color-rebeccapurple: 9.0.1(postcss@8.4.35) - postcss-custom-media: 10.0.2(postcss@8.4.35) - postcss-custom-properties: 13.3.2(postcss@8.4.35) - postcss-custom-selectors: 7.1.6(postcss@8.4.35) - postcss-dir-pseudo-class: 8.0.0(postcss@8.4.35) - postcss-double-position-gradients: 5.0.2(postcss@8.4.35) - postcss-focus-visible: 9.0.0(postcss@8.4.35) - postcss-focus-within: 8.0.0(postcss@8.4.35) + postcss-color-functional-notation: 6.0.5(postcss@8.4.35) + postcss-color-hex-alpha: 9.0.4(postcss@8.4.35) + postcss-color-rebeccapurple: 9.0.3(postcss@8.4.35) + postcss-custom-media: 10.0.3(postcss@8.4.35) + postcss-custom-properties: 13.3.5(postcss@8.4.35) + postcss-custom-selectors: 7.1.7(postcss@8.4.35) + postcss-dir-pseudo-class: 8.0.1(postcss@8.4.35) + postcss-double-position-gradients: 5.0.4(postcss@8.4.35) + postcss-focus-visible: 9.0.1(postcss@8.4.35) + postcss-focus-within: 8.0.1(postcss@8.4.35) postcss-font-variant: 5.0.0(postcss@8.4.35) - postcss-gap-properties: 5.0.0(postcss@8.4.35) - postcss-image-set-function: 6.0.1(postcss@8.4.35) - postcss-lab-function: 6.0.7(postcss@8.4.35) - postcss-logical: 7.0.0(postcss@8.4.35) - postcss-nesting: 12.0.1(postcss@8.4.35) + postcss-gap-properties: 5.0.1(postcss@8.4.35) + postcss-image-set-function: 6.0.3(postcss@8.4.35) + postcss-lab-function: 6.0.10(postcss@8.4.35) + postcss-logical: 7.0.1(postcss@8.4.35) + postcss-nesting: 12.0.3(postcss@8.4.35) postcss-opacity-percentage: 2.0.0(postcss@8.4.35) - postcss-overflow-shorthand: 5.0.0(postcss@8.4.35) + postcss-overflow-shorthand: 5.0.1(postcss@8.4.35) postcss-page-break: 3.0.4(postcss@8.4.35) - postcss-place: 9.0.0(postcss@8.4.35) - postcss-pseudo-class-any-link: 9.0.0(postcss@8.4.35) + postcss-place: 9.0.1(postcss@8.4.35) + postcss-pseudo-class-any-link: 9.0.1(postcss@8.4.35) postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.35) - postcss-selector-not: 7.0.1(postcss@8.4.35) - postcss-value-parser: 4.2.0 + postcss-selector-not: 7.0.2(postcss@8.4.35) dev: true - /postcss-pseudo-class-any-link@9.0.0(postcss@8.4.35): - resolution: {integrity: sha512-QNCYIL98VKFKY6HGDEJpF6+K/sg9bxcUYnOmNHJxZS5wsFDFaVoPeG68WAuhsqwbIBSo/b9fjEnTwY2mTSD+uA==} + /postcss-pseudo-class-any-link@9.0.1(postcss@8.4.35): + resolution: {integrity: sha512-cKYGGZ9yzUZi+dZd7XT2M8iSDfo+T2Ctbpiizf89uBTBfIpZpjvTavzIJXpCReMVXSKROqzpxClNu6fz4DHM0Q==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: postcss: 8.4.35 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.15 dev: true /postcss-replace-overflow-wrap@4.0.0(postcss@8.4.35): @@ -6190,14 +6232,14 @@ packages: postcss: 8.4.35 dev: true - /postcss-selector-not@7.0.1(postcss@8.4.35): - resolution: {integrity: sha512-1zT5C27b/zeJhchN7fP0kBr16Cc61mu7Si9uWWLoA3Px/D9tIJPKchJCkUH3tPO5D0pCFmGeApAv8XpXBQJ8SQ==} + /postcss-selector-not@7.0.2(postcss@8.4.35): + resolution: {integrity: sha512-/SSxf/90Obye49VZIfc0ls4H0P6i6V1iHv0pzZH8SdgvZOPFkF37ef1r5cyWcMflJSFJ5bfuoluTnFnBBFiuSA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: postcss: 8.4.35 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.15 dev: true /postcss-selector-parser@6.0.13: @@ -6207,6 +6249,14 @@ packages: cssesc: 3.0.0 util-deprecate: 1.0.2 + /postcss-selector-parser@6.0.15: + resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + /postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -7239,17 +7289,6 @@ packages: webpack-virtual-modules: 0.5.0 dev: false - /update-browserslist-db@1.0.13(browserslist@4.22.1): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.22.1 - escalade: 3.1.1 - picocolors: 1.0.0 - dev: true - /update-browserslist-db@1.0.13(browserslist@4.22.2): resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true @@ -7261,6 +7300,17 @@ packages: picocolors: 1.0.0 dev: true + /update-browserslist-db@1.0.13(browserslist@4.23.0): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.23.0 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: diff --git a/src/lib/utils/db/categoryUtils.ts b/src/lib/utils/db/categoryUtils.ts new file mode 100644 index 0000000..07d4cb2 --- /dev/null +++ b/src/lib/utils/db/categoryUtils.ts @@ -0,0 +1,77 @@ +import kebabCase from 'just-kebab-case'; +import db from '$lib/drizzle'; +import { externalIds, type Mechanics, type Categories, categories, categoriesToExternalIds } from '../../../schema'; +import { eq } from 'drizzle-orm'; +import { error } from '@sveltejs/kit'; +import { PUBLIC_SITE_URL } from '$env/static/public'; + +export async function createCategory(locals: App.Locals, category: Categories, externalId: string) { + if (!category || !externalId || externalId === '') { + error(400, 'Invalid Request'); + } + + try { + const dbExternalId = await db.query.externalIds.findFirst({ + where: eq(externalIds.externalId, externalId) + }); + + if (dbExternalId) { + const foundCategory = await db + .select({ + id: categories.id, + name: categories.name, + slug: categories.slug + }) + .from(categories) + .leftJoin(categoriesToExternalIds, eq(categoriesToExternalIds.externalId, externalId)); + console.log('Mechanic already exists', foundCategory); + if (foundCategory.length > 0) { + console.log('Mechanic name', foundCategory[0].name); + return new Response('Mechanic already exists', { + headers: { + 'Content-Type': 'application/json', + Location: `${PUBLIC_SITE_URL}/api/mechanic/${foundCategory[0].id}` + }, + status: 409 + }); + } + } + + let dbCategory: Mechanics[] = []; + console.log('Creating category', JSON.stringify(category, null, 2)); + await db.transaction(async (transaction) => { + dbCategory = await transaction + .insert(categories) + .values({ + name: category.name, + slug: kebabCase(category.name || category.slug || '') + }) + .returning(); + const dbExternalIds = await transaction + .insert(externalIds) + .values({ + externalId, + type: 'category' + }) + .returning({ id: externalIds.id }); + await transaction.insert(categoriesToExternalIds).values({ + categoryId: dbCategory[0].id, + externalId: dbExternalIds[0].id + }); + }); + + if (dbCategory.length === 0) { + return new Response('Could not create category', { + status: 500 + }); + } + + console.log('Created category', JSON.stringify(dbCategory[0], null, 2)); + return new Response(JSON.stringify(dbCategory[0]), { + status: 201, + }); + } catch (e) { + console.error(e); + throw new Error('Something went wrong creating Category'); + } +} diff --git a/src/lib/utils/db/expansionUtils.ts b/src/lib/utils/db/expansionUtils.ts new file mode 100644 index 0000000..4330435 --- /dev/null +++ b/src/lib/utils/db/expansionUtils.ts @@ -0,0 +1,178 @@ +import { error } from '@sveltejs/kit'; +import { and, eq } from 'drizzle-orm'; +import db from '$lib/drizzle'; +import { type Expansions, expansions } from '../../../schema'; +import { PUBLIC_SITE_URL } from '$env/static/public'; + +export async function createExpansion(locals: App.Locals, expansion: Expansions) { + if (!expansion || expansion?.base_game_id === '' || expansion?.game_id === '') { + error(400, 'Invalid Request'); + } + + try { + const foundExpansion = await db.query.expansions + .findFirst({ + where: and(eq(expansions.base_game_id, expansion.base_game_id), eq(expansions.game_id, expansion.game_id)), + columns: { + id: true, + game_id: true, + base_game_id: true + } + }); + console.log('Expansion already exists', foundExpansion); + if (foundExpansion) { + console.log('Expansion Game ID', foundExpansion.game_id); + return new Response('Expansion already exists', { + headers: { + 'Content-Type': 'application/json', + Location: `${PUBLIC_SITE_URL}/api/game/${foundExpansion.game_id}` + }, + status: 409 + }); + } + + console.log('Creating expansion', JSON.stringify(expansion, null, 2)); + const dbExpansion = await db + .insert(expansions) + .values({ + base_game_id: expansion.base_game_id, + game_id: expansion.game_id, + }) + .returning(); + + if (dbExpansion.length === 0) { + return new Response('Could not create expansion', { + status: 500 + }); + } + + console.log('Created expansion', JSON.stringify(dbExpansion[0], null, 2)); + return new Response(JSON.stringify(dbExpansion[0]), { + status: 201, + }); + } catch (e) { + console.error(e); + throw new Error('Something went wrong creating Expansion'); + } +} + +// export async function createExpansion( +// locals: App.Locals, +// game: Game, +// externalExpansion: BggLinkDto, +// gameIsExpansion: boolean, +// eventFetch: Function +// ) { +// try { +// let dbExpansionGame = await prisma.game.findUnique({ +// where: { +// external_id: externalExpansion.id +// } +// }); + +// if (!dbExpansionGame) { +// const externalGameResponse = await eventFetch( +// `/api/external/game/${externalExpansion.id}?simplified=true` +// ); +// if (externalGameResponse.ok) { +// const externalGame = await externalGameResponse.json(); +// console.log('externalGame', externalGame); +// const boredGame = mapAPIGameToBoredGame(externalGame); +// dbExpansionGame = await createOrUpdateGameMinimal(locals, boredGame); +// } else { +// throw new Error( +// `${gameIsExpansion ? 'Base game' : 'Expansion game'} not found and failed to create.` +// ); +// } +// } + +// let dbExpansion; +// let baseGameId; +// let gameId; +// if (gameIsExpansion) { +// console.log( +// 'External expansion is expansion. Looking for base game', +// JSON.stringify(game, null, 2) +// ); +// dbExpansion = await prisma.expansion.findFirst({ +// where: { +// game_id: dbExpansionGame.id +// }, +// select: { +// id: true, +// base_game_id: true, +// game_id: true +// } +// }); +// baseGameId = game.id; +// gameId = dbExpansionGame.id; +// } else { +// console.log( +// 'External Expansion is base game. Looking for expansion', +// JSON.stringify(game, null, 2) +// ); +// dbExpansion = await prisma.expansion.findFirst({ +// where: { +// base_game_id: dbExpansionGame.id +// }, +// select: { +// id: true, +// base_game_id: true, +// game_id: true +// } +// }); +// baseGameId = dbExpansionGame.id; +// gameId = game.id; +// } + +// if (dbExpansion) { +// console.log('Expansion already exists', JSON.stringify(dbExpansion, null, 2)); +// return dbExpansion; +// } + +// console.log(`Creating expansion. baseGameId: ${baseGameId}, gameId: ${gameId}`); +// const expansion = await prisma.expansion.create({ +// data: { +// base_game_id: baseGameId, +// game_id: gameId +// } +// }); + +// console.log('Created expansion', JSON.stringify(expansion, null, 2)); + +// if (gameIsExpansion) { +// console.log('Connecting current game to expansion'); +// await prisma.game.update({ +// where: { +// id: gameId +// }, +// data: { +// expansions: { +// connect: { +// id: expansion.id +// } +// } +// } +// }); +// } else { +// console.log('Connecting current game to base game'); +// await prisma.game.update({ +// where: { +// id: baseGameId +// }, +// data: { +// expansions: { +// connect: { +// id: expansion.id +// } +// } +// } +// }); +// } + +// return expansion; +// } catch (e) { +// console.error(e); +// throw new Error('Something went wrong creating Expansion'); +// } +// } \ No newline at end of file diff --git a/src/lib/utils/db/gameUtils.ts b/src/lib/utils/db/gameUtils.ts new file mode 100644 index 0000000..7ae301a --- /dev/null +++ b/src/lib/utils/db/gameUtils.ts @@ -0,0 +1,422 @@ +import kebabCase from 'just-kebab-case'; +import db from '$lib/drizzle'; +import { externalIds, gamesToExternalIds, type Games, games } from '../../../schema'; +import { eq } from 'drizzle-orm'; +import { error } from '@sveltejs/kit'; +import { PUBLIC_SITE_URL } from '$env/static/public'; + +export async function createGame(locals: App.Locals, game: Games, externalId: string) { + if (!game || !externalId || externalId === '') { + error(400, 'Invalid Request'); + } + + try { + const dbExternalId = await db.query.externalIds.findFirst({ + where: eq(externalIds.externalId, externalId) + }); + + if (dbExternalId) { + const foundGame = await db + .select({ + id: games.id, + name: games.name, + slug: games.slug + }) + .from(games) + .leftJoin(gamesToExternalIds, eq(gamesToExternalIds.externalId, externalId)); + console.log('Game already exists', foundGame); + if (foundGame.length > 0) { + console.log('Game name', foundGame[0].name); + return new Response('Game already exists', { + headers: { + 'Content-Type': 'application/json', + Location: `${PUBLIC_SITE_URL}/api/game/${foundGame[0].id}` + }, + status: 409 + }); + } + } + + let dbGames: Games[] = []; + console.log('Creating game', JSON.stringify(game, null, 2)); + await db.transaction(async (transaction) => { + dbGames = await transaction + .insert(games) + .values({ + name: game.name, + slug: kebabCase(game.name || game.slug || ''), + description: game.description, + year_published: game.year_published, + url: game.url, + image_url: game.image_url, + thumb_url: game.thumb_url, + min_age: game.min_age, + min_players: game.min_players, + max_players: game.max_players, + min_playtime: game.min_playtime, + max_playtime: game.max_playtime + }) + .returning(); + const dbExternalIds = await transaction + .insert(externalIds) + .values({ + externalId, + type: 'game' + }) + .returning({ id: externalIds.id }); + await transaction.insert(gamesToExternalIds).values({ + gameId: dbGames[0].id, + externalId: dbExternalIds[0].id + }); + }); + + if (dbGames.length === 0) { + return new Response('Could not create game', { + status: 500 + }); + } + + console.log('Created game', JSON.stringify(dbGames[0], null, 2)); + return new Response(JSON.stringify(dbGames[0]), { + status: 201, + }); + } catch (e) { + console.error(e); + throw new Error('Something went wrong creating Game'); + } +} + +export async function createOrUpdateGameMinimal(locals: App.Locals, game: Games, externalId: string) { + if (!game || !externalId || externalId === '') { + error(400, 'Invalid Request'); + } + + console.log('Creating or updating minimal game data', JSON.stringify(game, null, 2)); + const externalUrl = `https://boardgamegeek.com/boardgame/${externalId}`; + try { + let dbGames: Games[] = []; + console.log('Creating game', JSON.stringify(game, null, 2)); + await db.transaction(async (transaction) => { + dbGames = await transaction + .insert(games) + .values({ + name: game.name, + slug: kebabCase(game.name || game.slug || ''), + description: game.description, + year_published: game.year_published, + url: externalUrl, + image_url: game.image_url, + thumb_url: game.thumb_url, + min_age: game.min_age, + min_players: game.min_players, + max_players: game.max_players, + min_playtime: game.min_playtime, + max_playtime: game.max_playtime + }) + .onConflictDoUpdate({ + target: games.id, + set: { + name: game.name, + slug: kebabCase(game.name || game.slug || ''), + description: game.description, + year_published: game.year_published, + url: externalUrl, + image_url: game.image_url, + thumb_url: game.thumb_url, + min_age: game.min_age, + min_players: game.min_players, + max_players: game.max_players, + min_playtime: game.min_playtime, + max_playtime: game.max_playtime + } + }) + .returning(); + const dbExternalIds = await transaction + .insert(externalIds) + .values({ + externalId, + type: 'game' + }) + .onConflictDoNothing() + .returning({ id: externalIds.id }); + await transaction.insert(gamesToExternalIds).values({ + gameId: dbGames[0].id, + externalId: dbExternalIds[0].id + }).onConflictDoNothing(); + }); + + if (dbGames.length === 0) { + return new Response('Could not create game', { + status: 500 + }); + } + + console.log('Created game', JSON.stringify(dbGames[0], null, 2)); + return new Response(JSON.stringify(dbGames[0]), { + status: 201, + }); + } catch (e) { + console.error(e); + throw new Error('Something went wrong creating Game'); + } +} + +export async function createOrUpdateGame(locals: App.Locals, game: Games, externalId: string) { + if (!game || !externalId || externalId === '') { + error(400, 'Invalid Request'); + } + + try { + const externalUrl = `https://boardgamegeek.com/boardgame/${externalId}`; + const dbExternalId = await db.query.externalIds.findFirst({ + where: eq(externalIds.externalId, externalId) + }); + + if (dbExternalId) { + const foundGame = await db + .select({ + id: games.id, + name: games.name, + slug: games.slug + }) + .from(games) + .leftJoin(gamesToExternalIds, eq(gamesToExternalIds.externalId, externalId)); + console.log('Game already exists', foundGame); + if (foundGame.length > 0) { + console.log('Game name', foundGame[0].name); + return new Response('Game already exists', { + headers: { + 'Content-Type': 'application/json', + Location: `${PUBLIC_SITE_URL}/api/game/${foundGame[0].id}` + }, + status: 409 + }); + } + } + + let dbGames: Games[] = []; + console.log('Creating game', JSON.stringify(game, null, 2)); + await db.transaction(async (transaction) => { + dbGames = await transaction + .insert(games) + .values({ + name: game.name, + slug: kebabCase(game.name || game.slug || ''), + description: game.description, + year_published: game.year_published, + url: game.url, + image_url: game.image_url, + thumb_url: game.thumb_url, + min_age: game.min_age, + min_players: game.min_players, + max_players: game.max_players, + min_playtime: game.min_playtime, + max_playtime: game.max_playtime + }) + .onConflictDoUpdate({ + target: games.id, + set: { + name: game.name, + slug: kebabCase(game.name || game.slug || ''), + description: game.description, + year_published: game.year_published, + url: externalUrl, + image_url: game.image_url, + thumb_url: game.thumb_url, + min_age: game.min_age, + min_players: game.min_players, + max_players: game.max_players, + min_playtime: game.min_playtime, + max_playtime: game.max_playtime + } + }) + .returning(); + const dbExternalIds = await transaction + .insert(externalIds) + .values({ + externalId, + type: 'game' + }) + .onConflictDoNothing() + .returning({ id: externalIds.id }); + await transaction.insert(gamesToExternalIds).values({ + gameId: dbGames[0].id, + externalId: dbExternalIds[0].id + }).onConflictDoNothing(); + }); + + if (dbGames.length === 0) { + return new Response('Could not create game', { + status: 500 + }); + } + + console.log('Created game', JSON.stringify(dbGames[0], null, 2)); + return new Response(JSON.stringify(dbGames[0]), { + status: 201, + }); + } catch (e) { + console.error(e); + throw new Error('Something went wrong creating Game'); + } +} + +export async function updateGame(locals: App.Locals, game: Games, id: string) { + if (!game || !id || id === '') { + error(400, 'Invalid Request'); + } + + try { + const dbGame = await db + .update(games) + .set({ + name: game.name, + slug: kebabCase(game.name || game.slug || ''), + description: game.description, + year_published: game.year_published, + url: game.url, + image_url: game.image_url, + thumb_url: game.thumb_url, + min_age: game.min_age, + min_players: game.min_players, + max_players: game.max_players, + min_playtime: game.min_playtime, + max_playtime: game.max_playtime + }) + .where(eq(games.id, id)) + .returning(); + return new Response(JSON.stringify(dbGame[0]), { + headers: { + 'Content-Type': 'application/json' + } + }); + } catch (e) { + console.error(e); + return new Response('Could not get publishers', { + status: 500 + }); + } +} + +// console.log('Creating or updating game', JSON.stringify(game, null, 2)); + // const categoryIds = game.categories; + // const mechanicIds = game.mechanics; + // const publisherIds = game.publishers; + // const designerIds = game.designers; + // const artistIds = game.artists; + // // const expansionIds = game.expansions; + // const externalUrl = `https://boardgamegeek.com/boardgame/${game.external_id}`; + // console.log('categoryIds', categoryIds); + // console.log('mechanicIds', mechanicIds); + // await db.transaction(async (transaction) => { + // const dbGame = await db.transaction(async (transaction) => { + // transaction.insert(games).values({ + // name: game.name, + // slug: kebabCase(game.name || ''), + // description: game.description, + // external_id: game.external_id, + // url: externalUrl, + // thumb_url: game.thumb_url, + // image_url: game.image_url, + // min_age: game.min_age || 0, + // min_players: game.min_players || 0, + // max_players: game.max_players || 0, + // min_playtime: game.min_playtime || 0, + // max_playtime: game.max_playtime || 0, + // year_published: game.year_published || 0, + // last_sync_at: new Date(), + // }).onConflictDoUpdate({ + // target: games.id, set: { + // name: game.name, + // slug: kebabCase(game.name), + // description: game.description, + // external_id: game.external_id, + // url: externalUrl, + // thumb_url: game.thumb_url, + // image_url: game.image_url, + // min_age: game.min_age || 0, + // min_players: game.min_players || 0, + // max_players: game.max_players || 0, + // min_playtime: game.min_playtime || 0, + // max_playtime: game.max_playtime || 0, + // year_published: game.year_published || 0, + // last_sync_at: new Date(), + // } + // }).returning(); + // }); + // // TODO: Connect to everything else + // }); + // await db.insert(games).values({ + // include: { + // mechanics: true, + // publishers: true, + // designers: true, + // artists: true, + // expansions: true + // }, + // where: { + // external_id: game.external_id + // }, + // create: { + // name: game.name, + // slug: kebabCase(game.name), + // description: game.description, + // external_id: game.external_id, + // url: externalUrl, + // thumb_url: game.thumb_url, + // image_url: game.image_url, + // min_age: game.min_age || 0, + // min_players: game.min_players || 0, + // max_players: game.max_players || 0, + // min_playtime: game.min_playtime || 0, + // max_playtime: game.max_playtime || 0, + // year_published: game.year_published || 0, + // last_sync_at: new Date(), + // categories: { + // connect: categoryIds + // }, + // mechanics: { + // connect: mechanicIds + // }, + // publishers: { + // connect: publisherIds + // }, + // designers: { + // connect: designerIds + // }, + // artists: { + // connect: artistIds + // } + // }, + // update: { + // name: game.name, + // slug: kebabCase(game.name), + // description: game.description, + // external_id: game.external_id, + // url: externalUrl, + // thumb_url: game.thumb_url, + // image_url: game.image_url, + // min_age: game.min_age || 0, + // min_players: game.min_players || 0, + // max_players: game.max_players || 0, + // min_playtime: game.min_playtime || 0, + // max_playtime: game.max_playtime || 0, + // year_published: game.year_published || 0, + // last_sync_at: new Date(), + // categories: { + // connect: categoryIds + // }, + // mechanics: { + // connect: mechanicIds + // }, + // publishers: { + // connect: publisherIds + // }, + // designers: { + // connect: designerIds + // }, + // artists: { + // connect: artistIds + // } + // } + // }); \ No newline at end of file diff --git a/src/lib/utils/db/mechanicUtils.ts b/src/lib/utils/db/mechanicUtils.ts new file mode 100644 index 0000000..5030065 --- /dev/null +++ b/src/lib/utils/db/mechanicUtils.ts @@ -0,0 +1,77 @@ +import kebabCase from 'just-kebab-case'; +import db from '$lib/drizzle'; +import { externalIds, mechanics, mechanicsToExternalIds, type Mechanics } from '../../../schema'; +import { eq } from 'drizzle-orm'; +import { error } from '@sveltejs/kit'; +import { PUBLIC_SITE_URL } from '$env/static/public'; + +export async function createMechanic(locals: App.Locals, mechanic: Mechanics, externalId: string) { + if (!mechanic || !externalId || externalId === '') { + error(400, 'Invalid Request'); + } + + try { + const dbExternalId = await db.query.externalIds.findFirst({ + where: eq(externalIds.externalId, externalId) + }); + + if (dbExternalId) { + const foundMechanic = await db + .select({ + id: mechanics.id, + name: mechanics.name, + slug: mechanics.slug + }) + .from(mechanics) + .leftJoin(mechanicsToExternalIds, eq(mechanicsToExternalIds.externalId, externalId)); + console.log('Mechanic already exists', foundMechanic); + if (foundMechanic.length > 0) { + console.log('Mechanic name', foundMechanic[0].name); + return new Response('Mechanic already exists', { + headers: { + 'Content-Type': 'application/json', + Location: `${PUBLIC_SITE_URL}/api/mechanic/${foundMechanic[0].id}` + }, + status: 409 + }); + } + } + + let dbMechanics: Mechanics[] = []; + console.log('Creating mechanic', JSON.stringify(mechanic, null, 2)); + await db.transaction(async (transaction) => { + dbMechanics = await transaction + .insert(mechanics) + .values({ + name: mechanic.name, + slug: kebabCase(mechanic.name || mechanic.slug || '') + }) + .returning(); + const dbExternalIds = await transaction + .insert(externalIds) + .values({ + externalId, + type: 'mechanic' + }) + .returning({ id: externalIds.id }); + await transaction.insert(mechanicsToExternalIds).values({ + mechanicId: dbMechanics[0].id, + externalId: dbExternalIds[0].id + }); + }); + + if (dbMechanics.length === 0) { + return new Response('Could not create mechanic', { + status: 500 + }); + } + + console.log('Created mechanic', JSON.stringify(dbMechanics[0], null, 2)); + return new Response(JSON.stringify(dbMechanics[0]), { + status: 201, + }); + } catch (e) { + console.error(e); + throw new Error('Something went wrong creating Mechanic'); + } +} diff --git a/src/lib/utils/db/publisherUtils.ts b/src/lib/utils/db/publisherUtils.ts new file mode 100644 index 0000000..40aeea0 --- /dev/null +++ b/src/lib/utils/db/publisherUtils.ts @@ -0,0 +1,125 @@ +import { error } from '@sveltejs/kit'; +import { eq } from 'drizzle-orm'; +import kebabCase from 'just-kebab-case'; +import db from '$lib/drizzle'; +import { + externalIds, + publishersToExternalIds, + type Publishers, + publishers, +} from '../../../schema'; +import { PUBLIC_SITE_URL } from '$env/static/public'; + +export async function getPublisher(locals: App.Locals, id: string) { + const publisher = await db.select().from(publishers).where(eq(publishers.id, id)); + if (publisher.length === 0) { + error(404, 'not found'); + } + return new Response(JSON.stringify(publisher[0]), { + headers: { + 'Content-Type': 'application/json' + } + }); +} + +export async function updatePublisher(locals: App.Locals, publisher: Publishers, id: string) { + if (!publisher || publisher.name === '' || !id || id === '') { + error(400, 'Invalid Request'); + } + + try { + const dbPublisher = await db + .update(publishers) + .set({ + name: publisher.name, + slug: kebabCase(publisher.name || '') + }) + .where(eq(publishers.id, id)) + .returning(); + return new Response(JSON.stringify(dbPublisher[0]), { + headers: { + 'Content-Type': 'application/json' + } + }); + } catch (e) { + console.error(e); + return new Response('Could not get publishers', { + status: 500 + }); + } +} + +export async function createPublisher( + locals: App.Locals, + publisher: Publishers, + externalId: string +) { + if (!publisher || !externalId || externalId === '') { + error(400, 'Invalid Request'); + } + + try { + const dbExternalId = await db.query.externalIds.findFirst({ + where: eq(externalIds.externalId, externalId) + }); + + if (dbExternalId) { + const foundPublisher = await db + .select({ + id: publishers.id, + name: publishers.name, + slug: publishers.slug + }) + .from(publishers) + .leftJoin(publishersToExternalIds, eq(publishersToExternalIds.externalId, externalId)); + console.log('Publisher already exists', foundPublisher); + if (foundPublisher.length > 0) { + console.log('Publisher name', foundPublisher[0].name); + return new Response('Publisher already exists', { + headers: { + 'Content-Type': 'application/json', + Location: `${PUBLIC_SITE_URL}/api/publisher/${foundPublisher[0].id}` + }, + status: 409 + }); + } + } + + let dbPublishers: Publishers[] = []; + console.log('Creating publisher', JSON.stringify(publisher, null, 2)); + await db.transaction(async (transaction) => { + dbPublishers = await transaction + .insert(publishers) + .values({ + name: publisher.name, + slug: kebabCase(publisher.name || publisher.slug || '') + }) + .returning(); + const dbExternalIds = await transaction + .insert(externalIds) + .values({ + externalId, + type: 'publisher' + }) + .returning({ id: externalIds.id }); + await transaction.insert(publishersToExternalIds).values({ + publisherId: dbPublishers[0].id, + externalId: dbExternalIds[0].id + }); + }); + + if (dbPublishers.length === 0) { + return new Response('Could not create publisher', { + status: 500 + }); + } + + console.log('Created publisher', JSON.stringify(dbPublishers[0], null, 2)); + return new Response(JSON.stringify(dbPublishers[0]), { + status: 201, + }); + } catch (e) { + console.error(e); + throw new Error('Something went wrong creating Publisher'); + } +} \ No newline at end of file diff --git a/src/lib/utils/dbUtils.ts b/src/lib/utils/dbUtils.ts deleted file mode 100644 index 6619824..0000000 --- a/src/lib/utils/dbUtils.ts +++ /dev/null @@ -1,415 +0,0 @@ -import type { Game } from '@prisma/client'; -import kebabCase from 'just-kebab-case'; -import type { BggLinkDto } from 'boardgamegeekclient/dist/esm/dto/concrete/subdto'; -import { mapAPIGameToBoredGame } from './gameMapper'; -import db from '$lib/drizzle'; -import { externalIds, games, publishersToExternalIds, type Publishers, publishers } from '../../schema'; -import { eq, sql } from 'drizzle-orm'; -import { error } from '@sveltejs/kit'; - -export async function createPublisher(locals: App.Locals, publisher: Publishers, externalId: string) { - if (!publisher || !externalId || externalId === '') { - error(400, 'Invalid Request'); - } - - try { - let dbExternalId = await db.query.externalIds.findFirst({ - where: eq(externalIds.id, externalId), - }); - - if (dbExternalId) { - const dbPublisher = await db.select().from(publishers).leftJoin(publishersToExternalIds, eq(publishersToExternalIds.externalId, externalId)); - } - let dbPublisher = await db.query.publishers.findFirst({ - where: eq(publishers.external_id, externalPublisher.id), - columns: { - id: true, - name: true, - slug: true, - external_id: true - }, - with: { - publishersToExternalIds: { - columns: { - externalId: true - } - } - } - }); - if (dbPublisher) { - console.log('Publisher already exists', dbPublisher.name); - return dbPublisher; - } - console.log('Creating publisher', JSON.stringify(externalPublisher, null, 2)); - let publisher = await prisma.publisher.create({ - data: { - name: externalPublisher.value, - external_id: externalPublisher.id, - slug: kebabCase(externalPublisher.value) - }, - select: { - id: true, - name: true, - slug: true, - external_id: true - } - }); - - console.log('Created publisher', JSON.stringify(publisher, null, 2)); - return publisher; - } catch (e) { - console.error(e); - throw new Error('Something went wrong creating Publisher'); - } -} - -export async function createCategory(locals: App.Locals, externalCategory: BggLinkDto) { - try { - let dbCategory = await prisma.category.findFirst({ - where: { - external_id: externalCategory.id - }, - select: { - id: true, - name: true, - slug: true, - external_id: true - } - }); - if (dbCategory) { - console.log('Category already exists', dbCategory.name); - return dbCategory; - } - console.log('Creating category', JSON.stringify(externalCategory, null, 2)); - let category = await prisma.category.create({ - data: { - name: externalCategory.value, - external_id: externalCategory.id, - slug: kebabCase(externalCategory.value) - }, - select: { - id: true, - name: true, - slug: true, - external_id: true - } - }); - - console.log('Created category', JSON.stringify(category, null, 2)); - - return category; - } catch (e) { - console.error(e); - throw new Error('Something went wrong creating Category'); - } -} - -export async function createMechanic(locals: App.Locals, externalMechanic: BggLinkDto) { - try { - let dbMechanic = await prisma.mechanic.findFirst({ - where: { - external_id: externalMechanic.id - }, - select: { - id: true, - name: true, - slug: true, - external_id: true - } - }); - if (dbMechanic) { - console.log('Mechanic already exists', dbMechanic.name); - return dbMechanic; - } - console.log('Creating mechanic', JSON.stringify(externalMechanic, null, 2)); - let mechanic = await prisma.mechanic.upsert({ - where: { - external_id: externalMechanic.id - }, - create: { - name: externalMechanic.value, - external_id: externalMechanic.id, - slug: kebabCase(externalMechanic.value) - }, - update: { - name: externalMechanic.value, - slug: kebabCase(externalMechanic.value) - } - }); - - console.log('Created mechanic', JSON.stringify(mechanic, null, 2)); - - return mechanic; - } catch (e) { - console.error(e); - throw new Error('Something went wrong creating Mechanic'); - } -} - -export async function createExpansion( - locals: App.Locals, - game: Game, - externalExpansion: BggLinkDto, - gameIsExpansion: boolean, - eventFetch: Function -) { - try { - let dbExpansionGame = await prisma.game.findUnique({ - where: { - external_id: externalExpansion.id - } - }); - - if (!dbExpansionGame) { - const externalGameResponse = await eventFetch( - `/api/external/game/${externalExpansion.id}?simplified=true` - ); - if (externalGameResponse.ok) { - const externalGame = await externalGameResponse.json(); - console.log('externalGame', externalGame); - let boredGame = mapAPIGameToBoredGame(externalGame); - dbExpansionGame = await createOrUpdateGameMinimal(locals, boredGame); - } else { - throw new Error( - `${gameIsExpansion ? 'Base game' : 'Expansion game'} not found and failed to create.` - ); - } - } - - let dbExpansion; - let baseGameId; - let gameId; - if (gameIsExpansion) { - console.log( - 'External expansion is expansion. Looking for base game', - JSON.stringify(game, null, 2) - ); - dbExpansion = await prisma.expansion.findFirst({ - where: { - game_id: dbExpansionGame.id - }, - select: { - id: true, - base_game_id: true, - game_id: true - } - }); - baseGameId = game.id; - gameId = dbExpansionGame.id; - } else { - console.log( - 'External Expansion is base game. Looking for expansion', - JSON.stringify(game, null, 2) - ); - dbExpansion = await prisma.expansion.findFirst({ - where: { - base_game_id: dbExpansionGame.id - }, - select: { - id: true, - base_game_id: true, - game_id: true - } - }); - baseGameId = dbExpansionGame.id; - gameId = game.id; - } - - if (dbExpansion) { - console.log('Expansion already exists', JSON.stringify(dbExpansion, null, 2)); - return dbExpansion; - } - - console.log(`Creating expansion. baseGameId: ${baseGameId}, gameId: ${gameId}`); - let expansion = await prisma.expansion.create({ - data: { - base_game_id: baseGameId, - game_id: gameId - } - }); - - console.log('Created expansion', JSON.stringify(expansion, null, 2)); - - if (gameIsExpansion) { - console.log('Connecting current game to expansion'); - await prisma.game.update({ - where: { - id: gameId - }, - data: { - expansions: { - connect: { - id: expansion.id - } - } - } - }); - } else { - console.log('Connecting current game to base game'); - await prisma.game.update({ - where: { - id: baseGameId - }, - data: { - expansions: { - connect: { - id: expansion.id - } - } - } - }); - } - - return expansion; - } catch (e) { - console.error(e); - throw new Error('Something went wrong creating Expansion'); - } -} - -export async function createOrUpdateGameMinimal(locals: App.Locals, game: Game) { - console.log('Creating or updating minimal game data', JSON.stringify(game, null, 2)); - const externalUrl = `https://boardgamegeek.com/boardgame/${game.external_id}`; - await db.insert(games).values({ - external_id: game.external_id, - name: game.name, - slug: kebabCase(game.name), - description: game.description, - url: externalUrl, - thumb_url: game.thumb_url, - image_url: game.image_url, - min_age: game.min_age || 0, - min_players: game.min_players || 0, - max_players: game.max_players || 0, - min_playtime: game.min_playtime || 0, - max_playtime: game.max_playtime || 0, - year_published: game.year_published || 0, - }).onDuplicateKeyUpdate({ set: { external_id: sql`external_id` } }); - - return db.query.games.findFirst({ where: eq(games.external_id, game.external_id) }); -} - -export async function createOrUpdateGame(locals: App.Locals, game: Game) { - console.log('Creating or updating game', JSON.stringify(game, null, 2)); - const categoryIds = game.categories; - const mechanicIds = game.mechanics; - const publisherIds = game.publishers; - const designerIds = game.designers; - const artistIds = game.artists; - // const expansionIds = game.expansions; - const externalUrl = `https://boardgamegeek.com/boardgame/${game.external_id}`; - console.log('categoryIds', categoryIds); - console.log('mechanicIds', mechanicIds); - await db.transaction(async (transaction) => { - const dbGame = await transaction.insert(games).values({ - name: game.name, - slug: kebabCase(game.name), - description: game.description, - external_id: game.external_id, - url: externalUrl, - thumb_url: game.thumb_url, - image_url: game.image_url, - min_age: game.min_age || 0, - min_players: game.min_players || 0, - max_players: game.max_players || 0, - min_playtime: game.min_playtime || 0, - max_playtime: game.max_playtime || 0, - year_published: game.year_published || 0, - last_sync_at: new Date(), - }).onConflictDoUpdate({ - target: games.id, set: { - name: game.name, - slug: kebabCase(game.name), - description: game.description, - external_id: game.external_id, - url: externalUrl, - thumb_url: game.thumb_url, - image_url: game.image_url, - min_age: game.min_age || 0, - min_players: game.min_players || 0, - max_players: game.max_players || 0, - min_playtime: game.min_playtime || 0, - max_playtime: game.max_playtime || 0, - year_published: game.year_published || 0, - last_sync_at: new Date(), - } - }).returning(); - - // TODO: Connect to everything else - // await transaction.insert() - }); - // await db.insert(games).values({ - // include: { - // mechanics: true, - // publishers: true, - // designers: true, - // artists: true, - // expansions: true - // }, - // where: { - // external_id: game.external_id - // }, - // create: { - // name: game.name, - // slug: kebabCase(game.name), - // description: game.description, - // external_id: game.external_id, - // url: externalUrl, - // thumb_url: game.thumb_url, - // image_url: game.image_url, - // min_age: game.min_age || 0, - // min_players: game.min_players || 0, - // max_players: game.max_players || 0, - // min_playtime: game.min_playtime || 0, - // max_playtime: game.max_playtime || 0, - // year_published: game.year_published || 0, - // last_sync_at: new Date(), - // categories: { - // connect: categoryIds - // }, - // mechanics: { - // connect: mechanicIds - // }, - // publishers: { - // connect: publisherIds - // }, - // designers: { - // connect: designerIds - // }, - // artists: { - // connect: artistIds - // } - // }, - // update: { - // name: game.name, - // slug: kebabCase(game.name), - // description: game.description, - // external_id: game.external_id, - // url: externalUrl, - // thumb_url: game.thumb_url, - // image_url: game.image_url, - // min_age: game.min_age || 0, - // min_players: game.min_players || 0, - // max_players: game.max_players || 0, - // min_playtime: game.min_playtime || 0, - // max_playtime: game.max_playtime || 0, - // year_published: game.year_published || 0, - // last_sync_at: new Date(), - // categories: { - // connect: categoryIds - // }, - // mechanics: { - // connect: mechanicIds - // }, - // publishers: { - // connect: publisherIds - // }, - // designers: { - // connect: designerIds - // }, - // artists: { - // connect: artistIds - // } - // } - }); -} diff --git a/src/routes/(app)/game/[id]/+page.server.ts b/src/routes/(app)/game/[id]/+page.server.ts index ced13a9..2db7c8a 100644 --- a/src/routes/(app)/game/[id]/+page.server.ts +++ b/src/routes/(app)/game/[id]/+page.server.ts @@ -8,7 +8,7 @@ import { createMechanic, createOrUpdateGame, createPublisher -} from '$lib/utils/dbUtils.js'; +} from '$lib/utils/db/dbUtils.js'; import { mapAPIGameToBoredGame } from '$lib/utils/gameMapper.js'; import prisma from '$lib/prisma'; import type { PageServerLoad } from './$types'; @@ -119,11 +119,11 @@ async function syncGameAndConnectedData(locals: App.Locals, game: Game, eventFet if (externalGameResponse.ok) { const externalGame = await externalGameResponse.json(); console.log('externalGame', externalGame); - let categories = []; - let mechanics = []; - let artists = []; - let designers = []; - let publishers = []; + const categories = []; + const mechanics = []; + const artists = []; + const designers = []; + const publishers = []; for (const externalCategory of externalGame.categories) { const category = await createCategory(locals, externalCategory); categories.push({ @@ -156,7 +156,7 @@ async function syncGameAndConnectedData(locals: App.Locals, game: Game, eventFet } } - let boredGame = mapAPIGameToBoredGame(externalGame); + const boredGame = mapAPIGameToBoredGame(externalGame); boredGame.categories = categories; boredGame.mechanics = mechanics; diff --git a/src/routes/(app)/search/+page.server.ts b/src/routes/(app)/search/+page.server.ts index 326b4ff..ab1e9eb 100644 --- a/src/routes/(app)/search/+page.server.ts +++ b/src/routes/(app)/search/+page.server.ts @@ -15,7 +15,7 @@ import { createOrUpdateGame, createOrUpdateGameMinimal, createPublisher -} from '$lib/utils/dbUtils.js'; +} from '$lib/utils/db/dbUtils.js'; // import { listGameSchema } from '$lib/config/zod-schemas.js'; async function searchForGames( diff --git a/src/routes/api/publisher/+server.ts b/src/routes/api/publisher/+server.ts new file mode 100644 index 0000000..bce4a51 --- /dev/null +++ b/src/routes/api/publisher/+server.ts @@ -0,0 +1,21 @@ +import { createPublisher } from '$lib/utils/db/publisherUtils.js'; +import type { Publishers } from '../../../schema.js'; + +type PublisherCreate = { + publisher: Publishers; + externalId: string; +} + +export async function POST({ request, locals }) { + const data: PublisherCreate = await request.json(); + console.log('data', data); + + try { + return await createPublisher(locals, data.publisher, data.externalId); + } catch (e) { + console.error(e); + return new Response('Could not create publisher', { + status: 500 + }); + } +} \ No newline at end of file diff --git a/src/routes/api/publisher/[id]/+server.ts b/src/routes/api/publisher/[id]/+server.ts new file mode 100644 index 0000000..f7505b8 --- /dev/null +++ b/src/routes/api/publisher/[id]/+server.ts @@ -0,0 +1,19 @@ +import { getPublisher, updatePublisher } from '$lib/utils/db/publisherUtils.js'; +import type { Publishers } from '../../../../schema.js'; + +export async function GET({ locals, params }) { + try { + return await getPublisher(locals, params.id); + } catch (e) { + console.error(e); + return new Response('Could not get publishers', { + status: 500 + }); + } +} + +export async function PUT({ locals, params, request }) { + const data: Publishers = await request.json(); + const publisherId = params.id; + return await updatePublisher(locals, data, publisherId); +} \ No newline at end of file diff --git a/src/schema.ts b/src/schema.ts index 2f3845f..4468dca 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -136,6 +136,8 @@ export const user_role_relations = relations(user_roles, ({ one }) => ({ }) })); +export type UserRoles = InferSelectModel; + export const collections = pgTable('collections', { id: varchar('id', { length: 255 @@ -195,6 +197,8 @@ export const collection_items = pgTable('collection_items', { }).default(sql`now()`) }); +export type CollectionItems = InferSelectModel; + export const collection_item_relations = relations(collection_items, ({ one }) => ({ collection: one(collections, { fields: [collection_items.collection_id], @@ -229,6 +233,8 @@ export const wishlists = pgTable('wishlists', { }).default(sql`now()`) }); +export type Wishlists = InferSelectModel; + export const wishlists_relations = relations(wishlists, ({ one }) => ({ user: one(users, { fields: [wishlists.user_id], @@ -264,6 +270,8 @@ export const wishlist_items = pgTable('wishlist_items', { }).default(sql`now()`) }); +export type WishlistItems = InferSelectModel; + export const wishlist_item_relations = relations(wishlist_items, ({ one }) => ({ wishlist: one(wishlists, { fields: [wishlist_items.wishlist_id], @@ -298,6 +306,8 @@ export const externalIds = pgTable('external_ids', { }).notNull() }); +export type ExternalIds = InferSelectModel; + export const games = pgTable( 'games', { @@ -415,30 +425,9 @@ export const expansions = pgTable('expansions', { }).default(sql`now()`) }); -export const expansionsToExternalIds = pgTable( - 'expansions_to_external_ids', - { - expansionId: varchar('expansion_id', { - length: 255 - }) - .notNull() - .references(() => expansions.id, { onDelete: 'restrict', onUpdate: 'cascade' }), - externalId: varchar('external_id', { - length: 255 - }) - .notNull() - .references(() => externalIds.id, { onDelete: 'restrict', onUpdate: 'cascade' }) - }, - (table) => { - return { - expansionsToExternalIdsPkey: primaryKey({ - columns: [table.expansionId, table.externalId] - }) - }; - } -); +export type Expansions = InferSelectModel; -export const expansion_relations = relations(expansions, ({ one, many }) => ({ +export const expansion_relations = relations(expansions, ({ one }) => ({ baseGame: one(games, { fields: [expansions.base_game_id], references: [games.id] @@ -446,8 +435,7 @@ export const expansion_relations = relations(expansions, ({ one, many }) => ({ game: one(games, { fields: [expansions.game_id], references: [games.id] - }), - expansionsToExternalIds: many(expansionsToExternalIds) + }) })); export const publishers = pgTable('publishers', { @@ -462,7 +450,6 @@ export const publishers = pgTable('publishers', { slug: varchar('slug', { length: 255 }), - external_id: integer('external_id'), created_at: timestamp('created_at', { withTimezone: true, mode: 'date', @@ -513,7 +500,6 @@ export const categories = pgTable('categories', { slug: varchar('slug', { length: 255 }), - external_id: integer('external_id'), created_at: timestamp('created_at', { withTimezone: true, mode: 'date', @@ -526,6 +512,8 @@ export const categories = pgTable('categories', { }).default(sql`now()`) }); +export type Categories = InferSelectModel; + export const categoriesToExternalIds = pgTable('categories_to_external_ids', { categoryId: varchar('category_id', { length: 255 @@ -592,7 +580,6 @@ export const mechanics = pgTable('mechanics', { slug: varchar('slug', { length: 255 }), - external_id: integer('external_id'), created_at: timestamp('created_at', { withTimezone: true, mode: 'date', @@ -605,6 +592,8 @@ export const mechanics = pgTable('mechanics', { }).default(sql`now()`) }); +export type Mechanics = InferSelectModel; + export const mechanicsToExternalIds = pgTable('mechanics_to_external_ids', { mechanicId: varchar('mechanic_id', { length: 255