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"
- 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

View file

@ -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

View file

@ -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

View file

@ -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/

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": {
"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"

View file

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

View file

@ -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

View file

@ -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:"
},

View file

@ -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"
}
}

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

View file

@ -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';
/**

View file

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

View file

@ -1,8 +1,6 @@
import { test } from './fixtures';
import {
assertHarperHighlightBoxes,
clickHarperHighlight,
getHarperHighlights,
getTextarea,
replaceEditorContent,
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';
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);

View file

@ -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);

View file

@ -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);

View file

@ -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"

View file

@ -6,28 +6,28 @@
<script type="module">
// We can import `harper.js` using native ECMAScript syntax.
// 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.
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.
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
list.innerHTML = '';
for (let lint of lints) {
let item = document.createElement('LI');
var text = document.createTextNode(lint.message());
for (const lint of lints) {
const item = document.createElement('LI');
const text = document.createTextNode(lint.message());
item.appendChild(text);
list.appendChild(item);
}
}
let inputField = document.getElementById('maininput');
const inputField = document.getElementById('maininput');
inputField.addEventListener('input', onInput);
onInput({target: inputField});
</script>

View file

@ -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",

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"
],
"scripts": {
"build": "tsc && vite build",
"build": "tsc && vite build -l warn",
"dev": "vite",
"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) {
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{

View file

@ -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;

View file

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

View file

@ -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();
}),

View file

@ -39,7 +39,7 @@ export default class State {
constructor(
saveDataCallback: (data: any) => Promise<void>,
onExtensionChange: () => void,
editorViewField?: StateField<MarkdownFileInfo>,
_editorViewField?: StateField<MarkdownFileInfo>,
) {
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;

View file

@ -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', () => {

View file

@ -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:",

View file

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

View file

@ -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 {

View file

@ -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 {

View file

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

View file

@ -22,7 +22,7 @@ for (let [key, val] of data.entries()) {
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 {
duration,
css: (t: number) => {

View file

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

View file

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

View file

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

View file

@ -2,7 +2,13 @@
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.
- [`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`
- [`wasm-pack`](https://drager.github.io/wasm-pack/installer/)
- `zip`
- `pandoc`
- [`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`.

View file

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

View file

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

View file

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

View file

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

View file

@ -1,239 +1,247 @@
import { defaultTheme } from '@sveltepress/theme-default';
import { sveltepress } from '@sveltepress/vite';
import tailwindcss from '@tailwindcss/vite';
import { defineConfig } from 'vite';
import topLevelAwait from 'vite-plugin-top-level-await';
import wasm from 'vite-plugin-wasm';
const prod = process.env.APP_ENV === 'production';
export default defineConfig({
ssr: {
noExternal: prod ? ['mysql2', 'drizzle-orm', 'posthog-js', 'drizzle-zod', 'zod'] : [],
},
server: {
port: 3000,
fs: {
allow: ['../harper.js/dist'],
export default defineConfig(async () => {
const [{ defaultTheme }, { sveltepress }] = await Promise.all([
import('@sveltepress/theme-default'),
import('@sveltepress/vite'),
]);
return {
ssr: {
noExternal: prod ? ['mysql2', 'drizzle-orm', 'posthog-js', 'drizzle-zod', 'zod'] : [],
},
},
plugins: [
sveltepress({
siteConfig: {
title: 'Harper',
description: 'A Grammar Checker from Automattic',
server: {
port: 3000,
fs: {
allow: ['../harper.js/dist'],
},
theme: defaultTheme({
editLink: 'https://github.com/automattic/harper/edit/master/packages/web/src/routes/:route',
logo: '/circle-logo.png',
github: 'https://github.com/automattic/harper',
discord: 'https://discord.gg/invite/JBqcAaKrzQ',
themeColor: {
primary: '#818eae',
dark: '#355280',
gradient: {
start: '#355280',
end: '#818eae',
},
},
plugins: [
sveltepress({
siteConfig: {
title: 'Harper',
description: 'A Grammar Checker from Automattic',
},
navbar: [
{ title: 'Documentation', to: '/docs/about' },
{
title: 'Visual Studio Code',
to: 'https://marketplace.visualstudio.com/items?itemName=elijah-potter.harper',
theme: defaultTheme({
editLink:
'https://github.com/automattic/harper/edit/master/packages/web/src/routes/:route',
logo: '/circle-logo.png',
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' },
{
title: 'Chrome Extension',
to: 'https://chromewebstore.google.com/detail/private-grammar-checking/lodbfhdipoipcjmlebjbgmmgekckhpfb',
},
],
sidebar: {
'/docs/': [
navbar: [
{ title: 'Documentation', to: '/docs/about' },
{
items: [
{
title: 'About',
to: '/docs/about',
},
],
title: 'Visual Studio Code',
to: 'https://marketplace.visualstudio.com/items?itemName=elijah-potter.harper',
},
{ title: 'Obsidian', to: '/docs/integrations/obsidian' },
{
title: 'Integrations',
items: [
{
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',
title: 'Chrome Extension',
to: 'https://chromewebstore.google.com/detail/private-grammar-checking/lodbfhdipoipcjmlebjbgmmgekckhpfb',
},
],
},
highlighter: {
languages: [
'svelte',
'sh',
'js',
'html',
'ts',
'md',
'css',
'scss',
'toml',
'rust',
'lua',
'json',
'elisp',
],
},
sidebar: {
'/docs/': [
{
items: [
{
title: 'About',
to: '/docs/about',
},
],
},
{
title: 'Integrations',
items: [
{
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',
},
],
},
highlighter: {
languages: [
'svelte',
'sh',
'js',
'html',
'ts',
'md',
'css',
'scss',
'toml',
'rust',
'lua',
'json',
'elisp',
],
},
}),
}),
}),
wasm(),
topLevelAwait(),
],
wasm(),
topLevelAwait(),
tailwindcss(),
],
};
});

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,12 +1,5 @@
import { binaryInlined, type Linter, WorkerLinter } from 'harper.js';
import React, {
createContext,
type ReactNode,
useContext,
useEffect,
useRef,
useState,
} from 'react';
import { createContext, type ReactNode, useContext, useEffect, useRef, useState } from 'react';
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 DataBlock from './DataBlock';
import Highlighter from './Highlighter';

View file

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

View file

@ -1,5 +1,5 @@
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 { suggestionText } from './lintUtils';
import { useAddToDictionary } from './usePersonalDictionary';

View file

@ -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;

View file

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

View file

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

277
pnpm-lock.yaml generated
View file

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

View file

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