From 1f2ba0abed5f6be67934c0120bd4572e1d76a11f Mon Sep 17 00:00:00 2001 From: Carsten Kragelund Date: Fri, 6 Oct 2023 23:37:29 +0200 Subject: [PATCH] fix: correct lint issues, format, move to tailwind --- .eslintrc.cjs | 33 ++++++------- README.md | 4 +- bun.lockb | Bin 229258 -> 231321 bytes bunfig.toml | 1 + drizzle.config.ts | 3 +- package.json | 29 ++++++------ prettier.config.cjs | 14 +----- public/.gitkeep | 0 reset.d.ts | 2 +- src/auth/index.ts | 3 +- src/components/base.tsx | 8 +--- src/components/tweets.tsx | 1 - src/context/index.ts | 7 ++- src/controllers/auth.tsx | 10 ++-- src/controllers/tweets.tsx | 11 +++-- src/db/index.ts | 3 +- src/db/schema/tweets.ts | 1 - src/main.ts | 16 ++++--- src/pages/(auth)/signin.tsx | 91 +++++++++++++++++------------------- src/pages/index.tsx | 12 ++--- src/styles.css | 1 + src/types/htmx.d.ts | 15 ++++-- src/types/lucia.d.ts | 3 +- tsconfig.json | 15 +++--- uno.config.ts | 13 ------ 25 files changed, 140 insertions(+), 156 deletions(-) create mode 100644 bunfig.toml create mode 100644 public/.gitkeep create mode 100644 src/styles.css delete mode 100644 uno.config.ts diff --git a/.eslintrc.cjs b/.eslintrc.cjs index c6d2a93..de95c0c 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -1,5 +1,5 @@ /** @type {import("eslint").Linter.Config} */ -const config = { +module.exports = { root: true, parser: "@typescript-eslint/parser", plugins: ["isaacscript", "import"], @@ -12,32 +12,29 @@ const config = { ecmaVersion: "latest", sourceType: "module", tsconfigRootDir: __dirname, - project: [ - "./tsconfig.json", - "./cli/tsconfig.eslint.json", // separate eslint config for the CLI since we want to lint and typecheck differently due to template files - "./upgrade/tsconfig.json", - "./www/tsconfig.json", - ], + project: ["./tsconfig.json"], }, - overrides: [ - // Template files don't have reliable type information - { - files: ["./cli/template/**/*.{ts,tsx}"], - extends: ["plugin:@typescript-eslint/disable-type-checked"], - }, - ], + overrides: [], rules: { // These off/not-configured-the-way-we-want lint rules we like & opt into "@typescript-eslint/no-explicit-any": "error", + // Note: you must disable the base rule as it can report incorrect errors + "no-unused-vars": "off", "@typescript-eslint/no-unused-vars": [ - "error", - { argsIgnorePattern: "^_", destructuredArrayIgnorePattern: "^_" }, + "warn", + { + argsIgnorePattern: "^_", + destructuredArrayIgnorePattern: "^_", + varsIgnorePattern: "^_", + ignoreRestSiblings: true, + }, ], "@typescript-eslint/consistent-type-imports": [ "error", { prefer: "type-imports", fixStyle: "inline-type-imports" }, ], - "import/consistent-type-specifier-style": ["error", "prefer-inline"], + "import/consistent-type-specifier-style": ["error", "prefer-top-level"], + "@typescript-eslint/consistent-type-definitions": ["error", "type"], // For educational purposes we format our comments/jsdoc nicely "isaacscript/complete-sentences-jsdoc": "warn", @@ -51,5 +48,3 @@ const config = { "@typescript-eslint/prefer-nullish-coalescing": "off", }, }; - -module.exports = config; diff --git a/README.md b/README.md index 8854caf..cf55c46 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # This project was created using `create-beth-app` + ## To open an issue: https://github.com/ethanniser/the-beth-stack + ## To discuss: https://discord.gg/Z3yUtMfkwa ### To run locally: @@ -22,4 +24,4 @@ 3. Run `fly secrets set =` (probably want to set `NODE_ENV` to `"production"`) -5. Run `fly deploy` \ No newline at end of file +4. Run `fly deploy` diff --git a/bun.lockb b/bun.lockb index 2d9e96cb21f9e5510e507f463b3afeae82bfcff4..a2b8e3434001d344ceb782854f0ab15649ff1f7e 100755 GIT binary patch delta 67775 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 delta 63713 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 ( - - + diff --git a/src/components/tweets.tsx b/src/components/tweets.tsx index 766dac6..6e99bde 100644 --- a/src/components/tweets.tsx +++ b/src/components/tweets.tsx @@ -1,5 +1,4 @@ import { db } from "../db"; -import { tweets } from "../db/schema/tweets"; export function TweetCard({ author: { handle }, diff --git a/src/context/index.ts b/src/context/index.ts index 0dab923..7de1de6 100644 --- a/src/context/index.ts +++ b/src/context/index.ts @@ -1,5 +1,4 @@ import { logger } from "@bogeychan/elysia-logger"; -import { Logger } from "@bogeychan/elysia-logger/types"; import { cron } from "@elysiajs/cron"; import { HoltLogger } from "@tlscipher/holt"; import { bethStack } from "beth-stack/elysia"; @@ -30,13 +29,13 @@ export const ctx = new Elysia({ .use(bethStack()) .use(logger(loggerConfig)) .use( - // @ts-expect-error + // @ts-expect-error missing toString symbol config.env.NODE_ENV === "development" ? new HoltLogger().getLogger() : (a) => a, ) .use( - // @ts-expect-error + // @ts-expect-error missing toString symbol config.env.DATABASE_CONNECTION_TYPE === "local-replica" ? cron({ name: "heartbeat", @@ -66,7 +65,7 @@ export const ctx = new Elysia({ log.debug(`Request received: ${request.method}: ${request.url}`); } }) - .onResponse(({ log, request, set }) => { + .onResponse(({ log, request }) => { if (log && config.env.NODE_ENV === "production") { log.debug(`Response sent: ${request.method}: ${request.url}`); } diff --git a/src/controllers/auth.tsx b/src/controllers/auth.tsx index 6c5be98..52c662c 100644 --- a/src/controllers/auth.tsx +++ b/src/controllers/auth.tsx @@ -30,8 +30,13 @@ export const authController = new Elysia({ handle, }, }) - .catch((err) => { - if (err.code === "SQLITE_CONSTRAINT") { + .catch((err: unknown) => { + if ( + typeof err === "object" && + err && + "code" in err && + err.code === "SQLITE_CONSTRAINT" + ) { throw new DuplicateEmailError(); } else { throw err; @@ -68,7 +73,6 @@ export const authController = new Elysia({ }), // Enum to validate action type }), error({ code, error, set, log }) { - log.error(error); let errorMessage = ""; diff --git a/src/controllers/tweets.tsx b/src/controllers/tweets.tsx index 163695c..960f3ec 100644 --- a/src/controllers/tweets.tsx +++ b/src/controllers/tweets.tsx @@ -1,6 +1,5 @@ import { eq } from "drizzle-orm"; import { Elysia, t } from "elysia"; -import { authed } from "../auth/middleware"; import { AdditionalTweetList, TweetCard } from "../components/tweets"; import { ctx } from "../context"; import { tweets } from "../db/schema/tweets"; @@ -10,10 +9,12 @@ export const tweetsController = new Elysia({ }) .use(ctx) .derive(async (ctx) => { - const authRequest = ctx.auth.handleRequest(ctx); - const session = await authRequest.validate(); + if (ctx.request) { + const authRequest = ctx.auth.handleRequest(ctx); + const session = await authRequest.validate(); - return { session }; + return { session }; + } }) .get( "/", @@ -32,7 +33,7 @@ export const tweetsController = new Elysia({ ) .post( "/", - async ({ session, db, body, set, log }) => { + async ({ session, db, body, set }) => { if (!session) { set.status = "Unauthorized"; set.headers["HX-Redirect"] = "/signin"; diff --git a/src/db/index.ts b/src/db/index.ts index be7b2fa..06e38e0 100644 --- a/src/db/index.ts +++ b/src/db/index.ts @@ -1,4 +1,5 @@ -import { createClient, type Config } from "@libsql/client"; +import { createClient } from "@libsql/client"; +import type { Config } from "@libsql/client"; import { drizzle } from "drizzle-orm/libsql"; import { config } from "../config"; import * as schema from "./schema"; diff --git a/src/db/schema/tweets.ts b/src/db/schema/tweets.ts index 366597b..a033a91 100644 --- a/src/db/schema/tweets.ts +++ b/src/db/schema/tweets.ts @@ -1,6 +1,5 @@ import { index, integer, sqliteTable, text } from "drizzle-orm/sqlite-core"; import { createInsertSchema, createSelectSchema } from "drizzle-typebox"; -import { user } from "."; export const tweets = sqliteTable( "tweet", diff --git a/src/main.ts b/src/main.ts index 8d3efb7..e6bb87a 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,27 +1,29 @@ import { staticPlugin } from "@elysiajs/static"; -// import { swagger } from "@elysiajs/swagger"; import { Elysia } from "elysia"; import { config } from "./config"; -import { ctx } from "./context"; import { api } from "./controllers/*"; import { pages } from "./pages/*"; +import styles from "./styles.css"; const app = new Elysia() // .use(swagger()) - // @ts-expect-error .use(staticPlugin()) .use(api) .use(pages) + .get("/styles.css", ({ set }) => { + set.headers["Content-Type"] = "text/css"; + return styles; + }) .onStart(({ log }) => { if (config.env.NODE_ENV === "development") { void fetch("http://localhost:3001/restart"); - // log.debug("🦊 Triggering Live Reload"); - console.log("🦊 Triggering Live Reload"); + log.debug("🦊 Triggering Live Reload"); + // console.log("🦊 Triggering Live Reload"); } }) .onError(({ code, error, request, log }) => { - // log.error(` ${request.method} ${request.url}`, code, error); - console.error(error); + log.error(` ${request.method} ${request.url}`, code, error); + // console.error(error); }) .listen(3000); diff --git a/src/pages/(auth)/signin.tsx b/src/pages/(auth)/signin.tsx index 4da0da0..4c06b0d 100644 --- a/src/pages/(auth)/signin.tsx +++ b/src/pages/(auth)/signin.tsx @@ -111,57 +111,54 @@ export const login = new Elysia() set.headers["Set-Cookie"] = stateCookie; set.redirect = url.toString(); }) - .get( - "/login/github/callback", - async ({ request, log, path, query, set, auth }) => { - const { code, state } = query; + .get("/login/github/callback", async ({ request, log, query, set, auth }) => { + const { code, state } = query; - const cookies = parseCookie(request.headers.get("Cookie") ?? ""); - const storedState = cookies.github_oauth_state; + const cookies = parseCookie(request.headers.get("Cookie") ?? ""); + const storedState = cookies.github_oauth_state; - if (!storedState || !state || storedState !== state || !code) { - set.status = 400; - return "Invalid state"; - } - - try { - const { getExistingUser, githubUser, createUser } = - await githubAuth.validateCallback(code); + if (!storedState || !state || storedState !== state || !code) { + set.status = 400; + return "Invalid state"; + } - const getUser = async () => { - const existingUser = await getExistingUser(); - if (existingUser) return existingUser; - const user = await createUser({ - attributes: { - handle: githubUser.login, - }, - }); - return user; - }; + try { + const { getExistingUser, githubUser, createUser } = + await githubAuth.validateCallback(code); - const user = await getUser(); - const session = await auth.createSession({ - userId: user.userId, - attributes: {}, - }); - const sessionCookie = auth.createSessionCookie(session); - // redirect to profile page - return new Response(null, { - headers: { - Location: "/", - "Set-Cookie": sessionCookie.serialize(), // store session cookie + const getUser = async () => { + const existingUser = await getExistingUser(); + if (existingUser) return existingUser; + const user = await createUser({ + attributes: { + handle: githubUser.login, }, - status: 302, }); - } catch (e) { - if (e instanceof OAuthRequestError) { - // invalid code - set.status = 400; - return e.message; - } - set.status = 500; - log.error(e); - return "Internal server error"; + return user; + }; + + const user = await getUser(); + const session = await auth.createSession({ + userId: user.userId, + attributes: {}, + }); + const sessionCookie = auth.createSessionCookie(session); + // redirect to profile page + return new Response(null, { + headers: { + Location: "/", + "Set-Cookie": sessionCookie.serialize(), // store session cookie + }, + status: 302, + }); + } catch (e) { + if (e instanceof OAuthRequestError) { + // invalid code + set.status = 400; + return e.message; } - }, - ); + set.status = 500; + log.error(e); + return "Internal server error"; + } + }); diff --git a/src/pages/index.tsx b/src/pages/index.tsx index ecfe08e..074667e 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -1,6 +1,4 @@ -import { Suspense } from "beth-stack/jsx"; import { Elysia } from "elysia"; -import { authed } from "../auth/middleware"; import { BaseHtml } from "../components/base"; import { InitialTweetList, TweetCreationForm } from "../components/tweets"; import { ctx } from "../context"; @@ -8,12 +6,14 @@ import { ctx } from "../context"; export const index = new Elysia() .use(ctx) .derive(async (ctx) => { - const authRequest = ctx.auth.handleRequest(ctx); - const session = await authRequest.validate(); + if (ctx.request) { + const authRequest = ctx.auth.handleRequest(ctx); + const session = await authRequest.validate(); - return { session }; + return { session }; + } }) - .get("/", async ({ htmlStream, session, db }) => { + .get("/", ({ htmlStream, session }) => { return htmlStream(() => (
diff --git a/src/styles.css b/src/styles.css new file mode 100644 index 0000000..f1d8c73 --- /dev/null +++ b/src/styles.css @@ -0,0 +1 @@ +@import "tailwindcss"; diff --git a/src/types/htmx.d.ts b/src/types/htmx.d.ts index 8faaae3..fe98948 100644 --- a/src/types/htmx.d.ts +++ b/src/types/htmx.d.ts @@ -1,4 +1,5 @@ type RoutesByType< + // eslint-disable-next-line @typescript-eslint/no-explicit-any Schema extends Record, // Ensure keys are strings Type extends "get" | "post" | "put" | "delete" | "patch", > = RouterPattern< @@ -20,22 +21,23 @@ type RemoveSlash = S extends `${infer T}/` : S; type RouterPattern = - T extends `${infer Start}:${infer Param}/${infer Rest}` + T extends `${infer Start}:${infer _}/${infer Rest}` ? `${Start}${string}/${RouterPattern}` - : T extends `${infer Start}:${infer Param}` + : T extends `${infer Start}:${infer _}` ? `${Start}${string}` : T extends `${infer Start}*` ? `${Start}${string}` : T; -type StartsWithApi = T extends `${"/api"}${infer Rest}` +type StartsWithApi = T extends `${"/api"}${infer _}` ? T : never; -type DoesntStartWithApi = T extends `${"/api"}${infer Rest}` +type DoesntStartWithApi = T extends `${"/api"}${infer _}` ? never : T; +// eslint-disable-next-line @typescript-eslint/consistent-type-imports type Schema = import("../main").App["schema"]; type PostRoutes = RoutesByType; @@ -44,9 +46,12 @@ type PutRoutes = RoutesByType; type DeleteRoutes = RoutesByType; type PatchRoutes = RoutesByType; +type AllowQuery = `${T}?${string}` | T; + declare namespace JSX { + // eslint-disable-next-line @typescript-eslint/consistent-type-definitions interface HtmlTag extends Htmx.Attributes { - ["hx-get"]?: StartsWithApi; + ["hx-get"]?: AllowQuery>; ["hx-post"]?: StartsWithApi; ["hx-put"]?: StartsWithApi; ["hx-delete"]?: StartsWithApi; diff --git a/src/types/lucia.d.ts b/src/types/lucia.d.ts index 3dd9fc2..6a21805 100644 --- a/src/types/lucia.d.ts +++ b/src/types/lucia.d.ts @@ -1,8 +1,9 @@ /// declare namespace Lucia { + // eslint-disable-next-line @typescript-eslint/consistent-type-imports type Auth = import("../auth/index").Auth; type DatabaseUserAttributes = { handle: string; }; - type DatabaseSessionAttributes = {}; + type DatabaseSessionAttributes = object; } diff --git a/tsconfig.json b/tsconfig.json index a521d90..c2add4e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,5 +1,7 @@ { + "$schema": "https://json.schemastore.org/tsconfig.json", "compilerOptions": { + "rootDir": ".", "lib": ["ESNext"], "module": "esnext", "target": "esnext", @@ -18,16 +20,15 @@ "forceConsistentCasingInFileNames": true, "allowJs": true, "types": [ - "bun-types" // add Bun global + "bun-types", // add Bun global + "bun-postcss-plugin" ], - // non bun init - // "plugins": [{ "name": "@kitajs/ts-html-plugin" }], "noUncheckedIndexedAccess": true, - // "noUnusedLocals": true, - // "noUnusedParameters": true, "exactOptionalPropertyTypes": true, "noFallthroughCasesInSwitch": true, "noImplicitOverride": true - // "noImplicitReturns": true - } + }, + "files": [".eslintrc.cjs"], + "include": ["**/*", "**/*.d.ts"], + "exclude": ["./node_modules"] } diff --git a/uno.config.ts b/uno.config.ts deleted file mode 100644 index 9674a1e..0000000 --- a/uno.config.ts +++ /dev/null @@ -1,13 +0,0 @@ -import transformerVariantGroup from "@unocss/transformer-variant-group"; -import { defineConfig, presetIcons, presetWebFonts, presetWind } from "unocss"; - -export default defineConfig({ - cli: { - entry: { - patterns: ["src/**/*.{ts,tsx}"], - outFile: "public/dist/unocss.css", - }, - }, - presets: [presetWind(), presetIcons(), presetWebFonts()], - transformers: [transformerVariantGroup()], -});