From 76de8f4137d650fc02602fb78e791a90f01ad2c0 Mon Sep 17 00:00:00 2001 From: Jade Ellis Date: Sun, 15 Sep 2024 18:07:41 +0100 Subject: [PATCH] Add biome and fix typos --- packages/website/biome.jsonc | 30 ++++++ packages/website/mdsvex.config.js | 16 ++-- packages/website/package.json | 4 +- packages/website/src/app.d.ts | 2 - packages/website/src/hooks.server.ts | 2 +- packages/website/src/lib/Toc.svelte | 4 +- packages/website/src/lib/TocItem.svelte | 2 +- .../website/src/lib/htmlComponents/img.svelte | 2 +- packages/website/src/lib/theme.ts | 2 +- packages/website/src/lib/workers/terser.ts | 10 +- .../website/src/lib/workers/terserWorker.ts | 12 +-- packages/website/src/lib/workers/util.ts | 38 ++++---- .../routes/(tools)/bookmarklets/+page.svelte | 6 +- .../(tools)/bookmarklets/bookmarklets.ts | 34 +++---- .../(tools)/javascript-minifier/+page.svelte | 6 +- packages/website/src/routes/+error.svelte | 2 +- .../routes/.well-known/webfinger/+server.ts | 10 +- packages/website/src/routes/blog/+page.svelte | 2 +- .../blog/[...date]/[slug]/+page.server.ts | 4 +- .../routes/blog/[...date]/[slug]/+page.svelte | 4 +- .../blog/[...date]/feed.json/+server.ts | 6 +- .../routes/blog/[...date]/rss.xml/+server.ts | 4 +- .../website/src/routes/blog/image/+server.ts | 10 +- packages/website/src/routes/blog/posts.ts | 10 +- .../routes/projects/[slug]/+page.server.ts | 8 +- .../src/routes/projects/[slug]/projects.ts | 4 +- pnpm-lock.yaml | 91 +++++++++++++++++++ 27 files changed, 223 insertions(+), 102 deletions(-) create mode 100644 packages/website/biome.jsonc diff --git a/packages/website/biome.jsonc b/packages/website/biome.jsonc new file mode 100644 index 00000000..39ff5cff --- /dev/null +++ b/packages/website/biome.jsonc @@ -0,0 +1,30 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.9.0/schema.json", + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true + }, + "files": { + "ignoreUnknown": false, + "ignore": [] + }, + "formatter": { + "enabled": true, + "indentStyle": "tab" + }, + "organizeImports": { + "enabled": true + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true + } + }, + "javascript": { + "formatter": { + "quoteStyle": "double" + } + } +} diff --git a/packages/website/mdsvex.config.js b/packages/website/mdsvex.config.js index dfa8731f..a7b2cc0b 100644 --- a/packages/website/mdsvex.config.js +++ b/packages/website/mdsvex.config.js @@ -76,7 +76,7 @@ import { grammars } from 'tm-grammars' * @param {string} name */ function getGrammar(name) { - let metadata = grammars.find((grammar) => grammar.name == name) + const metadata = grammars.find((grammar) => grammar.name == name) if (!metadata) { throw "Grammar not found" } @@ -112,18 +112,18 @@ function buildNestedHeadings(headings) { /** * @type {{level: number, title: string, children: unknown}[]} */ - let result = []; - let stack = [{ level: 0, children: result }]; + const result = []; + const stack = [{ level: 0, children: result }]; - for (let heading of headings) { + for (const heading of headings) { while ( stack.length > 1 && heading.level <= stack[stack.length - 1].level ) { stack.pop(); } - let parent = stack[stack.length - 1]; - let newHeading = { + const parent = stack[stack.length - 1]; + const newHeading = { ...heading, children: [], level: heading.level, @@ -151,7 +151,7 @@ function add_toc_remark(opts) { vFile.data.flattenedHeadings = []; visit(tree, 'heading', (node) => { - let title = mdast_tree_to_string(node); + const title = mdast_tree_to_string(node); vFile.data.flattenedHeadings.push({ level: node.depth, title, @@ -263,7 +263,7 @@ function vite_images_rehype(opts) { }); visit(tree, { tagName: "Components.img" }, (node) => { let url = node.properties.src; - let thumb = (url.includes("?") ? url + "&" : url + "?") + "thumb"; + const thumb = (url.includes("?") ? url + "&" : url + "?") + "thumb"; url = (url.includes("?") ? url + "&" : url + "?") + "url"; node.properties.src = `{${transformUrl(url)}}` diff --git a/packages/website/package.json b/packages/website/package.json index ef368fca..9787c274 100644 --- a/packages/website/package.json +++ b/packages/website/package.json @@ -6,9 +6,11 @@ "build": "vite build", "preview": "vite preview", "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", - "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch" + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "fix": "biome lint --write . && biome format --write . && biome check . --write" }, "devDependencies": { + "@biomejs/biome": "1.9.0", "@bitmachina/highlighter": "1.0.0-alpha.6", "@fontsource/fira-mono": "^5.0.14", "@json-feed-types/1_1": "^1.0.2", diff --git a/packages/website/src/app.d.ts b/packages/website/src/app.d.ts index 847e5674..c89a0deb 100644 --- a/packages/website/src/app.d.ts +++ b/packages/website/src/app.d.ts @@ -13,5 +13,3 @@ declare global { } } } - -export {}; diff --git a/packages/website/src/hooks.server.ts b/packages/website/src/hooks.server.ts index 76518b79..f51eeaf4 100644 --- a/packages/website/src/hooks.server.ts +++ b/packages/website/src/hooks.server.ts @@ -39,7 +39,7 @@ export const handle: Handle = async (input) => { }), async ({ event, resolve }) => { const response = await resolve(event); - let csp = response.headers.get("Content-Security-Policy"); + const csp = response.headers.get("Content-Security-Policy"); if (csp) { response.headers.set("Content-Security-Policy", csp.replace("script-src", "script-src 'nonce-" + sentryNonce + "'")); } diff --git a/packages/website/src/lib/Toc.svelte b/packages/website/src/lib/Toc.svelte index 169d2643..8f3c20a1 100644 --- a/packages/website/src/lib/Toc.svelte +++ b/packages/website/src/lib/Toc.svelte @@ -1,13 +1,13 @@
  • diff --git a/packages/website/src/lib/htmlComponents/img.svelte b/packages/website/src/lib/htmlComponents/img.svelte index 48f16b27..27da371f 100644 --- a/packages/website/src/lib/htmlComponents/img.svelte +++ b/packages/website/src/lib/htmlComponents/img.svelte @@ -6,7 +6,7 @@ // export let align // export let small: boolean; // console.log("imgcmp", thumb); - let className = ""; + const className = ""; export { className as class }; let loaded = false // console.log(thumb) diff --git a/packages/website/src/lib/theme.ts b/packages/website/src/lib/theme.ts index efab5962..e692cb93 100644 --- a/packages/website/src/lib/theme.ts +++ b/packages/website/src/lib/theme.ts @@ -1,6 +1,6 @@ import { writable } from 'svelte/store' -let query = typeof window != "undefined" ? window?.matchMedia('(prefers-color-scheme: dark)') : undefined +const query = typeof window != "undefined" ? window?.matchMedia('(prefers-color-scheme: dark)') : undefined export const theme = writable(query?.matches ? 'dark' : 'light') diff --git a/packages/website/src/lib/workers/terser.ts b/packages/website/src/lib/workers/terser.ts index fc031ba6..8f3e9cea 100644 --- a/packages/website/src/lib/workers/terser.ts +++ b/packages/website/src/lib/workers/terser.ts @@ -1,5 +1,5 @@ import type { MinifyOptions, MinifyOutput } from "terser"; -import { recieveMessageData, sendMessageData } from "./util"; +import { receiveMessageData, sendMessageData } from "./util"; const is_browser = typeof window !== "undefined"; export function init() { @@ -7,7 +7,7 @@ export function init() { let worker: SharedWorker; let currentId = 0; let terserModule: typeof import("terser"); - let promises: { [id: number]: [(value: MinifyOutput | PromiseLike) => void, (reason?: any) => void] } = {}; + const promises: { [id: number]: [(value: MinifyOutput | PromiseLike) => void, (reason?: any) => void] } = {}; return { minify: async function minify(files: string | string[] | { [file: string]: string; @@ -18,10 +18,10 @@ export function init() { worker = new SharedWorker(new URL('./terserWorker.ts', import.meta.url), { type: "module" }) worker.port.onmessage = (e: MessageEvent) => { // invoke the promise's resolve() or reject() depending on whether there was an error. - promises[e.data[recieveMessageData.MessageId]][e.data[recieveMessageData.MessageType]](e.data[recieveMessageData.Return]); + promises[e.data[receiveMessageData.MessageId]][e.data[receiveMessageData.MessageType]](e.data[receiveMessageData.Return]); // ... then delete the promise controller - delete promises[e.data[recieveMessageData.MessageId]]; + delete promises[e.data[receiveMessageData.MessageId]]; } } @@ -29,7 +29,7 @@ export function init() { return new Promise((resolve, reject) => { promises[++currentId] = [resolve, reject]; - let data = { + const data = { [sendMessageData.MessageId]: currentId, [sendMessageData.Parameters]: [files, options ] diff --git a/packages/website/src/lib/workers/terserWorker.ts b/packages/website/src/lib/workers/terserWorker.ts index 715c2501..f4165661 100644 --- a/packages/website/src/lib/workers/terserWorker.ts +++ b/packages/website/src/lib/workers/terserWorker.ts @@ -1,24 +1,24 @@ import { minify, type MinifyOptions } from "terser"; -import { recieveMessageTypes, sendMessageData } from "./util"; +import { receiveMessageTypes, sendMessageData } from "./util"; /// declare var self: SharedWorkerGlobalScope; -self.onconnect = function (event) { +self.onconnect = (event) => { const port = event.ports[0]; - port.onmessage = function (e: MessageEvent<{ + port.onmessage = (e: MessageEvent<{ [sendMessageData.MessageId]: number, [sendMessageData.Parameters]: [string | string[] | { [file: string]: string; }, MinifyOptions? ] - }>) { + }>) => { minify(...e.data[sendMessageData.Parameters]).then( // success handler - callback(id, SUCCESS(0), result) // if `d` is transferable transfer zero-copy d => { - port.postMessage([e.data[0], recieveMessageTypes.RESOLVE, d], + port.postMessage([e.data[0], receiveMessageTypes.RESOLVE, d], // @ts-ignore [d].filter(x => ( (x instanceof ArrayBuffer) || @@ -27,7 +27,7 @@ self.onconnect = function (event) { ))); }, // error handler - callback(id, ERROR(1), error) - er => { postMessage([e.data[0], recieveMessageTypes.REJECT, '' + er]); } + er => { postMessage([e.data[0], receiveMessageTypes.REJECT, '' + er]); } ); }; diff --git a/packages/website/src/lib/workers/util.ts b/packages/website/src/lib/workers/util.ts index 326453e4..7a573283 100644 --- a/packages/website/src/lib/workers/util.ts +++ b/packages/website/src/lib/workers/util.ts @@ -1,9 +1,9 @@ export type FunctionMap = { [x: string]: Function } export enum sendMessageData { - MessageId, - Function, - Parameters + MessageId = 0, + Function = 1, + Parameters = 2 } export interface sendMessageMap { @@ -12,27 +12,27 @@ export interface sendMessageMap { [sendMessageData.Parameters]: T[], } -export enum recieveMessageTypes { - RESOLVE, // OK - REJECT // ERROR +export enum receiveMessageTypes { + RESOLVE = 0, // OK + REJECT = 1 // ERROR } -export enum recieveMessageData { - MessageId, - MessageType, - Return +export enum receiveMessageData { + MessageId = 0, + MessageType = 1, + Return = 2 } -export interface recieveMessageMap { - [recieveMessageData.MessageId]: number, - [recieveMessageData.MessageType]: recieveMessageTypes, - [recieveMessageData.Return]: T, +export interface receiveMessageMap { + [receiveMessageData.MessageId]: number, + [receiveMessageData.MessageType]: receiveMessageTypes, + [receiveMessageData.Return]: T, } // // worker -// import { recieveMessageTypes, type FunctionMap } from "./util"; +// import { receiveMessageTypes, type FunctionMap } from "./util"; // function makeMessageHandler(functions: FunctionMap) { @@ -44,20 +44,20 @@ export interface recieveMessageMap { // // success handler - callback(id, SUCCESS(0), result) // // if `d` is transferable transfer zero-copy // d => { -// postMessage([e.data[0], recieveMessageTypes.SUCCESS, d], [d].filter(x => ( +// postMessage([e.data[0], receiveMessageTypes.SUCCESS, d], [d].filter(x => ( // (x instanceof ArrayBuffer) || // (x instanceof MessagePort) || // (self.ImageBitmap && x instanceof ImageBitmap) // ))); // }, // // error handler - callback(id, ERROR(1), error) -// er => { postMessage([e.data[0], recieveMessageTypes.ERROR, '' + er]); } +// er => { postMessage([e.data[0], receiveMessageTypes.ERROR, '' + er]); } // ); // } // } // // host -// import { recieveMessageData, recieveMessageTypes, sendMessageData, type recieveMessageMap, type sendMessageMap } from "./util"; +// import { receiveMessageData, receiveMessageTypes, sendMessageData, type receiveMessageMap, type sendMessageMap } from "./util"; // function makeHostHandler(worker: Worker) { @@ -72,7 +72,7 @@ export interface recieveMessageMap { // * status - 0 for success, 1 for failure // * result - the result or error, depending on `status` // */ -// worker.onmessage = (e: MessageEvent) => { +// worker.onmessage = (e: MessageEvent) => { // // invoke the promise's resolve() or reject() depending on whether there was an error. // promises[e.data[0]][e.data[1]](e.data[2]); diff --git a/packages/website/src/routes/(tools)/bookmarklets/+page.svelte b/packages/website/src/routes/(tools)/bookmarklets/+page.svelte index 0354890e..8d7880f8 100644 --- a/packages/website/src/routes/(tools)/bookmarklets/+page.svelte +++ b/packages/website/src/routes/(tools)/bookmarklets/+page.svelte @@ -13,20 +13,20 @@ restore: (v: string) => (value = v), }; - let minify = init().minify; + const minify = init().minify; let value = ""; let output = ""; let options: Config = {}; async function process(str: string) { options = await parseMeta(str); - let res = await bookmarkify(str, options, minify); + const res = await bookmarkify(str, options, minify); if (typeof res == "string") { output = res; } } - let contentAttributes = { "aria-label": "Bookmarklet editor" }; + const contentAttributes = { "aria-label": "Bookmarklet editor" }; $: progress = process(value); diff --git a/packages/website/src/routes/(tools)/bookmarklets/bookmarklets.ts b/packages/website/src/routes/(tools)/bookmarklets/bookmarklets.ts index 60eb908e..680f2ff8 100644 --- a/packages/website/src/routes/(tools)/bookmarklets/bookmarklets.ts +++ b/packages/website/src/routes/(tools)/bookmarklets/bookmarklets.ts @@ -2,9 +2,9 @@ // import MagicString from "magic-string"; import { Parser } from "acorn"; -import { type MinifyOptions, type MinifyOutput } from "terser"; +import type { MinifyOptions, MinifyOutput } from "terser"; -let sourceMap = false; +const sourceMap = false; import { configSchema } from "./config.schema"; import type { Config } from "./config"; @@ -18,14 +18,14 @@ export async function bookmarkify(code: string, options: Config, minify: (files: if (options.script) { options.script = options.script.reverse(); options.script.forEach(s => { - let { path, opts } = extractOptions(s); + const { path, opts } = extractOptions(s); code = loadScript(code, path, opts.loadOnce); }); } if (options.style) { options.style.forEach(s => { - let { path, opts } = extractOptions(s); + const { path, opts } = extractOptions(s); code = loadStyle(path, opts.loadOnce) + code; }); } @@ -43,9 +43,9 @@ export async function bookmarkify(code: string, options: Config, minify: (files: export async function parseMeta(str: string): Promise { enum MetaState { - PreOpen, - Opened, - Closed + PreOpen = 0, + Opened = 1, + Closed = 2 } let state: MetaState = MetaState.PreOpen @@ -53,7 +53,7 @@ export async function parseMeta(str: string): Promise { const openMetadata = /==bookmarklet==/gim; const closeMetadata = /==\/bookmarklet==/gim; const metaLine = /^[\s]*@([^\s]+)\s+(.*)$/gim; - let options: Config = {}; + const options: Config = {}; Parser.parse(str, { ecmaVersion: "latest", @@ -62,7 +62,7 @@ export async function parseMeta(str: string): Promise { closeMetadata.lastIndex = 0; metaLine.lastIndex = 0; if (state == MetaState.PreOpen) { - let res = openMetadata.exec(text) + const res = openMetadata.exec(text) if (res !== null) { state = MetaState.Opened closeMetadata.lastIndex = openMetadata.lastIndex; @@ -75,8 +75,8 @@ export async function parseMeta(str: string): Promise { while (state == MetaState.Opened && (res = metaLine.exec(text)) !== null) { closeMetadata.lastIndex = metaLine.lastIndex; // console.log(str.slice(start + 2 + (metaLine.lastIndex - res[0].length), start + 2 + metaLine.lastIndex )) - let k = res[1]; - let v = res[2]; + const k = res[1]; + const v = res[2]; if (k) { if (configSchema.properties[k]?.type == "array") { options[k] = options[k] || []; @@ -90,7 +90,7 @@ export async function parseMeta(str: string): Promise { } if (state == MetaState.Opened) { - let endRes = closeMetadata.exec(text) + const endRes = closeMetadata.exec(text) if (endRes !== null) { state = MetaState.Closed; @@ -110,7 +110,7 @@ export async function parseMeta(str: string): Promise { function loadScript(code: string, path: string, loadOnce: boolean) { loadOnce = !!loadOnce; - let id = `bookmarklet__script_${cyrb53(path).toString(36).substring(0, 7)}`; + const id = `bookmarklet__script_${cyrb53(path).toString(36).substring(0, 7)}`; return ` function callback(){ ${code} @@ -136,7 +136,7 @@ function loadScript(code: string, path: string, loadOnce: boolean) { function loadStyle(path: string, loadOnce: boolean) { loadOnce = !!loadOnce; - let id = `bookmarklet__style_${cyrb53(path).toString(36).substring(0, 7)}`; + const id = `bookmarklet__style_${cyrb53(path).toString(36).substring(0, 7)}`; return ` if (!${loadOnce} || !document.getElementById("${id}")) { var link = document.createElement("link"); @@ -178,16 +178,16 @@ function extractOptions(path: string) { // If there is no `=`, then the value of the option defaults to `true`. // Values get converted via JSON.parse if possible, o/w they're a string. // - let opts: { [x: string]: any } = {}; + const opts: { [x: string]: any } = {}; - let matcher = /^(\![^\s]+)\s+/g + const matcher = /^(\![^\s]+)\s+/g let m let splitAfter = 0; while ((m = matcher.exec(path)) !== null) { splitAfter = matcher.lastIndex; - let opt = m[1].substring(1).split('='); + const opt = m[1].substring(1).split('='); opts[opt[0]] = opt[1] === undefined ? true : _fuzzyParse(opt[1]); // break } diff --git a/packages/website/src/routes/(tools)/javascript-minifier/+page.svelte b/packages/website/src/routes/(tools)/javascript-minifier/+page.svelte index 291528c2..918d9572 100644 --- a/packages/website/src/routes/(tools)/javascript-minifier/+page.svelte +++ b/packages/website/src/routes/(tools)/javascript-minifier/+page.svelte @@ -11,7 +11,7 @@ restore: (v: string) => (value = v), }; - let minify = init().minify; + const minify = init().minify; let value = ""; let output = ""; @@ -20,7 +20,7 @@ output = ""; return; } - let result = await minify(str); + const result = await minify(str); if (typeof result.code == "string") { output = result.code; } else { @@ -28,7 +28,7 @@ } } - let contentAttributes = { "aria-label": "Javascript editor" }; + const contentAttributes = { "aria-label": "Javascript editor" }; $: progress = process(value); diff --git a/packages/website/src/routes/+error.svelte b/packages/website/src/routes/+error.svelte index 243433e0..f037b6da 100644 --- a/packages/website/src/routes/+error.svelte +++ b/packages/website/src/routes/+error.svelte @@ -9,7 +9,7 @@ const title = `${status}: ${message}`; let sentryElement: HTMLDivElement; let openForm = () => {}; - let online = typeof navigator !== 'undefined' ? navigator.onLine : true; + const online = typeof navigator !== 'undefined' ? navigator.onLine : true; onMount(async () => { const feedback = Sentry.getFeedback({ el: sentryElement, diff --git a/packages/website/src/routes/.well-known/webfinger/+server.ts b/packages/website/src/routes/.well-known/webfinger/+server.ts index 511c3c87..908f637b 100644 --- a/packages/website/src/routes/.well-known/webfinger/+server.ts +++ b/packages/website/src/routes/.well-known/webfinger/+server.ts @@ -29,15 +29,15 @@ const accounts = [ ].map(i => i.toLowerCase()) export async function GET({ url }: RequestEvent) { // export const GET = async ({ url }) => { - let resource = url.searchParams.get("resource"); + const resource = url.searchParams.get("resource"); if (resource?.split(":")[0] !== "acct") { - let res = new Response("", { status: 404 }) + const res = new Response("", { status: 404 }) return res; } - let account = resource?.split(":")[1] + const account = resource?.split(":")[1] if (!accounts.includes(account.toLowerCase()) && !account.toLowerCase().endsWith("@jade.ellis.link")) { if (resource?.split(":")[0] !== "acct") { - let res = new Response("", { status: 404 }) + const res = new Response("", { status: 404 }) return res; } } @@ -75,6 +75,6 @@ export async function GET({ url }: RequestEvent) { ] } // const isMe = (user.toLowerCase() == EMAIL.toLowerCase()) ? true : false; - let res = new Response(JSON.stringify(webFinger), { headers: { "content-type": "application/jrd+json" }, status: 200 }) + const res = new Response(JSON.stringify(webFinger), { headers: { "content-type": "application/jrd+json" }, status: 200 }) return res; } diff --git a/packages/website/src/routes/blog/+page.svelte b/packages/website/src/routes/blog/+page.svelte index ac6cf21a..f82cc7a6 100644 --- a/packages/website/src/routes/blog/+page.svelte +++ b/packages/website/src/routes/blog/+page.svelte @@ -5,7 +5,7 @@ import type { WithContext, Thing } from "schema-dts"; export let data; - let { pages } = data; + const { pages } = data; const jsonLd = { "@context": "https://schema.org", diff --git a/packages/website/src/routes/blog/[...date]/[slug]/+page.server.ts b/packages/website/src/routes/blog/[...date]/[slug]/+page.server.ts index 35e549d0..d6b0960c 100644 --- a/packages/website/src/routes/blog/[...date]/[slug]/+page.server.ts +++ b/packages/website/src/routes/blog/[...date]/[slug]/+page.server.ts @@ -11,7 +11,7 @@ import { error } from '@sveltejs/kit' /** @type {import('./$types').PageServerLoad} */ export async function load({ params }) { const { slug } = params - let dateParts = params.date.split(/[\/-]/).map((p) => parseInt(p, 10)) + const dateParts = params.date.split(/[\/-]/).map((p) => Number.parseInt(p, 10)) if (dateParts.length > 3) { throw error(404, 'Post not found (bad date)') } @@ -25,7 +25,7 @@ export async function load({ params }) { const page = pages .filter((post) => slug === post.slug) .filter((post) => { - let date = new Date(post.date) + const date = new Date(post.date) return ( (!dateParts[0] || date.getFullYear() == dateParts[0]) && (!dateParts[1] || date.getMonth()+1 == dateParts[1]) && diff --git a/packages/website/src/routes/blog/[...date]/[slug]/+page.svelte b/packages/website/src/routes/blog/[...date]/[slug]/+page.svelte index 9e6d60c1..d52c4290 100644 --- a/packages/website/src/routes/blog/[...date]/[slug]/+page.svelte +++ b/packages/website/src/routes/blog/[...date]/[slug]/+page.svelte @@ -21,7 +21,7 @@ ratio?: number, width?: number, ): URL { - let url = new URL(SITE_URL + "/blog/image"); + const url = new URL(SITE_URL + "/blog/image"); url.searchParams.set("slug", slug); url.searchParams.set("date", date); if (ratio) { @@ -39,7 +39,7 @@ $: handleWebShare; const handleWebShare = async () => { try { - let url = new URL(canonical); + const url = new URL(canonical); url.searchParams.set("utm_medium", "share"); await navigator.share({ title: data.post.title, diff --git a/packages/website/src/routes/blog/[...date]/feed.json/+server.ts b/packages/website/src/routes/blog/[...date]/feed.json/+server.ts index 0ba0fa42..acb3444f 100644 --- a/packages/website/src/routes/blog/[...date]/feed.json/+server.ts +++ b/packages/website/src/routes/blog/[...date]/feed.json/+server.ts @@ -14,14 +14,14 @@ import { error } from '@sveltejs/kit' // export const prerender = true; export async function GET({ params, url}) { - let dateParts = params.date.split(/[\/-]/).filter((s)=>s.length !== 0).map((p) => parseInt(p, 10)) + const dateParts = params.date.split(/[\/-]/).filter((s)=>s.length !== 0).map((p) => Number.parseInt(p, 10)) if (dateParts.length > 3) { throw error(404, 'Feed not found (bad date)') } const selectedPages = dateParts.length ? pages .filter((post) => { - let date = new Date(post.date) + const date = new Date(post.date) return ( (!dateParts[0] || date.getFullYear() == dateParts[0]) && (!dateParts[1] || date.getMonth()+1 == dateParts[1]) && @@ -57,7 +57,7 @@ async function getJsonFeed(selfUrl: string, pages: any[]): Promise { const postUrl = SITE_URL + "/blog/" + post.canonical // const postHtml = const summary = post.description; - let item: typeof feed.items[number] = { + const item: typeof feed.items[number] = { id: post.postUrl, title, url: postUrl, diff --git a/packages/website/src/routes/blog/[...date]/rss.xml/+server.ts b/packages/website/src/routes/blog/[...date]/rss.xml/+server.ts index 58e05024..1e79cdb8 100644 --- a/packages/website/src/routes/blog/[...date]/rss.xml/+server.ts +++ b/packages/website/src/routes/blog/[...date]/rss.xml/+server.ts @@ -15,7 +15,7 @@ import { error } from '@sveltejs/kit' // export const prerender = true; export async function GET({ url, params }) { - let dateParts = params.date.split(/[\/-]/).filter((s)=>s.length !== 0).map((p) => parseInt(p, 10)) + const dateParts = params.date.split(/[\/-]/).filter((s)=>s.length !== 0).map((p) => Number.parseInt(p, 10)) if (dateParts.length > 3) { throw error(404, 'Feed not found (bad date)') } @@ -23,7 +23,7 @@ export async function GET({ url, params }) { const selectedPages = dateParts.length ? pages .filter((post) => { console.log("filtering") - let date = new Date(post.date) + const date = new Date(post.date) return ( (!dateParts[0] || date.getFullYear() == dateParts[0]) && (!dateParts[1] || date.getMonth()+1 == dateParts[1]) && diff --git a/packages/website/src/routes/blog/image/+server.ts b/packages/website/src/routes/blog/image/+server.ts index dec7833d..58ccac36 100644 --- a/packages/website/src/routes/blog/image/+server.ts +++ b/packages/website/src/routes/blog/image/+server.ts @@ -24,7 +24,7 @@ export async function GET({ url, request }) { // First, get the information about the post // We have the slug and date of the post, which we can use to look up the post const slug = url.searchParams.get('slug') - let dateParts = url.searchParams.get('date')?.split(/[\/-]/)?.map((p: string) => parseInt(p, 10)) + const dateParts = url.searchParams.get('date')?.split(/[\/-]/)?.map((p: string) => Number.parseInt(p, 10)) if (dateParts && dateParts.length > 3) { throw error(404, 'Post not found (bad date)') } @@ -43,7 +43,7 @@ export async function GET({ url, request }) { .filter((post) => slug === post.slug) .filter((post) => { if (dateParts) { - let date = new Date(post.date) + const date = new Date(post.date) return ( (!dateParts[0] || date.getFullYear() == dateParts[0]) && (!dateParts[1] || date.getMonth() + 1 == dateParts[1]) && @@ -59,9 +59,9 @@ export async function GET({ url, request }) { // Generate a cache key based on the post's canonical URL, reading time, width, and ratio // Caching the image based on this key ensures that the image is not regenerated every time // The cache key is also used for browser caching - let cache_key = fnv.hash(page.canonical + "\x00" + page.readingTime.text + "\x00" + width + "\x00" + ratio).str() + const cache_key = fnv.hash(page.canonical + "\x00" + page.readingTime.text + "\x00" + width + "\x00" + ratio).str() - let received_etag = request.headers.get("if-none-match"); + const received_etag = request.headers.get("if-none-match"); // If the client has a cached version of the image, return a 304 Not Modified response, indicating that the image has not changed // This means we don't even have to have the image cached in memory if (received_etag == cache_key) { @@ -71,7 +71,7 @@ export async function GET({ url, request }) { // If the image is not cached, generate the image and cache it if (!cache.has(cache_key)) { // First, render the HTML / JSX-based template - let template = h("div", { + const template = h("div", { style: { display: 'flex', height: '100%', diff --git a/packages/website/src/routes/blog/posts.ts b/packages/website/src/routes/blog/posts.ts index 7f6e88ed..b151c308 100644 --- a/packages/website/src/routes/blog/posts.ts +++ b/packages/website/src/routes/blog/posts.ts @@ -67,16 +67,16 @@ if (browser) { const dateRegex = /^((?\d{4})-(?[0][1-9]|1[0-2])-(?[0][1-9]|[1-2]\d|3[01]))\s*/ export const pages = Object.entries(import.meta.glob('/node_modules/Notes/Blogs/*.md', { eager: true })) .map(([filepath, post]) => { - let path = parse(filepath); - let title = path.name.replace(dateRegex, "") + const path = parse(filepath); + const title = path.name.replace(dateRegex, "") // @ts-ignore // let {year, month, day}: { year: string, month: string, day: string } = path.name.match(dateRegex)?.groups; // console.log(year, month, day) - let date = path.name.match(dateRegex)[1]; - let datePath = date.replaceAll("-", "/") - let slug = slugify(title, { lower: true }) + const date = path.name.match(dateRegex)[1]; + const datePath = date.replaceAll("-", "/") + const slug = slugify(title, { lower: true }) return { title, date, diff --git a/packages/website/src/routes/projects/[slug]/+page.server.ts b/packages/website/src/routes/projects/[slug]/+page.server.ts index 714e9c13..0992572b 100644 --- a/packages/website/src/routes/projects/[slug]/+page.server.ts +++ b/packages/website/src/routes/projects/[slug]/+page.server.ts @@ -6,7 +6,7 @@ const cache = new TTLCache({ max: 10000, ttl: 1000 }) import type { Endpoints } from "@octokit/types"; -let repoRegex = new RegExp("https?://github\.com/(?[a-zA-Z0-9]+/[a-zA-Z0-9]+)/?") +const repoRegex = /https?:\/\/github\.com\/(?[a-zA-Z0-9]+\/[a-zA-Z0-9]+)\/?/ /** @type {import('./$types').PageServerLoad} */ export async function load({ params }) { @@ -21,13 +21,13 @@ export async function load({ params }) { let ghReleaseData: Endpoints["GET /repos/{owner}/{repo}/releases/latest"]["response"]["data"] | undefined; - let repo = (page.repo as string).match(repoRegex)?.groups?.repo + const repo = (page.repo as string).match(repoRegex)?.groups?.repo if (repo) { if (!cache.has(repo)) { // console.log("cache miss") ghReleaseData = await fetch("https://api.github.com/repos/" + repo + "/releases/latest").then(async (res) => { - let json = await res.json() - let ttl = (parse(res.headers.get("cache-control") || undefined)?.maxAge || 60) * 1000 + const json = await res.json() + const ttl = (parse(res.headers.get("cache-control") || undefined)?.maxAge || 60) * 1000 cache.set(repo, json, { ttl }) return json }) diff --git a/packages/website/src/routes/projects/[slug]/projects.ts b/packages/website/src/routes/projects/[slug]/projects.ts index 7d6e7732..1593034e 100644 --- a/packages/website/src/routes/projects/[slug]/projects.ts +++ b/packages/website/src/routes/projects/[slug]/projects.ts @@ -11,8 +11,8 @@ if (browser) { export const pages = Object.entries(import.meta.glob('/node_modules/Notes/Projects/*.md', { eager: true })) .map(([filepath, post]) => { - let path = parse(filepath); - let slug = slugify(path.name, { lower: true }) + const path = parse(filepath); + const slug = slugify(path.name, { lower: true }) return { title: path.name, // @ts-ignore diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d590a44d..2583d154 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -177,6 +177,9 @@ importers: specifier: ^3.1.1 version: 3.1.1 devDependencies: + '@biomejs/biome': + specifier: 1.9.0 + version: 1.9.0 '@bitmachina/highlighter': specifier: 1.0.0-alpha.6 version: 1.0.0-alpha.6 @@ -477,6 +480,59 @@ packages: resolution: {integrity: sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==} engines: {node: '>=6.9.0'} + '@biomejs/biome@1.9.0': + resolution: {integrity: sha512-NlWh2F1wbxB3O/wE+aohGL0BziTS6e+6+dyFvpdeqLsbQZY7EsiklFb9W5Xs41U4vEmY7ANgdNp+oVDij6sQdA==} + engines: {node: '>=14.21.3'} + hasBin: true + + '@biomejs/cli-darwin-arm64@1.9.0': + resolution: {integrity: sha512-2w9v/NRtYSmodx5QWQ49OGcyGKSECdWKbzc7n532Iq5sBhkKk996fd19icT6BuL54f01KFKRCRibAW+A2rg1Kw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@1.9.0': + resolution: {integrity: sha512-fBVt8jJQi0zX0SJ1C+tdzUbRpuX/07sgtBXEhunWRkPjdi6W/2S1sYHQ1wKn4OKiRAKfHM2Cf2FNO7hQvY61dA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@1.9.0': + resolution: {integrity: sha512-Jy84mZ4vcppdmWMgQWOCfd8qIVC/vHmlaS5gy7GXkdWlBKSQ56YxEXTU58MHTbZ16LwJQpK2IulqRCC/rqWLBA==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-arm64@1.9.0': + resolution: {integrity: sha512-l8U2lcqsl9yKPP5WUdIrKH//C1pWyM2cSUfcTBn6GSvXmsSjBNEdGSdM4Wfne777Oe/9ONaD1Ga53U2HksHHLw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-x64-musl@1.9.0': + resolution: {integrity: sha512-N3enoFoIrkB6qJWyYfTiYmFdB1R/Mrij1dd1xBHqxxCKZY9GRkEswRX3F1Uqzo5T+9Iu8nAQobDqI/ygicYy/Q==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-linux-x64@1.9.0': + resolution: {integrity: sha512-8jAzjrrJTj510pwq4aVs7ZKkOvEy1D+nzl9DKvrPh4TOyUw5Ie+0EDwXGE2RAkCKHkGNOQBZ78WtIdsATgz5sA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-win32-arm64@1.9.0': + resolution: {integrity: sha512-AIjwJTGfdWGMRluSQ9pDB29nzce077dfHh0/HMqzztKzgD3spyuo2R9VoaFpbR0hLHPWEH6g6OxxDO7hfkXNkQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@1.9.0': + resolution: {integrity: sha512-4/4wTjNSoyNkm1SzcUaStDx46baX1VJRXtUoeEHjX9LfedR5N3qwZz5KfrRUnCd2fl5bmXK1CwMqKBkoF6zEiA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + '@bitmachina/highlighter@1.0.0-alpha.6': resolution: {integrity: sha512-f3KLy64cZnO58GuRswbk/oo3rKoRXz0zE3JtpCrIHr/RmT3gjBH8O1CeKxBdfx3fWvdnrGfEkkHSKBHRbf6/dw==} @@ -4291,6 +4347,41 @@ snapshots: '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 + '@biomejs/biome@1.9.0': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 1.9.0 + '@biomejs/cli-darwin-x64': 1.9.0 + '@biomejs/cli-linux-arm64': 1.9.0 + '@biomejs/cli-linux-arm64-musl': 1.9.0 + '@biomejs/cli-linux-x64': 1.9.0 + '@biomejs/cli-linux-x64-musl': 1.9.0 + '@biomejs/cli-win32-arm64': 1.9.0 + '@biomejs/cli-win32-x64': 1.9.0 + + '@biomejs/cli-darwin-arm64@1.9.0': + optional: true + + '@biomejs/cli-darwin-x64@1.9.0': + optional: true + + '@biomejs/cli-linux-arm64-musl@1.9.0': + optional: true + + '@biomejs/cli-linux-arm64@1.9.0': + optional: true + + '@biomejs/cli-linux-x64-musl@1.9.0': + optional: true + + '@biomejs/cli-linux-x64@1.9.0': + optional: true + + '@biomejs/cli-win32-arm64@1.9.0': + optional: true + + '@biomejs/cli-win32-x64@1.9.0': + optional: true + '@bitmachina/highlighter@1.0.0-alpha.6': dependencies: hast-util-to-string: 2.0.0