diff --git a/astro.config.mjs b/astro.config.mjs index 23566f8..479475c 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -1,6 +1,7 @@ // @ts-check import { defineConfig, envField } from 'astro/config'; import { modifiedTime } from './src/utils/lastModified.mjs'; +import db from "@astrojs/db"; import mdx from "@astrojs/mdx"; import node from "@astrojs/node"; import devOnlyRoutes from '@fujocoded/astro-dev-only'; @@ -14,6 +15,7 @@ export default defineConfig({ }, integrations: [ mdx(), + db(), devOnlyRoutes({ // dryRun: true, routePatterns: ["/guestbook/admin"] diff --git a/db/config.ts b/db/config.ts new file mode 100644 index 0000000..e202fbb --- /dev/null +++ b/db/config.ts @@ -0,0 +1,19 @@ +import { column, defineDb, defineTable, NOW } from 'astro:db'; + +const Guestbook = defineTable({ + columns: { + id: column.number({ primaryKey: true }), + username: column.text(), + website: column.text({ optional: true }), + message: column.text(), + published: column.date({ default: NOW }), + updated: column.date({ optional: true }), + reply: column.text({ optional: true }), + } +}); + +export default defineDb({ + tables: { + Guestbook, + }, +}); \ No newline at end of file diff --git a/db/seed.ts b/db/seed.ts deleted file mode 100644 index 003e458..0000000 --- a/db/seed.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { db } from "db"; -import { guestbookTable } from "./schema"; - -export default async function seed() { - await db.insert(guestbookTable).values([ - { id: 1, username: "test user", message: "this is a message!" }, - { id: 2, username: "heylo", website: "https://world.org", message: "hiii!!" }, - ]); -} diff --git a/drizzle.config.ts b/drizzle.config.ts deleted file mode 100644 index 5c71b19..0000000 --- a/drizzle.config.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { loadEnv } from "vite"; -import { defineConfig } from 'drizzle-kit'; - -const { ASTRO_DB_REMOTE_URL } = loadEnv(process.env.NODE_ENV!, process.cwd(), ""); - -export default defineConfig({ - out: "./db/migrations", - schema: "./db/schema.ts", - dialect: "turso", - dbCredentials: { - url: ASTRO_DB_REMOTE_URL, - }, -}); \ No newline at end of file diff --git a/guestbook.db b/guestbook.db index bde39df..e80655e 100644 Binary files a/guestbook.db and b/guestbook.db differ diff --git a/package.json b/package.json index b8a31e4..6330120 100644 --- a/package.json +++ b/package.json @@ -9,20 +9,18 @@ "astro": "astro" }, "dependencies": { + "@astrojs/db": "^0.18.3", "@astrojs/mdx": "^4.3.12", "@astrojs/node": "9.5.1", "@astrojs/rss": "4.0.14", "@fujocoded/astro-dev-only": "0.0.4", - "@libsql/client": "^0.15.15", "astro": "5.16.0", "astro-breadcrumbs": "^3.3.1", "dayjs": "^1.11.19", - "drizzle-orm": "^0.44.7", "isomorphic-dompurify": "^2.33.0", "marked": "^16.4.2" }, "devDependencies": { - "@types/node": "^22.19.1", - "drizzle-kit": "^0.31.7" + "@types/node": "^22.19.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fd55aee..d1f214d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,9 @@ importers: .: dependencies: + '@astrojs/db': + specifier: ^0.18.3 + version: 0.18.3 '@astrojs/mdx': specifier: ^4.3.12 version: 4.3.12(astro@5.16.0(@types/node@22.19.1)(rollup@4.53.3)(typescript@5.9.2)) @@ -23,9 +26,6 @@ importers: '@fujocoded/astro-dev-only': specifier: 0.0.4 version: 0.0.4 - '@libsql/client': - specifier: ^0.15.15 - version: 0.15.15 astro: specifier: 5.16.0 version: 5.16.0(@types/node@22.19.1)(rollup@4.53.3)(typescript@5.9.2) @@ -35,9 +35,6 @@ importers: dayjs: specifier: ^1.11.19 version: 1.11.19 - drizzle-orm: - specifier: ^0.44.7 - version: 0.44.7(@libsql/client@0.15.15) isomorphic-dompurify: specifier: ^2.33.0 version: 2.33.0 @@ -48,9 +45,6 @@ importers: '@types/node': specifier: ^22.19.1 version: 22.19.1 - drizzle-kit: - specifier: ^0.31.7 - version: 0.31.7 packages: @@ -60,8 +54,8 @@ packages: '@asamuzakjp/css-color@4.1.0': resolution: {integrity: sha512-9xiBAtLn4aNsa4mDnpovJvBn72tNEIACyvlqaNJ+ADemR+yeMJWnBudOi2qGDviJa7SwcDOU/TRh5dnET7qk0w==} - '@asamuzakjp/dom-selector@6.7.4': - resolution: {integrity: sha512-buQDjkm+wDPXd6c13534URWZqbz0RP5PAhXZ+LIoa5LgwInT9HVJvGIJivg75vi8I13CxDGdTnz+aY5YUJlIAA==} + '@asamuzakjp/dom-selector@6.7.5': + resolution: {integrity: sha512-Eks6dY8zau4m4wNRQjRVaKQRTalNcPcBvU1ZQ35w5kKRk1gUeNCkVLsRiATurjASTp3TKM4H10wsI50nx3NZdw==} '@asamuzakjp/nwsapi@2.3.9': resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} @@ -69,6 +63,9 @@ packages: '@astrojs/compiler@2.13.0': resolution: {integrity: sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw==} + '@astrojs/db@0.18.3': + resolution: {integrity: sha512-iTK50jUgyj25oa/JiXSN1/IVp5kTmPuioLlve06LE8/HzWGv3JpVgCKIV9HHf3kOVi1HV/uauXnyWzkB+yHLSQ==} + '@astrojs/internal-helpers@0.7.5': resolution: {integrity: sha512-vreGnYSSKhAjFJCWAwe/CNhONvoc5lokxtRoZims+0wa3KbHBdPHSSthJsKxPd8d/aic6lWKpRTYGY/hsgK6EA==} @@ -142,28 +139,17 @@ packages: peerDependencies: '@csstools/css-tokenizer': ^3.0.4 - '@csstools/css-syntax-patches-for-csstree@1.0.17': - resolution: {integrity: sha512-LCC++2h8pLUSPY+EsZmrrJ1EOUu+5iClpEiDhhdw3zRJpPbABML/N5lmRuBHjxtKm9VnRcsUzioyD0sekFMF0A==} + '@csstools/css-syntax-patches-for-csstree@1.0.20': + resolution: {integrity: sha512-8BHsjXfSciZxjmHQOuVdW2b8WLUPts9a+mfL13/PzEviufUEW2xnvQuOlKs9dRBHgRqJ53SF/DUoK9+MZk72oQ==} engines: {node: '>=18'} '@csstools/css-tokenizer@3.0.4': resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} engines: {node: '>=18'} - '@drizzle-team/brocli@0.10.2': - resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} - '@emnapi/runtime@1.7.1': resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} - '@esbuild-kit/core-utils@3.3.2': - resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} - deprecated: 'Merged into tsx: https://tsx.is' - - '@esbuild-kit/esm-loader@2.6.5': - resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} - deprecated: 'Merged into tsx: https://tsx.is' - '@esbuild/aix-ppc64@0.25.12': resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} engines: {node: '>=18'} @@ -652,23 +638,23 @@ packages: cpu: [x64] os: [win32] - '@shikijs/core@3.15.0': - resolution: {integrity: sha512-8TOG6yG557q+fMsSVa8nkEDOZNTSxjbbR8l6lF2gyr6Np+jrPlslqDxQkN6rMXCECQ3isNPZAGszAfYoJOPGlg==} + '@shikijs/core@3.17.1': + resolution: {integrity: sha512-VWsduykcibGU0WMi66PflThDWyqEeTOiWdCRa3wmsZuishh+1PDSOh5gGxHdSrOtS+v1pmYaxodk/JNzwusElA==} - '@shikijs/engine-javascript@3.15.0': - resolution: {integrity: sha512-ZedbOFpopibdLmvTz2sJPJgns8Xvyabe2QbmqMTz07kt1pTzfEvKZc5IqPVO/XFiEbbNyaOpjPBkkr1vlwS+qg==} + '@shikijs/engine-javascript@3.17.1': + resolution: {integrity: sha512-Ars0DVJITQrkOl5Swwy+94NL/BlOi/w1NSFbPGkcsln7Dv+M2qHaVpNHwdtWCC4/arzvjuHbyWBUsWExDHPDLw==} - '@shikijs/engine-oniguruma@3.15.0': - resolution: {integrity: sha512-HnqFsV11skAHvOArMZdLBZZApRSYS4LSztk2K3016Y9VCyZISnlYUYsL2hzlS7tPqKHvNqmI5JSUJZprXloMvA==} + '@shikijs/engine-oniguruma@3.17.1': + resolution: {integrity: sha512-fsXPy4va/4iblEGS+22nP5V08IwwBcM+8xHUzSON0QmHm29/AJRghA95w9VDnxuwp9wOdJxEhfPkKp6vqcsN+w==} - '@shikijs/langs@3.15.0': - resolution: {integrity: sha512-WpRvEFvkVvO65uKYW4Rzxs+IG0gToyM8SARQMtGGsH4GDMNZrr60qdggXrFOsdfOVssG/QQGEl3FnJ3EZ+8w8A==} + '@shikijs/langs@3.17.1': + resolution: {integrity: sha512-YTBVN+L2j7zBuOVjNZ2XiSNQEkm/7wZ1TSc5UO77GJPcg7Rk25WSscWA7y8pW7Bo25JIU0EWchUkq/UQjOJlJA==} - '@shikijs/themes@3.15.0': - resolution: {integrity: sha512-8ow2zWb1IDvCKjYb0KiLNrK4offFdkfNVPXb1OZykpLCzRU6j+efkY+Y7VQjNlNFXonSw+4AOdGYtmqykDbRiQ==} + '@shikijs/themes@3.17.1': + resolution: {integrity: sha512-aohwwqNUB5h2ATfgrqYRPl8vyazqCiQ2wIV4xq+UzaBRHpqLMGSemkasK+vIEpl0YaendoaKUsDfpwhCqyHIaQ==} - '@shikijs/types@3.15.0': - resolution: {integrity: sha512-BnP+y/EQnhihgHy4oIAN+6FFtmfTekwOLsQbRw9hOKwqgNy8Bdsjq8B05oAt/ZgvIWWFrshV71ytOrlPfYjIJw==} + '@shikijs/types@3.17.1': + resolution: {integrity: sha512-yUFLiCnZHHJ16KbVbt3B1EzBUadU3OVpq0PEyb301m5BbuFKApQYBzJGhrK48hH/tYWSjzwcj7BSmYbBc0zntQ==} '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} @@ -804,9 +790,6 @@ packages: brotli@1.3.3: resolution: {integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==} - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - camelcase@8.0.0: resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} engines: {node: '>=16'} @@ -866,8 +849,8 @@ packages: cookie-es@1.2.2: resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} - cookie@1.0.2: - resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} + cookie@1.1.1: + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} engines: {node: '>=18'} crossws@0.3.5: @@ -927,6 +910,9 @@ packages: decode-named-character-reference@1.2.0: resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} + deep-diff@1.0.2: + resolution: {integrity: sha512-aWS3UIVH+NPGCD1kki+DCU9Dua032iSsO43LqQpcs4R3+dVv7tX0qBGjiVHJHjplsoUM2XRO/KB92glqc68awg==} + defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} @@ -985,12 +971,8 @@ packages: domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} - drizzle-kit@0.31.7: - resolution: {integrity: sha512-hOzRGSdyKIU4FcTSFYGKdXEjFsncVwHZ43gY3WU5Bz9j5Iadp6Rh6hxLSQ1IWXpKLBKt/d5y1cpSPcV+FcoQ1A==} - hasBin: true - - drizzle-orm@0.44.7: - resolution: {integrity: sha512-quIpnYznjU9lHshEOAYLoZ9s3jweleHlZIAWR/jX9gAWNg/JhQ1wj0KGRf7/Zm+obRrYd9GjPVJg790QY9N5AQ==} + drizzle-orm@0.42.0: + resolution: {integrity: sha512-pS8nNJm2kBNZwrOjTHJfdKkaU+KuUQmV/vk5D57NojDq4FG+0uAYGMulXtYT///HfgsMF0hnFFvu1ezI3OwOkg==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' '@cloudflare/workers-types': '>=4' @@ -1006,7 +988,6 @@ packages: '@types/better-sqlite3': '*' '@types/pg': '*' '@types/sql.js': '*' - '@upstash/redis': '>=1.34.7' '@vercel/postgres': '>=0.8.0' '@xata.io/client': '*' better-sqlite3: '>=7' @@ -1050,8 +1031,6 @@ packages: optional: true '@types/sql.js': optional: true - '@upstash/redis': - optional: true '@vercel/postgres': optional: true '@xata.io/client': @@ -1115,11 +1094,6 @@ packages: esast-util-from-js@2.0.1: resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} - esbuild-register@3.6.0: - resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} - peerDependencies: - esbuild: '>=0.25.0' - esbuild@0.25.12: resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} engines: {node: '>=18'} @@ -1213,9 +1187,6 @@ packages: resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} engines: {node: '>=18'} - get-tsconfig@4.13.0: - resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} - github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} @@ -1371,8 +1342,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.2.2: - resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} + lru-cache@11.2.4: + resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==} engines: {node: 20 || >=22} magic-string@0.30.21: @@ -1435,8 +1406,8 @@ packages: mdast-util-phrasing@4.1.0: resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} - mdast-util-to-hast@13.2.0: - resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} mdast-util-to-markdown@2.1.2: resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} @@ -1575,6 +1546,11 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanoid@5.1.6: + resolution: {integrity: sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==} + engines: {node: ^18 || >=20} + hasBin: true + neotraverse@0.6.18: resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} engines: {node: '>= 10'} @@ -1632,8 +1608,8 @@ packages: resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} engines: {node: '>=14.16'} - package-manager-detector@1.5.0: - resolution: {integrity: sha512-uBj69dVlYe/+wxj8JOpr97XfsxH/eumMt6HqjNTmJDf/6NO9s+0uxeOneIz3AsPt2m6y9PqzDzd3ATcU17MNfw==} + package-manager-detector@1.6.0: + resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} pako@0.2.9: resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} @@ -1761,9 +1737,6 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - restructure@3.0.2: resolution: {integrity: sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==} @@ -1813,8 +1786,8 @@ packages: resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - shiki@3.15.0: - resolution: {integrity: sha512-kLdkY6iV3dYbtPwS9KXU7mjfmDm25f5m0IPNFnaXO7TBPcvbUOY72PYXSuSqDzwp+vlH/d7MXpHlKO/x+QoLXw==} + shiki@3.17.1: + resolution: {integrity: sha512-KbAPJo6pQpfjupOg5HW0fk/OSmeBfzza2IjZ5XbNKbqhZaCoxro/EyOgesaLvTdyDfrsAUDA6L4q14sc+k9i7g==} sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -1827,13 +1800,6 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - source-map@0.7.6: resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} engines: {node: '>= 12'} @@ -2216,20 +2182,61 @@ snapshots: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - lru-cache: 11.2.2 + lru-cache: 11.2.4 - '@asamuzakjp/dom-selector@6.7.4': + '@asamuzakjp/dom-selector@6.7.5': dependencies: '@asamuzakjp/nwsapi': 2.3.9 bidi-js: 1.0.3 css-tree: 3.1.0 is-potential-custom-element-name: 1.0.1 - lru-cache: 11.2.2 + lru-cache: 11.2.4 '@asamuzakjp/nwsapi@2.3.9': {} '@astrojs/compiler@2.13.0': {} + '@astrojs/db@0.18.3': + dependencies: + '@libsql/client': 0.15.15 + deep-diff: 1.0.2 + drizzle-orm: 0.42.0(@libsql/client@0.15.15) + nanoid: 5.1.6 + piccolore: 0.1.3 + prompts: 2.4.2 + yargs-parser: 21.1.1 + zod: 3.25.76 + transitivePeerDependencies: + - '@aws-sdk/client-rds-data' + - '@cloudflare/workers-types' + - '@electric-sql/pglite' + - '@libsql/client-wasm' + - '@neondatabase/serverless' + - '@op-engineering/op-sqlite' + - '@opentelemetry/api' + - '@planetscale/database' + - '@prisma/client' + - '@tidbcloud/serverless' + - '@types/better-sqlite3' + - '@types/pg' + - '@types/sql.js' + - '@vercel/postgres' + - '@xata.io/client' + - better-sqlite3 + - bufferutil + - bun-types + - expo-sqlite + - gel + - knex + - kysely + - mysql2 + - pg + - postgres + - prisma + - sql.js + - sqlite3 + - utf-8-validate + '@astrojs/internal-helpers@0.7.5': {} '@astrojs/markdown-remark@6.3.9': @@ -2248,7 +2255,7 @@ snapshots: remark-parse: 11.0.0 remark-rehype: 11.1.2 remark-smartypants: 3.0.2 - shiki: 3.15.0 + shiki: 3.17.1 smol-toml: 1.5.2 unified: 11.0.5 unist-util-remove-position: 5.0.0 @@ -2342,27 +2349,15 @@ snapshots: dependencies: '@csstools/css-tokenizer': 3.0.4 - '@csstools/css-syntax-patches-for-csstree@1.0.17': {} + '@csstools/css-syntax-patches-for-csstree@1.0.20': {} '@csstools/css-tokenizer@3.0.4': {} - '@drizzle-team/brocli@0.10.2': {} - '@emnapi/runtime@1.7.1': dependencies: tslib: 2.8.1 optional: true - '@esbuild-kit/core-utils@3.3.2': - dependencies: - esbuild: 0.25.12 - source-map-support: 0.5.21 - - '@esbuild-kit/esm-loader@2.6.5': - dependencies: - '@esbuild-kit/core-utils': 3.3.2 - get-tsconfig: 4.13.0 - '@esbuild/aix-ppc64@0.25.12': optional: true @@ -2712,33 +2707,33 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.53.3': optional: true - '@shikijs/core@3.15.0': + '@shikijs/core@3.17.1': dependencies: - '@shikijs/types': 3.15.0 + '@shikijs/types': 3.17.1 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 hast-util-to-html: 9.0.5 - '@shikijs/engine-javascript@3.15.0': + '@shikijs/engine-javascript@3.17.1': dependencies: - '@shikijs/types': 3.15.0 + '@shikijs/types': 3.17.1 '@shikijs/vscode-textmate': 10.0.2 oniguruma-to-es: 4.3.4 - '@shikijs/engine-oniguruma@3.15.0': + '@shikijs/engine-oniguruma@3.17.1': dependencies: - '@shikijs/types': 3.15.0 + '@shikijs/types': 3.17.1 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/langs@3.15.0': + '@shikijs/langs@3.17.1': dependencies: - '@shikijs/types': 3.15.0 + '@shikijs/types': 3.17.1 - '@shikijs/themes@3.15.0': + '@shikijs/themes@3.17.1': dependencies: - '@shikijs/types': 3.15.0 + '@shikijs/types': 3.17.1 - '@shikijs/types@3.15.0': + '@shikijs/types@3.17.1': dependencies: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 @@ -2847,7 +2842,7 @@ snapshots: ci-info: 4.3.1 clsx: 2.1.1 common-ancestor-path: 1.0.1 - cookie: 1.0.2 + cookie: 1.1.1 cssesc: 3.0.0 debug: 4.4.3 deterministic-object-hash: 2.0.2 @@ -2871,13 +2866,13 @@ snapshots: neotraverse: 0.6.18 p-limit: 6.2.0 p-queue: 8.1.1 - package-manager-detector: 1.5.0 + package-manager-detector: 1.6.0 piccolore: 0.1.3 picomatch: 4.0.3 prompts: 2.4.2 rehype: 13.0.2 semver: 7.7.3 - shiki: 3.15.0 + shiki: 3.17.1 smol-toml: 1.5.2 svgo: 4.0.0 tinyexec: 1.0.2 @@ -2962,8 +2957,6 @@ snapshots: dependencies: base64-js: 1.5.1 - buffer-from@1.1.2: {} - camelcase@8.0.0: {} ccount@2.0.1: {} @@ -3000,7 +2993,7 @@ snapshots: cookie-es@1.2.2: {} - cookie@1.0.2: {} + cookie@1.1.1: {} crossws@0.3.5: dependencies: @@ -3035,7 +3028,7 @@ snapshots: cssstyle@5.3.3: dependencies: '@asamuzakjp/css-color': 4.1.0 - '@csstools/css-syntax-patches-for-csstree': 1.0.17 + '@csstools/css-syntax-patches-for-csstree': 1.0.20 css-tree: 3.1.0 data-uri-to-buffer@4.0.1: {} @@ -3057,6 +3050,8 @@ snapshots: dependencies: character-entities: 2.0.2 + deep-diff@1.0.2: {} + defu@6.1.4: {} depd@2.0.0: {} @@ -3108,16 +3103,7 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 - drizzle-kit@0.31.7: - dependencies: - '@drizzle-team/brocli': 0.10.2 - '@esbuild-kit/esm-loader': 2.6.5 - esbuild: 0.25.12 - esbuild-register: 3.6.0(esbuild@0.25.12) - transitivePeerDependencies: - - supports-color - - drizzle-orm@0.44.7(@libsql/client@0.15.15): + drizzle-orm@0.42.0(@libsql/client@0.15.15): optionalDependencies: '@libsql/client': 0.15.15 @@ -3151,13 +3137,6 @@ snapshots: esast-util-from-estree: 2.0.0 vfile-message: 4.0.3 - esbuild-register@3.6.0(esbuild@0.25.12): - dependencies: - debug: 4.4.3 - esbuild: 0.25.12 - transitivePeerDependencies: - - supports-color - esbuild@0.25.12: optionalDependencies: '@esbuild/aix-ppc64': 0.25.12 @@ -3277,10 +3256,6 @@ snapshots: get-east-asian-width@1.4.0: {} - get-tsconfig@4.13.0: - dependencies: - resolve-pkg-maps: 1.0.0 - github-slugger@2.0.0: {} h3@1.15.4: @@ -3331,7 +3306,7 @@ snapshots: hast-util-from-parse5: 8.0.3 hast-util-to-parse5: 8.0.0 html-void-elements: 3.0.0 - mdast-util-to-hast: 13.2.0 + mdast-util-to-hast: 13.2.1 parse5: 7.3.0 unist-util-position: 5.0.0 unist-util-visit: 5.0.0 @@ -3368,7 +3343,7 @@ snapshots: comma-separated-tokens: 2.0.3 hast-util-whitespace: 3.0.0 html-void-elements: 3.0.0 - mdast-util-to-hast: 13.2.0 + mdast-util-to-hast: 13.2.1 property-information: 7.1.0 space-separated-tokens: 2.0.2 stringify-entities: 4.0.4 @@ -3513,7 +3488,7 @@ snapshots: jsdom@27.2.0: dependencies: '@acemir/cssom': 0.9.24 - '@asamuzakjp/dom-selector': 6.7.4 + '@asamuzakjp/dom-selector': 6.7.5 cssstyle: 5.3.3 data-urls: 6.0.0 decimal.js: 10.6.0 @@ -3558,7 +3533,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.2.2: {} + lru-cache@11.2.4: {} magic-string@0.30.21: dependencies: @@ -3717,7 +3692,7 @@ snapshots: '@types/mdast': 4.0.4 unist-util-is: 6.0.1 - mdast-util-to-hast@13.2.0: + mdast-util-to-hast@13.2.1: dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 @@ -4025,6 +4000,8 @@ snapshots: nanoid@3.3.11: {} + nanoid@5.1.6: {} + neotraverse@0.6.18: {} nlcst-to-string@4.0.0: @@ -4080,7 +4057,7 @@ snapshots: p-timeout@6.1.4: {} - package-manager-detector@1.5.0: {} + package-manager-detector@1.6.0: {} pako@0.2.9: {} @@ -4249,7 +4226,7 @@ snapshots: dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - mdast-util-to-hast: 13.2.0 + mdast-util-to-hast: 13.2.1 unified: 11.0.5 vfile: 6.0.3 @@ -4268,8 +4245,6 @@ snapshots: require-from-string@2.0.2: {} - resolve-pkg-maps@1.0.0: {} - restructure@3.0.2: {} retext-latin@4.0.0: @@ -4387,14 +4362,14 @@ snapshots: '@img/sharp-win32-x64': 0.34.5 optional: true - shiki@3.15.0: + shiki@3.17.1: dependencies: - '@shikijs/core': 3.15.0 - '@shikijs/engine-javascript': 3.15.0 - '@shikijs/engine-oniguruma': 3.15.0 - '@shikijs/langs': 3.15.0 - '@shikijs/themes': 3.15.0 - '@shikijs/types': 3.15.0 + '@shikijs/core': 3.17.1 + '@shikijs/engine-javascript': 3.17.1 + '@shikijs/engine-oniguruma': 3.17.1 + '@shikijs/langs': 3.17.1 + '@shikijs/themes': 3.17.1 + '@shikijs/types': 3.17.1 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 @@ -4404,13 +4379,6 @@ snapshots: source-map-js@1.2.1: {} - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - source-map@0.7.6: {} space-separated-tokens@2.0.2: {} diff --git a/shippy.config.ts b/shippy.config.ts index d7e0f02..87320cf 100644 --- a/shippy.config.ts +++ b/shippy.config.ts @@ -1,8 +1,8 @@ export default { host: { - host: "137.184.37.162", + host: "15.235.122.159", username: "haetae", - remoteProjectPath: "/var/www/fujohost/haetae/", + remoteProjectPath: "/var/www/", remoteDbPath: "/var/www/fujohost/haetae/guestbook.db", dbDriver: "astro:db", privateKeyPath: "/home/ayowaddup/.ssh/shippy.id_ed25519" diff --git a/src/actions/guestbook.ts b/src/actions/guestbook.ts index 6a78059..7b6eb9a 100644 --- a/src/actions/guestbook.ts +++ b/src/actions/guestbook.ts @@ -1,8 +1,7 @@ import { ActionError, defineAction } from "astro:actions"; import { z } from "astro:schema"; -import { db } from "db"; -import { guestbookTable } from "db/schema"; -import { eq } from "drizzle-orm"; +import { db, eq, Guestbook } from "astro:db"; +// import { guestbookTable } from "db/schema"; import DOMPurify from "isomorphic-dompurify"; export const guestbook = { @@ -26,7 +25,7 @@ export const guestbook = { const sanitized = DOMPurify.sanitize(addLine); try { - const entry = await db.insert(guestbookTable).values({ + const entry = await db.insert(Guestbook).values({ username, website, message: sanitized, @@ -50,7 +49,7 @@ export const guestbook = { throw new ActionError({ code: "UNAUTHORIZED" }); } - const entry = await db.select().from(guestbookTable).where(eq(guestbookTable.id, id)); + const entry = await db.select().from(Guestbook).where(eq(Guestbook.id, id)); if (!entry) { throw new ActionError({ code: "NOT_FOUND", @@ -62,10 +61,10 @@ export const guestbook = { const sanitized = DOMPurify.sanitize(addLine); try { - const update = await db.update(guestbookTable).set({ + const update = await db.update(Guestbook).set({ reply: sanitized, - updated: new Date().toDateString(), - }).where(eq(guestbookTable.id, id)).returning(); + updated: new Date(), + }).where(eq(Guestbook.id, id)).returning(); return update[0]; } catch (e) { @@ -83,7 +82,7 @@ export const guestbook = { throw new ActionError({ code: "UNAUTHORIZED" }); } - const entry = await db.select().from(guestbookTable).where(eq(guestbookTable.id, id)); + const entry = await db.select().from(Guestbook).where(eq(Guestbook.id, id)); if (!entry) { throw new ActionError({ code: "NOT_FOUND", @@ -92,7 +91,7 @@ export const guestbook = { } try { - const entry = await db.delete(guestbookTable).where(eq(guestbookTable.id, id)).returning(); + const entry = await db.delete(Guestbook).where(eq(Guestbook.id, id)).returning(); return entry[0]; } catch (e) { diff --git a/src/components/Entries.astro b/src/components/Entries.astro index ce33faa..942555d 100644 --- a/src/components/Entries.astro +++ b/src/components/Entries.astro @@ -1,11 +1,14 @@ --- -import { desc } from "drizzle-orm"; -import { db } from "db"; -import { guestbookTable } from "db/schema"; +import type { GuestbookEntry } from "db/schema"; import formatDate from "@/utils/formatDate"; +import speech from "$/speech.png"; import pikachu from "$/images/portrait-0025.png"; -const entries = await db.select().from(guestbookTable).orderBy(desc(guestbookTable.published)); +interface Props { + entries: GuestbookEntry[]; +} + +const { entries } = Astro.props; ---
{entries.map(entry => ( @@ -29,21 +32,23 @@ const entries = await db.select().from(guestbookTable).orderBy(desc(guestbookTab - {entry.reply &&
- a portrait of pikachu -
-
-

Reply to {entry.username}

- -
+ {entry.reply && ( +
+ a portrait of pikachu +
+
+

Reply to {entry.username}

+ +
-
- +
+ +
-
-
} +
+ )} ))} @@ -53,9 +58,16 @@ const entries = await db.select().from(guestbookTable).orderBy(desc(guestbookTab

There's nothing here! Want to be the first to comment?

)} + +
- \ No newline at end of file + + + \ No newline at end of file diff --git a/src/pages/guestbook/[page].astro b/src/pages/guestbook/[page].astro new file mode 100644 index 0000000..c3649eb --- /dev/null +++ b/src/pages/guestbook/[page].astro @@ -0,0 +1,33 @@ +--- +import type { GetStaticPaths } from "astro"; +import { Font } from "astro:assets"; +import { desc } from "drizzle-orm"; +import { db } from "db"; +import { guestbookTable } from "db/schema"; + +import Layout from "@/layouts/Layout.astro"; +import Entries from "~/Entries.astro"; + +export const getStaticPaths = (async ({ paginate }) => { + const data = await db.select().from(guestbookTable).orderBy(desc(guestbookTable.published)); + return paginate(data, { pageSize: 1 }); +}) satisfies GetStaticPaths; + +const { page } = Astro.props; +--- + + + + + + + + + + \ No newline at end of file diff --git a/src/pages/guestbook/index.astro b/src/pages/guestbook/index.astro index 9c1e245..6e0cf54 100644 --- a/src/pages/guestbook/index.astro +++ b/src/pages/guestbook/index.astro @@ -1,13 +1,17 @@ --- import { actions, isInputError } from "astro:actions"; import { Font } from "astro:assets"; +import { desc } from "drizzle-orm"; +import { db } from "db"; +import { guestbookTable } from "db/schema"; import Layout from "@/layouts/Layout.astro"; -import speech from "$/speech.png"; import Entries from "~/Entries.astro"; import Dialog from "~/Dialog.astro"; const result = Astro.getActionResult(actions.guestbook.addEntry); +const entries = await db.select().from(guestbookTable).orderBy(desc(guestbookTable.published)); +entries.slice(0, 10); const inputErrors = isInputError(result?.error) ? result.error.fields : {}; --- @@ -42,7 +46,7 @@ const inputErrors = isInputError(result?.error) ? result.error.fields : {}; - +

Loading...

@@ -52,12 +56,7 @@ const inputErrors = isInputError(result?.error) ? result.error.fields : {};
-