diff --git a/.eslintrc.cjs b/.eslintrc.cjs index af91af2d..65ff1269 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -7,17 +7,11 @@ module.exports = { // 'plugin:@typescript-eslint/recommended-requiring-type-checking', 'plugin:@typescript-eslint/strict', 'plugin:unicorn/recommended', + 'plugin:svelte/recommended', + 'plugin:svelte/prettier', 'prettier' ], - plugins: [ - 'svelte3', - 'tailwindcss', - '@typescript-eslint', - 'es', - 'vitest', - 'no-only-tests', - 'unicorn' - ], + plugins: ['tailwindcss', '@typescript-eslint', 'es', 'vitest', 'no-only-tests', 'unicorn'], ignorePatterns: [ 'docs/*', '*.cjs', @@ -30,7 +24,13 @@ module.exports = { 'tsconfig.json' ], overrides: [ - { files: ['*.svelte'], processor: 'svelte3/svelte3' }, + { + files: ['*.svelte'], + parser: 'svelte-eslint-parser', + parserOptions: { + parser: '@typescript-eslint/parser' + } + }, { files: ['*.ts'], extends: [ @@ -42,16 +42,12 @@ module.exports = { ] } ], - settings: { - 'svelte3/typescript': () => require('typescript') - }, parserOptions: { sourceType: 'module', ecmaVersion: 2020, tsconfigRootDir: __dirname, - project: ['./tsconfig.json'], - extraFileExtensions: ['.svelte'], - allowAutomaticSingleRunInference: true + project: './tsconfig.json', + extraFileExtensions: ['.svelte'] }, env: { browser: true, @@ -76,6 +72,7 @@ module.exports = { case: 'camelCase' } ], + 'unicorn/filename-case': 'off', 'unicorn/prevent-abbreviations': [ 'error', { diff --git a/.vscode/settings.json b/.vscode/settings.json index b7a2cfd6..5d2cb867 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -10,6 +10,7 @@ "daisyui", "esserializer", "gantt", + "gitgraph", "KROKI", "localstorage", "mermaidchart", diff --git a/package.json b/package.json index aaa2c929..044f27a3 100644 --- a/package.json +++ b/package.json @@ -9,9 +9,9 @@ "dev:test": "yarn dev", "build": "vite build", "preview": "vite preview", - "lint": "prettier --check --cache --plugin-search-dir=. .;eslint --ignore-path .gitignore .", - "lint:fix": "prettier --write --cache --plugin-search-dir=. .;eslint --fix --ignore-path .gitignore .", - "format": "prettier --write --cache --plugin-search-dir=. .", + "lint": "prettier --check --cache . && eslint --ignore-path .gitignore .", + "lint:fix": "prettier --write --cache . && eslint --fix --ignore-path .gitignore .", + "format": "prettier --write --cache .", "pre-commit": "lint-staged", "postinstall": "husky install && svelte-kit sync && (git config blame.ignoreRevsFile .git-blame-ignore-revs || true)", "test:unit": "vitest", @@ -42,29 +42,29 @@ "eslint": "8.56.0", "eslint-config-prettier": "9.1.0", "eslint-plugin-cypress": "2.15.1", - "eslint-plugin-es": "4.1.0", + "eslint-plugin-es": "^4.1.0", "eslint-plugin-no-only-tests": "^3.1.0", - "eslint-plugin-postcss-modules": "2.0.0", - "eslint-plugin-svelte3": "4.0.0", - "eslint-plugin-tailwindcss": "3.13.1", + "eslint-plugin-postcss-modules": "^2.0.0", + "eslint-plugin-svelte": "^2.35.1", + "eslint-plugin-tailwindcss": "^3.13.1", "eslint-plugin-unicorn": "^50.0.1", "eslint-plugin-vitest": "^0.3.20", - "esserializer": "1.3.11", + "esserializer": "^1.3.11", "font-awesome": "^4.7.0", "husky": "^8.0.3", - "jsdom": "21.1.2", - "lint-staged": "15.2.0", + "jsdom": "^21.1.2", + "lint-staged": "^15.2.0", "node-html-parser": "^6.1.5", "postcss": "^8.4.33", "postcss-load-config": "5.0.2", - "prettier": "3.1.0", + "prettier": "^3.1.0", "prettier-plugin-svelte": "^3.1.2", "prettier-plugin-tailwindcss": "^0.5.11", - "svelte": "4.2.8", - "svelte-preprocess": "5.1.3", + "svelte": "^4.2.8", + "svelte-preprocess": "^5.1.3", "tailwindcss": "^3.4.1", "tslib": "^2.6.2", - "typescript": "5.3.3", + "typescript": "^5.3.3", "vite": "^5.0.11", "vitest": "^1.1.3", "vitest-dom": "^0.1.1" diff --git a/src/global.d.ts b/src/global.d.ts index 95ecd6a0..63908c66 100644 --- a/src/global.d.ts +++ b/src/global.d.ts @@ -1,16 +1 @@ -/* eslint-disable @typescript-eslint/no-empty-interface */ -/* eslint-disable @typescript-eslint/ban-types */ -/* eslint-disable @typescript-eslint/no-unused-vars */ - /// -import type { TestingLibraryMatchers } from '@testing-library/jest-dom/matchers'; - -declare global { - namespace jest { - interface Matchers - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error - // eslint-disable-next-line no-undef - extends TestingLibraryMatchers {} - } -} diff --git a/src/lib/components/Actions.svelte b/src/lib/components/Actions.svelte index 82540f81..9b1fd242 100644 --- a/src/lib/components/Actions.svelte +++ b/src/lib/components/Actions.svelte @@ -7,12 +7,12 @@ import { logEvent } from '$lib/util/stats'; import { toBase64 } from 'js-base64'; import dayjs from 'dayjs'; - const { krokiRendererUrl, rendererUrl } = env; + const { krokiRendererUrl, rendererUrl } = env; type Exporter = (context: CanvasRenderingContext2D, image: HTMLImageElement) => () => void; - const getFileName = (ext: string) => - `mermaid-diagram-${dayjs().format('YYYY-MM-DD-HHmmss')}.${ext}`; + const getFileName = (extension: string) => + `mermaid-diagram-${dayjs().format('YYYY-MM-DD-HHmmss')}.${extension}`; const getBase64SVG = (svg?: HTMLElement, width?: number, height?: number): string => { if (svg) { @@ -22,7 +22,7 @@ height && svg?.setAttribute('height', `${height}px`); width && svg?.setAttribute('width', `${width}px`); // Workaround https://stackoverflow.com/questions/28690643/firefox-error-rendering-an-svg-image-to-html5-canvas-with-drawimage if (!svg) { - svg = getSvgEl(); + svg = getSvgElement(); } const svgString = svg.outerHTML .replaceAll('
', '
') @@ -32,7 +32,7 @@ const exportImage = (event: Event, exporter: Exporter) => { const canvas: HTMLCanvasElement = document.createElement('canvas'); - const svg: HTMLElement | null = document.querySelector('#container svg'); + const svg = document.querySelector('#container svg'); if (!svg) { throw new Error('svg not found'); } @@ -57,28 +57,26 @@ context.fillRect(0, 0, canvas.width, canvas.height); const image = new Image(); - image.onload = exporter(context, image); + image.addEventListener('load', exporter(context, image)); image.src = `data:image/svg+xml;base64,${getBase64SVG(svg, canvas.width, canvas.height)}`; event.stopPropagation(); event.preventDefault(); }; - const getSvgEl = () => { - const svgEl: HTMLElement = document - .querySelector('#container svg')! - .cloneNode(true) as HTMLElement; - svgEl.setAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink'); - const fontAwesomeCdnUrl = Array.from(document.head.getElementsByTagName('link')) - .map((l) => l.href) - .find((h) => h.includes('font-awesome')); + const getSvgElement = () => { + const svgElement = document.querySelector('#container svg')?.cloneNode(true) as HTMLElement; + svgElement.setAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink'); + const fontAwesomeCdnUrl = [...document.head.querySelectorAll('link')] + .map((link) => link.href) + .find((url) => url.includes('font-awesome')); if (fontAwesomeCdnUrl == null) { - return svgEl; + return svgElement; } - const styleEl = document.createElement('style'); - styleEl.innerText = `@import url("${fontAwesomeCdnUrl}");'`; - svgEl.prepend(styleEl); - return svgEl; + const styleElement = document.createElement('style'); + styleElement.textContent = `@import url("${fontAwesomeCdnUrl}");'`; + svgElement.prepend(styleElement); + return svgElement; }; const simulateDownload = (download: string, href: string): void => { @@ -144,7 +142,7 @@ }; const onCopyMarkdown = () => { - (document.getElementById('markdown') as HTMLInputElement).select(); + document.querySelector('#markdown')?.select(); document.execCommand('Copy'); logEvent('copyMarkdown'); }; diff --git a/src/lib/components/Editor.svelte b/src/lib/components/Editor.svelte index e9acac05..77652eca 100644 --- a/src/lib/components/Editor.svelte +++ b/src/lib/components/Editor.svelte @@ -1,3 +1,12 @@ + + -
+
diff --git a/src/lib/components/History/History.svelte b/src/lib/components/History/History.svelte index 5831ec2b..72c110d4 100644 --- a/src/lib/components/History/History.svelte +++ b/src/lib/components/History/History.svelte @@ -20,7 +20,7 @@ dayjs.extend(dayjsRelativeTime); - const HISTORY_SAVE_INTERVAL = 60000; + const HISTORY_SAVE_INTERVAL = 60_000; const tabSelectHandler = (message: CustomEvent) => { historyModeStore.set(message.detail.id as HistoryType); @@ -56,17 +56,13 @@ const input = document.createElement('input'); input.type = 'file'; input.accept = 'application/json'; - input.addEventListener('change', ({ target }: Event) => { + input.addEventListener('change', async ({ target }: Event) => { const file = (target as HTMLInputElement)?.files?.[0]; if (!file) { return; } - const reader = new FileReader(); - reader.onload = (e) => { - const data: HistoryEntry[] = JSON.parse(e.target?.result as string); - restoreHistory(data); - }; - reader.readAsText(file); + const data: HistoryEntry[] = JSON.parse(await file.text()); + restoreHistory(data); }); input.click(); }; diff --git a/src/lib/components/View.svelte b/src/lib/components/View.svelte index fb5fb791..2158fa42 100644 --- a/src/lib/components/View.svelte +++ b/src/lib/components/View.svelte @@ -37,7 +37,7 @@ pzoom?.destroy(); pzoom = undefined; void Promise.resolve().then(() => { - const graphDiv = document.getElementById('graph-div'); + const graphDiv = document.querySelector('#graph-div'); if (!graphDiv) { return; } @@ -77,7 +77,7 @@ code = state.code; config = state.mermaid; panZoomEnabled = state.panZoom; - const scroll = view.parentElement!.scrollTop; + const scroll = view.parentElement?.scrollTop; delete container.dataset.processed; const { svg, bindFunctions } = await renderDiagram( Object.assign({}, JSON.parse(state.mermaid)) as MermaidConfig, @@ -89,7 +89,7 @@ handlePanZoom(state); container.innerHTML = svg; console.log({ svg }); - const graphDiv = document.getElementById('graph-div'); + const graphDiv = document.querySelector('#graph-div'); if (!graphDiv) { throw new Error('graph-div not found'); } @@ -99,16 +99,17 @@ bindFunctions(graphDiv); } } - - view.parentElement!.scrollTop = scroll; + if (view.parentElement && scroll) { + view.parentElement.scrollTop = scroll; + } error = false; } else if (manualUpdate) { manualUpdate = false; } else if (code !== state.code || config !== state.mermaid) { outOfSync = true; } - } catch (e) { - console.error('view fail', e); + } catch (error_) { + console.error('view fail', error_); error = true; } }; diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 394a33b9..bd354ea8 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -34,7 +34,7 @@ themeStore.subscribe(({ theme, isDark }) => { if (theme) { - document.getElementsByTagName('html')[0].setAttribute('data-theme', theme); + document.querySelectorAll('html')[0].dataset.theme = theme; toggleDarkTheme(isDark); } }); diff --git a/src/routes/edit/+page.svelte b/src/routes/edit/+page.svelte index 6ad79b2d..27c17390 100644 --- a/src/routes/edit/+page.svelte +++ b/src/routes/edit/+page.svelte @@ -59,7 +59,7 @@ let docKey = ''; stateStore.subscribe(({ code, editorMode }: ValidatedState) => { activeTabID = editorMode; - const codeTypeMatch = /([\S]+)[\s\n]/.exec(code); + const codeTypeMatch = /(\S+)\s/.exec(code); if (codeTypeMatch && codeTypeMatch.length > 1) { docKey = codeTypeMatch[1]; const docConfig = docMap[docKey] ?? { code: '' }; @@ -87,14 +87,14 @@ onMount(async () => { await initHandler(); - const resizer = document.getElementById('resizeHandler'); - const element = document.getElementById('editorPane'); + const resizer = document.querySelector('#resizeHandler'); + const element = document.querySelector('#editorPane'); if (!resizer || !element) { console.debug('Failed to find resize handler or editor pane', { resizer, element }); return; } - const resize = (e: { pageX: number }) => { - const newWidth = e.pageX - element.getBoundingClientRect().left; + const resize = ({ pageX }: { pageX: number }) => { + const newWidth = pageX - element.getBoundingClientRect().left; if (newWidth > 50) { element.style.width = `${newWidth}px`; } @@ -103,8 +103,8 @@ const stopResize = () => { window.removeEventListener('mousemove', resize); }; - resizer.addEventListener('mousedown', (e) => { - e.preventDefault(); + resizer.addEventListener('mousedown', (event) => { + event.preventDefault(); window.addEventListener('mousemove', resize); window.addEventListener('mouseup', stopResize); }); diff --git a/yarn.lock b/yarn.lock index 5d55f08c..d857e7b1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,11 +7,6 @@ resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== -"@adobe/css-tools@^4.3.2": - version "4.3.2" - resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.3.2.tgz#a6abc715fb6884851fca9dad37fc34739a04fd11" - integrity sha512-DA5a1C0gD/pLOvhv33YMrbf2FK3oUzwNl9oOJqE4XVjuEtt6XIakRcsd7eLiOSPkp1kTRQGICTA8cKra/vFbjw== - "@alloc/quick-lru@^5.2.0": version "5.2.0" resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" @@ -52,7 +47,7 @@ chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/runtime@^7.12.5", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.12.5": version "7.22.10" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.10.tgz#ae3e9631fd947cb7e3610d3e9d8fef5f76696682" integrity sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ== @@ -496,20 +491,6 @@ lz-string "^1.5.0" pretty-format "^27.0.2" -"@testing-library/jest-dom@6.2.0": - version "6.2.0" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.2.0.tgz#b572bd5cd6b29314487bac7ba393188e4987b4f7" - integrity sha512-+BVQlJ9cmEn5RDMUS8c2+TU6giLvzaHZ8sU/x0Jj7fk+6/46wPdwlgOPcpxS17CjcanBi/3VmGMqVr2rmbUmNw== - dependencies: - "@adobe/css-tools" "^4.3.2" - "@babel/runtime" "^7.9.2" - aria-query "^5.0.0" - chalk "^3.0.0" - css.escape "^1.5.1" - dom-accessibility-api "^0.6.3" - lodash "^4.17.15" - redent "^3.0.0" - "@testing-library/svelte@4.0.5": version "4.0.5" resolved "https://registry.yarnpkg.com/@testing-library/svelte/-/svelte-4.0.5.tgz#a93b105fe8327b471f5dfb208a37c7b41c90d205" @@ -976,7 +957,7 @@ aria-query@5.1.3: dependencies: deep-equal "^2.0.5" -aria-query@^5.0.0, aria-query@^5.3.0: +aria-query@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== @@ -1285,14 +1266,6 @@ chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - chalk@^4.0.0, chalk@^4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" @@ -2082,7 +2055,7 @@ debug@3.1.0: dependencies: ms "2.0.0" -debug@4, debug@4.3.4, debug@^4.0.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: +debug@4, debug@4.3.4, debug@^4.0.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -2243,7 +2216,7 @@ dom-accessibility-api@^0.5.9: resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== -dom-accessibility-api@^0.6.1, dom-accessibility-api@^0.6.3: +dom-accessibility-api@^0.6.1: version "0.6.3" resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz#993e925cc1d73f2c662e7d75dd5a5445259a8fd8" integrity sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w== @@ -2435,6 +2408,11 @@ escodegen@^2.0.0: optionalDependencies: source-map "~0.6.1" +eslint-compat-utils@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz#f45e3b5ced4c746c127cf724fb074cd4e730d653" + integrity sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg== + eslint-config-prettier@9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f" @@ -2447,7 +2425,7 @@ eslint-plugin-cypress@2.15.1: dependencies: globals "^13.20.0" -eslint-plugin-es@4.1.0: +eslint-plugin-es@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz#f0822f0c18a535a97c3e714e89f88586a7641ec9" integrity sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ== @@ -2460,7 +2438,7 @@ eslint-plugin-no-only-tests@^3.1.0: resolved "https://registry.yarnpkg.com/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.1.0.tgz#f38e4935c6c6c4842bf158b64aaa20c366fe171b" integrity sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw== -eslint-plugin-postcss-modules@2.0.0: +eslint-plugin-postcss-modules@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/eslint-plugin-postcss-modules/-/eslint-plugin-postcss-modules-2.0.0.tgz#d136d6fb5bd9afa6ac73c22aea85212aa2531806" integrity sha512-82usNIaeAEHKbQOnbSs+H3d9nP6TKD2zBZC/wuedbGMTbF8XGkdxI83kptTE6BcvIWgnLPciVa8voe6zIw4ddw== @@ -2476,12 +2454,25 @@ eslint-plugin-postcss-modules@2.0.0: postcss-modules-scope "^3.0.0" postcss-modules-values "^4.0.0" -eslint-plugin-svelte3@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-svelte3/-/eslint-plugin-svelte3-4.0.0.tgz#3d4f3dcaec5761dac8bc697f81de3613b485b4e3" - integrity sha512-OIx9lgaNzD02+MDFNLw0GEUbuovNcglg+wnd/UY0fbZmlQSz7GlQiQ1f+yX0XvC07XPcDOnFcichqI3xCwp71g== +eslint-plugin-svelte@^2.35.1: + version "2.35.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-svelte/-/eslint-plugin-svelte-2.35.1.tgz#7b1e3c263b09dbc9293c25fe02d03d309725d2b9" + integrity sha512-IF8TpLnROSGy98Z3NrsKXWDSCbNY2ReHDcrYTuXZMbfX7VmESISR78TWgO9zdg4Dht1X8coub5jKwHzP0ExRug== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + debug "^4.3.1" + eslint-compat-utils "^0.1.2" + esutils "^2.0.3" + known-css-properties "^0.29.0" + postcss "^8.4.5" + postcss-load-config "^3.1.4" + postcss-safe-parser "^6.0.0" + postcss-selector-parser "^6.0.11" + semver "^7.5.3" + svelte-eslint-parser ">=0.33.0 <1.0.0" -eslint-plugin-tailwindcss@3.13.1: +eslint-plugin-tailwindcss@^3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/eslint-plugin-tailwindcss/-/eslint-plugin-tailwindcss-3.13.1.tgz#40b26aa7cbde3dfe55b1a343258b5b495628dc06" integrity sha512-2Nlgr9doO6vFAG9w4iGU0sspWXuzypfng10HTF+dFS2NterhweWtgdRvf/f7aaoOUUxVZM8wMIXzazrZ7CxyeA== @@ -2518,7 +2509,7 @@ eslint-plugin-vitest@^0.3.20: dependencies: "@typescript-eslint/utils" "^6.15.0" -eslint-scope@^7.2.2: +eslint-scope@^7.0.0, eslint-scope@^7.2.2: version "7.2.2" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== @@ -2538,7 +2529,7 @@ eslint-visitor-keys@^1.1.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: +eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: version "3.4.3" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== @@ -2592,7 +2583,7 @@ esm-env@^1.0.0: resolved "https://registry.yarnpkg.com/esm-env/-/esm-env-1.0.0.tgz#b124b40b180711690a4cb9b00d16573391950413" integrity sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA== -espree@^9.6.0, espree@^9.6.1: +espree@^9.0.0, espree@^9.6.0, espree@^9.6.1: version "9.6.1" resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== @@ -2620,7 +2611,7 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" -esserializer@1.3.11: +esserializer@^1.3.11: version "1.3.11" resolved "https://registry.yarnpkg.com/esserializer/-/esserializer-1.3.11.tgz#cd743190205d6801a8ff9829320dc8a939df79e2" integrity sha512-slnPPuTEaYYHqJOvtBVldmQRlKkJlOCMytd3Il9UNeI9DHlHV5c1wqyUe9f4LZCk69+jZm6zjhwPVNIj8/1I4g== @@ -2637,7 +2628,7 @@ estree-walker@^3.0.0, estree-walker@^3.0.3: dependencies: "@types/estree" "^1.0.0" -esutils@^2.0.2: +esutils@^2.0.2, esutils@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== @@ -3591,7 +3582,7 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== -jsdom@21.1.2: +jsdom@^21.1.2: version "21.1.2" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-21.1.2.tgz#6433f751b8718248d646af1cdf6662dc8a1ca7f9" integrity sha512-sCpFmK2jv+1sjff4u7fzft+pUh2KSUbUrEHYHyfSIbGTIcmnjyp83qg6qLwdJ/I3LpTXx33ACxeRL7Lsyc6lGQ== @@ -3692,6 +3683,11 @@ kleur@^4.0.3, kleur@^4.1.5: resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== +known-css-properties@^0.29.0: + version "0.29.0" + resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.29.0.tgz#e8ba024fb03886f23cb882e806929f32d814158f" + integrity sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ== + layout-base@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/layout-base/-/layout-base-1.0.2.tgz#1291e296883c322a9dd4c5dd82063721b53e26e2" @@ -3730,7 +3726,7 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -lint-staged@15.2.0: +lint-staged@^15.2.0: version "15.2.0" resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-15.2.0.tgz#3111534ca58096a3c8f70b044b6e7fe21b36f859" integrity sha512-TFZzUEV00f+2YLaVPWBWGAMq7So6yQx+GG8YRMDeOEIf95Zn5RyiLMsEiX4KTNl9vq/w+NqRJkLA1kPIo15ufQ== @@ -3824,7 +3820,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== -lodash@^4.17.15, lodash@^4.17.21: +lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -4709,7 +4705,7 @@ postcss-load-config@5.0.2: lilconfig "^3.0.0" yaml "^2.3.4" -postcss-load-config@^3.1.0: +postcss-load-config@^3.1.0, postcss-load-config@^3.1.4: version "3.1.4" resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855" integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== @@ -4895,6 +4891,16 @@ postcss-reduce-transforms@^6.0.0: dependencies: postcss-value-parser "^4.2.0" +postcss-safe-parser@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz#bb4c29894171a94bc5c996b9a30317ef402adaa1" + integrity sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ== + +postcss-scss@^4.0.8: + version "4.0.9" + resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-4.0.9.tgz#a03c773cd4c9623cb04ce142a52afcec74806685" + integrity sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A== + postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5: version "6.0.13" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" @@ -4932,7 +4938,7 @@ postcss@^8.3.0, postcss@^8.4.23, postcss@^8.4.4: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8.4.32, postcss@^8.4.33: +postcss@^8.4.29, postcss@^8.4.32, postcss@^8.4.33, postcss@^8.4.5: version "8.4.33" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.33.tgz#1378e859c9f69bf6f638b990a0212f43e2aaa742" integrity sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg== @@ -4956,10 +4962,10 @@ prettier-plugin-tailwindcss@^0.5.11: resolved "https://registry.yarnpkg.com/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.5.11.tgz#1aa9308c3285b3cb7942aaeaec8d0e0775ac54d0" integrity sha512-AvI/DNyMctyyxGOjyePgi/gqj5hJYClZ1avtQvLlqMT3uDZkRbi4HhGUpok3DRzv9z7Lti85Kdj3s3/1CeNI0w== -prettier@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.1.0.tgz#c6d16474a5f764ea1a4a373c593b779697744d5e" - integrity sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw== +prettier@^3.1.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.2.tgz#96e580f7ca9c96090ad054616c0c4597e2844b65" + integrity sha512-HTByuKZzw7utPiDO523Tt2pLtEyK7OibUD9suEJQrPUCYQqrHr74GGX6VidMrovbf/I50mPqr8j/II6oBAuc5A== pretty-bytes@^5.6.0: version "5.6.0" @@ -5092,14 +5098,6 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -redent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" - integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== - dependencies: - indent-string "^4.0.0" - strip-indent "^3.0.0" - redent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-4.0.0.tgz#0c0ba7caabb24257ab3bb7a4fd95dd1d5c5681f9" @@ -5663,12 +5661,23 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +"svelte-eslint-parser@>=0.33.0 <1.0.0": + version "0.33.1" + resolved "https://registry.yarnpkg.com/svelte-eslint-parser/-/svelte-eslint-parser-0.33.1.tgz#c64dbed2fad099577429b3c39377f6b8d36e5d97" + integrity sha512-vo7xPGTlKBGdLH8T5L64FipvTrqv3OQRx9d2z5X05KKZDlF4rQk8KViZO4flKERY+5BiVdOh7zZ7JGJWo5P0uA== + dependencies: + eslint-scope "^7.0.0" + eslint-visitor-keys "^3.0.0" + espree "^9.0.0" + postcss "^8.4.29" + postcss-scss "^4.0.8" + svelte-hmr@^0.15.3: version "0.15.3" resolved "https://registry.yarnpkg.com/svelte-hmr/-/svelte-hmr-0.15.3.tgz#df54ccde9be3f091bf5f18fc4ef7b8eb6405fbe6" integrity sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ== -svelte-preprocess@5.1.3: +svelte-preprocess@^5.1.3: version "5.1.3" resolved "https://registry.yarnpkg.com/svelte-preprocess/-/svelte-preprocess-5.1.3.tgz#7682239fe53f724c845b53026816fdfe15d028f9" integrity sha512-xxAkmxGHT+J/GourS5mVJeOXZzne1FR5ljeOUAMXUkfEhkLEllRreXpbl3dIYJlcJRfL1LO1uIAPpBpBfiqGPw== @@ -5679,7 +5688,7 @@ svelte-preprocess@5.1.3: sorcery "^0.11.0" strip-indent "^3.0.0" -svelte@4.2.8: +svelte@^4.2.8: version "4.2.8" resolved "https://registry.yarnpkg.com/svelte/-/svelte-4.2.8.tgz#a279d8b6646131ffb11bc692840f8839b8ae4ed1" integrity sha512-hU6dh1MPl8gh6klQZwK/n73GiAHiR95IkFsesLPbMeEZi36ydaXL/ZAb4g9sayT0MXzpxyZjR28yderJHxcmYA== @@ -5942,7 +5951,7 @@ type-fest@^3.0.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.13.1.tgz#bb744c1f0678bea7543a2d1ec24e83e68e8c8706" integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== -typescript@5.3.3: +typescript@^5.3.3: version "5.3.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==