From 6c9546b74ac9a1748ef0992c95afe905c72c9aa1 Mon Sep 17 00:00:00 2001 From: Max Nuding Date: Tue, 11 Apr 2023 16:02:54 +0200 Subject: [PATCH] Improve formatting --- .nova/Configuration.json | 10 +- README.md | 7 +- faviconDescription.json | 3 +- src/app.html | 94 ++++----- src/hooks.server.ts | 7 +- src/lib/components/AccountComponent.svelte | 2 +- src/lib/components/AvatarComponent.svelte | 22 +- src/lib/components/LoadMoreComponent.svelte | 22 +- .../components/LoadingSpinnerComponent.svelte | 12 +- src/lib/components/PostComponent.svelte | 11 +- src/lib/errorToast.ts | 2 +- src/lib/mastodon/response.ts | 37 ++-- src/lib/relativeTime.ts | 9 +- src/lib/server/db.ts | 188 +++++++++--------- src/lib/server/rss.ts | 18 +- src/lib/server/timeline.ts | 54 +++-- src/routes/+page.ts | 10 +- src/routes/+server.ts | 2 +- src/routes/api/posts/+server.ts | 2 +- static/site.webmanifest | 34 ++-- static/style.css | 9 +- svelte.config.js | 4 +- 22 files changed, 280 insertions(+), 279 deletions(-) diff --git a/.nova/Configuration.json b/.nova/Configuration.json index 136f707..51b43ff 100644 --- a/.nova/Configuration.json +++ b/.nova/Configuration.json @@ -1,7 +1,7 @@ { - "apexskier.typescript.config.formatDocumentOnSave": "true", - "apexskier.typescript.config.isEnabledForJavascript": "Enable", - "apexskier.typescript.config.organizeImportsOnSave": "true", - "apexskier.typescript.config.userPreferences.quotePreference": "single", - "apexskier.typescript.config.userPreferences.useLabelDetailsInCompletionEntries": true + "apexskier.typescript.config.formatDocumentOnSave" : "true", + "apexskier.typescript.config.isEnabledForJavascript" : "Enable", + "apexskier.typescript.config.organizeImportsOnSave" : "true", + "apexskier.typescript.config.userPreferences.quotePreference" : "single", + "apexskier.typescript.config.userPreferences.useLabelDetailsInCompletionEntries" : true } diff --git a/README.md b/README.md index 3a41123..74328ed 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ I can see that there are plenty of posts using only descriptions and links witho be missed. This isn't a great solution. Another idea was to store only URLs of posts and resolve the content and account information live. -This would be better, but I'm *still* storing post information while also slowing the app down and introduce more code +This would be better, but I'm _still_ storing post information while also slowing the app down and introduce more code complexity. I'm willing to make this change if people prefer this though. Additionally, I ended up adding a few things which turned out to be not needed: @@ -51,7 +51,6 @@ By default, NVM is used to install NodeJS, but you can install it any way you wa This is based on [SvelteKit's instructions](https://kit.svelte.dev/docs/adapter-node#deploying) and [How To Deploy Node.js Applications Using Systemd and Nginx](https://www.digitalocean.com/community/tutorials/how-to-deploy-node-js-applications-using-systemd-and-nginx) - #### On your server Install Apache2 if not already installed. @@ -78,7 +77,6 @@ Enter `$APP_DIR`. Place `package-lock.json` and `start.sh.EXAMPLE` in this directory. Run `npm ci --omit dev` to install the dependencies. - Rename `start.sh.EXAMPLE` to `start.sh` and set the path to your NVM. If you do not have NVM installed, simply remove the line and make sure your node executable can be found either by @@ -93,12 +91,11 @@ If you do, add the path to your SSLCertificateFile and SSLCertificateKeyFile. Copy `moshing-mammut.service.EXAMPLE` to `/etc/systemd/system/moshing-mammut.service` and set your `User`, `Group`, `ExecStart` and `WorkingDirectory` accordingly. - #### On your development machine Copy `.env.EXAMPLE` to `.env` and add your `YOUTUBE_API_KEY`. To obtain one follow [YouTube's guide](https://developers.google.com/youtube/registering_an_application) to create an -*API key*. As soon as #13 is implemented, this will be optional! +_API key_. As soon as #13 is implemented, this will be optional! Run `npm run build` and copy the output folder, usually `build` to `$APP_DIR` on your server. diff --git a/faviconDescription.json b/faviconDescription.json index edc8e91..3d77851 100644 --- a/faviconDescription.json +++ b/faviconDescription.json @@ -1,4 +1,3 @@ - { "masterPicture": "./icon.svg", "iconsPath": "/static", @@ -61,4 +60,4 @@ "htmlCodeFile": false, "usePathAsIs": false } -} \ No newline at end of file +} diff --git a/src/app.html b/src/app.html index 52aae12..fa2ed58 100644 --- a/src/app.html +++ b/src/app.html @@ -1,53 +1,53 @@ - - - - - - - - - - - - - - - - - %sveltekit.head% - - - -
%sveltekit.body%
- + @media (prefers-color-scheme: dark) { + body { + --color-text: white; + --color-bg: #17063b; + --color-border: white; + --color-link: #8a9bf0; + --color-link-visited: #c384fb; + } + } + + + +
%sveltekit.body%
+ diff --git a/src/hooks.server.ts b/src/hooks.server.ts index 18198d9..99616f5 100644 --- a/src/hooks.server.ts +++ b/src/hooks.server.ts @@ -24,12 +24,9 @@ export const handle = (async ({ event, resolve }) => { } if (event.url.pathname === '/feed.xml') { const f = await fs.readFile('feed.xml', { encoding: 'utf8' }); - return new Response( - f, - { headers: [['Content-Type', 'application/atom+xml']] } - ); + return new Response(f, { headers: [['Content-Type', 'application/atom+xml']] }); } const response = await resolve(event); return response; -}) satisfies Handle; \ No newline at end of file +}) satisfies Handle; diff --git a/src/lib/components/AccountComponent.svelte b/src/lib/components/AccountComponent.svelte index 635a1be..c58e3af 100644 --- a/src/lib/components/AccountComponent.svelte +++ b/src/lib/components/AccountComponent.svelte @@ -4,4 +4,4 @@ export let account: Account; -{account.display_name} @{account.acct} \ No newline at end of file +{account.display_name} @{account.acct} diff --git a/src/lib/components/AvatarComponent.svelte b/src/lib/components/AvatarComponent.svelte index 55b608f..9a4aeea 100644 --- a/src/lib/components/AvatarComponent.svelte +++ b/src/lib/components/AvatarComponent.svelte @@ -3,18 +3,18 @@ export let account: Account; let avatarDescription: string; - $: avatarDescription = `Avatar for ${account.acct}` + $: avatarDescription = `Avatar for ${account.acct}`; -{avatarDescription}/ +{avatarDescription} \ No newline at end of file + img { + max-width: 50px; + max-height: 50px; + width: auto; + height: auto; + object-fit: contain; + border-radius: 3px; + } + diff --git a/src/lib/components/LoadMoreComponent.svelte b/src/lib/components/LoadMoreComponent.svelte index ce461db..01482d8 100644 --- a/src/lib/components/LoadMoreComponent.svelte +++ b/src/lib/components/LoadMoreComponent.svelte @@ -2,19 +2,19 @@ import { createEventDispatcher } from 'svelte'; import LoadingSpinnerComponent from '$lib/components/LoadingSpinnerComponent.svelte'; - export let moreAvailable: boolean = false; - export let isLoading: boolean = false; + export let moreAvailable = false; + export let isLoading = false; let displayText = ''; let title = ''; let disabled: boolean; $: if (isLoading) { - displayText = 'Loading...'; + displayText = 'Loading...'; } else if (!moreAvailable) { - displayText = 'You reached the end'; + displayText = 'You reached the end'; } else { - displayText = 'Load More'; - }; + displayText = 'Load More'; + } $: disabled = !moreAvailable || isLoading; $: title = moreAvailable ? 'Load More' : 'There be dragons!'; @@ -26,10 +26,10 @@ \ No newline at end of file + diff --git a/src/lib/components/LoadingSpinnerComponent.svelte b/src/lib/components/LoadingSpinnerComponent.svelte index e41ec9f..53f37a9 100644 --- a/src/lib/components/LoadingSpinnerComponent.svelte +++ b/src/lib/components/LoadingSpinnerComponent.svelte @@ -1,9 +1,10 @@ -
+
+ \ No newline at end of file + diff --git a/src/lib/components/PostComponent.svelte b/src/lib/components/PostComponent.svelte index f15245a..d2d8f9d 100644 --- a/src/lib/components/PostComponent.svelte +++ b/src/lib/components/PostComponent.svelte @@ -3,14 +3,14 @@ import AvatarComponent from '$lib/components/AvatarComponent.svelte'; import AccountComponent from '$lib/components/AccountComponent.svelte'; import { secondsSince, relativeTime } from '$lib/relativeTime'; - import { onMount } from "svelte"; + import { onMount } from 'svelte'; export let post: Post; let displayRelativeTime = false; const absoluteDate = new Date(post.created_at).toLocaleString(); let dateCreated = absoluteDate; const timePassed = secondsSince(new Date(post.created_at)); - $: if(displayRelativeTime) { + $: if (displayRelativeTime) { dateCreated = relativeTime($timePassed) ?? absoluteDate; } @@ -19,16 +19,15 @@ // When JS is disabled the server-side rendered absolute date will be shown, // otherwise the relative date would be outdated very quickly displayRelativeTime = true; - }) + }); -
{@html post.content}
@@ -54,4 +53,4 @@ max-width: calc(600px - 1em - 50px); overflow-x: auto; } - \ No newline at end of file + diff --git a/src/lib/errorToast.ts b/src/lib/errorToast.ts index 1d85264..3e15c37 100644 --- a/src/lib/errorToast.ts +++ b/src/lib/errorToast.ts @@ -5,4 +5,4 @@ export function errorToast(message: string): number { return toast.push(`${message}`, { classes: ['error'] }); -} \ No newline at end of file +} diff --git a/src/lib/mastodon/response.ts b/src/lib/mastodon/response.ts index 6e188fb..5f544c3 100644 --- a/src/lib/mastodon/response.ts +++ b/src/lib/mastodon/response.ts @@ -1,29 +1,28 @@ export interface TimelineEvent { - event: string, - payload: string + event: string; + payload: string; } export interface Post { - id: string, - created_at: string, - tags: Tag[], - url: string, - content: string, - account: Account - + id: string; + created_at: string; + tags: Tag[]; + url: string; + content: string; + account: Account; } export interface Tag { - name: string, - url: string + name: string; + url: string; } export interface Account { - id: string, - acct: string, - username: string, - display_name: string, - url: string, - avatar: string, - avatar_static: string -} \ No newline at end of file + id: string; + acct: string; + username: string; + display_name: string; + url: string; + avatar: string; + avatar_static: string; +} diff --git a/src/lib/relativeTime.ts b/src/lib/relativeTime.ts index 2128a96..62faa30 100644 --- a/src/lib/relativeTime.ts +++ b/src/lib/relativeTime.ts @@ -11,10 +11,7 @@ export const time = readable(new Date(), function start(set) { }); export function secondsSince(date: Date): Readable { - return derived( - time, - $time => Math.round(($time.getTime() - date.getTime()) / 1000) - ); + return derived(time, ($time) => Math.round(($time.getTime() - date.getTime()) / 1000)); } export function relativeTime(seconds: number): string | null { @@ -30,11 +27,11 @@ export function relativeTime(seconds: number): string | null { const day = hour * 24; if (seconds < day) { - return `${(Math.floor(seconds / hour))}h`; + return `${Math.floor(seconds / hour)}h`; } const maxRelative = day * 31; if (seconds < maxRelative) { return `${Math.floor(seconds / day)}d`; } return null; -} \ No newline at end of file +} diff --git a/src/lib/server/db.ts b/src/lib/server/db.ts index 02bd876..c2655ab 100644 --- a/src/lib/server/db.ts +++ b/src/lib/server/db.ts @@ -9,7 +9,7 @@ if (DEV && env.VERBOSE === 'true') { sqlite3.verbose(); db.on('change', (t, d, table, rowid) => { console.debug('DB change event', t, d, table, rowid); - }) + }); db.on('trace', (sql) => { console.debug('Running', sql); @@ -21,9 +21,9 @@ if (DEV && env.VERBOSE === 'true') { } interface Migration { - id: number, - name: string, - statement: string + id: number; + name: string; + statement: string; } db.on('open', () => { @@ -37,20 +37,24 @@ db.on('open', () => { } console.debug('Already applied migrations', rows); const appliedMigrations: Set = new Set(rows.map((row: any) => row['id'])); - const toApply = getMigrations().filter(m => !appliedMigrations.has(m.id)); - for (let migration of toApply) { + const toApply = getMigrations().filter((m) => !appliedMigrations.has(m.id)); + for (const migration of toApply) { db.exec(migration.statement, (err) => { if (err !== null) { console.error(`Failed to apply migration ${migration.name}`, err); return; } - db.run('INSERT INTO migrations (id, name) VALUES(?, ?)', [migration.id, migration.name], (e: Error) => { - if (e !== null) { - console.error(`Failed to mark migration ${migration.name} as applied`, e); - return; + db.run( + 'INSERT INTO migrations (id, name) VALUES(?, ?)', + [migration.id, migration.name], + (e: Error) => { + if (e !== null) { + console.error(`Failed to mark migration ${migration.name} as applied`, e); + return; + } + console.info(`Applied migration ${migration.name}`); } - console.info(`Applied migration ${migration.name}`); - }); + ); }); } }); @@ -60,10 +64,11 @@ db.on('error', (err) => { }); function getMigrations(): Migration[] { - return [{ - id: 1, - name: 'initial', - statement: ` + return [ + { + id: 1, + name: 'initial', + statement: ` CREATE TABLE accounts ( id TEXT NOT NULL PRIMARY KEY, acct TEXT, @@ -89,14 +94,16 @@ function getMigrations(): Migration[] { FOREIGN KEY (post_id) REFERENCES posts(id), FOREIGN KEY (tag_url) REFERENCES tags(url) )` - }]; + } + ]; } export async function savePost(post: Post): Promise { return new Promise((resolve, reject) => { console.debug(`Saving post ${post.url}`); const account = post.account; - db.run(` + db.run( + ` INSERT INTO accounts (id, acct, username, display_name, url, avatar, avatar_static) VALUES(?, ?, ?, ?, ?, ?, ?) ON CONFLICT(id) @@ -122,20 +129,15 @@ export async function savePost(post: Post): Promise { reject(err); return; } - db.run(` + db.run( + ` INSERT INTO posts (id, content, created_at, url, account_id) VALUES (?, ?, ?, ?, ?) ON CONFLICT(id) DO UPDATE SET content=excluded.content, created_at=excluded.created_at, url=excluded.url, account_id=excluded.account_id;`, - [ - post.id, - post.content, - post.created_at, - post.url, - post.account.id - ], + [post.id, post.content, post.created_at, post.url, post.account.id], (postErr) => { if (postErr !== null) { console.error(`Could not insert post ${post.url}`, postErr); @@ -145,26 +147,28 @@ export async function savePost(post: Post): Promise { db.parallelize(() => { let remaining = post.tags.length; - for (let tag of post.tags) { - db.run(` + for (const tag of post.tags) { + db.run( + ` INSERT INTO tags (url, tag) VALUES (?, ?) ON CONFLICT(url) DO UPDATE SET tag=excluded.tag;`, - [ - tag.url, - tag.name - ], + [tag.url, tag.name], (tagErr) => { if (tagErr !== null) { console.error(`Could not insert/update tag ${tag.url}`, tagErr); reject(tagErr); return; } - db.run('INSERT INTO poststags (post_id, tag_url) VALUES (?, ?)', + db.run( + 'INSERT INTO poststags (post_id, tag_url) VALUES (?, ?)', [post.id, tag.url], (posttagserr) => { if (posttagserr !== null) { - console.error(`Could not insert poststags ${tag.url}, ${post.url}`, posttagserr); + console.error( + `Could not insert poststags ${tag.url}, ${post.url}`, + posttagserr + ); reject(posttagserr); return; } @@ -180,15 +184,17 @@ export async function savePost(post: Post): Promise { ); } }); - }); - }); + } + ); + } + ); }); } export async function getPosts(since: string | null, before: string | null, limit: number) { - let promise = await new Promise((resolve, reject) => { + const promise = await new Promise((resolve, reject) => { let filter_query; - let params: any = { $limit: limit }; + const params: any = { $limit: limit }; if (since === null && before === null) { filter_query = ''; } else if (since !== null) { @@ -207,66 +213,60 @@ export async function getPosts(since: string | null, before: string | null, limi ${filter_query} ORDER BY created_at DESC LIMIT $limit`; - db.all( - sql, - params, - (err, rows: any[]) => { - if (err != null) { - console.error('Error loading posts', err); - reject(err); - return; - } - if (rows.length === 0) { - // No need to check for tags - resolve([]); - return; - } - const postIdsParams = rows.map(() => '?').join(', '); - db.all( - `SELECT post_id, tags.url, tags.tag + db.all(sql, params, (err, rows: any[]) => { + if (err != null) { + console.error('Error loading posts', err); + reject(err); + return; + } + if (rows.length === 0) { + // No need to check for tags + resolve([]); + return; + } + const postIdsParams = rows.map(() => '?').join(', '); + db.all( + `SELECT post_id, tags.url, tags.tag FROM poststags JOIN tags ON poststags.tag_url = tags.url WHERE post_id IN (${postIdsParams});`, - rows.map((r: any) => r.id), - (tagErr, tagRows: any[]) => { - if (tagErr != null) { - console.error('Error loading post tags', tagErr); - reject(tagErr); - return; - } - const tagMap: Map = tagRows.reduce( - (result: Map, item) => { - const tag: Tag = { - url: item.url, - name: item.tag - }; - result.set(item.post_id, [...result.get(item.post_id) || [], tag]); - return result; - }, new Map()); - const posts = rows.map(row => { - return { - id: row.id, - content: row.content, - created_at: row.created_at, - url: row.url, - tags: tagMap.get(row.id) || [], - account: { - id: row.account_id, - acct: row.acct, - username: row.username, - display_name: row.display_name, - url: row.account_url, - avatar: row.avatar, - avatar_static: '' - } as Account - } as Post - }); - resolve(posts); + rows.map((r: any) => r.id), + (tagErr, tagRows: any[]) => { + if (tagErr != null) { + console.error('Error loading post tags', tagErr); + reject(tagErr); + return; } - ); - } - ); + const tagMap: Map = tagRows.reduce((result: Map, item) => { + const tag: Tag = { + url: item.url, + name: item.tag + }; + result.set(item.post_id, [...(result.get(item.post_id) || []), tag]); + return result; + }, new Map()); + const posts = rows.map((row) => { + return { + id: row.id, + content: row.content, + created_at: row.created_at, + url: row.url, + tags: tagMap.get(row.id) || [], + account: { + id: row.account_id, + acct: row.acct, + username: row.username, + display_name: row.display_name, + url: row.account_url, + avatar: row.avatar, + avatar_static: '' + } as Account + } as Post; + }); + resolve(posts); + } + ); + }); }); return promise; } - diff --git a/src/lib/server/rss.ts b/src/lib/server/rss.ts index cfe792a..5e33681 100644 --- a/src/lib/server/rss.ts +++ b/src/lib/server/rss.ts @@ -22,24 +22,26 @@ export function createFeed(posts: Post[]): Feed { author: { name: '@aymm', link: 'https://metalhead.club/@aymm' - }, + } }); - posts.forEach(p => { + posts.forEach((p) => { feed.addItem({ title: p.content, id: p.url, link: p.url, content: p.content, - author: [{ - name: p.account.acct, - link: p.account.url - }], + author: [ + { + name: p.account.acct, + link: p.account.url + } + ], date: new Date(p.created_at) - }) + }); }); feed.addCategory('Music'); return feed; } export async function saveAtomFeed(feed: Feed) { await fs.writeFile('feed.xml', feed.atom1(), { encoding: 'utf8' }); -} \ No newline at end of file +} diff --git a/src/lib/server/timeline.ts b/src/lib/server/timeline.ts index 9c03a66..7806a92 100644 --- a/src/lib/server/timeline.ts +++ b/src/lib/server/timeline.ts @@ -1,10 +1,17 @@ -import { HASHTAG_FILTER, MASTODON_INSTANCE, URL_FILTER, YOUTUBE_API_KEY } from '$env/static/private'; +import { + HASHTAG_FILTER, + MASTODON_INSTANCE, + URL_FILTER, + YOUTUBE_API_KEY +} from '$env/static/private'; import type { Post, Tag, TimelineEvent } from '$lib/mastodon/response'; import { getPosts, savePost } from '$lib/server/db'; import { createFeed, saveAtomFeed } from '$lib/server/rss'; -import { WebSocket } from "ws"; +import { WebSocket } from 'ws'; -const YOUTUBE_REGEX = new RegExp(/https?:\/\/(www\.)?youtu((be.com\/.*?v=)|(\.be\/))(?[a-zA-Z_0-9-]+)/gm); +const YOUTUBE_REGEX = new RegExp( + /https?:\/\/(www\.)?youtu((be.com\/.*?v=)|(\.be\/))(?[a-zA-Z_0-9-]+)/gm +); export class TimelineReader { private static _instance: TimelineReader; @@ -13,7 +20,8 @@ export class TimelineReader { const searchParams = new URLSearchParams([ ['part', 'snippet'], ['id', videoId], - ['key', YOUTUBE_API_KEY]]); + ['key', YOUTUBE_API_KEY] + ]); const youtubeVideoUrl = new URL(`https://www.googleapis.com/youtube/v3/videos?${searchParams}`); const resp = await fetch(youtubeVideoUrl); const respObj = await resp.json(); @@ -30,15 +38,20 @@ export class TimelineReader { const categorySearchParams = new URLSearchParams([ ['part', 'snippet'], ['id', item.categoryId], - ['key', YOUTUBE_API_KEY]]); - const youtubeCategoryUrl = new URL(`https://www.googleapis.com/youtube/v3/videoCategories?${categorySearchParams}`); - const categoryTitle: string = await fetch(youtubeCategoryUrl).then(r => r.json()).then(r => r.items[0]?.title); + ['key', YOUTUBE_API_KEY] + ]); + const youtubeCategoryUrl = new URL( + `https://www.googleapis.com/youtube/v3/videoCategories?${categorySearchParams}` + ); + const categoryTitle: string = await fetch(youtubeCategoryUrl) + .then((r) => r.json()) + .then((r) => r.items[0]?.title); return categoryTitle === 'Music'; } private static async checkYoutubeMatches(postContent: string): Promise { const matches = postContent.matchAll(YOUTUBE_REGEX); - for (let match of matches) { + for (const match of matches) { if (match === undefined || match.groups === undefined) { continue; } @@ -57,10 +70,10 @@ export class TimelineReader { private constructor() { const socket = new WebSocket(`wss://${MASTODON_INSTANCE}/api/v1/streaming`); - socket.onopen = (_event) => { + socket.onopen = () => { socket.send('{ "type": "subscribe", "stream": "public:local"}'); }; - socket.onmessage = (async (event) => { + socket.onmessage = async (event) => { try { const data: TimelineEvent = JSON.parse(event.data.toString()); if (data.event !== 'update') { @@ -71,31 +84,30 @@ export class TimelineReader { const found_tags: Tag[] = post.tags.filter((t: Tag) => hashttags.includes(t.name)); const urls: string[] = URL_FILTER.split(','); - const found_urls = urls.filter(t => post.content.includes(t)); + const found_urls = urls.filter((t) => post.content.includes(t)); // If we don't have any tags or non-youtube urls, check youtube // YT is handled separately, because it requires an API call and therefore is slower - if (found_urls.length === 0 && + if ( + found_urls.length === 0 && found_tags.length === 0 && - !await TimelineReader.checkYoutubeMatches(post.content)) { + !(await TimelineReader.checkYoutubeMatches(post.content)) + ) { return; } await savePost(post); const posts = await getPosts(null, null, 100); await saveAtomFeed(createFeed(posts)); - } catch (e) { - console.error("error message", event, event.data, e) + console.error('error message', event, event.data, e); } - - }); + }; socket.onclose = (event) => { - console.log("Closed", event, event.code, event.reason) + console.log('Closed', event, event.code, event.reason); }; socket.onerror = (event) => { - console.log("error", event, event.message, event.error) + console.log('error', event, event.message, event.error); }; - } public static init() { @@ -108,4 +120,4 @@ export class TimelineReader { TimelineReader.init(); return this._instance; } -} \ No newline at end of file +} diff --git a/src/routes/+page.ts b/src/routes/+page.ts index 9caefde..35764ca 100644 --- a/src/routes/+page.ts +++ b/src/routes/+page.ts @@ -2,8 +2,8 @@ import type { Post } from '$lib/mastodon/response'; import type { PageLoad } from './$types'; export const load = (async ({ fetch }) => { - const p = await fetch('/'); - return { - posts: await p.json() as Post[] - }; -}) satisfies PageLoad; \ No newline at end of file + const p = await fetch('/'); + return { + posts: (await p.json()) as Post[] + }; +}) satisfies PageLoad; diff --git a/src/routes/+server.ts b/src/routes/+server.ts index 3eae499..d7badaf 100644 --- a/src/routes/+server.ts +++ b/src/routes/+server.ts @@ -2,4 +2,4 @@ import type { RequestHandler } from './$types'; export const GET = (async ({ fetch }) => { return await fetch('api/posts'); -}) satisfies RequestHandler; \ No newline at end of file +}) satisfies RequestHandler; diff --git a/src/routes/api/posts/+server.ts b/src/routes/api/posts/+server.ts index 4b67da2..54195a5 100644 --- a/src/routes/api/posts/+server.ts +++ b/src/routes/api/posts/+server.ts @@ -13,4 +13,4 @@ export const GET = (async ({ url }) => { count = Math.min(count, 100); const posts = await getPosts(since, before, count); return json(posts); -}) satisfies RequestHandler; \ No newline at end of file +}) satisfies RequestHandler; diff --git a/static/site.webmanifest b/static/site.webmanifest index af209e2..7ac6f0d 100644 --- a/static/site.webmanifest +++ b/static/site.webmanifest @@ -1,19 +1,19 @@ { - "name": "Moshing Mammut", - "short_name": "Moshing Mammut", - "icons": [ - { - "src": "/android-chrome-192x192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "/android-chrome-512x512.png", - "sizes": "512x512", - "type": "image/png" - } - ], - "theme_color": "#2e0b78", - "background_color": "#2e0b78", - "display": "standalone" + "name": "Moshing Mammut", + "short_name": "Moshing Mammut", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#2e0b78", + "background_color": "#2e0b78", + "display": "standalone" } diff --git a/static/style.css b/static/style.css index 244d6a4..11288af 100644 --- a/static/style.css +++ b/static/style.css @@ -16,7 +16,6 @@ body { --color-red-desat-dark: hsl(7, 20%, 30%); --color-red-desat-desat: hsl(7, 8%, 56%); - --color-text: var(--color-blue); --color-border: var(--color-grey); --color-link: var(--color-mauve); @@ -30,9 +29,9 @@ body { color: var(--color-text); background-color: var(--color-bg); - font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, - Ubuntu, Cantarell, "Helvetica Neue", Helvetica, Arial, sans-serif, - "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, + Cantarell, 'Helvetica Neue', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', + 'Segoe UI Symbol'; } a { @@ -55,4 +54,4 @@ a:visited { --color-button-deactivated: var(--color-red-desat-desat); --color-button-text: var(--color-blue-dark); } -} \ No newline at end of file +} diff --git a/svelte.config.js b/svelte.config.js index ba3eb7c..9444951 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -11,8 +11,8 @@ const config = { // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list. // If your environment is not supported or you settled on a specific environment, switch out the adapter. // See https://kit.svelte.dev/docs/adapters for more information about adapters. - adapter: adapter(), - }, + adapter: adapter() + } }; export default config;