diff --git a/.github/workflows/chrome_plugin.yml b/.github/workflows/chrome_plugin.yml index 410b6e79..20b72e7f 100644 --- a/.github/workflows/chrome_plugin.yml +++ b/.github/workflows/chrome_plugin.yml @@ -22,8 +22,6 @@ jobs: node-version-file: ".node-version" - name: Enable Corepack run: corepack enable - - name: Install `pandoc` - run: sudo apt-get update && sudo apt-get install pandoc -y - uses: cargo-bins/cargo-binstall@main - name: Install `wasm-pack` run: cargo binstall wasm-pack --force --no-confirm diff --git a/.github/workflows/just_checks.yml b/.github/workflows/just_checks.yml index 5038d768..d31a6c7c 100644 --- a/.github/workflows/just_checks.yml +++ b/.github/workflows/just_checks.yml @@ -43,8 +43,6 @@ jobs: package-manager-cache: false - name: Enable Corepack run: corepack enable - - name: Install `pandoc` - run: sudo apt-get update && sudo apt-get install pandoc -y - name: Rust Cache uses: Swatinem/rust-cache@v2.7.8 - uses: cargo-bins/cargo-binstall@main diff --git a/.github/workflows/wp_plugin.yml b/.github/workflows/wp_plugin.yml index db782e6e..63f481e8 100644 --- a/.github/workflows/wp_plugin.yml +++ b/.github/workflows/wp_plugin.yml @@ -22,8 +22,6 @@ jobs: node-version-file: ".node-version" - name: Enable Corepack run: corepack enable - - name: Install pandoc - run: sudo apt-get update && sudo apt-get install pandoc -y - uses: cargo-bins/cargo-binstall@main - name: Install wasm-pack run: cargo binstall wasm-pack --force --no-confirm diff --git a/Dockerfile b/Dockerfile index 68404f72..5209f2af 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,7 +18,7 @@ RUN wasm-pack build --target web FROM node:${NODE_VERSION} AS node-build -RUN apt-get update && apt-get install git pandoc parallel -y +RUN apt-get update && apt-get install git parallel -y RUN corepack enable RUN mkdir -p /usr/build/ diff --git a/biome.json b/biome.json index c4d6ec00..07102f9a 100644 --- a/biome.json +++ b/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/2.0.6/schema.json", + "$schema": "https://biomejs.dev/schemas/2.3.3/schema.json", "vcs": { "enabled": true, "clientKind": "git", @@ -30,6 +30,11 @@ "!**/yarn.lock" ] }, + "css": { + "parser": { + "tailwindDirectives": true + } + }, "formatter": { "enabled": true, "lineWidth": 100, @@ -94,6 +99,9 @@ "includes": ["**/*.svelte", "**/*.astro", "**/*.vue"], "linter": { "rules": { + "correctness": { + "noUnusedImports": "off" + }, "style": { "useConst": "off", "useImportType": "off" diff --git a/flake.nix b/flake.nix index 00eedf69..6ea9e01e 100644 --- a/flake.nix +++ b/flake.nix @@ -29,7 +29,6 @@ nodejs wasm-pack zip - pandoc wasm-bindgen-cli_0_2_100 ]; diff --git a/justfile b/justfile index d727de47..c9e642a3 100644 --- a/justfile +++ b/justfile @@ -177,7 +177,8 @@ test-vscode: mkdir "$bin_dir" fi - cargo build --release + echo Building binaries + cargo build --release -q cp "{{justfile_directory()}}/target/release/harper-ls"* "$bin_dir" @@ -203,7 +204,8 @@ package-vscode target="": cp LICENSE "$ext_dir" if [[ -z "{{target}}" ]]; then - cargo build --release + echo Building binaries + cargo build --release -q if ! [[ -d "$bin_dir" ]]; then mkdir "$bin_dir" @@ -285,7 +287,8 @@ precommit: check test build-harperjs build-obsidian build-web build-wp build-fir #!/usr/bin/env bash set -eo pipefail - cargo build --all-targets + echo Building binaries + cargo build --all-targets -q # Install `harper-cli` and `harper-ls` to your machine via `cargo` install: @@ -303,7 +306,8 @@ dogfood: done test-rust: - cargo test + echo Running all Rust tests + cargo test -q # Test everything. test: test-rust test-harperjs test-vscode test-obsidian test-chrome-plugin test-firefox-plugin diff --git a/package.json b/package.json index 441cab8f..0805f5c5 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ }, "devDependencies": { "@babel/runtime": "catalog:", - "@biomejs/biome": "2.0.6", + "@biomejs/biome": "2.3.3", "check-dependency-version-consistency": "^5.0.0", "typescript": "catalog:" }, diff --git a/packages/chrome-plugin/package.json b/packages/chrome-plugin/package.json index 1dfb7b2b..6d48a26b 100644 --- a/packages/chrome-plugin/package.json +++ b/packages/chrome-plugin/package.json @@ -17,12 +17,12 @@ }, "scripts": { "dev": "vite", - "build": "vite build", + "build": "vite build -l warn", "preview": "vite preview", "fmt": "prettier --write '**/*.{svelte,ts,json,css,scss,md}'", "zip-for-chrome": "TARGET_BROWSER=chrome npm run build && node src/zip.js harper-chrome-plugin.zip", "zip-for-firefox": "TARGET_BROWSER=firefox npm run build && node src/zip.js harper-firefox-plugin.zip", - "test": "playwright test --headed" + "test": "playwright test --headed --reporter=dot --quiet" }, "devDependencies": { "@crxjs/vite-plugin": "^2.0.0-beta.26", @@ -44,17 +44,17 @@ "svelte-preprocess": "^6.0.0", "tslib": "^2.6.2", "typescript": "^5.5.0", - "vite": "^5.4.10" + "vite": "^5.4.10", + "@tailwindcss/vite": "^4.1.4", + "tailwindcss": "^4.1.4" }, "dependencies": { "@fortawesome/free-solid-svg-icons": "^7.1.0", - "@tailwindcss/vite": "^4.1.4", "@webcomponents/custom-elements": "^1.6.0", "harper.js": "workspace:*", "lint-framework": "workspace:*", "lodash-es": "^4.17.21", "lru-cache": "^11.1.0", - "svelte-fa": "^4.0.4", - "tailwindcss": "^4.1.4" + "svelte-fa": "^4.0.4" } } diff --git a/packages/chrome-plugin/src/background/index.ts b/packages/chrome-plugin/src/background/index.ts index 8779dd47..3a3c764d 100644 --- a/packages/chrome-plugin/src/background/index.ts +++ b/packages/chrome-plugin/src/background/index.ts @@ -43,7 +43,7 @@ chrome.runtime.onInstalled.addListener((details) => { } }); -chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { +chrome.runtime.onMessage.addListener((request, _sender, sendResponse) => { handleRequest(request).then(sendResponse); return true; @@ -172,7 +172,7 @@ async function handleLint(req: LintRequest): Promise { return { kind: 'lints', lints: unpackedBySource }; } -async function handleGetConfig(req: GetConfigRequest): Promise { +async function handleGetConfig(_req: GetConfigRequest): Promise { return { kind: 'getConfig', config: await getLintConfig() }; } @@ -188,7 +188,7 @@ async function handleSetDialect(req: SetDialectRequest): Promise { return createUnitResponse(); } -async function handleGetDialect(req: GetDialectRequest): Promise { +async function handleGetDialect(_req: GetDialectRequest): Promise { return { kind: 'getDialect', dialect: await getDialect() }; } @@ -240,7 +240,7 @@ async function handleSetDefaultStatus(req: SetDefaultStatusRequest): Promise { return { kind: 'getLintDescriptions', descriptions: await linter.getLintDescriptionsHTML() }; } diff --git a/packages/chrome-plugin/src/manifest.ts b/packages/chrome-plugin/src/manifest.ts index 88daea97..4c1e116c 100644 --- a/packages/chrome-plugin/src/manifest.ts +++ b/packages/chrome-plugin/src/manifest.ts @@ -1,7 +1,7 @@ import { defineManifest } from '@crxjs/vite-plugin'; import packageData from '../package.json'; -//@ts-ignore +//@ts-expect-error const isDev = process.env.NODE_ENV == 'development'; /** diff --git a/packages/chrome-plugin/src/options/Options.svelte b/packages/chrome-plugin/src/options/Options.svelte index 113556e8..c31be964 100644 --- a/packages/chrome-plugin/src/options/Options.svelte +++ b/packages/chrome-plugin/src/options/Options.svelte @@ -185,7 +185,7 @@ async function exportEnabledDomainsCSV() { User Dictionary Each word should be on its own line. - diff --git a/packages/chrome-plugin/src/popup/Popup.svelte b/packages/chrome-plugin/src/popup/Popup.svelte index 870f5b5d..87726d1d 100644 --- a/packages/chrome-plugin/src/popup/Popup.svelte +++ b/packages/chrome-plugin/src/popup/Popup.svelte @@ -51,6 +51,6 @@ function openSettings() { GitHub Discord Discover - Settings + diff --git a/packages/chrome-plugin/src/protocol.ts b/packages/chrome-plugin/src/protocol.ts index 2005646c..741b5fb3 100644 --- a/packages/chrome-plugin/src/protocol.ts +++ b/packages/chrome-plugin/src/protocol.ts @@ -1,4 +1,4 @@ -import type { Dialect, LintConfig, Summary } from 'harper.js'; +import type { Dialect, LintConfig } from 'harper.js'; import type { UnpackedLintGroups } from 'lint-framework'; export type Request = diff --git a/packages/chrome-plugin/tests/github.spec.ts b/packages/chrome-plugin/tests/github.spec.ts index fae95092..fa2f22a1 100644 --- a/packages/chrome-plugin/tests/github.spec.ts +++ b/packages/chrome-plugin/tests/github.spec.ts @@ -1,8 +1,6 @@ import { test } from './fixtures'; import { assertHarperHighlightBoxes, - clickHarperHighlight, - getHarperHighlights, getTextarea, replaceEditorContent, testBasicSuggestionTextarea, diff --git a/packages/chrome-plugin/tests/lint-kinds.spec.ts b/packages/chrome-plugin/tests/lint-kinds.spec.ts index 528b09a9..c9bb930b 100644 --- a/packages/chrome-plugin/tests/lint-kinds.spec.ts +++ b/packages/chrome-plugin/tests/lint-kinds.spec.ts @@ -1,7 +1,8 @@ -import { expect, test } from '@playwright/test'; +import { test } from '@playwright/test'; import { LINT_KINDS, lintKindColor } from 'lint-framework'; -test('display lint kind colors', async ({ page }, testInfo) => { +// biome-ignore lint/correctness/noEmptyPattern: Playwright requires an object destruction +test('display lint kind colors', async ({}, testInfo) => { // Generate color boxes for each lint kind const colorBoxes = LINT_KINDS.map((kind) => { const color = lintKindColor(kind); diff --git a/packages/chrome-plugin/tests/simple_inputs_disabled.spec.ts b/packages/chrome-plugin/tests/simple_inputs_disabled.spec.ts index eefeedd5..c6f4c992 100644 --- a/packages/chrome-plugin/tests/simple_inputs_disabled.spec.ts +++ b/packages/chrome-plugin/tests/simple_inputs_disabled.spec.ts @@ -3,7 +3,7 @@ import { assertHarperHighlightBoxes } from './testUtils'; const TEST_PAGE_URL = 'http://localhost:8081/simple_inputs_disabled.html'; -test('Ignores disabled and readonly inputs', async ({ page }, testInfo) => { +test('Ignores disabled and readonly inputs', async ({ page }) => { await page.goto(TEST_PAGE_URL); await page.waitForTimeout(6000); diff --git a/packages/chrome-plugin/tests/testUtils.ts b/packages/chrome-plugin/tests/testUtils.ts index 2ff5c510..8c9f4d81 100644 --- a/packages/chrome-plugin/tests/testUtils.ts +++ b/packages/chrome-plugin/tests/testUtils.ts @@ -68,7 +68,7 @@ export function getTextarea(page: Page): Locator { } export async function testBasicSuggestionTextarea(testPageUrl: string) { - test('Can apply basic suggestion.', async ({ page, context }) => { + test('Can apply basic suggestion.', async ({ page }) => { await page.goto(testPageUrl); await page.waitForTimeout(2000); diff --git a/packages/harper.js/docs.sh b/packages/harper.js/docs.sh index 2f500a08..73028247 100755 --- a/packages/harper.js/docs.sh +++ b/packages/harper.js/docs.sh @@ -19,34 +19,17 @@ if [[ -d "$harperjs_docs_dir" ]]; then fi mkdir -p "$harperjs_docs_dir" || true -cat <<- PANDOC_FILTER > "./temp/md_to_html.lua" - function Link(elem) - elem.target = string.gsub(elem.target, "%.md$", ".html") - return elem - end -PANDOC_FILTER - echo "Rendering HTML..." if command -v parallel &> /dev/null; then parallel ' base=$(basename {} .md) - pandoc -s \ - -V pagetitle="${base#"harper.js."} - Harper" \ - -V description-meta="API reference documentation for harper.js" \ - -V document-css="true" \ - -L "./temp/md_to_html.lua" \ - -o "html/${base}.html" {} + node renderPage.js "${base#"harper.js."} - Harper" "API reference documentation for harper.js" {} "html/${base}.html" ' ::: ./markdown/*.md else echo "parallel not found, falling back to sequential processing" for file in ./markdown/*.md; do base=$(basename "$file" .md) - pandoc -s \ - -V pagetitle="${base#"harper.js."} - Harper" \ - -V description-meta="API reference documentation for harper.js" \ - -V document-css="true" \ - -L "./temp/md_to_html.lua" \ - -o "html/${base}.html" "$file" + node renderPage.js "${base#"harper.js."} - Harper" "API reference documentation for harper.js" {} "html/${base}.html" done fi mv -f "$html_dir" "${harperjs_docs_dir}/ref" diff --git a/packages/harper.js/examples/raw-web/index.html b/packages/harper.js/examples/raw-web/index.html index ca26eee1..a4f6a6c8 100644 --- a/packages/harper.js/examples/raw-web/index.html +++ b/packages/harper.js/examples/raw-web/index.html @@ -6,28 +6,28 @@ diff --git a/packages/harper.js/package.json b/packages/harper.js/package.json index 7a242662..a774b0c2 100644 --- a/packages/harper.js/package.json +++ b/packages/harper.js/package.json @@ -16,7 +16,7 @@ "type": "module", "scripts": { "dev": "vite", - "build": "tsc && vite build", + "build": "tsc && vite build -l warn", "test": "vitest run", "test:debug": "vitest run --browser.headless false --testTimeout 0", "api:extractor": "api-extractor run", @@ -26,16 +26,17 @@ "@microsoft/api-documenter": "^7.26.10", "@microsoft/api-extractor": "^7.50.1", "@vitest/browser": "^3.0.6", + "harper-wasm": "workspace:*", + "marked": "^16.4.1", + "p-lazy": "^5.0.0", + "p-memoize": "^7.1.1", "playwright": "^1.49.1", + "type-fest": "^4.37.0", "typescript": "catalog:", "vite": "^6.1.0", "vite-plugin-dts": "^4.5.0", "vite-plugin-virtual": "^0.3.0", - "vitest": "^3.0.5", - "harper-wasm": "workspace:*", - "type-fest": "^4.37.0", - "p-memoize": "^7.1.1", - "p-lazy": "^5.0.0" + "vitest": "^3.0.5" }, "main": "dist/harper.js", "types": "dist/harper.d.ts", diff --git a/packages/harper.js/renderPage.js b/packages/harper.js/renderPage.js new file mode 100644 index 00000000..64d0d75b --- /dev/null +++ b/packages/harper.js/renderPage.js @@ -0,0 +1,39 @@ +import fs from 'fs'; +import { marked } from 'marked'; + +const pageTitle = process.argv[2]; +const description = process.argv[3]; +const input = process.argv[4]; +const output = process.argv[5]; + +const renderer = new marked.Renderer(); + +renderer.link = ({ href, title, text }) => { + if (href.endsWith('.md')) { + href = `${href.slice(0, href.length - 3)}.html`; + } + const titleAttr = title ? ` title="${title}"` : ''; + return `${text}`; +}; + +const markdown = fs.readFileSync(input, 'utf8'); +const body = marked.parse(markdown, { async: false, renderer }); + +const html = ` + + + +${pageTitle} + + + + +${body} + + +`; + +fs.writeFileSync(output, html); diff --git a/packages/lint-framework/package.json b/packages/lint-framework/package.json index 37ad3ca0..ef30d067 100644 --- a/packages/lint-framework/package.json +++ b/packages/lint-framework/package.json @@ -16,7 +16,7 @@ "dist" ], "scripts": { - "build": "tsc && vite build", + "build": "tsc && vite build -l warn", "dev": "vite", "test": "echo 'no tests'" }, diff --git a/packages/lint-framework/src/lint/SuggestionBox.ts b/packages/lint-framework/src/lint/SuggestionBox.ts index c251aed8..77808a02 100644 --- a/packages/lint-framework/src/lint/SuggestionBox.ts +++ b/packages/lint-framework/src/lint/SuggestionBox.ts @@ -22,7 +22,6 @@ FocusHook.prototype.hook = function (node: any, _propertyName: any, _previousVal }); }; -/** biome-ignore-all lint/complexity/useArrowFunction: It cannot be an arrow function for the logic to work. */ var CloseOnEscapeHook: any = function (this: any, onClose: () => void) { this.onClose = onClose; }; @@ -179,7 +178,7 @@ function suggestions( ): any { return suggestions.map((s: UnpackedSuggestion, i: number) => { const label = s.replacement_text !== '' ? s.replacement_text : String(s.kind); - const desc = `Replace with \"${label}\"`; + const desc = `Replace with "${label}"`; const props = i === 0 ? { hook: new FocusHook() } : {}; return button(label, { background: '#2DA44E', color: '#FFFFFF' }, () => apply(s), desc, props); }); @@ -224,7 +223,7 @@ function styleTag() { display:flex; flex-direction:column; z-index:5000; - font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Helvetica,Arial,sans-serif; + font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif; pointer-events:auto } .harper-header{ diff --git a/packages/lint-framework/src/lint/domUtils.ts b/packages/lint-framework/src/lint/domUtils.ts index 4d0d0131..8dd3f56b 100644 --- a/packages/lint-framework/src/lint/domUtils.ts +++ b/packages/lint-framework/src/lint/domUtils.ts @@ -48,7 +48,9 @@ export function leafNodes(node: Node): Node[] { for (const child of children) { const sub = leafNodes(child); - sub.forEach((v) => out.push(v)); + sub.forEach((v) => { + out.push(v); + }); } return out; diff --git a/packages/obsidian-plugin/package.json b/packages/obsidian-plugin/package.json index 1ef52f7c..a48df6d2 100644 --- a/packages/obsidian-plugin/package.json +++ b/packages/obsidian-plugin/package.json @@ -15,7 +15,7 @@ "vitest": "^3.0.8" }, "scripts": { - "build": "vite build", + "build": "vite build -l warn", "dev": "vite build --watch", "test": "vitest run" }, diff --git a/packages/obsidian-plugin/src/HarperSettingTab.ts b/packages/obsidian-plugin/src/HarperSettingTab.ts index 5cf8888d..7632aa46 100644 --- a/packages/obsidian-plugin/src/HarperSettingTab.ts +++ b/packages/obsidian-plugin/src/HarperSettingTab.ts @@ -79,7 +79,7 @@ export class HarperSettingTab extends PluginSettingTab { .addOption(Dialect.Australian.toString(), 'Australian') .setValue((this.settings.dialect ?? Dialect.American).toString()) .onChange(async (value) => { - const dialect = Number.parseInt(value); + const dialect = Number.parseInt(value, 10); this.settings.dialect = dialect; await this.state.initializeFromSettings(this.settings); this.plugin.updateStatusBar(dialect); @@ -90,7 +90,7 @@ export class HarperSettingTab extends PluginSettingTab { .setName('Activate Harper') .setDesc('Enable or disable Harper with this option.') .addToggle((toggle) => - toggle.setValue(this.settings.lintEnabled).onChange(async (value) => { + toggle.setValue(this.settings.lintEnabled).onChange(async (_value) => { this.state.toggleAutoLint(); this.plugin.updateStatusBar(); }), diff --git a/packages/obsidian-plugin/src/State.ts b/packages/obsidian-plugin/src/State.ts index 98e73a0d..c960006e 100644 --- a/packages/obsidian-plugin/src/State.ts +++ b/packages/obsidian-plugin/src/State.ts @@ -39,7 +39,7 @@ export default class State { constructor( saveDataCallback: (data: any) => Promise, onExtensionChange: () => void, - editorViewField?: StateField, + _editorViewField?: StateField, ) { this.harper = new WorkerLinter({ binary: binaryInlined }); this.delay = DEFAULT_DELAY; @@ -115,12 +115,15 @@ export default class State { if (this.editorViewField != null) { const mdView = view.state.field(this.editorViewField) as MarkdownView; const file = mdView?.file; - const path = file?.path!; - if (path != null) { - for (const glob of ignoredGlobs) { - if (minimatch(path, glob)) { - return []; + if (file != null) { + const path = file.path; + + if (path != null) { + for (const glob of ignoredGlobs) { + if (minimatch(path, glob)) { + return []; + } } } } @@ -177,7 +180,7 @@ export default class State { actions.push({ name: '📖', title: `Add “${word}” to your dictionary`, - apply: (view) => { + apply: (_view) => { this.harper.importWords([word]); this.reinitialize(); }, @@ -189,7 +192,7 @@ export default class State { to: span.end, severity: 'error', title: lint.lint_kind_pretty(), - renderMessage: (view) => { + renderMessage: (_view) => { const node = document.createElement('template'); node.innerHTML = lint.message_html(); return node.content; diff --git a/packages/obsidian-plugin/src/textUtils.test.ts b/packages/obsidian-plugin/src/textUtils.test.ts index 15c03b9a..fdd527db 100644 --- a/packages/obsidian-plugin/src/textUtils.test.ts +++ b/packages/obsidian-plugin/src/textUtils.test.ts @@ -1,5 +1,4 @@ -import { binary, LocalLinter } from 'harper.js'; -import { describe, expect, test } from 'vitest'; +import { expect, test } from 'vitest'; import { linesToString, stringToLines } from './textUtils'; test('Dictionary values are reversible', () => { diff --git a/packages/web/package.json b/packages/web/package.json index f536abb2..68f797df 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -4,7 +4,7 @@ "private": true, "scripts": { "dev": "vite dev", - "build": "vite build", + "build": "vite build -l warn", "preview": "vite preview", "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", @@ -19,10 +19,10 @@ "drizzle-kit": "^0.31.5", "flowbite": "^3.1.2", "flowbite-svelte": "^0.44.18", - "postcss": "^8.4.31", "svelte": "^5.15.0", "svelte-check": "^4.1.5", - "tailwindcss": "^3.3.3", + "tailwindcss": "^4.1.16", + "@tailwindcss/vite": "^4.1.4", "tslib": "catalog:", "tsx": "^4.20.6", "typescript": "catalog:", diff --git a/packages/web/postcss.config.js b/packages/web/postcss.config.js deleted file mode 100644 index 7b75c83a..00000000 --- a/packages/web/postcss.config.js +++ /dev/null @@ -1,6 +0,0 @@ -export default { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -}; diff --git a/packages/web/src/app.css b/packages/web/src/app.css index 6bdaee1d..dd148a09 100644 --- a/packages/web/src/app.css +++ b/packages/web/src/app.css @@ -1,6 +1,4 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; +@import "tailwindcss"; @layer base { body { @@ -51,12 +49,12 @@ } code { - font-family: "JetBrains Mono", monospace !important; + font-family: "JetBrains Mono", monospace; word-break: keep-all; } code * { - font-family: "JetBrains Mono", monospace !important; + font-family: "JetBrains Mono", monospace; } .underlinespecial { @@ -80,7 +78,7 @@ code * { } textarea { - --tw-ring-shadow: 0 0 #000 !important; + --tw-ring-shadow: 0 0 #000; } .animate-bigbounce { diff --git a/packages/web/src/hooks.server.ts b/packages/web/src/hooks.server.ts index a622fa09..206d2da4 100644 --- a/packages/web/src/hooks.server.ts +++ b/packages/web/src/hooks.server.ts @@ -1,5 +1,5 @@ -import { db } from '$lib/db'; import { migrate } from 'drizzle-orm/mysql2/migrator'; +import { db } from '$lib/db'; // Migrate exactly once at startup try { diff --git a/packages/web/src/lib/components/Editor.svelte b/packages/web/src/lib/components/Editor.svelte index 52e7b256..40e7e884 100644 --- a/packages/web/src/lib/components/Editor.svelte +++ b/packages/web/src/lib/components/Editor.svelte @@ -1,5 +1,4 @@ diff --git a/packages/web/src/routes/request-browser-support/+page.svelte b/packages/web/src/routes/request-browser-support/+page.svelte index 85e927d6..ce9ee416 100644 --- a/packages/web/src/routes/request-browser-support/+page.svelte +++ b/packages/web/src/routes/request-browser-support/+page.svelte @@ -1,5 +1,5 @@
- +
diff --git a/packages/web/src/routes/stats/+page.svelte b/packages/web/src/routes/stats/+page.svelte index 9adaa578..550290ca 100644 --- a/packages/web/src/routes/stats/+page.svelte +++ b/packages/web/src/routes/stats/+page.svelte @@ -1,5 +1,4 @@