diff --git a/.github/workflows/deploy-website-other.yaml b/.github/workflows/deploy-website-other.yaml index d567ba1..c6e6e10 100644 --- a/.github/workflows/deploy-website-other.yaml +++ b/.github/workflows/deploy-website-other.yaml @@ -1,4 +1,4 @@ -name: Deploy prod +name: Deploy branch on: workflow_dispatch: @@ -11,7 +11,7 @@ jobs: - uses: actions/checkout@v3 - name: Extract branch name shell: bash - run: echo "branch=$(echo ${GITHUB_REF#refs/heads/})" >> $GITHUB_OUTPUT + run: echo "branch=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}" >> $GITHUB_OUTPUT id: extract_branch - uses: actions/setup-node@v3 with: @@ -26,6 +26,7 @@ jobs: run: | cd website netlify build + ls /home/runner/work/fsc-core/fsc-core/public netlify deploy --alias ${{ steps.extract_branch.outputs.branch }} env: NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} diff --git a/walter/src/db/schema.ts b/walter/src/db/schema.ts index 8378575..74dbe00 100644 --- a/walter/src/db/schema.ts +++ b/walter/src/db/schema.ts @@ -6,6 +6,13 @@ export const users = mysqlTable('users', { username: varchar('username', { length: 120 }), tagline: varchar('tagline', { length: 250 }), img_url: varchar('img_url', { length: 500 }), + website_url: varchar('website_url', { length: 500 }), + twitter_url: varchar('twitter_url', { length: 500 }), + facebook_url: varchar('facebook_url', { length: 500 }), + instagram_url: varchar('instagram_url', { length: 500 }), + twitch_url: varchar('twitch_url', { length: 500 }), + threads_url: varchar('threads_url', { length: 500 }), + is_public: boolean('is_public'), }) export const userLinks = mysqlTable('user_links', { diff --git a/website/drizzle.config.ts b/website/drizzle.config.ts new file mode 100644 index 0000000..f8d8bc5 --- /dev/null +++ b/website/drizzle.config.ts @@ -0,0 +1,13 @@ +import type { Config } from "drizzle-kit"; +import * as dotenv from 'dotenv' + +dotenv.config() + +export default { + schema: "./functions/db/schema.ts", + out: "./drizzle/generated", + driver: "mysql2", + dbCredentials: { + connectionString: process.env["DATABASE_URL"] as string + }, +} satisfies Config; \ No newline at end of file diff --git a/website/drizzle/generated/0000_nervous_warbird.sql b/website/drizzle/generated/0000_nervous_warbird.sql new file mode 100644 index 0000000..e65692d --- /dev/null +++ b/website/drizzle/generated/0000_nervous_warbird.sql @@ -0,0 +1,37 @@ +CREATE TABLE `spaces` ( + `id` serial AUTO_INCREMENT NOT NULL, + `space_url` varchar(300), + CONSTRAINT `spaces_id` PRIMARY KEY(`id`) +); +--> statement-breakpoint +CREATE TABLE `user_links` ( + `id` serial AUTO_INCREMENT NOT NULL, + `type` int, + `is_public` boolean, + `tagline` varchar(250), + CONSTRAINT `user_links_id` PRIMARY KEY(`id`) +); +--> statement-breakpoint +CREATE TABLE `user_role_pings` ( + `id` serial AUTO_INCREMENT NOT NULL, + `role_id` varchar(20), + `user_id` int, + CONSTRAINT `user_role_pings_id` PRIMARY KEY(`id`) +); +--> statement-breakpoint +CREATE TABLE `user_xp` ( + `user_id` bigint NOT NULL, + `last_applied_time` bigint, + `current_xp` bigint, + `multiplier` int, + `pentalty_count` int, + CONSTRAINT `user_xp_user_id` PRIMARY KEY(`user_id`) +); +--> statement-breakpoint +CREATE TABLE `users` ( + `id` bigint NOT NULL, + `username` varchar(120), + `tagline` varchar(250), + `img_url` varchar(500), + CONSTRAINT `users_id` PRIMARY KEY(`id`) +); diff --git a/website/drizzle/generated/0001_needy_mattie_franklin.sql b/website/drizzle/generated/0001_needy_mattie_franklin.sql new file mode 100644 index 0000000..2e3bf97 --- /dev/null +++ b/website/drizzle/generated/0001_needy_mattie_franklin.sql @@ -0,0 +1,6 @@ +ALTER TABLE `users` ADD `website_url` varchar(500);--> statement-breakpoint +ALTER TABLE `users` ADD `twitter_url` varchar(500);--> statement-breakpoint +ALTER TABLE `users` ADD `facebook_url` varchar(500);--> statement-breakpoint +ALTER TABLE `users` ADD `instagram_url` varchar(500);--> statement-breakpoint +ALTER TABLE `users` ADD `twitch_url` varchar(500);--> statement-breakpoint +ALTER TABLE `users` ADD `threads_url` varchar(500); \ No newline at end of file diff --git a/website/drizzle/generated/meta/0000_snapshot.json b/website/drizzle/generated/meta/0000_snapshot.json new file mode 100644 index 0000000..7699a28 --- /dev/null +++ b/website/drizzle/generated/meta/0000_snapshot.json @@ -0,0 +1,220 @@ +{ + "version": "5", + "dialect": "mysql", + "id": "d20ff113-3ba9-4c19-8db9-36225ede32be", + "prevId": "00000000-0000-0000-0000-000000000000", + "tables": { + "spaces": { + "name": "spaces", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "space_url": { + "name": "space_url", + "type": "varchar(300)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "spaces_id": { + "name": "spaces_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "user_links": { + "name": "user_links", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "type": { + "name": "type", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "tagline": { + "name": "tagline", + "type": "varchar(250)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "user_links_id": { + "name": "user_links_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "user_role_pings": { + "name": "user_role_pings", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "role_id": { + "name": "role_id", + "type": "varchar(20)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "user_role_pings_id": { + "name": "user_role_pings_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "user_xp": { + "name": "user_xp", + "columns": { + "user_id": { + "name": "user_id", + "type": "bigint", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "last_applied_time": { + "name": "last_applied_time", + "type": "bigint", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "current_xp": { + "name": "current_xp", + "type": "bigint", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "multiplier": { + "name": "multiplier", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "pentalty_count": { + "name": "pentalty_count", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "user_xp_user_id": { + "name": "user_xp_user_id", + "columns": [ + "user_id" + ] + } + }, + "uniqueConstraints": {} + }, + "users": { + "name": "users", + "columns": { + "id": { + "name": "id", + "type": "bigint", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "username": { + "name": "username", + "type": "varchar(120)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "tagline": { + "name": "tagline", + "type": "varchar(250)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "img_url": { + "name": "img_url", + "type": "varchar(500)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "users_id": { + "name": "users_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + } + }, + "schemas": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + } +} \ No newline at end of file diff --git a/website/drizzle/generated/meta/0001_snapshot.json b/website/drizzle/generated/meta/0001_snapshot.json new file mode 100644 index 0000000..22b6a34 --- /dev/null +++ b/website/drizzle/generated/meta/0001_snapshot.json @@ -0,0 +1,262 @@ +{ + "version": "5", + "dialect": "mysql", + "id": "9fd34d05-fb00-4b49-a445-a455051d5996", + "prevId": "d20ff113-3ba9-4c19-8db9-36225ede32be", + "tables": { + "spaces": { + "name": "spaces", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "space_url": { + "name": "space_url", + "type": "varchar(300)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "spaces_id": { + "name": "spaces_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "user_links": { + "name": "user_links", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "type": { + "name": "type", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "tagline": { + "name": "tagline", + "type": "varchar(250)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "user_links_id": { + "name": "user_links_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "user_role_pings": { + "name": "user_role_pings", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": false, + "notNull": true, + "autoincrement": true + }, + "role_id": { + "name": "role_id", + "type": "varchar(20)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "user_role_pings_id": { + "name": "user_role_pings_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + }, + "user_xp": { + "name": "user_xp", + "columns": { + "user_id": { + "name": "user_id", + "type": "bigint", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "last_applied_time": { + "name": "last_applied_time", + "type": "bigint", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "current_xp": { + "name": "current_xp", + "type": "bigint", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "multiplier": { + "name": "multiplier", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "pentalty_count": { + "name": "pentalty_count", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "user_xp_user_id": { + "name": "user_xp_user_id", + "columns": [ + "user_id" + ] + } + }, + "uniqueConstraints": {} + }, + "users": { + "name": "users", + "columns": { + "id": { + "name": "id", + "type": "bigint", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "username": { + "name": "username", + "type": "varchar(120)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "tagline": { + "name": "tagline", + "type": "varchar(250)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "img_url": { + "name": "img_url", + "type": "varchar(500)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "website_url": { + "name": "website_url", + "type": "varchar(500)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "twitter_url": { + "name": "twitter_url", + "type": "varchar(500)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "facebook_url": { + "name": "facebook_url", + "type": "varchar(500)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "instagram_url": { + "name": "instagram_url", + "type": "varchar(500)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "twitch_url": { + "name": "twitch_url", + "type": "varchar(500)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "threads_url": { + "name": "threads_url", + "type": "varchar(500)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "users_id": { + "name": "users_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": {} + } + }, + "schemas": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + } +} \ No newline at end of file diff --git a/website/drizzle/generated/meta/_journal.json b/website/drizzle/generated/meta/_journal.json new file mode 100644 index 0000000..2a548db --- /dev/null +++ b/website/drizzle/generated/meta/_journal.json @@ -0,0 +1,20 @@ +{ + "version": "5", + "dialect": "mysql", + "entries": [ + { + "idx": 0, + "version": "5", + "when": 1693311368297, + "tag": "0000_nervous_warbird", + "breakpoints": true + }, + { + "idx": 1, + "version": "5", + "when": 1693311412240, + "tag": "0001_needy_mattie_franklin", + "breakpoints": true + } + ] +} \ No newline at end of file diff --git a/website/functions/code.ts b/website/functions/code.ts new file mode 100644 index 0000000..b54528a --- /dev/null +++ b/website/functions/code.ts @@ -0,0 +1,48 @@ +import { HandlerContext, HandlerEvent } from "@netlify/functions"; + +exports.handler = async (event: HandlerEvent, context: HandlerContext) => { + if(event.body) { + const body = JSON.parse(event.body); + + let data = { + 'client_id': process.env.DISCORD_CLIENT_ID, + 'client_secret': process.env.DISCORD_CLIENT_SECRET, + 'grant_type': 'authorization_code', + 'code': body.code, + 'redirect_uri': process.env.DISCORD_REDIRECT_URI, + 'scope': 'identify' + } + let formBodyArr: string[] = []; + for (let property in data) { + let encodedKey = encodeURIComponent(property); + let encodedValue = encodeURIComponent(data[property]); + formBodyArr.push(encodedKey + "=" + encodedValue); + } + const formBody = formBodyArr.join("&"); + + try { + const res = await fetch('https://discord.com/api/oauth2/token', { + method: 'post', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + }, + body: formBody + }); + const json = await res.json() + + return { + statusCode: 200, + body: JSON.stringify(json) + } + } catch (err) { + console.error(err) + return { + statusCode: 400 + } + } + } else { + return { + statusCode: 500 + } + } +} \ No newline at end of file diff --git a/website/functions/db/schema.ts b/website/functions/db/schema.ts index 8378575..8da6f59 100644 --- a/website/functions/db/schema.ts +++ b/website/functions/db/schema.ts @@ -6,6 +6,12 @@ export const users = mysqlTable('users', { username: varchar('username', { length: 120 }), tagline: varchar('tagline', { length: 250 }), img_url: varchar('img_url', { length: 500 }), + website_url: varchar('website_url', { length: 500 }), + twitter_url: varchar('twitter_url', { length: 500 }), + facebook_url: varchar('facebook_url', { length: 500 }), + instagram_url: varchar('instagram_url', { length: 500 }), + twitch_url: varchar('twitch_url', { length: 500 }), + threads_url: varchar('threads_url', { length: 500 }), }) export const userLinks = mysqlTable('user_links', { @@ -34,13 +40,20 @@ export const spaces = mysqlTable('spaces', { space_url: varchar('space_url', { length: 300 }) }) -export const useXpRelations = relations(userXp, ({ one }) => ({ +export const user_userXpRelations = relations(userXp, ({ one }) => ({ user: one(users, { fields: [userXp.user_id], references: [users.id] }) })); +export const userXp_userRelations = relations(users, ({ one }) => ({ + userXp: one(userXp, { + fields: [users.id], + references: [userXp.user_id] + }) +})) + // export const usersRelations = relations(users, ({ many }) => ({ // blocks: many(blocks) // })); diff --git a/website/functions/me.ts b/website/functions/me.ts new file mode 100644 index 0000000..bab2f5e --- /dev/null +++ b/website/functions/me.ts @@ -0,0 +1,118 @@ +import { HandlerContext, HandlerEvent } from "@netlify/functions"; +import { ValidateAuthResults, validateAuth } from './utils/auth' +import { getDb } from "./db/db"; +import { users } from "./db/schema"; +import { eq, sql } from "drizzle-orm"; + +exports.handler = async (event: HandlerEvent, context: HandlerContext) => { + let auth = await validateAuth(event) + if(!auth.isAuthorized) { + return { + statusCode: 401 + } + } + + console.log(auth) + + if(event.httpMethod === "GET") { + return await get(event, context, auth) + } + + if(event.httpMethod === "POST") { + return await post(event, context, auth) + } + + return { + statusCode: 404 + } +} + +async function get(event: HandlerEvent, context: HandlerContext, auth: ValidateAuthResults) { + try { + const db = getDb(); + const userIdBigInt = BigInt(auth.userId as string) + let userData = await db.query.users.findFirst({ + where: eq(users.id, userIdBigInt), + with: { + userXp: true + } + }); + + // Get this directly from discord + if(userData) { + userData.username = auth.username as string + userData.img_url = auth.img_url as string + } + + return { + statusCode: 200, + body: JSON.stringify(userData, (_, value) => typeof value === 'bigint' ? value.toString() + 'n' : value) + } + } catch (err) { + console.error(err) + return { + statusCode: 500 + } + } +} + +async function post(event: HandlerEvent, context: HandlerContext, auth: ValidateAuthResults) { + try { + if(!event.body) { + return { + statusCode: 400 + } + } + + const body = JSON.parse(event.body); + + console.log(body) + + const db = getDb(); + await db.execute(sql`insert into users( + id, + username, + tagline, + img_url, + website_url, + twitter_url, + facebook_url, + instagram_url, + twitch_url, + threads_url, + is_public + ) VALUES ( + ${BigInt(auth.userId as string)}, + ${auth.username}, + ${body.tagline}, + ${auth.img_url}, + ${body.website_url}, + ${body.twitter_url}, + ${body.facebook_url}, + ${body.instagram_url}, + ${body.twitch_url}, + ${body.threads_url}, + ${body.is_public} + ) ON DUPLICATE KEY UPDATE + username = ${auth.username}, + tagline = ${body.tagline}, + img_url = ${auth.img_url}, + website_url = ${body.website_url}, + twitter_url = ${body.twitter_url}, + facebook_url = ${body.facebook_url}, + instagram_url = ${body.instagram_url}, + twitch_url = ${body.twitch_url}, + threads_url = ${body.threads_url}, + is_public = ${body.is_public} + ;`); + + return { + statusCode: 200 + } + } catch (err) { + console.error(err) + return { + statusCode: 500 + } + } +} \ No newline at end of file diff --git a/website/functions/profiles.ts b/website/functions/profiles.ts new file mode 100644 index 0000000..d31e16f --- /dev/null +++ b/website/functions/profiles.ts @@ -0,0 +1,42 @@ +const axios = require('axios'); + +exports.handler = async event => { + return { + statusCode: 404 + } + // let response = {}; + // if(event.httpMethod === 'OPTIONS') { + // return { + // statusCode: 200, + // headers: { + // 'Access-Control-Allow-Origin': '*', + // 'Access-Control-Allow-Headers': '*' + // } + // } + // } + // let faunaService = new FaunaService(process.env.FAUNA_SECRET) + + // let profiles = await faunaService.listRecords("profiles") + // profiles = profiles.filter(p => p.document.isPublic) + + // response = { + // statusCode: 200, + // headers: { + // 'Content-Type': 'application/json' + // }, + // body: JSON.stringify(profiles) + // } + + // // Handle CORS + // if(!response.headers) { + // response.headers = { + // 'Access-Control-Allow-Origin': '*', + // 'Access-Control-Allow-Headers': '*' + // } + // } else { + // response.headers['Access-Control-Allow-Origin'] = '*' + // response.headers['Access-Control-Allow-Headers'] = '*' + // } + + // return response +} \ No newline at end of file diff --git a/website/functions/utils/auth.ts b/website/functions/utils/auth.ts new file mode 100644 index 0000000..af9ad9d --- /dev/null +++ b/website/functions/utils/auth.ts @@ -0,0 +1,55 @@ +import { HandlerEvent } from "@netlify/functions" + +export type ValidateAuthResults = { + isAuthorized?: boolean + isMod?: boolean + userId?: string + username?: string + img_url?: string +} + +function parseCookies(event: HandlerEvent): {[key: string]: string} { + let cookies: {[key: string]: string} = {} + if(event.headers && event.headers.cookie) { + let spl1 = event.headers.cookie.split(";") + spl1.forEach(el => { + let spl2 = el.split("=") + cookies[spl2[0].trim()] = spl2[1] + }) + } + return cookies +} + +export async function validateAuth(event: HandlerEvent): Promise { + const results: ValidateAuthResults = { + isAuthorized: false, + isMod: false + } + try { + let cookies = parseCookies(event) + if(cookies["discord_token"]) { + let res = await fetch('https://discord.com/api/users/@me', { + method: 'get', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Authorization': `Bearer ${cookies["discord_token"]}` + } + }); + let json = await res.json(); + if(res.status !== 200) { + return results + } + results.userId = json.id + results.img_url = `https://cdn.discordapp.com/avatars/${json.id}/${json.avatar}.png` + if(json.global_name) { + results.username = json.global_name + } else { + results.username = json.username + } + results.isAuthorized = true + } + } catch (err) { + console.error(err) + } + return results; +} \ No newline at end of file diff --git a/website/functions/utils/netlify.ts b/website/functions/utils/netlify.ts new file mode 100644 index 0000000..df47552 --- /dev/null +++ b/website/functions/utils/netlify.ts @@ -0,0 +1,42 @@ +import { HandlerContext, HandlerEvent } from "@netlify/functions" +import { ValidateAuthResults, validateAuth } from "./auth" + +export interface HandlerEventWithAuth extends HandlerEvent { + auth: ValidateAuthResults +} + +const NotFoundResponse = { + statusCode: 404 +} + +export default class NetlifyRouter { + authRequired: boolean = false + get?: (event: HandlerEventWithAuth, context: HandlerContext) => Promise + post?: (event: HandlerEventWithAuth, context: HandlerContext) => Promise + put?: (event: HandlerEventWithAuth, context: HandlerContext) => Promise + del?: (event: HandlerEventWithAuth, context: HandlerContext) => Promise + + async handle(event: HandlerEvent, context: HandlerContext): Promise { + if(this.authRequired) { + let auth = await validateAuth(event) + if(!auth.isAuthorized) { + return { + statusCode: 401 + } + } + } + + const fnmap: {[key: string]: any} = { + "GET": this.get, + "POST": this.post, + "PUT": this.put, + "DELETE": this.del + } + + if(fnmap[event.httpMethod]) { + return await fnmap[event.httpMethod] + } else { + return NotFoundResponse + } + } +} \ No newline at end of file diff --git a/website/package-lock.json b/website/package-lock.json index 1d5ab9b..db00cc4 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -29,6 +29,7 @@ "@types/node": "^20.3.3", "@types/react": "^18.2.14", "@types/react-dom": "^18.2.6", + "drizzle-kit": "^0.19.13", "typescript": "^5.1.6" } }, @@ -1969,6 +1970,384 @@ "partytown": "bin/partytown.cjs" } }, + "node_modules/@drizzle-team/studio": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@drizzle-team/studio/-/studio-0.0.5.tgz", + "integrity": "sha512-ps5qF0tMxWRVu+V5gvCRrQNqlY92aTnIKdq27gm9LZMSdaKYZt6AVvSK1dlUMzs6Rt0Jm80b+eWct6xShBKhIw==", + "dev": true + }, + "node_modules/@esbuild-kit/core-utils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@esbuild-kit/core-utils/-/core-utils-3.2.2.tgz", + "integrity": "sha512-Ub6LaRaAgF80dTSzUdXpFLM1pVDdmEVB9qb5iAzSpyDlX/mfJTFGOnZ516O05p5uWWteNviMKi4PAyEuRxI5gA==", + "dev": true, + "dependencies": { + "esbuild": "~0.18.20", + "source-map-support": "^0.5.21" + } + }, + "node_modules/@esbuild-kit/esm-loader": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.5.5.tgz", + "integrity": "sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==", + "dev": true, + "dependencies": { + "@esbuild-kit/core-utils": "^3.0.0", + "get-tsconfig": "^4.4.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@eslint-community/regexpp": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", @@ -5508,6 +5887,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cli-color": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.3.tgz", + "integrity": "sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.61", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.15", + "timers-ext": "^0.1.7" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -6608,6 +7003,18 @@ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, + "node_modules/difflib": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", + "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", + "dev": true, + "dependencies": { + "heap": ">= 0.2.0" + }, + "engines": { + "node": "*" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -6708,25 +7115,148 @@ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "dependencies": { - "is-obj": "^2.0.0" + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "engines": { + "node": ">=10" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" + }, + "node_modules/dreamopt": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/dreamopt/-/dreamopt-0.8.0.tgz", + "integrity": "sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==", + "dev": true, + "dependencies": { + "wordwrap": ">=0.0.2" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/drizzle-kit": { + "version": "0.19.13", + "resolved": "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.19.13.tgz", + "integrity": "sha512-Rba5VW1O2JfJlwVBeZ8Zwt2E2us5oZ08PQBDiVSGlug53TOc8hzXjblZFuF+dnll9/RQEHrkzBmJFgqTvn5Rxg==", + "dev": true, + "dependencies": { + "@drizzle-team/studio": "^0.0.5", + "@esbuild-kit/esm-loader": "^2.5.5", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "commander": "^9.4.1", + "esbuild": "^0.18.6", + "esbuild-register": "^3.4.2", + "glob": "^8.1.0", + "hanji": "^0.0.5", + "json-diff": "0.9.0", + "minimatch": "^7.4.3", + "zod": "^3.20.2" + }, + "bin": { + "drizzle-kit": "index.cjs" + } + }, + "node_modules/drizzle-kit/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/drizzle-kit/node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/drizzle-kit/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/drizzle-kit/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/drizzle-kit/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/drizzle-kit/node_modules/glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "node_modules/drizzle-kit/node_modules/minimatch": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" - }, "node_modules/drizzle-orm": { "version": "0.28.5", "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.28.5.tgz", @@ -7162,6 +7692,78 @@ "es6-symbol": "^3.1.1" } }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/esbuild-register": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.4.2.tgz", + "integrity": "sha512-kG/XyTDyz6+YDuyfB9ZoSIOOmgyFCH+xPRtsCa8W85HLRV5Csp+o3jWVbOSHgSLfyLc5DmP+KFDNwty4mEjC+Q==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "peerDependencies": { + "esbuild": ">=0.12 <1" + } + }, + "node_modules/esbuild-register/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/esbuild-register/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -9454,6 +10056,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-tsconfig": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.0.tgz", + "integrity": "sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/git-up": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", @@ -9687,6 +10301,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/hanji": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/hanji/-/hanji-0.0.5.tgz", + "integrity": "sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==", + "dev": true, + "dependencies": { + "lodash.throttle": "^4.1.1", + "sisteransi": "^1.0.5" + } + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -9806,6 +10430,12 @@ "tslib": "^2.0.3" } }, + "node_modules/heap": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", + "dev": true + }, "node_modules/hosted-git-info": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", @@ -10697,6 +11327,23 @@ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, + "node_modules/json-diff": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/json-diff/-/json-diff-0.9.0.tgz", + "integrity": "sha512-cVnggDrVkAAA3OvFfHpFEhOnmcsUpleEKq4d4O8sQWWSH40MBrWstKigVB1kGrgLWzuom+7rRdaCsnBD6VyObQ==", + "dev": true, + "dependencies": { + "cli-color": "^2.0.0", + "difflib": "~0.2.1", + "dreamopt": "~0.8.0" + }, + "bin": { + "json-diff": "bin/json-diff.js" + }, + "engines": { + "node": "*" + } + }, "node_modules/json-loader": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", @@ -10956,6 +11603,12 @@ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", + "dev": true + }, "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", @@ -13803,6 +14456,15 @@ "node": ">=8" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/responselike": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", @@ -15905,6 +16567,12 @@ "node": ">=0.10.0" } }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -16250,6 +16918,15 @@ "engines": { "node": ">=4" } + }, + "node_modules/zod": { + "version": "3.22.2", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.2.tgz", + "integrity": "sha512-wvWkphh5WQsJbVk1tbx1l1Ly4yg+XecD+Mq280uBGt9wa5BKSWf4Mhp6GmrkPixhMxmabYY7RbzlwVP32pbGCg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } }, "dependencies": { @@ -17567,6 +18244,186 @@ "resolved": "https://registry.npmjs.org/@builder.io/partytown/-/partytown-0.7.5.tgz", "integrity": "sha512-Zbr2Eo0AQ4yzmQr/36/h+6LKjmdVBB3Q5cGzO6rtlIKB/IOpbQVUZW+XAnhpJmJr9sIF97OZjgbhG9k7Sjn4yw==" }, + "@drizzle-team/studio": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@drizzle-team/studio/-/studio-0.0.5.tgz", + "integrity": "sha512-ps5qF0tMxWRVu+V5gvCRrQNqlY92aTnIKdq27gm9LZMSdaKYZt6AVvSK1dlUMzs6Rt0Jm80b+eWct6xShBKhIw==", + "dev": true + }, + "@esbuild-kit/core-utils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@esbuild-kit/core-utils/-/core-utils-3.2.2.tgz", + "integrity": "sha512-Ub6LaRaAgF80dTSzUdXpFLM1pVDdmEVB9qb5iAzSpyDlX/mfJTFGOnZ516O05p5uWWteNviMKi4PAyEuRxI5gA==", + "dev": true, + "requires": { + "esbuild": "~0.18.20", + "source-map-support": "^0.5.21" + } + }, + "@esbuild-kit/esm-loader": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.5.5.tgz", + "integrity": "sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==", + "dev": true, + "requires": { + "@esbuild-kit/core-utils": "^3.0.0", + "get-tsconfig": "^4.4.0" + } + }, + "@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "dev": true, + "optional": true + }, "@eslint-community/regexpp": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", @@ -20142,6 +20999,19 @@ "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" }, + "cli-color": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.3.tgz", + "integrity": "sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==", + "dev": true, + "requires": { + "d": "^1.0.1", + "es5-ext": "^0.10.61", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.15", + "timers-ext": "^0.1.7" + } + }, "cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -20977,6 +21847,15 @@ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, + "difflib": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", + "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", + "dev": true, + "requires": { + "heap": ">= 0.2.0" + } + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -21066,6 +21945,97 @@ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" }, + "dreamopt": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/dreamopt/-/dreamopt-0.8.0.tgz", + "integrity": "sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==", + "dev": true, + "requires": { + "wordwrap": ">=0.0.2" + } + }, + "drizzle-kit": { + "version": "0.19.13", + "resolved": "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.19.13.tgz", + "integrity": "sha512-Rba5VW1O2JfJlwVBeZ8Zwt2E2us5oZ08PQBDiVSGlug53TOc8hzXjblZFuF+dnll9/RQEHrkzBmJFgqTvn5Rxg==", + "dev": true, + "requires": { + "@drizzle-team/studio": "^0.0.5", + "@esbuild-kit/esm-loader": "^2.5.5", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "commander": "^9.4.1", + "esbuild": "^0.18.6", + "esbuild-register": "^3.4.2", + "glob": "^8.1.0", + "hanji": "^0.0.5", + "json-diff": "0.9.0", + "minimatch": "^7.4.3", + "zod": "^3.20.2" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "dev": true + }, + "chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true + }, + "commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true + }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "dependencies": { + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "minimatch": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "drizzle-orm": { "version": "0.28.5", "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.28.5.tgz", @@ -21363,6 +22333,62 @@ "es6-symbol": "^3.1.1" } }, + "esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "esbuild-register": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.4.2.tgz", + "integrity": "sha512-kG/XyTDyz6+YDuyfB9ZoSIOOmgyFCH+xPRtsCa8W85HLRV5Csp+o3jWVbOSHgSLfyLc5DmP+KFDNwty4mEjC+Q==", + "dev": true, + "requires": { + "debug": "^4.3.4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -23004,6 +24030,15 @@ "get-intrinsic": "^1.1.1" } }, + "get-tsconfig": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.0.tgz", + "integrity": "sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==", + "dev": true, + "requires": { + "resolve-pkg-maps": "^1.0.0" + } + }, "git-up": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", @@ -23175,6 +24210,16 @@ "duplexer": "^0.1.2" } }, + "hanji": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/hanji/-/hanji-0.0.5.tgz", + "integrity": "sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==", + "dev": true, + "requires": { + "lodash.throttle": "^4.1.1", + "sisteransi": "^1.0.5" + } + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -23254,6 +24299,12 @@ "tslib": "^2.0.3" } }, + "heap": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", + "dev": true + }, "hosted-git-info": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", @@ -23880,6 +24931,17 @@ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, + "json-diff": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/json-diff/-/json-diff-0.9.0.tgz", + "integrity": "sha512-cVnggDrVkAAA3OvFfHpFEhOnmcsUpleEKq4d4O8sQWWSH40MBrWstKigVB1kGrgLWzuom+7rRdaCsnBD6VyObQ==", + "dev": true, + "requires": { + "cli-color": "^2.0.0", + "difflib": "~0.2.1", + "dreamopt": "~0.8.0" + } + }, "json-loader": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", @@ -24094,6 +25156,12 @@ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, + "lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", + "dev": true + }, "lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", @@ -26084,6 +27152,12 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" }, + "resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true + }, "responselike": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", @@ -27650,6 +28724,12 @@ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -27901,6 +28981,12 @@ } } } + }, + "zod": { + "version": "3.22.2", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.2.tgz", + "integrity": "sha512-wvWkphh5WQsJbVk1tbx1l1Ly4yg+XecD+Mq280uBGt9wa5BKSWf4Mhp6GmrkPixhMxmabYY7RbzlwVP32pbGCg==", + "dev": true } } } diff --git a/website/package.json b/website/package.json index 848f4da..52177d1 100644 --- a/website/package.json +++ b/website/package.json @@ -15,7 +15,9 @@ "serve": "gatsby serve", "clean": "gatsby clean", "typecheck": "tsc --noEmit", - "deploy:prod": "netlify build&&netlify deploy --prod" + "deploy:prod": "netlify build&&netlify deploy --prod", + "db:push": "drizzle-kit push:mysql --config ./drizzle.config.ts", + "db:generate": "drizzle-kit generate:mysql --config ./drizzle.config.ts" }, "dependencies": { "@netlify/functions": "^2.0.2", @@ -39,6 +41,7 @@ "@types/node": "^20.3.3", "@types/react": "^18.2.14", "@types/react-dom": "^18.2.6", + "drizzle-kit": "^0.19.13", "typescript": "^5.1.6" } } diff --git a/website/src/components/Checkbox.tsx b/website/src/components/Checkbox.tsx new file mode 100644 index 0000000..af1aad9 --- /dev/null +++ b/website/src/components/Checkbox.tsx @@ -0,0 +1,20 @@ +import React from 'react' + +interface Props extends React.DetailedHTMLProps, HTMLInputElement> { + label: string +} + +function Checkbox(props: Props) { + return ( +
+ + +
+ ) +} + +export default Checkbox \ No newline at end of file diff --git a/website/src/components/Input.tsx b/website/src/components/Input.tsx new file mode 100644 index 0000000..93af2c8 --- /dev/null +++ b/website/src/components/Input.tsx @@ -0,0 +1,21 @@ +import React from 'react' + +interface Props extends React.DetailedHTMLProps, HTMLInputElement> { + label: string +} + +function Input(props: Props) { + return ( +
+ + +
+ ) +} + +export default Input \ No newline at end of file diff --git a/website/src/components/Loading.tsx b/website/src/components/Loading.tsx new file mode 100644 index 0000000..d755090 --- /dev/null +++ b/website/src/components/Loading.tsx @@ -0,0 +1,12 @@ +import React from 'react' +import { FaCircleNotch } from 'react-icons/fa' + +function Loading() { + return ( +
+ +
+ ) +} + +export default Loading \ No newline at end of file diff --git a/website/src/components/Navbar.tsx b/website/src/components/Navbar.tsx index a274c7f..3b3d87e 100644 --- a/website/src/components/Navbar.tsx +++ b/website/src/components/Navbar.tsx @@ -32,19 +32,22 @@ function Navbar() { >
  • - Home + setIsMenuShown(false)} >Home
  • - + setIsMenuShown(false)}> Blog
  • - About + setIsMenuShown(false)}>About
  • - Join Us + setIsMenuShown(false)}>Join Us
  • + {/*
  • + setIsMenuShown(false)}>Login +
  • */}
    diff --git a/website/src/layout.tsx b/website/src/layout.tsx new file mode 100644 index 0000000..bde7b4d --- /dev/null +++ b/website/src/layout.tsx @@ -0,0 +1,19 @@ +import React, { ReactNode } from 'react' +import Navbar from './components/Navbar' + +type Props = { + children: ReactNode +} + +function Layout({ children }: Props) { + return ( +
    +
    + + { children } +
    +
    + ) +} + +export default Layout \ No newline at end of file diff --git a/website/src/pages/index.tsx b/website/src/pages/index.tsx index 595fd31..2826335 100644 --- a/website/src/pages/index.tsx +++ b/website/src/pages/index.tsx @@ -3,6 +3,7 @@ import type { HeadFC, PageProps } from 'gatsby'; import ChatBubble from '../components/ChatBubble'; import Navbar from '../components/Navbar'; import { useState } from 'react'; +import Layout from '../layout'; export const Head: HeadFC = () => Home Page; @@ -15,158 +16,159 @@ function IndexPage() { } return ( -
    - -
    -
    - {/* */} - fullstack.chat logo - {/* */} - {/* */} -
    -
    -

    ๐Ÿ‘‹ Welcome to fullstack.chat!

    -
    - We are a welcome and opening community of developers of all - skillsets and experience levels. Scroll down to see what our - community is all about! + +
    +
    +
    + {/* */} + fullstack.chat logo + {/* */} + {/* */}
    -
    -
    - - {/* */} -
    -
    -
    - - Look at this cool thing I did! - - - Wow thats awesome! Great job ๐Ÿ˜€ - - - How exactly does this work? So cool... - -
    - -
    -

    - ๐Ÿ˜Š A Friendly Place for Experts &{' '} - Beginners -

    -

    - Whether you're a seasoned expert or just getting started, - fullstack.chat is a safe place to ask questions and grow as a - developer. There's no such thing as a dumb question with us. -

    +
    +

    ๐Ÿ‘‹ Welcome to fullstack.chat!

    +
    + We are a welcome and opening community of developers of all + skillsets and experience levels. Scroll down to see what our + community is all about! +
    -
    - {/* */} -
    -
    -

    ๐Ÿ’ฌ Come Say Hello!

    -
    -
    - Before joining, read and agree to the rules below. Help keep our - server friendly and welcoming! + {/* */} +
    +
    +
    + + Look at this cool thing I did! + + + Wow thats awesome! Great job ๐Ÿ˜€ + + + How exactly does this work? So cool... +
    -
    -

    NSFW Content

    -

    - No NSFW content is permitted here. Posting NSFW content will - result in an immediate ban without warning. -

    -

    Accept Others

    -

    - Be kind and respectful of all members. We are tolerant of all - races, genders, LGBTQ, religions, and creeds. +

    +

    + ๐Ÿ˜Š A Friendly Place for Experts &{' '} + Beginners +

    +

    + Whether you're a seasoned expert or just getting started, + fullstack.chat is a safe place to ask questions and grow as a + developer. There's no such thing as a dumb question with us.

    +
    +
    +
    -

    Addressing Conflicts

    -

    - If you take issue with another member, discuss it with them - PRIVATELY to come to a resolution. If you have done so and the - issue is not yet resolved, the admins & mods are always open to - assist in any way we can. Itโ€™s also worth noting that mods are - not monitoring all channels 24/7, so members are expected to - report issues if a mod is not available.{' '} -

    + {/* */} +
    +
    +

    ๐Ÿ’ฌ Come Say Hello!

    +
    +
    + Before joining, read and agree to the rules below. Help keep our + server friendly and welcoming! +
    +
    +

    NSFW Content

    +

    + No NSFW content is permitted here. Posting NSFW content will + result in an immediate ban without warning. +

    -

    Logging

    -

    - Actions that modify or delete content from the Discord are - logged for reference if needed. This includes the content of - messages PRIOR to modification, as well as the modified version - of the message.{' '} -

    +

    Accept Others

    +

    + Be kind and respectful of all members. We are tolerant of all + races, genders, LGBTQ, religions, and creeds. +

    -

    Constructive Criticism

    -

    - Mods and the direction of the community are open to constructive - criticism. If you feel the group is heading in the wrong - direction or can be improved in some way, our minds will always - be open to considerations. Blatant criticism and insulting mods, - however, will not be tolerated and will result in a ban from the - server.{' '} -

    +

    Addressing Conflicts

    +

    + If you take issue with another member, discuss it with them + PRIVATELY to come to a resolution. If you have done so and the + issue is not yet resolved, the admins & mods are always open to + assist in any way we can. Itโ€™s also worth noting that mods are + not monitoring all channels 24/7, so members are expected to + report issues if a mod is not available.{' '} +

    -

    No Patronizing

    -

    - Feel free to celebrate wins and progress in your coding journey, - but dont talk down to other members or make them feel beneath - you or anyone else. Direct comparison of your own progress to - others in a negative context will not be tolerated. -

    +

    Logging

    +

    + Actions that modify or delete content from the Discord are + logged for reference if needed. This includes the content of + messages PRIOR to modification, as well as the modified version + of the message.{' '} +

    -

    Trolling

    -

    - Trolling can be good natured fun, but can also sincerely offend - people if they take it the wrong way. Keep trolling to a minimum - and if you are offended by someoneโ€™s comments, discuss it with - them to cultivate a positive outcome. -

    -
    +

    Constructive Criticism

    +

    + Mods and the direction of the community are open to constructive + criticism. If you feel the group is heading in the wrong + direction or can be improved in some way, our minds will always + be open to considerations. Blatant criticism and insulting mods, + however, will not be tolerated and will result in a ban from the + server.{' '} +

    + +

    No Patronizing

    +

    + Feel free to celebrate wins and progress in your coding journey, + but dont talk down to other members or make them feel beneath + you or anyone else. Direct comparison of your own progress to + others in a negative context will not be tolerated. +

    + +

    Trolling

    +

    + Trolling can be good natured fun, but can also sincerely offend + people if they take it the wrong way. Keep trolling to a minimum + and if you are offended by someoneโ€™s comments, discuss it with + them to cultivate a positive outcome. +

    +
    -
    -
    - setIsUserAgreedToRules(!isUserAgreedToRules)} - /> - +
    +
    + setIsUserAgreedToRules(!isUserAgreedToRules)} + /> + +
    +
    -
    -
    -
    + + ); } diff --git a/website/src/pages/login.tsx b/website/src/pages/login.tsx new file mode 100644 index 0000000..21ba416 --- /dev/null +++ b/website/src/pages/login.tsx @@ -0,0 +1,16 @@ +import { navigate } from 'gatsby' +import React, { useEffect } from 'react' +import Loading from '../components/Loading' + +function Login() { + useEffect(() => { + // @ts-ignore + window.location.href = process.env.GATSBY_DISCORD_LOGIN_URL + }, []) + + return ( + + ) +} + +export default Login \ No newline at end of file diff --git a/website/src/pages/me.tsx b/website/src/pages/me.tsx new file mode 100644 index 0000000..4e20359 --- /dev/null +++ b/website/src/pages/me.tsx @@ -0,0 +1,128 @@ +import React, { useEffect, useState } from 'react' +import Input from '../components/Input' +import Layout from '../layout' +import Loading from '../components/Loading' +import Checkbox from '../components/Checkbox' +import { FaSave } from 'react-icons/fa' +import { navigate } from 'gatsby' + +function Me() { + const [isLoaded, setIsLoaded] = useState(false) + const [username, setUsername] = useState("") + const [img_url, setImgUrl] = useState("") + const [is_public, setIsPublic] = useState(false) + const [xp, setXp] = useState(0) + + // Fields + const [tagline, setTagline] = useState("") + const [website_url, setWebsite] = useState("") + const [twitter_url, setTwitter] = useState("") + const [facebook_url, setFacebook] = useState("") + const [instagram_url, setInstagram] = useState("") + const [twitch_url, setTwitch] = useState("") + const [threads_url, setThreads] = useState("") + + useEffect(() => { + async function init() { + let res = await fetch("/.netlify/functions/me") + if(res.status !== 200) { + navigate("/") + } + let json = await res.json() + setUsername(json.username) + setXp(json.userXp.current_xp) + setImgUrl(json.img_url) + setIsPublic(json.is_public) + setTagline(json.tagline) + setWebsite(json.website_url) + setTwitter(json.twitter_url) + setFacebook(json.facebook_url) + setInstagram(json.instagram_url) + setTwitch(json.twitch_url) + setThreads(json.threads_url) + setIsLoaded(true) + } + init() + }, []) + + async function save() { + const body = { + tagline, + website_url, + twitter_url, + facebook_url, + instagram_url, + twitch_url, + threads_url, + is_public + } + const res = await fetch("/.netlify/functions/me", { + method: "post", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify(body) + }) + } + + return ( + + {!isLoaded ? : ( + <> +
    + {img_url && ( +
    + {`${username}'s +
    + )} +
    +

    @{ username }

    + { xp }xp +
    +
    + + +
    +
    +
    +

    General info

    +
    + setTagline(e.target.value)} /> + setIsPublic(e.target.checked)} /> +
    +
    +
    +

    Socials

    +
    + setWebsite(e.target.value)} /> + setTwitter(e.target.value)}/> + setFacebook(e.target.value)}/> + setInstagram(e.target.value)}/> + setTwitch(e.target.value)}/> + setThreads(e.target.value)}/> +
    +
    + {/*
    +

    Ping roles

    +
    + + + +
    +
    */} + + )} +
    + ) +} + +export default Me \ No newline at end of file diff --git a/website/src/pages/oauth.tsx b/website/src/pages/oauth.tsx new file mode 100644 index 0000000..282cc3d --- /dev/null +++ b/website/src/pages/oauth.tsx @@ -0,0 +1,78 @@ +import { navigate } from 'gatsby' +import React, { useEffect } from 'react' +import Loading from '../components/Loading' + +type TokenResponse = { + access_token: string + expires_in: number + refresh_token: string + scope: string + token_type: string +} + +// function setCookie(name,value,days) { +// var expires = ""; +// if (days) { +// var date = new Date(); +// date.setTime(date.getTime() + (days*24*60*60*1000)); +// expires = "; expires=" + date.toUTCString(); +// } +// document.cookie = name + "=" + (value || "") + expires + "; path=/"; +// } +// function getCookie(name) { +// var nameEQ = name + "="; +// var ca = document.cookie.split(';'); +// for(var i=0;i < ca.length;i++) { +// var c = ca[i]; +// while (c.charAt(0)==' ') c = c.substring(1,c.length); +// if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); +// } +// return null; +// } +// function eraseCookie(name) { +// document.cookie = name +'=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;'; +// } + +function OAuthHandler() { + useEffect(() => { + async function handleCode() { + let { search } = window.location + search = search.replace("?", "") + let query: {[key: string]: string} = {} + search.split("&").forEach(el => { + let split = el.split("=") + // @ts-ignore + query[split[0]] = split[1] + }) + + let res = await fetch(`/.netlify/functions/code`, { + method: "post", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify({ + code: query["code"] + }) + }) + let json = await res.json() as TokenResponse + let expiry = new Date() + expiry.setTime(Date.now() + (json.expires_in * 1000)) + document.cookie = `discord_token=${json.access_token};expires=${expiry.toUTCString()}; path=/` + + navigate("/me") + } + + try { + handleCode() + } catch (err) { + console.error(err) + navigate("/") + } + }, []) + + return ( + + ) +} + +export default OAuthHandler \ No newline at end of file diff --git a/website/src/pages/s/[id].tsx b/website/src/pages/s/[id].tsx index 85ee560..2a4af9b 100644 --- a/website/src/pages/s/[id].tsx +++ b/website/src/pages/s/[id].tsx @@ -1,6 +1,7 @@ import React, { useEffect } from 'react' import { FaCircleNotch } from 'react-icons/fa'; import { useLocation } from '@reach/router'; +import Loading from '../../components/Loading'; function SpacesPage() { @@ -20,9 +21,7 @@ function SpacesPage() { }, []) return ( -
    - -
    + ) } diff --git a/website/src/styles/global.css b/website/src/styles/global.css index 3346b7b..5f5c1ff 100644 --- a/website/src/styles/global.css +++ b/website/src/styles/global.css @@ -26,7 +26,7 @@ h3 { @apply text-2xl pb-1 mb-2 !important; } -h1, h2, .section-header { +.home h1,.home h2, .home .section-header { display: inline-block; font-family: 'Lato', monospace; color: white; @@ -36,14 +36,14 @@ h1, h2, .section-header { border-bottom: 2px solid #FF8500; } -.layout { +.home .layout { max-width: 760px; margin: 0 auto; padding-left: 20px; padding-right: 20px; } -.header { +.home .header { display: flex; justify-content: space-between; align-items: center; @@ -51,58 +51,54 @@ h1, h2, .section-header { height: 80px; } -.nav__link { - margin-left: 20px; -} - -.footer { +.home .footer { display: flex; justify-content: center; align-content: center; padding-top: 20px; } -.copyright-and-docs { +.home .copyright-and-docs { color: white; } -.copyright-and-docs a { +.home .copyright-and-docs a { margin-left: 5px; } /* index */ -a { +.home a { color: white !important; border-bottom: 2px solid #00a8e8; } -a:hover { +.home a:hover { text-decoration: none !important; border-bottom: 2px solid #003459; } -.section-link { +.home .section-link { margin-right: 10px; } -.logo { +.home .logo { max-width: 250px; display: block; } -.logo-sm-screen { +.home .logo-sm-screen { align-content: right; /* margin: 20px auto; * */ margin: 0px auto; display: block; } -.full-height-row { +.home .full-height-row { height: 100vh; } -.activity-container { +.home .activity-container { color: white; border: 2px solid #003459; background-color: rgba(0, 52, 89, 0.6); @@ -112,58 +108,58 @@ a:hover { height: 90%; } -.container-wrapper { +.home .container-wrapper { min-height: 100%; min-height: 100vh; display: flex; align-items: center; } -h1, h2, h3, h4, h5, h6 { +.home h1, .home h2, .home h3, .home h4, .home h5, .home h6 { display: inline-block; } -h3 { +.home h3 { color: white; } -code { +.home code { background-color: rgba(0, 52, 89, 0.6); border-radius: 5px; padding: 0px 2px; color: #FF8500 !important; } -.centered-header { +.home .centered-header { text-align: center; } -.section { +.home .section { min-height: 550px; } -.welcome-col { +.home .welcome-col { display: flex; flex-direction: row; } -.welcome-content { +.home .welcome-content { padding: 0px 20px; margin-top: auto; margin-bottom: auto; } -.welcome-text { +.home .welcome-text { color: white; font-size: 22px; margin-bottom: 20px; } -.small-screen-spacer { +.home .small-screen-spacer { height: 200px; } -.agree-to-rules-check { +.home .agree-to-rules-check { padding-right: 10px; } diff --git a/website/tailwind.config.js b/website/tailwind.config.js index 2d6e260..d7ad7fc 100644 --- a/website/tailwind.config.js +++ b/website/tailwind.config.js @@ -3,6 +3,7 @@ module.exports = { content: [ `./src/pages/**/*.{js,jsx,ts,tsx}`, `./src/components/**/*.{js,jsx,ts,tsx}`, + `./src/layout.tsx`, ], theme: { extend: {},