chore: reduce dependency load for new contributors (#2131)
Some checks are pending
Binaries / harper-cli - macOS-aarch64 (push) Waiting to run
Binaries / harper-cli - Linux-aarch64-GNU (push) Waiting to run
Binaries / harper-cli - Linux-aarch64-musl (push) Waiting to run
Binaries / harper-cli - macOS-x86_64 (push) Waiting to run
Binaries / harper-cli - Linux-x86_64-GNU (push) Waiting to run
Binaries / harper-cli - Linux-x86_64-musl (push) Waiting to run
Binaries / harper-cli - Windows-x86_64 (push) Waiting to run
Binaries / harper-ls - macOS-aarch64 (push) Waiting to run
Binaries / harper-ls - Linux-aarch64-GNU (push) Waiting to run
Binaries / harper-ls - Linux-aarch64-musl (push) Waiting to run
Binaries / harper-ls - macOS-x86_64 (push) Waiting to run
Binaries / harper-ls - Linux-x86_64-GNU (push) Waiting to run
Binaries / harper-ls - Linux-x86_64-musl (push) Waiting to run
Binaries / harper-ls - Windows-x86_64 (push) Waiting to run
Build Web / build-web (push) Waiting to run
Chrome Plugin / chrome-plugin (push) Waiting to run
Just Checks / just build-obsidian (push) Waiting to run
Just Checks / just test-harperjs (push) Waiting to run
Just Checks / just test-obsidian (push) Waiting to run
Just Checks / just test-rust (push) Waiting to run
Just Checks / just test-vscode (push) Waiting to run
VS Code Plugin / alpine-arm64 (push) Waiting to run
VS Code Plugin / darwin-arm64 (push) Waiting to run
VS Code Plugin / linux-armhf (push) Waiting to run
VS Code Plugin / linux-x64 (push) Waiting to run
WordPress Plugin / wp-plugin (push) Waiting to run
Just Checks / just check-js (push) Waiting to run
Just Checks / just check-rust (push) Waiting to run
Just Checks / just test-chrome-plugin (push) Waiting to run
Just Checks / just test-firefox-plugin (push) Waiting to run
VS Code Plugin / alpine-x64 (push) Waiting to run
VS Code Plugin / darwin-x64 (push) Waiting to run
VS Code Plugin / linux-arm64 (push) Waiting to run
VS Code Plugin / win32-arm64 (push) Waiting to run
VS Code Plugin / win32-x64 (push) Waiting to run

This commit is contained in:
Elijah Potter 2025-11-04 13:53:01 -07:00 committed by GitHub
parent 387f5e2746
commit b033b9bf6d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
61 changed files with 459 additions and 570 deletions

View file

@ -22,8 +22,6 @@ jobs:
node-version-file: ".node-version" node-version-file: ".node-version"
- name: Enable Corepack - name: Enable Corepack
run: corepack enable run: corepack enable
- name: Install `pandoc`
run: sudo apt-get update && sudo apt-get install pandoc -y
- uses: cargo-bins/cargo-binstall@main - uses: cargo-bins/cargo-binstall@main
- name: Install `wasm-pack` - name: Install `wasm-pack`
run: cargo binstall wasm-pack --force --no-confirm run: cargo binstall wasm-pack --force --no-confirm

View file

@ -43,8 +43,6 @@ jobs:
package-manager-cache: false package-manager-cache: false
- name: Enable Corepack - name: Enable Corepack
run: corepack enable run: corepack enable
- name: Install `pandoc`
run: sudo apt-get update && sudo apt-get install pandoc -y
- name: Rust Cache - name: Rust Cache
uses: Swatinem/rust-cache@v2.7.8 uses: Swatinem/rust-cache@v2.7.8
- uses: cargo-bins/cargo-binstall@main - uses: cargo-bins/cargo-binstall@main

View file

@ -22,8 +22,6 @@ jobs:
node-version-file: ".node-version" node-version-file: ".node-version"
- name: Enable Corepack - name: Enable Corepack
run: corepack enable run: corepack enable
- name: Install pandoc
run: sudo apt-get update && sudo apt-get install pandoc -y
- uses: cargo-bins/cargo-binstall@main - uses: cargo-bins/cargo-binstall@main
- name: Install wasm-pack - name: Install wasm-pack
run: cargo binstall wasm-pack --force --no-confirm run: cargo binstall wasm-pack --force --no-confirm

View file

@ -18,7 +18,7 @@ RUN wasm-pack build --target web
FROM node:${NODE_VERSION} AS node-build 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 corepack enable
RUN mkdir -p /usr/build/ RUN mkdir -p /usr/build/

View file

@ -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": { "vcs": {
"enabled": true, "enabled": true,
"clientKind": "git", "clientKind": "git",
@ -30,6 +30,11 @@
"!**/yarn.lock" "!**/yarn.lock"
] ]
}, },
"css": {
"parser": {
"tailwindDirectives": true
}
},
"formatter": { "formatter": {
"enabled": true, "enabled": true,
"lineWidth": 100, "lineWidth": 100,
@ -94,6 +99,9 @@
"includes": ["**/*.svelte", "**/*.astro", "**/*.vue"], "includes": ["**/*.svelte", "**/*.astro", "**/*.vue"],
"linter": { "linter": {
"rules": { "rules": {
"correctness": {
"noUnusedImports": "off"
},
"style": { "style": {
"useConst": "off", "useConst": "off",
"useImportType": "off" "useImportType": "off"

View file

@ -29,7 +29,6 @@
nodejs nodejs
wasm-pack wasm-pack
zip zip
pandoc
wasm-bindgen-cli_0_2_100 wasm-bindgen-cli_0_2_100
]; ];

View file

@ -177,7 +177,8 @@ test-vscode:
mkdir "$bin_dir" mkdir "$bin_dir"
fi fi
cargo build --release echo Building binaries
cargo build --release -q
cp "{{justfile_directory()}}/target/release/harper-ls"* "$bin_dir" cp "{{justfile_directory()}}/target/release/harper-ls"* "$bin_dir"
@ -203,7 +204,8 @@ package-vscode target="":
cp LICENSE "$ext_dir" cp LICENSE "$ext_dir"
if [[ -z "{{target}}" ]]; then if [[ -z "{{target}}" ]]; then
cargo build --release echo Building binaries
cargo build --release -q
if ! [[ -d "$bin_dir" ]]; then if ! [[ -d "$bin_dir" ]]; then
mkdir "$bin_dir" mkdir "$bin_dir"
@ -285,7 +287,8 @@ precommit: check test build-harperjs build-obsidian build-web build-wp build-fir
#!/usr/bin/env bash #!/usr/bin/env bash
set -eo pipefail 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 `harper-cli` and `harper-ls` to your machine via `cargo`
install: install:
@ -303,7 +306,8 @@ dogfood:
done done
test-rust: test-rust:
cargo test echo Running all Rust tests
cargo test -q
# Test everything. # Test everything.
test: test-rust test-harperjs test-vscode test-obsidian test-chrome-plugin test-firefox-plugin test: test-rust test-harperjs test-vscode test-obsidian test-chrome-plugin test-firefox-plugin

View file

@ -11,7 +11,7 @@
}, },
"devDependencies": { "devDependencies": {
"@babel/runtime": "catalog:", "@babel/runtime": "catalog:",
"@biomejs/biome": "2.0.6", "@biomejs/biome": "2.3.3",
"check-dependency-version-consistency": "^5.0.0", "check-dependency-version-consistency": "^5.0.0",
"typescript": "catalog:" "typescript": "catalog:"
}, },

View file

@ -17,12 +17,12 @@
}, },
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
"build": "vite build", "build": "vite build -l warn",
"preview": "vite preview", "preview": "vite preview",
"fmt": "prettier --write '**/*.{svelte,ts,json,css,scss,md}'", "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-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", "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": { "devDependencies": {
"@crxjs/vite-plugin": "^2.0.0-beta.26", "@crxjs/vite-plugin": "^2.0.0-beta.26",
@ -44,17 +44,17 @@
"svelte-preprocess": "^6.0.0", "svelte-preprocess": "^6.0.0",
"tslib": "^2.6.2", "tslib": "^2.6.2",
"typescript": "^5.5.0", "typescript": "^5.5.0",
"vite": "^5.4.10" "vite": "^5.4.10",
"@tailwindcss/vite": "^4.1.4",
"tailwindcss": "^4.1.4"
}, },
"dependencies": { "dependencies": {
"@fortawesome/free-solid-svg-icons": "^7.1.0", "@fortawesome/free-solid-svg-icons": "^7.1.0",
"@tailwindcss/vite": "^4.1.4",
"@webcomponents/custom-elements": "^1.6.0", "@webcomponents/custom-elements": "^1.6.0",
"harper.js": "workspace:*", "harper.js": "workspace:*",
"lint-framework": "workspace:*", "lint-framework": "workspace:*",
"lodash-es": "^4.17.21", "lodash-es": "^4.17.21",
"lru-cache": "^11.1.0", "lru-cache": "^11.1.0",
"svelte-fa": "^4.0.4", "svelte-fa": "^4.0.4"
"tailwindcss": "^4.1.4"
} }
} }

View file

@ -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); handleRequest(request).then(sendResponse);
return true; return true;
@ -172,7 +172,7 @@ async function handleLint(req: LintRequest): Promise<LintResponse> {
return { kind: 'lints', lints: unpackedBySource }; return { kind: 'lints', lints: unpackedBySource };
} }
async function handleGetConfig(req: GetConfigRequest): Promise<GetConfigResponse> { async function handleGetConfig(_req: GetConfigRequest): Promise<GetConfigResponse> {
return { kind: 'getConfig', config: await getLintConfig() }; return { kind: 'getConfig', config: await getLintConfig() };
} }
@ -188,7 +188,7 @@ async function handleSetDialect(req: SetDialectRequest): Promise<UnitResponse> {
return createUnitResponse(); return createUnitResponse();
} }
async function handleGetDialect(req: GetDialectRequest): Promise<GetDialectResponse> { async function handleGetDialect(_req: GetDialectRequest): Promise<GetDialectResponse> {
return { kind: 'getDialect', dialect: await getDialect() }; return { kind: 'getDialect', dialect: await getDialect() };
} }
@ -240,7 +240,7 @@ async function handleSetDefaultStatus(req: SetDefaultStatusRequest): Promise<Uni
} }
async function handleGetLintDescriptions( async function handleGetLintDescriptions(
req: GetLintDescriptionsRequest, _req: GetLintDescriptionsRequest,
): Promise<GetLintDescriptionsResponse> { ): Promise<GetLintDescriptionsResponse> {
return { kind: 'getLintDescriptions', descriptions: await linter.getLintDescriptionsHTML() }; return { kind: 'getLintDescriptions', descriptions: await linter.getLintDescriptionsHTML() };
} }

View file

@ -1,7 +1,7 @@
import { defineManifest } from '@crxjs/vite-plugin'; import { defineManifest } from '@crxjs/vite-plugin';
import packageData from '../package.json'; import packageData from '../package.json';
//@ts-ignore //@ts-expect-error
const isDev = process.env.NODE_ENV == 'development'; const isDev = process.env.NODE_ENV == 'development';
/** /**

View file

@ -185,7 +185,7 @@ async function exportEnabledDomainsCSV() {
<span class="font-medium">User Dictionary</span> <span class="font-medium">User Dictionary</span>
<span class="font-light">Each word should be on its own line.</span> <span class="font-light">Each word should be on its own line.</span>
</div> </div>
<textarea bind:value={userDict} /> <textarea bind:value={userDict} ></textarea>
</div> </div>
</div> </div>

View file

@ -51,6 +51,6 @@ function openSettings() {
<a href="https://github.com/Automattic/harper" target="_blank" rel="noopener" class="text-primary-600 hover:underline">GitHub</a> <a href="https://github.com/Automattic/harper" target="_blank" rel="noopener" class="text-primary-600 hover:underline">GitHub</a>
<a href="https://discord.com/invite/JBqcAaKrzQ" target="_blank" rel="noopener" class="text-primary-600 hover:underline">Discord</a> <a href="https://discord.com/invite/JBqcAaKrzQ" target="_blank" rel="noopener" class="text-primary-600 hover:underline">Discord</a>
<a href="https://writewithharper.com" target="_blank" rel="noopener" class="text-primary-600 hover:underline">Discover</a> <a href="https://writewithharper.com" target="_blank" rel="noopener" class="text-primary-600 hover:underline">Discover</a>
<a target="_blank" rel="noopener" class="text-primary-600 hover:underline" on:click={openSettings}>Settings</a> <button class="text-primary-600 hover:underline" onclick={openSettings}>Settings</button>
</footer> </footer>
</div> </div>

View file

@ -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'; import type { UnpackedLintGroups } from 'lint-framework';
export type Request = export type Request =

View file

@ -1,8 +1,6 @@
import { test } from './fixtures'; import { test } from './fixtures';
import { import {
assertHarperHighlightBoxes, assertHarperHighlightBoxes,
clickHarperHighlight,
getHarperHighlights,
getTextarea, getTextarea,
replaceEditorContent, replaceEditorContent,
testBasicSuggestionTextarea, testBasicSuggestionTextarea,

View file

@ -1,7 +1,8 @@
import { expect, test } from '@playwright/test'; import { test } from '@playwright/test';
import { LINT_KINDS, lintKindColor } from 'lint-framework'; 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 // Generate color boxes for each lint kind
const colorBoxes = LINT_KINDS.map((kind) => { const colorBoxes = LINT_KINDS.map((kind) => {
const color = lintKindColor(kind); const color = lintKindColor(kind);

View file

@ -3,7 +3,7 @@ import { assertHarperHighlightBoxes } from './testUtils';
const TEST_PAGE_URL = 'http://localhost:8081/simple_inputs_disabled.html'; 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.goto(TEST_PAGE_URL);
await page.waitForTimeout(6000); await page.waitForTimeout(6000);

View file

@ -68,7 +68,7 @@ export function getTextarea(page: Page): Locator {
} }
export async function testBasicSuggestionTextarea(testPageUrl: string) { 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.goto(testPageUrl);
await page.waitForTimeout(2000); await page.waitForTimeout(2000);

View file

@ -19,34 +19,17 @@ if [[ -d "$harperjs_docs_dir" ]]; then
fi fi
mkdir -p "$harperjs_docs_dir" || true 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..." echo "Rendering HTML..."
if command -v parallel &> /dev/null; then if command -v parallel &> /dev/null; then
parallel ' parallel '
base=$(basename {} .md) base=$(basename {} .md)
pandoc -s \ node renderPage.js "${base#"harper.js."} - Harper" "API reference documentation for harper.js" {} "html/${base}.html"
-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" {}
' ::: ./markdown/*.md ' ::: ./markdown/*.md
else else
echo "parallel not found, falling back to sequential processing" echo "parallel not found, falling back to sequential processing"
for file in ./markdown/*.md; do for file in ./markdown/*.md; do
base=$(basename "$file" .md) base=$(basename "$file" .md)
pandoc -s \ node renderPage.js "${base#"harper.js."} - Harper" "API reference documentation for harper.js" {} "html/${base}.html"
-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"
done done
fi fi
mv -f "$html_dir" "${harperjs_docs_dir}/ref" mv -f "$html_dir" "${harperjs_docs_dir}/ref"

View file

@ -6,28 +6,28 @@
<script type="module"> <script type="module">
// We can import `harper.js` using native ECMAScript syntax. // We can import `harper.js` using native ECMAScript syntax.
// TODO: Update to the latest version. // TODO: Update to the latest version.
import {WorkerLinter, binaryInlined} from 'https://unpkg.com/harper.js@0.54.0/dist/harper.js'; import {binaryInlined, WorkerLinter } from 'https://unpkg.com/harper.js@0.54.0/dist/harper.js';
// Since we are working in the browser, we can use either `WorkerLinter`, which doesn't block the event loop, or `LocalLinter`, which does. // Since we are working in the browser, we can use either `WorkerLinter`, which doesn't block the event loop, or `LocalLinter`, which does.
let linter = new WorkerLinter({binary: binaryInlined}); const linter = new WorkerLinter({binary: binaryInlined});
// Every time the `<textarea/>` received an input, we process it and update our list. // Every time the `<textarea/>` received an input, we process it and update our list.
async function onInput(e) { async function onInput(e) {
let lints = await linter.lint(e.target.value); const lints = await linter.lint(e.target.value);
let list = document.getElementById('errorlist'); const list = document.getElementById('errorlist');
// Clear previous results // Clear previous results
list.innerHTML = ''; list.innerHTML = '';
for (let lint of lints) { for (const lint of lints) {
let item = document.createElement('LI'); const item = document.createElement('LI');
var text = document.createTextNode(lint.message()); const text = document.createTextNode(lint.message());
item.appendChild(text); item.appendChild(text);
list.appendChild(item); list.appendChild(item);
} }
} }
let inputField = document.getElementById('maininput'); const inputField = document.getElementById('maininput');
inputField.addEventListener('input', onInput); inputField.addEventListener('input', onInput);
onInput({target: inputField}); onInput({target: inputField});
</script> </script>

View file

@ -16,7 +16,7 @@
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
"build": "tsc && vite build", "build": "tsc && vite build -l warn",
"test": "vitest run", "test": "vitest run",
"test:debug": "vitest run --browser.headless false --testTimeout 0", "test:debug": "vitest run --browser.headless false --testTimeout 0",
"api:extractor": "api-extractor run", "api:extractor": "api-extractor run",
@ -26,16 +26,17 @@
"@microsoft/api-documenter": "^7.26.10", "@microsoft/api-documenter": "^7.26.10",
"@microsoft/api-extractor": "^7.50.1", "@microsoft/api-extractor": "^7.50.1",
"@vitest/browser": "^3.0.6", "@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", "playwright": "^1.49.1",
"type-fest": "^4.37.0",
"typescript": "catalog:", "typescript": "catalog:",
"vite": "^6.1.0", "vite": "^6.1.0",
"vite-plugin-dts": "^4.5.0", "vite-plugin-dts": "^4.5.0",
"vite-plugin-virtual": "^0.3.0", "vite-plugin-virtual": "^0.3.0",
"vitest": "^3.0.5", "vitest": "^3.0.5"
"harper-wasm": "workspace:*",
"type-fest": "^4.37.0",
"p-memoize": "^7.1.1",
"p-lazy": "^5.0.0"
}, },
"main": "dist/harper.js", "main": "dist/harper.js",
"types": "dist/harper.d.ts", "types": "dist/harper.d.ts",

View file

@ -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 `<a href="${href}" ${titleAttr}>${text}</a>`;
};
const markdown = fs.readFileSync(input, 'utf8');
const body = marked.parse(markdown, { async: false, renderer });
const html = `<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>${pageTitle}</title>
<meta name="description" content="${description}">
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.min.css"
>
</head>
<body>
${body}
</body>
</html>
`;
fs.writeFileSync(output, html);

View file

@ -16,7 +16,7 @@
"dist" "dist"
], ],
"scripts": { "scripts": {
"build": "tsc && vite build", "build": "tsc && vite build -l warn",
"dev": "vite", "dev": "vite",
"test": "echo 'no tests'" "test": "echo 'no tests'"
}, },

View file

@ -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) { var CloseOnEscapeHook: any = function (this: any, onClose: () => void) {
this.onClose = onClose; this.onClose = onClose;
}; };
@ -179,7 +178,7 @@ function suggestions(
): any { ): any {
return suggestions.map((s: UnpackedSuggestion, i: number) => { return suggestions.map((s: UnpackedSuggestion, i: number) => {
const label = s.replacement_text !== '' ? s.replacement_text : String(s.kind); 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() } : {}; const props = i === 0 ? { hook: new FocusHook() } : {};
return button(label, { background: '#2DA44E', color: '#FFFFFF' }, () => apply(s), desc, props); return button(label, { background: '#2DA44E', color: '#FFFFFF' }, () => apply(s), desc, props);
}); });
@ -224,7 +223,7 @@ function styleTag() {
display:flex; display:flex;
flex-direction:column; flex-direction:column;
z-index:5000; 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 pointer-events:auto
} }
.harper-header{ .harper-header{

View file

@ -48,7 +48,9 @@ export function leafNodes(node: Node): Node[] {
for (const child of children) { for (const child of children) {
const sub = leafNodes(child); const sub = leafNodes(child);
sub.forEach((v) => out.push(v)); sub.forEach((v) => {
out.push(v);
});
} }
return out; return out;

View file

@ -15,7 +15,7 @@
"vitest": "^3.0.8" "vitest": "^3.0.8"
}, },
"scripts": { "scripts": {
"build": "vite build", "build": "vite build -l warn",
"dev": "vite build --watch", "dev": "vite build --watch",
"test": "vitest run" "test": "vitest run"
}, },

View file

@ -79,7 +79,7 @@ export class HarperSettingTab extends PluginSettingTab {
.addOption(Dialect.Australian.toString(), 'Australian') .addOption(Dialect.Australian.toString(), 'Australian')
.setValue((this.settings.dialect ?? Dialect.American).toString()) .setValue((this.settings.dialect ?? Dialect.American).toString())
.onChange(async (value) => { .onChange(async (value) => {
const dialect = Number.parseInt(value); const dialect = Number.parseInt(value, 10);
this.settings.dialect = dialect; this.settings.dialect = dialect;
await this.state.initializeFromSettings(this.settings); await this.state.initializeFromSettings(this.settings);
this.plugin.updateStatusBar(dialect); this.plugin.updateStatusBar(dialect);
@ -90,7 +90,7 @@ export class HarperSettingTab extends PluginSettingTab {
.setName('Activate Harper') .setName('Activate Harper')
.setDesc('Enable or disable Harper with this option.') .setDesc('Enable or disable Harper with this option.')
.addToggle((toggle) => .addToggle((toggle) =>
toggle.setValue(this.settings.lintEnabled).onChange(async (value) => { toggle.setValue(this.settings.lintEnabled).onChange(async (_value) => {
this.state.toggleAutoLint(); this.state.toggleAutoLint();
this.plugin.updateStatusBar(); this.plugin.updateStatusBar();
}), }),

View file

@ -39,7 +39,7 @@ export default class State {
constructor( constructor(
saveDataCallback: (data: any) => Promise<void>, saveDataCallback: (data: any) => Promise<void>,
onExtensionChange: () => void, onExtensionChange: () => void,
editorViewField?: StateField<MarkdownFileInfo>, _editorViewField?: StateField<MarkdownFileInfo>,
) { ) {
this.harper = new WorkerLinter({ binary: binaryInlined }); this.harper = new WorkerLinter({ binary: binaryInlined });
this.delay = DEFAULT_DELAY; this.delay = DEFAULT_DELAY;
@ -115,12 +115,15 @@ export default class State {
if (this.editorViewField != null) { if (this.editorViewField != null) {
const mdView = view.state.field(this.editorViewField) as MarkdownView; const mdView = view.state.field(this.editorViewField) as MarkdownView;
const file = mdView?.file; const file = mdView?.file;
const path = file?.path!;
if (path != null) { if (file != null) {
for (const glob of ignoredGlobs) { const path = file.path;
if (minimatch(path, glob)) {
return []; if (path != null) {
for (const glob of ignoredGlobs) {
if (minimatch(path, glob)) {
return [];
}
} }
} }
} }
@ -177,7 +180,7 @@ export default class State {
actions.push({ actions.push({
name: '📖', name: '📖',
title: `Add “${word}” to your dictionary`, title: `Add “${word}” to your dictionary`,
apply: (view) => { apply: (_view) => {
this.harper.importWords([word]); this.harper.importWords([word]);
this.reinitialize(); this.reinitialize();
}, },
@ -189,7 +192,7 @@ export default class State {
to: span.end, to: span.end,
severity: 'error', severity: 'error',
title: lint.lint_kind_pretty(), title: lint.lint_kind_pretty(),
renderMessage: (view) => { renderMessage: (_view) => {
const node = document.createElement('template'); const node = document.createElement('template');
node.innerHTML = lint.message_html(); node.innerHTML = lint.message_html();
return node.content; return node.content;

View file

@ -1,5 +1,4 @@
import { binary, LocalLinter } from 'harper.js'; import { expect, test } from 'vitest';
import { describe, expect, test } from 'vitest';
import { linesToString, stringToLines } from './textUtils'; import { linesToString, stringToLines } from './textUtils';
test('Dictionary values are reversible', () => { test('Dictionary values are reversible', () => {

View file

@ -4,7 +4,7 @@
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "vite dev", "dev": "vite dev",
"build": "vite build", "build": "vite build -l warn",
"preview": "vite preview", "preview": "vite preview",
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", "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",
@ -19,10 +19,10 @@
"drizzle-kit": "^0.31.5", "drizzle-kit": "^0.31.5",
"flowbite": "^3.1.2", "flowbite": "^3.1.2",
"flowbite-svelte": "^0.44.18", "flowbite-svelte": "^0.44.18",
"postcss": "^8.4.31",
"svelte": "^5.15.0", "svelte": "^5.15.0",
"svelte-check": "^4.1.5", "svelte-check": "^4.1.5",
"tailwindcss": "^3.3.3", "tailwindcss": "^4.1.16",
"@tailwindcss/vite": "^4.1.4",
"tslib": "catalog:", "tslib": "catalog:",
"tsx": "^4.20.6", "tsx": "^4.20.6",
"typescript": "catalog:", "typescript": "catalog:",

View file

@ -1,6 +0,0 @@
export default {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
};

View file

@ -1,6 +1,4 @@
@tailwind base; @import "tailwindcss";
@tailwind components;
@tailwind utilities;
@layer base { @layer base {
body { body {
@ -51,12 +49,12 @@
} }
code { code {
font-family: "JetBrains Mono", monospace !important; font-family: "JetBrains Mono", monospace;
word-break: keep-all; word-break: keep-all;
} }
code * { code * {
font-family: "JetBrains Mono", monospace !important; font-family: "JetBrains Mono", monospace;
} }
.underlinespecial { .underlinespecial {
@ -80,7 +78,7 @@ code * {
} }
textarea { textarea {
--tw-ring-shadow: 0 0 #000 !important; --tw-ring-shadow: 0 0 #000;
} }
.animate-bigbounce { .animate-bigbounce {

View file

@ -1,5 +1,5 @@
import { db } from '$lib/db';
import { migrate } from 'drizzle-orm/mysql2/migrator'; import { migrate } from 'drizzle-orm/mysql2/migrator';
import { db } from '$lib/db';
// Migrate exactly once at startup // Migrate exactly once at startup
try { try {

View file

@ -1,5 +1,4 @@
<script lang="ts"> <script lang="ts">
import LintCard from '$lib/components/LintCard.svelte';
import { Card } from 'flowbite-svelte'; import { Card } from 'flowbite-svelte';
import { type WorkerLinter } from 'harper.js'; import { type WorkerLinter } from 'harper.js';
import { import {
@ -10,6 +9,7 @@ import {
type UnpackedSuggestion, type UnpackedSuggestion,
unpackLint, unpackLint,
} from 'lint-framework'; } from 'lint-framework';
import LintCard from '$lib/components/LintCard.svelte';
import demo from '../../../../../demo.md?raw'; import demo from '../../../../../demo.md?raw';
export let content = demo.trim(); export let content = demo.trim();

View file

@ -22,7 +22,7 @@ for (let [key, val] of data.entries()) {
let els: Record<string, HTMLElement> = {}; let els: Record<string, HTMLElement> = {};
function expand(node: HTMLElement, { width, duration }: { width: number; duration: number }) { function expand(_node: HTMLElement, { width, duration }: { width: number; duration: number }) {
return { return {
duration, duration,
css: (t: number) => { css: (t: number) => {

View file

@ -1,7 +1,7 @@
<script lang="ts"> <script lang="ts">
import lintKindColor from '$lib/lintKindColor';
import Chart from 'chart.js/auto'; import Chart from 'chart.js/auto';
import { onMount } from 'svelte'; import { onMount } from 'svelte';
import lintKindColor from '$lib/lintKindColor';
// Receive lint counts from the parent component // Receive lint counts from the parent component
export let lintCounts: Record<string, number> = {}; export let lintCounts: Record<string, number> = {};

View file

@ -1,11 +1,11 @@
<script lang="ts"> <script lang="ts">
import '../app.css'; import '../app.css';
import posthog from 'posthog-js';
import { onMount } from 'svelte';
import { browser } from '$app/environment'; import { browser } from '$app/environment';
import AutomatticLogo from '$lib/components/AutomatticLogo.svelte'; import AutomatticLogo from '$lib/components/AutomatticLogo.svelte';
import GutterCenter from '$lib/components/GutterCenter.svelte'; import GutterCenter from '$lib/components/GutterCenter.svelte';
import posthog from 'posthog-js';
import { onMount } from 'svelte';
onMount(() => { onMount(() => {
if (browser) { if (browser) {

View file

@ -1,5 +1,5 @@
import ProblematicLints from '$lib/db/models/ProblematicLints';
import { type RequestEvent, redirect } from '@sveltejs/kit'; import { type RequestEvent, redirect } from '@sveltejs/kit';
import ProblematicLints from '$lib/db/models/ProblematicLints';
export const POST = async ({ request }: RequestEvent) => { export const POST = async ({ request }: RequestEvent) => {
const data = await request.formData(); const data = await request.formData();

View file

@ -1,5 +1,5 @@
import UninstallFeedback from '$lib/db/models/UninstallFeedback';
import { type RequestEvent, redirect } from '@sveltejs/kit'; import { type RequestEvent, redirect } from '@sveltejs/kit';
import UninstallFeedback from '$lib/db/models/UninstallFeedback';
export const POST = async ({ request }: RequestEvent) => { export const POST = async ({ request }: RequestEvent) => {
const data = await request.formData(); const data = await request.formData();

View file

@ -2,7 +2,13 @@
title: Set Up Your Environment title: Set Up Your Environment
--- ---
To use the tooling required to build and debug Harper, you'll need the following programs available in your `$PATH`. Depending on what you're wanting to work on within the Harper repo, you may not need to set up every aspect of the environment described on this page.
For example, if you only intend to work on the core grammar engine, `harper-ls`, or `harper-cli`, you only need `cargo` installed.
In that case, Harper follows all of the standard conventions for Rust projects, so any existing Rust knowledge will apply.
If you intend to work on the Chrome extension, Obsidian plugin, or certain other projects, you'll need the full environment set up.
To use _all_ the tooling we use to build and debug Harper, you'll need the following programs available in your `$PATH`.
For Nix users, we provide a [Nix development shell](#Nix-development-shell) to setup all the necessary tooling automatically. For Nix users, we provide a [Nix development shell](#Nix-development-shell) to setup all the necessary tooling automatically.
- [`just`](https://github.com/casey/just) - [`just`](https://github.com/casey/just)
@ -13,7 +19,6 @@ For Nix users, we provide a [Nix development shell](#Nix-development-shell) to s
- `grep` - `grep`
- [`wasm-pack`](https://drager.github.io/wasm-pack/installer/) - [`wasm-pack`](https://drager.github.io/wasm-pack/installer/)
- `zip` - `zip`
- `pandoc`
- [`cargo-hack`](https://github.com/taiki-e/cargo-hack?tab=readme-ov-file#installation) - [`cargo-hack`](https://github.com/taiki-e/cargo-hack?tab=readme-ov-file#installation)
To run integration tests, you may also need `libnss3` and/or `libasound3`. To run integration tests, you may also need `libnss3` and/or `libasound3`.

View file

@ -1,9 +1,9 @@
<script lang="ts"> <script lang="ts">
import 'reveal.js/dist/reveal.css'; import 'reveal.js/dist/reveal.css';
import 'reveal.js/dist/theme/serif.css'; import 'reveal.js/dist/theme/serif.css';
import Logo from '$lib/components/Logo.svelte';
import Reveal from 'reveal.js'; import Reveal from 'reveal.js';
import { onMount } from 'svelte'; import { onMount } from 'svelte';
import Logo from '$lib/components/Logo.svelte';
onMount(() => { onMount(() => {
let deck = new Reveal(); let deck = new Reveal();

View file

@ -1,6 +1,6 @@
<script lang="ts"> <script lang="ts">
import Isolate from '$lib/components/Isolate.svelte';
import { Button, Card, Checkbox, Input, Label, Radio } from 'flowbite-svelte'; import { Button, Card, Checkbox, Input, Label, Radio } from 'flowbite-svelte';
import Isolate from '$lib/components/Isolate.svelte';
</script> </script>
<Isolate> <Isolate>

View file

@ -1,5 +1,5 @@
<div class="fixed left-0 top-0 w-screen h-screen bg-white dark:bg-black z-1000"> <div class="fixed left-0 top-0 w-screen h-screen bg-white dark:bg-black z-1000">
<div class="max-w-4xl mx-auto shadow-md border-gray-300 dark:border-x h-full"> <div class="max-w-4xl mx-auto shadow-md border-gray-300 dark:border-x h-full">
<iframe src="https://docs.google.com/forms/d/e/1FAIpQLScaWQWtnszKS_oQ8DYEAt1Ei5ORIQFViaoImjZ06pXntbCarA/viewform?embedded=true" width="100%" height="100%" frameborder="0" marginheight="0" marginwidth="0">Loading…</iframe> <iframe src="https://docs.google.com/forms/d/e/1FAIpQLScaWQWtnszKS_oQ8DYEAt1Ei5ORIQFViaoImjZ06pXntbCarA/viewform?embedded=true" width="100%" height="100%" frameborder="0" marginheight="0" marginwidth="0" title="A form to request support for a specific website.">Loading…</iframe>
</div> </div>
</div> </div>

View file

@ -1,5 +1,4 @@
<script lang="ts"> <script lang="ts">
import LintKindChart from '$lib/components/LintKindChart.svelte';
import { import {
Fileupload, Fileupload,
Table, Table,
@ -10,6 +9,7 @@ import {
TableHeadCell, TableHeadCell,
} from 'flowbite-svelte'; } from 'flowbite-svelte';
import { binary, type Summary, WorkerLinter } from 'harper.js'; import { binary, type Summary, WorkerLinter } from 'harper.js';
import LintKindChart from '$lib/components/LintKindChart.svelte';
let linter = new WorkerLinter({ binary: binary }); let linter = new WorkerLinter({ binary: binary });
let files = $state<FileList | undefined>(); let files = $state<FileList | undefined>();

View file

@ -1,6 +1,6 @@
<script lang="ts"> <script lang="ts">
import Isolate from '$lib/components/Isolate.svelte';
import { Button, Card, Input, Label, Radio } from 'flowbite-svelte'; import { Button, Card, Input, Label, Radio } from 'flowbite-svelte';
import Isolate from '$lib/components/Isolate.svelte';
const reasons = { const reasons = {
confused: 'I was confused by how it worked', confused: 'I was confused by how it worked',

View file

@ -1,239 +1,247 @@
import { defaultTheme } from '@sveltepress/theme-default'; import tailwindcss from '@tailwindcss/vite';
import { sveltepress } from '@sveltepress/vite';
import { defineConfig } from 'vite'; import { defineConfig } from 'vite';
import topLevelAwait from 'vite-plugin-top-level-await'; import topLevelAwait from 'vite-plugin-top-level-await';
import wasm from 'vite-plugin-wasm'; import wasm from 'vite-plugin-wasm';
const prod = process.env.APP_ENV === 'production'; const prod = process.env.APP_ENV === 'production';
export default defineConfig({ export default defineConfig(async () => {
ssr: { const [{ defaultTheme }, { sveltepress }] = await Promise.all([
noExternal: prod ? ['mysql2', 'drizzle-orm', 'posthog-js', 'drizzle-zod', 'zod'] : [], import('@sveltepress/theme-default'),
}, import('@sveltepress/vite'),
server: { ]);
port: 3000,
fs: { return {
allow: ['../harper.js/dist'], ssr: {
noExternal: prod ? ['mysql2', 'drizzle-orm', 'posthog-js', 'drizzle-zod', 'zod'] : [],
}, },
}, server: {
plugins: [ port: 3000,
sveltepress({ fs: {
siteConfig: { allow: ['../harper.js/dist'],
title: 'Harper',
description: 'A Grammar Checker from Automattic',
}, },
theme: defaultTheme({ },
editLink: 'https://github.com/automattic/harper/edit/master/packages/web/src/routes/:route', plugins: [
logo: '/circle-logo.png', sveltepress({
github: 'https://github.com/automattic/harper', siteConfig: {
discord: 'https://discord.gg/invite/JBqcAaKrzQ', title: 'Harper',
themeColor: { description: 'A Grammar Checker from Automattic',
primary: '#818eae',
dark: '#355280',
gradient: {
start: '#355280',
end: '#818eae',
},
}, },
navbar: [ theme: defaultTheme({
{ title: 'Documentation', to: '/docs/about' }, editLink:
{ 'https://github.com/automattic/harper/edit/master/packages/web/src/routes/:route',
title: 'Visual Studio Code', logo: '/circle-logo.png',
to: 'https://marketplace.visualstudio.com/items?itemName=elijah-potter.harper', github: 'https://github.com/automattic/harper',
discord: 'https://discord.gg/invite/JBqcAaKrzQ',
themeColor: {
primary: '#818eae',
dark: '#355280',
gradient: {
start: '#355280',
end: '#818eae',
},
}, },
{ title: 'Obsidian', to: '/docs/integrations/obsidian' }, navbar: [
{ { title: 'Documentation', to: '/docs/about' },
title: 'Chrome Extension',
to: 'https://chromewebstore.google.com/detail/private-grammar-checking/lodbfhdipoipcjmlebjbgmmgekckhpfb',
},
],
sidebar: {
'/docs/': [
{ {
items: [ title: 'Visual Studio Code',
{ to: 'https://marketplace.visualstudio.com/items?itemName=elijah-potter.harper',
title: 'About',
to: '/docs/about',
},
],
}, },
{ title: 'Obsidian', to: '/docs/integrations/obsidian' },
{ {
title: 'Integrations', title: 'Chrome Extension',
items: [ to: 'https://chromewebstore.google.com/detail/private-grammar-checking/lodbfhdipoipcjmlebjbgmmgekckhpfb',
{
title: 'Obsidian',
to: '/docs/integrations/obsidian',
},
{
title: 'Chrome Extension',
to: '/docs/integrations/chrome-extension',
},
{
title: 'Firefox Extension',
to: '/docs/integrations/firefox-extension',
},
{
title: 'WordPress',
to: '/docs/integrations/wordpress',
},
{
title: 'Language Server',
to: '/docs/integrations/language-server',
},
{
title: 'Visual Studio Code',
to: '/docs/integrations/visual-studio-code',
},
{
title: 'Neovim',
to: '/docs/integrations/neovim',
},
{
title: 'Helix',
to: '/docs/integrations/helix',
},
{
title: 'Emacs',
to: '/docs/integrations/emacs',
},
{
title: 'Zed',
to: '/docs/integrations/zed',
},
{
title: 'Sublime Text',
to: '/docs/integrations/sublime-text',
},
],
},
{
title: 'harper.js',
items: [
{
title: 'Introduction',
to: '/docs/harperjs/introduction',
},
{
title: 'Linting',
to: '/docs/harperjs/linting',
},
{
title: 'Spans',
to: '/docs/harperjs/spans',
},
{
title: 'Configure Rules',
to: '/docs/harperjs/configurerules',
},
{
title: 'Node.js',
to: '/docs/harperjs/node',
},
{
title: 'CDN',
to: '/docs/harperjs/CDN',
},
{
title: 'API Reference',
to: '/docs/harperjs/ref/index.html',
},
],
},
{
title: 'Contributors',
items: [
{
title: 'Introduction',
to: '/docs/contributors/introduction',
},
{
title: 'Environment',
to: '/docs/contributors/environment',
},
{
title: 'Committing',
to: '/docs/contributors/committing',
},
{
title: 'Architecture',
to: '/docs/contributors/architecture',
},
{
title: 'Dictionary',
to: '/docs/contributors/dictionary',
},
{
title: 'Test Suite',
to: '/docs/contributors/tests',
},
{
title: 'Author a Rule',
to: '/docs/contributors/author-a-rule',
},
{
title: 'Visual Studio Code',
to: '/docs/contributors/visual-studio-code',
},
{
title: 'Chrome Extension',
to: '/docs/contributors/chrome-extension',
},
{
title: 'WordPress',
to: '/docs/contributors/wordpress',
},
{
title: 'Obsidian',
to: '/docs/contributors/obsidian',
},
{
title: 'Reviewing Pull Requests',
to: '/docs/contributors/review',
},
{
title: 'Local Statistics',
to: '/docs/contributors/local-stats',
},
{
title: 'Brill Tagging',
to: '/docs/contributors/brill',
},
{
title: 'FAQ',
to: '/docs/contributors/faq',
},
],
},
{
title: 'Rust Reference',
to: 'https://docs.rs/harper-core/latest/harper_core/',
},
{
title: 'Rules',
to: '/docs/rules',
}, },
], ],
}, sidebar: {
highlighter: { '/docs/': [
languages: [ {
'svelte', items: [
'sh', {
'js', title: 'About',
'html', to: '/docs/about',
'ts', },
'md', ],
'css', },
'scss', {
'toml', title: 'Integrations',
'rust', items: [
'lua', {
'json', title: 'Obsidian',
'elisp', to: '/docs/integrations/obsidian',
], },
}, {
title: 'Chrome Extension',
to: '/docs/integrations/chrome-extension',
},
{
title: 'Firefox Extension',
to: '/docs/integrations/firefox-extension',
},
{
title: 'WordPress',
to: '/docs/integrations/wordpress',
},
{
title: 'Language Server',
to: '/docs/integrations/language-server',
},
{
title: 'Visual Studio Code',
to: '/docs/integrations/visual-studio-code',
},
{
title: 'Neovim',
to: '/docs/integrations/neovim',
},
{
title: 'Helix',
to: '/docs/integrations/helix',
},
{
title: 'Emacs',
to: '/docs/integrations/emacs',
},
{
title: 'Zed',
to: '/docs/integrations/zed',
},
{
title: 'Sublime Text',
to: '/docs/integrations/sublime-text',
},
],
},
{
title: 'harper.js',
items: [
{
title: 'Introduction',
to: '/docs/harperjs/introduction',
},
{
title: 'Linting',
to: '/docs/harperjs/linting',
},
{
title: 'Spans',
to: '/docs/harperjs/spans',
},
{
title: 'Configure Rules',
to: '/docs/harperjs/configurerules',
},
{
title: 'Node.js',
to: '/docs/harperjs/node',
},
{
title: 'CDN',
to: '/docs/harperjs/CDN',
},
{
title: 'API Reference',
to: '/docs/harperjs/ref/index.html',
},
],
},
{
title: 'Contributors',
items: [
{
title: 'Introduction',
to: '/docs/contributors/introduction',
},
{
title: 'Environment',
to: '/docs/contributors/environment',
},
{
title: 'Committing',
to: '/docs/contributors/committing',
},
{
title: 'Architecture',
to: '/docs/contributors/architecture',
},
{
title: 'Dictionary',
to: '/docs/contributors/dictionary',
},
{
title: 'Test Suite',
to: '/docs/contributors/tests',
},
{
title: 'Author a Rule',
to: '/docs/contributors/author-a-rule',
},
{
title: 'Visual Studio Code',
to: '/docs/contributors/visual-studio-code',
},
{
title: 'Chrome Extension',
to: '/docs/contributors/chrome-extension',
},
{
title: 'WordPress',
to: '/docs/contributors/wordpress',
},
{
title: 'Obsidian',
to: '/docs/contributors/obsidian',
},
{
title: 'Reviewing Pull Requests',
to: '/docs/contributors/review',
},
{
title: 'Local Statistics',
to: '/docs/contributors/local-stats',
},
{
title: 'Brill Tagging',
to: '/docs/contributors/brill',
},
{
title: 'FAQ',
to: '/docs/contributors/faq',
},
],
},
{
title: 'Rust Reference',
to: 'https://docs.rs/harper-core/latest/harper_core/',
},
{
title: 'Rules',
to: '/docs/rules',
},
],
},
highlighter: {
languages: [
'svelte',
'sh',
'js',
'html',
'ts',
'md',
'css',
'scss',
'toml',
'rust',
'lua',
'json',
'elisp',
],
},
}),
}), }),
}), wasm(),
wasm(), topLevelAwait(),
topLevelAwait(), tailwindcss(),
], ],
};
}); });

View file

@ -1,6 +1,5 @@
import { SelectControl } from '@wordpress/components'; import { SelectControl } from '@wordpress/components';
import { Dialect } from 'harper.js'; import { Dialect } from 'harper.js';
import React from 'react';
import useDialect from './useDialect'; import useDialect from './useDialect';
export default function DialectSelectRow() { export default function DialectSelectRow() {
@ -31,7 +30,7 @@ export default function DialectSelectRow() {
value: Dialect.British.toString(), value: Dialect.British.toString(),
}, },
]} ]}
onChange={(value) => setDialect(Number.parseInt(value))} onChange={(value) => setDialect(Number.parseInt(value, 10))}
/> />
</div> </div>
); );

View file

@ -1,4 +1,4 @@
import React, { useEffect } from 'react'; import { useEffect } from 'react';
import type { LintBox } from './Box'; import type { LintBox } from './Box';
import type RichText from './RichText'; import type RichText from './RichText';
import SuggestionControl from './SuggestionControl'; import SuggestionControl from './SuggestionControl';

View file

@ -1,5 +1,4 @@
import { Animate, Spinner } from '@wordpress/components'; import { Animate, Spinner } from '@wordpress/components';
import React from 'react';
import type { IgnorableLintBox } from './Box'; import type { IgnorableLintBox } from './Box';
import LintListItem from './LintListItem'; import LintListItem from './LintListItem';

View file

@ -1,5 +1,4 @@
import { Button, Card, CardBody } from '@wordpress/components'; import { Button, Card, CardBody } from '@wordpress/components';
import React from 'react';
import type { IgnorableLintBox } from './Box'; import type { IgnorableLintBox } from './Box';
import { suggestionText } from './lintUtils'; import { suggestionText } from './lintUtils';
import { useAddToDictionary } from './usePersonalDictionary'; import { useAddToDictionary } from './usePersonalDictionary';

View file

@ -1,5 +1,5 @@
import { SearchControl } from '@wordpress/components'; import { SearchControl } from '@wordpress/components';
import React, { useState } from 'react'; import { useState } from 'react';
import { useLintDescriptions } from './LinterProvider'; import { useLintDescriptions } from './LinterProvider';
import LintSettingRow from './LintSettingRow'; import LintSettingRow from './LintSettingRow';
import useLintConfig, { useDefaultLintConfig } from './useLintConfig'; import useLintConfig, { useDefaultLintConfig } from './useLintConfig';

View file

@ -1,5 +1,5 @@
import { Animate, CheckboxControl } from '@wordpress/components'; import { Animate, CheckboxControl } from '@wordpress/components';
import React, { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { useLinter } from './LinterProvider'; import { useLinter } from './LinterProvider';
export default function LintSettingRow({ export default function LintSettingRow({

View file

@ -1,12 +1,5 @@
import { binaryInlined, type Linter, WorkerLinter } from 'harper.js'; import { binaryInlined, type Linter, WorkerLinter } from 'harper.js';
import React, { import { createContext, type ReactNode, useContext, useEffect, useRef, useState } from 'react';
createContext,
type ReactNode,
useContext,
useEffect,
useRef,
useState,
} from 'react';
const linterContext = createContext<Linter>(new WorkerLinter({ binary: binaryInlined })); const linterContext = createContext<Linter>(new WorkerLinter({ binary: binaryInlined }));

View file

@ -1,4 +1,4 @@
import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { useCallback, useEffect, useMemo, useState } from 'react';
import { createPortal } from 'react-dom'; import { createPortal } from 'react-dom';
import DataBlock from './DataBlock'; import DataBlock from './DataBlock';
import Highlighter from './Highlighter'; import Highlighter from './Highlighter';

View file

@ -1,5 +1,4 @@
import { Panel, PanelBody, SelectControl, TabPanel } from '@wordpress/components'; import { Panel, PanelBody, TabPanel } from '@wordpress/components';
import React from 'react';
import type { IgnorableLintBox } from './Box'; import type { IgnorableLintBox } from './Box';
import DialectSelectRow from './DialectSelectRow'; import DialectSelectRow from './DialectSelectRow';
import LintList from './LintList'; import LintList from './LintList';

View file

@ -1,5 +1,5 @@
import { Button, Popover } from '@wordpress/components'; import { Button, Popover } from '@wordpress/components';
import React, { useEffect, useMemo, useRef, useState } from 'react'; import { useEffect, useMemo, useRef, useState } from 'react';
import { type IgnorableLintBox, isPointInBox } from './Box'; import { type IgnorableLintBox, isPointInBox } from './Box';
import { suggestionText } from './lintUtils'; import { suggestionText } from './lintUtils';
import { useAddToDictionary } from './usePersonalDictionary'; import { useAddToDictionary } from './usePersonalDictionary';

View file

@ -48,7 +48,9 @@ export function leafNodes(node: Node): Node[] {
for (const child of children) { for (const child of children) {
const sub = leafNodes(child); const sub = leafNodes(child);
sub.forEach((v) => out.push(v)); sub.forEach((v) => {
out.push(v);
});
} }
return out; return out;

View file

@ -3,7 +3,6 @@ import { registerPlugin } from '@wordpress/plugins';
import Logo from './Logo'; import Logo from './Logo';
import SidebarControl from './SidebarControl'; import SidebarControl from './SidebarControl';
import './index.css'; import './index.css';
import React from 'react';
import LinterProvider from './LinterProvider'; import LinterProvider from './LinterProvider';
function Sidebar() { function Sidebar() {
@ -21,9 +20,9 @@ function Sidebar() {
); );
} }
// @ts-ignore // @ts-expect-error
if (!window.__harperSidebarRegistered) { if (!window.__harperSidebarRegistered) {
registerPlugin('harper-sidebar', { render: Sidebar }); registerPlugin('harper-sidebar', { render: Sidebar });
// @ts-ignore // @ts-expect-error
window.__harperSidebarRegistered = true; window.__harperSidebarRegistered = true;
} }

View file

@ -1,6 +1,6 @@
import type { Lint } from 'harper.js'; import type { Lint } from 'harper.js';
import { useCallback, useEffect, useState } from 'react'; import { useCallback, useEffect, useState } from 'react';
import { type IgnorableLintBox, LintBox } from './Box'; import type { IgnorableLintBox } from './Box';
import { useLinter } from './LinterProvider'; import { useLinter } from './LinterProvider';
import type RichText from './RichText'; import type RichText from './RichText';
import useDialect from './useDialect'; import useDialect from './useDialect';
@ -73,7 +73,9 @@ export default function useLintBoxes(richTexts: RichText[]): [IgnorableLintBox[]
}); });
return () => { return () => {
observers.forEach((observer) => observer.disconnect()); observers.forEach((observer) => {
observer.disconnect();
});
}; };
}, [richTexts, updateLints]); }, [richTexts, updateLints]);

277
pnpm-lock.yaml generated
View file

@ -27,8 +27,8 @@ importers:
specifier: 'catalog:' specifier: 'catalog:'
version: 7.26.10 version: 7.26.10
'@biomejs/biome': '@biomejs/biome':
specifier: 2.0.6 specifier: 2.3.3
version: 2.0.6 version: 2.3.3
check-dependency-version-consistency: check-dependency-version-consistency:
specifier: ^5.0.0 specifier: ^5.0.0
version: 5.0.0 version: 5.0.0
@ -43,9 +43,6 @@ importers:
'@fortawesome/free-solid-svg-icons': '@fortawesome/free-solid-svg-icons':
specifier: ^7.1.0 specifier: ^7.1.0
version: 7.1.0 version: 7.1.0
'@tailwindcss/vite':
specifier: ^4.1.4
version: 4.1.4(vite@5.4.17(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0))
'@webcomponents/custom-elements': '@webcomponents/custom-elements':
specifier: ^1.6.0 specifier: ^1.6.0
version: 1.6.0 version: 1.6.0
@ -64,9 +61,6 @@ importers:
svelte-fa: svelte-fa:
specifier: ^4.0.4 specifier: ^4.0.4
version: 4.0.4(svelte@5.21.0) version: 4.0.4(svelte@5.21.0)
tailwindcss:
specifier: ^4.1.4
version: 4.1.4
devDependencies: devDependencies:
'@crxjs/vite-plugin': '@crxjs/vite-plugin':
specifier: ^2.0.0-beta.26 specifier: ^2.0.0-beta.26
@ -77,6 +71,9 @@ importers:
'@sveltejs/vite-plugin-svelte': '@sveltejs/vite-plugin-svelte':
specifier: ^4.0.0 specifier: ^4.0.0
version: 4.0.4(svelte@5.21.0)(vite@5.4.17(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)) version: 4.0.4(svelte@5.21.0)(vite@5.4.17(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0))
'@tailwindcss/vite':
specifier: ^4.1.4
version: 4.1.4(vite@5.4.17(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0))
'@types/chrome': '@types/chrome':
specifier: ^0.0.246 specifier: ^0.0.246
version: 0.0.246 version: 0.0.246
@ -119,6 +116,9 @@ importers:
svelte-preprocess: svelte-preprocess:
specifier: ^6.0.0 specifier: ^6.0.0
version: 6.0.3(@babel/core@7.26.10)(postcss-load-config@4.0.2(postcss@8.5.3))(postcss@8.5.3)(sass@1.85.1)(svelte@5.21.0)(typescript@5.8.2) version: 6.0.3(@babel/core@7.26.10)(postcss-load-config@4.0.2(postcss@8.5.3))(postcss@8.5.3)(sass@1.85.1)(svelte@5.21.0)(typescript@5.8.2)
tailwindcss:
specifier: ^4.1.4
version: 4.1.16
tslib: tslib:
specifier: ^2.6.2 specifier: ^2.6.2
version: 2.8.1 version: 2.8.1
@ -143,6 +143,9 @@ importers:
harper-wasm: harper-wasm:
specifier: workspace:* specifier: workspace:*
version: link:../../harper-wasm/pkg version: link:../../harper-wasm/pkg
marked:
specifier: ^16.4.1
version: 16.4.1
p-lazy: p-lazy:
specifier: ^5.0.0 specifier: ^5.0.0
version: 5.0.0 version: 5.0.0
@ -369,6 +372,9 @@ importers:
'@sveltejs/vite-plugin-svelte': '@sveltejs/vite-plugin-svelte':
specifier: ^5.0.3 specifier: ^5.0.3
version: 5.0.3(svelte@5.21.0)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.0)) version: 5.0.3(svelte@5.21.0)(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.0))
'@tailwindcss/vite':
specifier: ^4.1.4
version: 4.1.4(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.0))
'@types/reveal.js': '@types/reveal.js':
specifier: ^5.0.3 specifier: ^5.0.3
version: 5.0.5 version: 5.0.5
@ -384,9 +390,6 @@ importers:
flowbite-svelte: flowbite-svelte:
specifier: ^0.44.18 specifier: ^0.44.18
version: 0.44.24(rollup@4.35.0)(svelte@5.21.0) version: 0.44.24(rollup@4.35.0)(svelte@5.21.0)
postcss:
specifier: ^8.4.31
version: 8.5.3
svelte: svelte:
specifier: ^5.15.0 specifier: ^5.15.0
version: 5.21.0 version: 5.21.0
@ -394,8 +397,8 @@ importers:
specifier: ^4.1.5 specifier: ^4.1.5
version: 4.1.5(picomatch@4.0.2)(svelte@5.21.0)(typescript@5.8.2) version: 4.1.5(picomatch@4.0.2)(svelte@5.21.0)(typescript@5.8.2)
tailwindcss: tailwindcss:
specifier: ^3.3.3 specifier: ^4.1.16
version: 3.4.17 version: 4.1.16
tslib: tslib:
specifier: 'catalog:' specifier: 'catalog:'
version: 2.8.1 version: 2.8.1
@ -529,10 +532,6 @@ packages:
resolution: {integrity: sha512-WqU0VumUILrIeVYCTGZlyyZoC/tbvhiyPxfGRRO1cSjxN558bnJLlR2BvS0SJ5b75dRNK7HDvtXo2QoP9eLfiA==} resolution: {integrity: sha512-WqU0VumUILrIeVYCTGZlyyZoC/tbvhiyPxfGRRO1cSjxN558bnJLlR2BvS0SJ5b75dRNK7HDvtXo2QoP9eLfiA==}
engines: {node: '>= 14.0.0'} engines: {node: '>= 14.0.0'}
'@alloc/quick-lru@5.2.0':
resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
engines: {node: '>=10'}
'@ampproject/remapping@2.3.0': '@ampproject/remapping@2.3.0':
resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
engines: {node: '>=6.0.0'} engines: {node: '>=6.0.0'}
@ -1281,55 +1280,55 @@ packages:
'@bcoe/v8-coverage@0.2.3': '@bcoe/v8-coverage@0.2.3':
resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
'@biomejs/biome@2.0.6': '@biomejs/biome@2.3.3':
resolution: {integrity: sha512-RRP+9cdh5qwe2t0gORwXaa27oTOiQRQvrFf49x2PA1tnpsyU7FIHX4ZOFMtBC4QNtyWsN7Dqkf5EDbg4X+9iqA==} resolution: {integrity: sha512-zn/P1pRBCpDdhi+VNSMnpczOz9DnqzOA2c48K8xgxjDODvi5O8gs3a2H233rck/5HXpkFj6TmyoqVvxirZUnvg==}
engines: {node: '>=14.21.3'} engines: {node: '>=14.21.3'}
hasBin: true hasBin: true
'@biomejs/cli-darwin-arm64@2.0.6': '@biomejs/cli-darwin-arm64@2.3.3':
resolution: {integrity: sha512-AzdiNNjNzsE6LfqWyBvcL29uWoIuZUkndu+wwlXW13EKcBHbbKjNQEZIJKYDc6IL+p7bmWGx3v9ZtcRyIoIz5A==} resolution: {integrity: sha512-5+JtW6RKmjqL9un0UtHV0ezOslAyYBzyl5ZhYiu7GHesX2x8NCDl6tXYrenv9m7e1RLbkO5E5Kh04kseMtz6lw==}
engines: {node: '>=14.21.3'} engines: {node: '>=14.21.3'}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
'@biomejs/cli-darwin-x64@2.0.6': '@biomejs/cli-darwin-x64@2.3.3':
resolution: {integrity: sha512-wJjjP4E7bO4WJmiQaLnsdXMa516dbtC6542qeRkyJg0MqMXP0fvs4gdsHhZ7p9XWTAmGIjZHFKXdsjBvKGIJJQ==} resolution: {integrity: sha512-UPmKRalkHicvIpeccuKqq+/gA2HYV8FUnAEDJnqYBlGlycKqe6xrovWqvWTE4TTNpIFf4UQyuaDzLkN6Kz6tbA==}
engines: {node: '>=14.21.3'} engines: {node: '>=14.21.3'}
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
'@biomejs/cli-linux-arm64-musl@2.0.6': '@biomejs/cli-linux-arm64-musl@2.3.3':
resolution: {integrity: sha512-CVPEMlin3bW49sBqLBg2x016Pws7eUXA27XYDFlEtponD0luYjg2zQaMJ2nOqlkKG9fqzzkamdYxHdMDc2gZFw==} resolution: {integrity: sha512-KhCDMV+V7Yu72v40ssGJTHuv/j0n7JQ6l0s/c+EMcX5zPYLMLr4XpmI+WXhp4Vfkz0T5Xnh5wbrTBI3f2UTpjQ==}
engines: {node: '>=14.21.3'} engines: {node: '>=14.21.3'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@biomejs/cli-linux-arm64@2.0.6': '@biomejs/cli-linux-arm64@2.3.3':
resolution: {integrity: sha512-ZSVf6TYo5rNMUHIW1tww+rs/krol7U5A1Is/yzWyHVZguuB0lBnIodqyFuwCNqG9aJGyk7xIMS8HG0qGUPz0SA==} resolution: {integrity: sha512-zeiKwALNB/hax7+LLhCYqhqzlWdTfgE9BGkX2Z8S4VmCYnGFrf2fON/ec6KCos7mra5MDm6fYICsEWN2+HKZhw==}
engines: {node: '>=14.21.3'} engines: {node: '>=14.21.3'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@biomejs/cli-linux-x64-musl@2.0.6': '@biomejs/cli-linux-x64-musl@2.3.3':
resolution: {integrity: sha512-mKHE/e954hR/hSnAcJSjkf4xGqZc/53Kh39HVW1EgO5iFi0JutTN07TSjEMg616julRtfSNJi0KNyxvc30Y4rQ==} resolution: {integrity: sha512-IyqQ+jYzU5MVy9CK5NV0U+NnUMPUAhYMrB/x4QgL/Dl1MqzBVc61bHeyhLnKM6DSEk73/TQYrk/8/QmVHudLdQ==}
engines: {node: '>=14.21.3'} engines: {node: '>=14.21.3'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@biomejs/cli-linux-x64@2.0.6': '@biomejs/cli-linux-x64@2.3.3':
resolution: {integrity: sha512-geM1MkHTV1Kh2Cs/Xzot9BOF3WBacihw6bkEmxkz4nSga8B9/hWy5BDiOG3gHDGIBa8WxT0nzsJs2f/hPqQIQw==} resolution: {integrity: sha512-05CjPLbvVVU8J6eaO6iSEoA0FXKy2l6ddL+1h/VpiosCmIp3HxRKLOa1hhC1n+D13Z8g9b1DtnglGtM5U3sTag==}
engines: {node: '>=14.21.3'} engines: {node: '>=14.21.3'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@biomejs/cli-win32-arm64@2.0.6': '@biomejs/cli-win32-arm64@2.3.3':
resolution: {integrity: sha512-290V4oSFoKaprKE1zkYVsDfAdn0An5DowZ+GIABgjoq1ndhvNxkJcpxPsiYtT7slbVe3xmlT0ncdfOsN7KruzA==} resolution: {integrity: sha512-NtlLs3pdFqFAQYZjlEHKOwJEn3GEaz7rtR2oCrzaLT2Xt3Cfd55/VvodQ5V+X+KepLa956QJagckJrNL+DmumQ==}
engines: {node: '>=14.21.3'} engines: {node: '>=14.21.3'}
cpu: [arm64] cpu: [arm64]
os: [win32] os: [win32]
'@biomejs/cli-win32-x64@2.0.6': '@biomejs/cli-win32-x64@2.3.3':
resolution: {integrity: sha512-bfM1Bce0d69Ao7pjTjUS+AWSZ02+5UHdiAP85Th8e9yV5xzw6JrHXbL5YWlcEKQ84FIZMdDc7ncuti1wd2sdbw==} resolution: {integrity: sha512-klJKPPQvUk9Rlp0Dd56gQw/+Wt6uUprHdHWtbDC93f3Iv+knA2tLWpcYoOZJgPV+9s+RBmYv0DGy4mUlr20esg==}
engines: {node: '>=14.21.3'} engines: {node: '>=14.21.3'}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
@ -4832,9 +4831,6 @@ packages:
resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
engines: {node: '>=12'} engines: {node: '>=12'}
any-promise@1.3.0:
resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
anymatch@3.1.3: anymatch@3.1.3:
resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
engines: {node: '>= 8'} engines: {node: '>= 8'}
@ -4846,9 +4842,6 @@ packages:
resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==}
engines: {node: '>=14'} engines: {node: '>=14'}
arg@5.0.2:
resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
argparse@1.0.10: argparse@1.0.10:
resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
@ -5249,10 +5242,6 @@ packages:
camel-case@4.1.2: camel-case@4.1.2:
resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==}
camelcase-css@2.0.1:
resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
engines: {node: '>= 6'}
camelcase-keys@6.2.2: camelcase-keys@6.2.2:
resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==}
engines: {node: '>=8'} engines: {node: '>=8'}
@ -5497,10 +5486,6 @@ packages:
commander@2.20.3: commander@2.20.3:
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
commander@4.1.1:
resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
engines: {node: '>= 6'}
commander@7.2.0: commander@7.2.0:
resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
@ -5962,9 +5947,6 @@ packages:
devtools-protocol@0.0.1423531: devtools-protocol@0.0.1423531:
resolution: {integrity: sha512-z6cOcajZWxk80zvFnkTGa7tj3oqF+C5SnOF1KSMeAr5/WW/nLNHlEpKr7voSzMz8IaUoq5rjdI0Mqv5k/BUkhg==} resolution: {integrity: sha512-z6cOcajZWxk80zvFnkTGa7tj3oqF+C5SnOF1KSMeAr5/WW/nLNHlEpKr7voSzMz8IaUoq5rjdI0Mqv5k/BUkhg==}
didyoumean@1.2.2:
resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
diff-sequences@29.6.3: diff-sequences@29.6.3:
resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
@ -5977,9 +5959,6 @@ packages:
resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
engines: {node: '>=8'} engines: {node: '>=8'}
dlv@1.1.3:
resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
dns-packet@5.6.1: dns-packet@5.6.1:
resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==}
engines: {node: '>=6'} engines: {node: '>=6'}
@ -8440,6 +8419,11 @@ packages:
resolution: {integrity: sha512-AG7UkLzNa1fxiOv5B+owPsPhtM4D6DoODhsJgiaNg1xowXovrYgOnLqAgOOFQpWOlHFVQUzjMY5ypNNTeov92g==} resolution: {integrity: sha512-AG7UkLzNa1fxiOv5B+owPsPhtM4D6DoODhsJgiaNg1xowXovrYgOnLqAgOOFQpWOlHFVQUzjMY5ypNNTeov92g==}
engines: {node: '>=12'} engines: {node: '>=12'}
marked@16.4.1:
resolution: {integrity: sha512-ntROs7RaN3EvWfy3EZi14H4YxmT6A5YvywfhO+0pm+cH/dnSQRmdAmoFIc3B9aiwTehyk7pESH4ofyBY+V5hZg==}
engines: {node: '>= 20'}
hasBin: true
marky@1.2.5: marky@1.2.5:
resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==} resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==}
@ -8819,9 +8803,6 @@ packages:
resolution: {integrity: sha512-kFm5+jbwR5mC+lo+3Cy46eHiykWSpUtTLOH3GE+AR7GeLq8PgfJcvpMiyVWk9/O53DjQsqm6a3VOOfq7gYWFRg==} resolution: {integrity: sha512-kFm5+jbwR5mC+lo+3Cy46eHiykWSpUtTLOH3GE+AR7GeLq8PgfJcvpMiyVWk9/O53DjQsqm6a3VOOfq7gYWFRg==}
engines: {node: '>= 8.0'} engines: {node: '>= 8.0'}
mz@2.7.0:
resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
named-placeholders@1.1.3: named-placeholders@1.1.3:
resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==} resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==}
engines: {node: '>=12.0.0'} engines: {node: '>=12.0.0'}
@ -8949,10 +8930,6 @@ packages:
object-filter@1.0.2: object-filter@1.0.2:
resolution: {integrity: sha512-NahvP2vZcy1ZiiYah30CEPw0FpDcSkSePJBMpzl5EQgCmISijiGuJm3SPYp7U+Lf2TljyaIw3E5EgkEx/TNEVA==} resolution: {integrity: sha512-NahvP2vZcy1ZiiYah30CEPw0FpDcSkSePJBMpzl5EQgCmISijiGuJm3SPYp7U+Lf2TljyaIw3E5EgkEx/TNEVA==}
object-hash@3.0.0:
resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
engines: {node: '>= 6'}
object-inspect@1.13.4: object-inspect@1.13.4:
resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
@ -9364,18 +9341,6 @@ packages:
peerDependencies: peerDependencies:
postcss: ^8.4.31 postcss: ^8.4.31
postcss-import@15.1.0:
resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
engines: {node: '>=14.0.0'}
peerDependencies:
postcss: ^8.0.0
postcss-js@4.0.1:
resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
engines: {node: ^12 || ^14 || >= 16}
peerDependencies:
postcss: ^8.4.21
postcss-load-config@4.0.2: postcss-load-config@4.0.2:
resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==}
engines: {node: '>= 14'} engines: {node: '>= 14'}
@ -9458,12 +9423,6 @@ packages:
peerDependencies: peerDependencies:
postcss: ^8.1.0 postcss: ^8.1.0
postcss-nested@6.2.0:
resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==}
engines: {node: '>=12.0'}
peerDependencies:
postcss: ^8.2.14
postcss-normalize-charset@6.0.2: postcss-normalize-charset@6.0.2:
resolution: {integrity: sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==} resolution: {integrity: sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==}
engines: {node: ^14 || ^16 || >=18.0} engines: {node: ^14 || ^16 || >=18.0}
@ -9825,9 +9784,6 @@ packages:
resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
read-cache@1.0.0:
resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
read-pkg-up@7.0.1: read-pkg-up@7.0.1:
resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==}
engines: {node: '>=8'} engines: {node: '>=8'}
@ -10657,11 +10613,6 @@ packages:
stylis@4.2.0: stylis@4.2.0:
resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==}
sucrase@3.35.0:
resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==}
engines: {node: '>=16 || 14 >=14.17'}
hasBin: true
supports-color@5.5.0: supports-color@5.5.0:
resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
engines: {node: '>=4'} engines: {node: '>=4'}
@ -10804,10 +10755,8 @@ packages:
tailwind-merge@2.6.0: tailwind-merge@2.6.0:
resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==} resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==}
tailwindcss@3.4.17: tailwindcss@4.1.16:
resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} resolution: {integrity: sha512-pONL5awpaQX4LN5eiv7moSiSPd/DLDzKVRJz8Q9PgzmAdd1R4307GQS2ZpfiN7ZmekdQrfhZZiSE5jkLR4WNaA==}
engines: {node: '>=14.0.0'}
hasBin: true
tailwindcss@4.1.4: tailwindcss@4.1.4:
resolution: {integrity: sha512-1ZIUqtPITFbv/DxRmDr5/agPqJwF69d24m9qmM1939TJehgY539CtzeZRjbLt5G6fSy/7YqqYsfvoTEw9xUI2A==} resolution: {integrity: sha512-1ZIUqtPITFbv/DxRmDr5/agPqJwF69d24m9qmM1939TJehgY539CtzeZRjbLt5G6fSy/7YqqYsfvoTEw9xUI2A==}
@ -10874,13 +10823,6 @@ packages:
text-table@0.2.0: text-table@0.2.0:
resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
thenify-all@1.6.0:
resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
engines: {node: '>=0.8'}
thenify@3.3.1:
resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
third-party-web@0.26.5: third-party-web@0.26.5:
resolution: {integrity: sha512-tDuKQJUTfjvi9Fcrs1s6YAQAB9mzhTSbBZMfNgtWNmJlHuoFeXO6dzBFdGeCWRvYL50jQGK0jPsBZYxqZQJ2SA==} resolution: {integrity: sha512-tDuKQJUTfjvi9Fcrs1s6YAQAB9mzhTSbBZMfNgtWNmJlHuoFeXO6dzBFdGeCWRvYL50jQGK0jPsBZYxqZQJ2SA==}
@ -10989,9 +10931,6 @@ packages:
peerDependencies: peerDependencies:
typescript: '>=4.2.0' typescript: '>=4.2.0'
ts-interface-checker@0.1.13:
resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
tsconfig-paths@3.15.0: tsconfig-paths@3.15.0:
resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==}
@ -12068,8 +12007,6 @@ snapshots:
dependencies: dependencies:
'@algolia/client-common': 5.21.0 '@algolia/client-common': 5.21.0
'@alloc/quick-lru@5.2.0': {}
'@ampproject/remapping@2.3.0': '@ampproject/remapping@2.3.0':
dependencies: dependencies:
'@jridgewell/gen-mapping': 0.3.8 '@jridgewell/gen-mapping': 0.3.8
@ -13686,39 +13623,39 @@ snapshots:
'@bcoe/v8-coverage@0.2.3': {} '@bcoe/v8-coverage@0.2.3': {}
'@biomejs/biome@2.0.6': '@biomejs/biome@2.3.3':
optionalDependencies: optionalDependencies:
'@biomejs/cli-darwin-arm64': 2.0.6 '@biomejs/cli-darwin-arm64': 2.3.3
'@biomejs/cli-darwin-x64': 2.0.6 '@biomejs/cli-darwin-x64': 2.3.3
'@biomejs/cli-linux-arm64': 2.0.6 '@biomejs/cli-linux-arm64': 2.3.3
'@biomejs/cli-linux-arm64-musl': 2.0.6 '@biomejs/cli-linux-arm64-musl': 2.3.3
'@biomejs/cli-linux-x64': 2.0.6 '@biomejs/cli-linux-x64': 2.3.3
'@biomejs/cli-linux-x64-musl': 2.0.6 '@biomejs/cli-linux-x64-musl': 2.3.3
'@biomejs/cli-win32-arm64': 2.0.6 '@biomejs/cli-win32-arm64': 2.3.3
'@biomejs/cli-win32-x64': 2.0.6 '@biomejs/cli-win32-x64': 2.3.3
'@biomejs/cli-darwin-arm64@2.0.6': '@biomejs/cli-darwin-arm64@2.3.3':
optional: true optional: true
'@biomejs/cli-darwin-x64@2.0.6': '@biomejs/cli-darwin-x64@2.3.3':
optional: true optional: true
'@biomejs/cli-linux-arm64-musl@2.0.6': '@biomejs/cli-linux-arm64-musl@2.3.3':
optional: true optional: true
'@biomejs/cli-linux-arm64@2.0.6': '@biomejs/cli-linux-arm64@2.3.3':
optional: true optional: true
'@biomejs/cli-linux-x64-musl@2.0.6': '@biomejs/cli-linux-x64-musl@2.3.3':
optional: true optional: true
'@biomejs/cli-linux-x64@2.0.6': '@biomejs/cli-linux-x64@2.3.3':
optional: true optional: true
'@biomejs/cli-win32-arm64@2.0.6': '@biomejs/cli-win32-arm64@2.3.3':
optional: true optional: true
'@biomejs/cli-win32-x64@2.0.6': '@biomejs/cli-win32-x64@2.3.3':
optional: true optional: true
'@bundled-es-modules/cookie@2.0.1': '@bundled-es-modules/cookie@2.0.1':
@ -15852,6 +15789,13 @@ snapshots:
tailwindcss: 4.1.4 tailwindcss: 4.1.4
vite: 5.4.17(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0) vite: 5.4.17(@types/node@22.13.10)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)
'@tailwindcss/vite@4.1.4(vite@6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.0))':
dependencies:
'@tailwindcss/node': 4.1.4
'@tailwindcss/oxide': 4.1.4
tailwindcss: 4.1.4
vite: 6.3.5(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.0)
'@tannin/compile@1.1.0': '@tannin/compile@1.1.0':
dependencies: dependencies:
'@tannin/evaluate': 1.2.0 '@tannin/evaluate': 1.2.0
@ -18073,8 +18017,6 @@ snapshots:
ansi-styles@6.2.1: {} ansi-styles@6.2.1: {}
any-promise@1.3.0: {}
anymatch@3.1.3: anymatch@3.1.3:
dependencies: dependencies:
normalize-path: 3.0.0 normalize-path: 3.0.0
@ -18092,8 +18034,6 @@ snapshots:
are-docs-informative@0.0.2: {} are-docs-informative@0.0.2: {}
arg@5.0.2: {}
argparse@1.0.10: argparse@1.0.10:
dependencies: dependencies:
sprintf-js: 1.0.3 sprintf-js: 1.0.3
@ -18596,8 +18536,6 @@ snapshots:
pascal-case: 3.1.2 pascal-case: 3.1.2
tslib: 2.8.1 tslib: 2.8.1
camelcase-css@2.0.1: {}
camelcase-keys@6.2.2: camelcase-keys@6.2.2:
dependencies: dependencies:
camelcase: 5.3.1 camelcase: 5.3.1
@ -18888,8 +18826,6 @@ snapshots:
commander@2.20.3: {} commander@2.20.3: {}
commander@4.1.1: {}
commander@7.2.0: {} commander@7.2.0: {}
commander@9.0.0: {} commander@9.0.0: {}
@ -19336,8 +19272,6 @@ snapshots:
devtools-protocol@0.0.1423531: {} devtools-protocol@0.0.1423531: {}
didyoumean@1.2.2: {}
diff-sequences@29.6.3: {} diff-sequences@29.6.3: {}
diff@4.0.2: {} diff@4.0.2: {}
@ -19346,8 +19280,6 @@ snapshots:
dependencies: dependencies:
path-type: 4.0.0 path-type: 4.0.0
dlv@1.1.3: {}
dns-packet@5.6.1: dns-packet@5.6.1:
dependencies: dependencies:
'@leichtgewicht/ip-codec': 2.0.5 '@leichtgewicht/ip-codec': 2.0.5
@ -22324,6 +22256,8 @@ snapshots:
dependencies: dependencies:
markdown-it: 12.3.2 markdown-it: 12.3.2
marked@16.4.1: {}
marky@1.2.5: {} marky@1.2.5: {}
math-intrinsics@1.1.0: {} math-intrinsics@1.1.0: {}
@ -22905,12 +22839,6 @@ snapshots:
seq-queue: 0.0.5 seq-queue: 0.0.5
sqlstring: 2.3.3 sqlstring: 2.3.3
mz@2.7.0:
dependencies:
any-promise: 1.3.0
object-assign: 4.1.1
thenify-all: 1.6.0
named-placeholders@1.1.3: named-placeholders@1.1.3:
dependencies: dependencies:
lru-cache: 7.18.3 lru-cache: 7.18.3
@ -23047,8 +22975,6 @@ snapshots:
object-filter@1.0.2: {} object-filter@1.0.2: {}
object-hash@3.0.0: {}
object-inspect@1.13.4: {} object-inspect@1.13.4: {}
object-keys@1.1.1: {} object-keys@1.1.1: {}
@ -23470,24 +23396,13 @@ snapshots:
dependencies: dependencies:
postcss: 8.5.3 postcss: 8.5.3
postcss-import@15.1.0(postcss@8.5.3):
dependencies:
postcss: 8.5.3
postcss-value-parser: 4.2.0
read-cache: 1.0.0
resolve: 1.22.10
postcss-js@4.0.1(postcss@8.5.3):
dependencies:
camelcase-css: 2.0.1
postcss: 8.5.3
postcss-load-config@4.0.2(postcss@8.5.3): postcss-load-config@4.0.2(postcss@8.5.3):
dependencies: dependencies:
lilconfig: 3.1.3 lilconfig: 3.1.3
yaml: 2.7.0 yaml: 2.7.0
optionalDependencies: optionalDependencies:
postcss: 8.5.3 postcss: 8.5.3
optional: true
postcss-loader@6.2.1(postcss@8.5.3)(webpack@5.98.0): postcss-loader@6.2.1(postcss@8.5.3)(webpack@5.98.0):
dependencies: dependencies:
@ -23558,11 +23473,6 @@ snapshots:
icss-utils: 5.1.0(postcss@8.5.3) icss-utils: 5.1.0(postcss@8.5.3)
postcss: 8.5.3 postcss: 8.5.3
postcss-nested@6.2.0(postcss@8.5.3):
dependencies:
postcss: 8.5.3
postcss-selector-parser: 6.1.2
postcss-normalize-charset@6.0.2(postcss@8.5.3): postcss-normalize-charset@6.0.2(postcss@8.5.3):
dependencies: dependencies:
postcss: 8.5.3 postcss: 8.5.3
@ -23929,10 +23839,6 @@ snapshots:
dependencies: dependencies:
loose-envify: 1.4.0 loose-envify: 1.4.0
read-cache@1.0.0:
dependencies:
pify: 2.3.0
read-pkg-up@7.0.1: read-pkg-up@7.0.1:
dependencies: dependencies:
find-up: 4.1.0 find-up: 4.1.0
@ -24974,16 +24880,6 @@ snapshots:
stylis@4.2.0: {} stylis@4.2.0: {}
sucrase@3.35.0:
dependencies:
'@jridgewell/gen-mapping': 0.3.8
commander: 4.1.1
glob: 10.4.5
lines-and-columns: 1.2.4
mz: 2.7.0
pirates: 4.0.6
ts-interface-checker: 0.1.13
supports-color@5.5.0: supports-color@5.5.0:
dependencies: dependencies:
has-flag: 3.0.0 has-flag: 3.0.0
@ -25121,32 +25017,7 @@ snapshots:
tailwind-merge@2.6.0: {} tailwind-merge@2.6.0: {}
tailwindcss@3.4.17: tailwindcss@4.1.16: {}
dependencies:
'@alloc/quick-lru': 5.2.0
arg: 5.0.2
chokidar: 3.6.0
didyoumean: 1.2.2
dlv: 1.1.3
fast-glob: 3.3.3
glob-parent: 6.0.2
is-glob: 4.0.3
jiti: 1.21.7
lilconfig: 3.1.3
micromatch: 4.0.8
normalize-path: 3.0.0
object-hash: 3.0.0
picocolors: 1.1.1
postcss: 8.5.3
postcss-import: 15.1.0(postcss@8.5.3)
postcss-js: 4.0.1(postcss@8.5.3)
postcss-load-config: 4.0.2(postcss@8.5.3)
postcss-nested: 6.2.0(postcss@8.5.3)
postcss-selector-parser: 6.1.2
resolve: 1.22.10
sucrase: 3.35.0
transitivePeerDependencies:
- ts-node
tailwindcss@4.1.4: {} tailwindcss@4.1.4: {}
@ -25230,14 +25101,6 @@ snapshots:
text-table@0.2.0: {} text-table@0.2.0: {}
thenify-all@1.6.0:
dependencies:
thenify: 3.3.1
thenify@3.3.1:
dependencies:
any-promise: 1.3.0
third-party-web@0.26.5: {} third-party-web@0.26.5: {}
third-party-web@0.27.0: {} third-party-web@0.27.0: {}
@ -25323,8 +25186,6 @@ snapshots:
dependencies: dependencies:
typescript: 5.8.2 typescript: 5.8.2
ts-interface-checker@0.1.13: {}
tsconfig-paths@3.15.0: tsconfig-paths@3.15.0:
dependencies: dependencies:
'@types/json5': 0.0.29 '@types/json5': 0.0.29

View file

@ -17,3 +17,4 @@ onlyBuiltDependencies:
- esbuild - esbuild
- keytar - keytar
- msw - msw
- svelte-preprocess