From 6f3aeec492af1f079b264588746626f758f4409c Mon Sep 17 00:00:00 2001 From: oekazuma Date: Mon, 22 Jun 2026 15:50:34 +0900 Subject: [PATCH 1/4] chore: formalize & guard ESM-only (#20) - add @arethetypeswrong/cli (esm-only profile) to check:publish alongside publint - drop legacy top-level main/types from core & vite (exports-only, uniform) - add sideEffects:false across all packages - document ESM-only (Node 18+, require unsupported) in each README - one-line ESM-only policy comment in every tsup.config.ts - rename scripts/verify-svelte-import.mjs -> .js (.js is ESM under type:module) Co-Authored-By: Claude Opus 4.8 (1M context) --- .changeset/esm-only-guard.md | 13 + package.json | 5 +- packages/cli/README.md | 2 + packages/cli/package.json | 1 + packages/cli/tsup.config.ts | 1 + packages/core/README.md | 2 + packages/core/package.json | 2 - packages/core/tsup.config.ts | 1 + packages/mcp/README.md | 2 +- packages/mcp/package.json | 1 + packages/vite/README.md | 2 + packages/vite/package.json | 3 +- packages/vite/tsup.config.ts | 1 + pnpm-lock.yaml | 370 ++++++++++++++++++ pnpm-workspace.yaml | 1 + ...lte-import.mjs => verify-svelte-import.js} | 9 +- 16 files changed, 406 insertions(+), 10 deletions(-) create mode 100644 .changeset/esm-only-guard.md rename scripts/{verify-svelte-import.mjs => verify-svelte-import.js} (75%) diff --git a/.changeset/esm-only-guard.md b/.changeset/esm-only-guard.md new file mode 100644 index 000000000..be9002503 --- /dev/null +++ b/.changeset/esm-only-guard.md @@ -0,0 +1,13 @@ +--- +'@svelte-vitals/core': patch +'@svelte-vitals/vite': patch +'svelte-vitals': patch +'@svelte-vitals/mcp': patch +--- + +Formalize the ESM-only stance (#20): drop the legacy top-level `main`/`types` from +`@svelte-vitals/core` and `@svelte-vitals/vite` so every package is `exports`-only, +add `sideEffects: false` across all packages for consistent tree-shaking, and document +the ESM-only (Node 18+, `require()` unsupported by design) requirement in each README. +CI now guards type-resolution with `@arethetypeswrong/cli` (esm-only profile) alongside +publint. diff --git a/package.json b/package.json index 281d48f16..0c1b3b9df 100644 --- a/package.json +++ b/package.json @@ -9,11 +9,14 @@ "test": "pnpm -r test", "lint": "prettier --check . && eslint .", "format": "prettier --write .", - "check:publish": "pnpm --filter @svelte-vitals/core --filter @svelte-vitals/vite --filter svelte-vitals --filter @svelte-vitals/mcp exec publint", + "check:publish": "pnpm run check:publint && pnpm run check:types", + "check:publint": "pnpm --filter @svelte-vitals/core --filter @svelte-vitals/vite --filter svelte-vitals --filter @svelte-vitals/mcp exec publint", + "check:types": "pnpm --workspace-concurrency=1 --filter @svelte-vitals/core --filter @svelte-vitals/vite --filter svelte-vitals --filter @svelte-vitals/mcp exec attw --pack . --profile esm-only", "release": "changeset publish", "changeset": "changeset" }, "devDependencies": { + "@arethetypeswrong/cli": "catalog:", "@changesets/cli": "catalog:", "@eslint/compat": "catalog:", "@eslint/js": "catalog:", diff --git a/packages/cli/README.md b/packages/cli/README.md index 2e56f8418..cedb7c171 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -10,6 +10,8 @@ npx svelte-vitals ``` +> **ESM-only** (Node 18+). Ships ES modules only; `require()` is unsupported by design. + > [!NOTE] > **Early development.** Currently ships static-mode analysis and the first SEO rule (`` presence). More rules, scoring, and a build-time plugin are on the roadmap. Output may change before `1.0`. diff --git a/packages/cli/package.json b/packages/cli/package.json index 16e7f2693..faa1ee561 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -22,6 +22,7 @@ "url": "https://github.com/oekazuma/svelte-vitals/issues" }, "homepage": "https://github.com/oekazuma/svelte-vitals#readme", + "sideEffects": false, "bin": { "svelte-vitals": "./dist/bin.js" }, diff --git a/packages/cli/tsup.config.ts b/packages/cli/tsup.config.ts index 4bdde025d..0c9103a8d 100644 --- a/packages/cli/tsup.config.ts +++ b/packages/cli/tsup.config.ts @@ -1,5 +1,6 @@ import { defineConfig } from 'tsup'; +// ESM-only by design (issue #20) — never add 'cjs'. export default defineConfig({ entry: ['src/index.ts', 'src/bin.ts'], format: ['esm'], diff --git a/packages/core/README.md b/packages/core/README.md index f09933e99..b46c4503f 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -9,6 +9,8 @@ This package is **mode-independent** and contains no I/O — it operates on a no > Most users don't depend on this directly — install [`svelte-vitals`](https://www.npmjs.com/package/svelte-vitals) instead. This package is for building tools on top of the shared engine. +> **ESM-only** (Node 18+). Ships ES modules only; `require()` is unsupported by design. + ## License [MIT](https://github.com/oekazuma/svelte-vitals/blob/main/LICENSE.md) © [Kazuma Oe](https://github.com/oekazuma) diff --git a/packages/core/package.json b/packages/core/package.json index adde87c2c..b90169c30 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -27,8 +27,6 @@ "import": "./dist/index.js" } }, - "main": "./dist/index.js", - "types": "./dist/index.d.ts", "files": [ "dist" ], diff --git a/packages/core/tsup.config.ts b/packages/core/tsup.config.ts index bf3e9e636..1b56f78f7 100644 --- a/packages/core/tsup.config.ts +++ b/packages/core/tsup.config.ts @@ -1,5 +1,6 @@ import { defineConfig } from 'tsup'; +// ESM-only by design (issue #20) — never add 'cjs'. export default defineConfig({ entry: ['src/index.ts'], format: ['esm'], diff --git a/packages/mcp/README.md b/packages/mcp/README.md index b63536320..79f5e1ab7 100644 --- a/packages/mcp/README.md +++ b/packages/mcp/README.md @@ -22,4 +22,4 @@ Add to your MCP client config: } ``` -ESM-only. Requires Node 18+. +**ESM-only** (Node 18+). Ships ES modules only; `require()` is unsupported by design. diff --git a/packages/mcp/package.json b/packages/mcp/package.json index f3772ec2e..54a52b871 100644 --- a/packages/mcp/package.json +++ b/packages/mcp/package.json @@ -22,6 +22,7 @@ "url": "https://github.com/oekazuma/svelte-vitals/issues" }, "homepage": "https://github.com/oekazuma/svelte-vitals#readme", + "sideEffects": false, "bin": { "svelte-vitals-mcp": "./dist/bin.js" }, diff --git a/packages/vite/README.md b/packages/vite/README.md index daae412ba..6c0b81c5e 100644 --- a/packages/vite/README.md +++ b/packages/vite/README.md @@ -4,6 +4,8 @@ Vite/SvelteKit plugin for [svelte-vitals](https://github.com/oekazuma/svelte-vitals). It piggybacks on `vite build`, parses the **prerendered HTML's `<head>`**, and runs the same SEO rules as the CLI — library-agnostic, because it inspects the real output. Fails the build when findings reach `failOn`. +> **ESM-only** (Node 18+). Ships ES modules only; `require()` is unsupported by design. + ## Usage ```ts diff --git a/packages/vite/package.json b/packages/vite/package.json index 12d0905b9..7163d20a6 100644 --- a/packages/vite/package.json +++ b/packages/vite/package.json @@ -21,6 +21,7 @@ "url": "https://github.com/oekazuma/svelte-vitals/issues" }, "homepage": "https://github.com/oekazuma/svelte-vitals#readme", + "sideEffects": false, "exports": { ".": { "types": "./dist/index.d.ts", @@ -31,8 +32,6 @@ "import": "./dist/hooks/index.js" } }, - "main": "./dist/index.js", - "types": "./dist/index.d.ts", "files": [ "dist" ], diff --git a/packages/vite/tsup.config.ts b/packages/vite/tsup.config.ts index 84ccc672a..aaa28fc33 100644 --- a/packages/vite/tsup.config.ts +++ b/packages/vite/tsup.config.ts @@ -1,5 +1,6 @@ import { defineConfig } from 'tsup'; +// ESM-only by design (issue #20) — never add 'cjs'. export default defineConfig({ entry: ['src/index.ts', 'src/hooks/index.ts'], format: ['esm'], diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index aabc01d46..91163ce99 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,6 +6,9 @@ settings: catalogs: default: + '@arethetypeswrong/cli': + specifier: ^0.18.0 + version: 0.18.3 '@changesets/cli': specifier: ^2.31.0 version: 2.31.0 @@ -86,6 +89,9 @@ importers: .: devDependencies: + '@arethetypeswrong/cli': + specifier: 'catalog:' + version: 0.18.3 '@changesets/cli': specifier: 'catalog:' version: 2.31.0(@types/node@24.13.2) @@ -211,10 +217,25 @@ importers: packages: + '@andrewbranch/untar.js@1.0.3': + resolution: {integrity: sha512-Jh15/qVmrLGhkKJBdXlK1+9tY4lZruYjsgkDFj08ZmDiWVBLJcqkok7Z0/R0In+i1rScBpJlSvrTS2Lm41Pbnw==} + + '@arethetypeswrong/cli@0.18.3': + resolution: {integrity: sha512-GeAlc+lUD4gKHD/LDQNvQY30FfQ+xAXg2inbQKUjFZgTOdI5ygEweaOnGHGBPSKXSLGQC7VLhpXu9zMnYk/4sQ==} + engines: {node: '>=20'} + hasBin: true + + '@arethetypeswrong/core@0.18.3': + resolution: {integrity: sha512-sWBB/tdIktaT5xMq0Dz6CJyqcf6oMNdmiKiuPU1lWoJLTL6gjRSsksBuSgqot21hylkklBQY1wiSu+PkZhW7sw==} + engines: {node: '>=20'} + '@babel/runtime@7.29.7': resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} engines: {node: '>=6.9.0'} + '@braidai/lang@1.1.2': + resolution: {integrity: sha512-qBcknbBufNHlui137Hft8xauQMTZDKdophmLFv05r2eNmdIv/MlPuP4TdUknHG68UdWLgVZwgxVe735HzJNIwA==} + '@changesets/apply-release-plan@7.1.1': resolution: {integrity: sha512-9qPCm/rLx/xoOFXIHGB229+4GOL76S4MC+7tyOuTsR6+1jYlfFDQORdvwR5hDA6y4FL2BPt3qpbcQIS+dW85LA==} @@ -270,6 +291,10 @@ packages: '@changesets/write@0.4.0': resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} + '@colors/colors@1.5.0': + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + '@emnapi/core@1.10.0': resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} @@ -534,6 +559,9 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@loaderkit/resolve@1.0.6': + resolution: {integrity: sha512-G8FdIoF5CypfwmD9rl8BXod5HDn8JqB0CCNBXDTaRZ+yRYhARrrSToX1zg1zy9jX3zLqigsELwhT4gNtkdQAUg==} + '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -814,6 +842,10 @@ packages: cpu: [x64] os: [win32] + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} @@ -998,10 +1030,22 @@ packages: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} + ansi-escapes@7.3.0: + resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} + engines: {node: '>=18'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} @@ -1076,6 +1120,18 @@ packages: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + chardet@2.1.1: resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} @@ -1083,10 +1139,36 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} + cjs-module-lexer@1.4.3: + resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} + + cli-highlight@2.1.11: + resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==} + engines: {node: '>=8.0.0', npm: '>=5.0.0'} + hasBin: true + + cli-table3@0.6.5: + resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} + engines: {node: 10.* || >= 12.*} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -1200,6 +1282,12 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emojilib@2.4.0: + resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} + encodeurl@2.0.0: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} @@ -1212,6 +1300,10 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -1232,6 +1324,10 @@ packages: engines: {node: '>=18'} hasBin: true + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} @@ -1385,6 +1481,9 @@ packages: picomatch: optional: true + fflate@0.8.3: + resolution: {integrity: sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==} + file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -1439,6 +1538,10 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -1474,6 +1577,10 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} @@ -1486,6 +1593,9 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true + highlight.js@10.7.3: + resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + hono@4.12.26: resolution: {integrity: sha512-uyZtpnYxM9CmQ7QsQknM4zN8EftNqhON1qYeIKM0Se67CCEe2c44xyGURwB0axX2fBDu1dqHrHAc1hmNT8ITkw==} engines: {node: '>=16.9.0'} @@ -1529,6 +1639,10 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -1704,9 +1818,24 @@ packages: lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + lru-cache@11.5.1: + resolution: {integrity: sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==} + engines: {node: 20 || >=22} + magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + marked-terminal@7.3.0: + resolution: {integrity: sha512-t4rBvPsHc57uE/2nJOLmMbZCQ4tgAccAED3ngXQqW6g+TxA488JzJ+FK3lQkzBQOI1mRV/r/Kq+1ZlJ4D0owQw==} + engines: {node: '>=16.0.0'} + peerDependencies: + marked: '>=1 <16' + + marked@9.1.6: + resolution: {integrity: sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q==} + engines: {node: '>= 16'} + hasBin: true + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -1768,6 +1897,10 @@ packages: resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} + node-emoji@2.2.0: + resolution: {integrity: sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==} + engines: {node: '>=18'} + node-html-parser@6.1.13: resolution: {integrity: sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==} @@ -1933,6 +2066,15 @@ packages: package-manager-detector@1.6.0: resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} + parse5-htmlparser2-tree-adapter@6.0.1: + resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} + + parse5@5.1.1: + resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==} + + parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -2091,6 +2233,10 @@ packages: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} @@ -2181,6 +2327,10 @@ packages: resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} engines: {node: '>=18'} + skin-tone@2.0.0: + resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} + engines: {node: '>=8'} + slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -2209,6 +2359,10 @@ packages: std-env@4.1.0: resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -2222,6 +2376,14 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-hyperlinks@3.2.0: + resolution: {integrity: sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==} + engines: {node: '>=14.18'} + svelte-eslint-parser@1.8.0: resolution: {integrity: sha512-mikR1qwIVy3t5WthUoAXkMwxkXvabZP9FJgdx35Ei7EbGWmctva1Pih16Koeor/bdNNq8NXHlwKGS6NkYTawLg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0, pnpm: 10.34.1} @@ -2326,6 +2488,11 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' + typescript@5.6.1-rc: + resolution: {integrity: sha512-E3b2+1zEFu84jB0YQi9BORDjz9+jGbwwy1Zi3G0LUNw7a7cePUrHMRNy8aPh53nXpkFGVHSxIZo5vKTfYaFiBQ==} + engines: {node: '>=14.17'} + hasBin: true + typescript@6.0.3: resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} @@ -2337,6 +2504,10 @@ packages: undici-types@7.18.2: resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} + unicode-emoji-modifier-base@1.0.0: + resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} + engines: {node: '>=4'} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -2351,6 +2522,10 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + validate-npm-package-name@5.0.1: + resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -2461,13 +2636,29 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + yaml@1.10.3: resolution: {integrity: sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==} engines: {node: '>= 6'} + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs@16.2.2: + resolution: {integrity: sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w==} + engines: {node: '>=10'} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -2485,8 +2676,33 @@ packages: snapshots: + '@andrewbranch/untar.js@1.0.3': {} + + '@arethetypeswrong/cli@0.18.3': + dependencies: + '@arethetypeswrong/core': 0.18.3 + chalk: 4.1.2 + cli-table3: 0.6.5 + commander: 10.0.1 + marked: 9.1.6 + marked-terminal: 7.3.0(marked@9.1.6) + semver: 7.8.4 + + '@arethetypeswrong/core@0.18.3': + dependencies: + '@andrewbranch/untar.js': 1.0.3 + '@loaderkit/resolve': 1.0.6 + cjs-module-lexer: 1.4.3 + fflate: 0.8.3 + lru-cache: 11.5.1 + semver: 7.8.4 + typescript: 5.6.1-rc + validate-npm-package-name: 5.0.1 + '@babel/runtime@7.29.7': {} + '@braidai/lang@1.1.2': {} + '@changesets/apply-release-plan@7.1.1': dependencies: '@changesets/config': 3.1.4 @@ -2630,6 +2846,9 @@ snapshots: human-id: 4.2.0 prettier: 2.8.8 + '@colors/colors@1.5.0': + optional: true + '@emnapi/core@1.10.0': dependencies: '@emnapi/wasi-threads': 1.2.1 @@ -2810,6 +3029,10 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@loaderkit/resolve@1.0.6': + dependencies: + '@braidai/lang': 1.1.2 + '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.29.7 @@ -2999,6 +3222,8 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.62.0': optional: true + '@sindresorhus/is@4.6.0': {} + '@standard-schema/spec@1.1.0': {} '@sveltejs/acorn-typescript@1.0.10(acorn@8.17.0)': @@ -3230,8 +3455,18 @@ snapshots: ansi-colors@4.1.3: {} + ansi-escapes@7.3.0: + dependencies: + environment: 1.1.0 + ansi-regex@5.0.1: {} + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + any-promise@1.3.0: {} argparse@1.0.10: @@ -3299,14 +3534,54 @@ snapshots: chai@6.2.2: {} + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.6.2: {} + + char-regex@1.0.2: {} + chardet@2.1.1: {} chokidar@4.0.3: dependencies: readdirp: 4.1.2 + cjs-module-lexer@1.4.3: {} + + cli-highlight@2.1.11: + dependencies: + chalk: 4.1.2 + highlight.js: 10.7.3 + mz: 2.7.0 + parse5: 5.1.1 + parse5-htmlparser2-tree-adapter: 6.0.1 + yargs: 16.2.2 + + cli-table3@0.6.5: + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + clsx@2.1.1: {} + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + commander@10.0.1: {} + commander@4.1.1: {} confbox@0.1.8: {} @@ -3396,6 +3671,10 @@ snapshots: ee-first@1.1.1: {} + emoji-regex@8.0.0: {} + + emojilib@2.4.0: {} + encodeurl@2.0.0: {} enquirer@2.4.1: @@ -3405,6 +3684,8 @@ snapshots: entities@4.5.0: {} + environment@1.1.0: {} + es-define-property@1.0.1: {} es-errors@1.3.0: {} @@ -3444,6 +3725,8 @@ snapshots: '@esbuild/win32-ia32': 0.27.7 '@esbuild/win32-x64': 0.27.7 + escalade@3.2.0: {} + escape-html@1.0.3: {} escape-string-regexp@4.0.0: {} @@ -3635,6 +3918,8 @@ snapshots: optionalDependencies: picomatch: 4.0.4 + fflate@0.8.3: {} + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -3698,6 +3983,8 @@ snapshots: function-bind@1.1.2: {} + get-caller-file@2.0.5: {} + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -3741,6 +4028,8 @@ snapshots: graceful-fs@4.2.11: {} + has-flag@4.0.0: {} + has-symbols@1.1.0: {} hasown@2.0.4: @@ -3749,6 +4038,8 @@ snapshots: he@1.2.0: {} + highlight.js@10.7.3: {} + hono@4.12.26: {} http-errors@2.0.1: @@ -3779,6 +4070,8 @@ snapshots: is-extglob@2.1.1: {} + is-fullwidth-code-point@3.0.0: {} + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 @@ -3908,10 +4201,25 @@ snapshots: lodash.startcase@4.4.0: {} + lru-cache@11.5.1: {} + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + marked-terminal@7.3.0(marked@9.1.6): + dependencies: + ansi-escapes: 7.3.0 + ansi-regex: 6.2.2 + chalk: 5.6.2 + cli-highlight: 2.1.11 + cli-table3: 0.6.5 + marked: 9.1.6 + node-emoji: 2.2.0 + supports-hyperlinks: 3.2.0 + + marked@9.1.6: {} + math-intrinsics@1.1.0: {} media-typer@1.1.0: {} @@ -3960,6 +4268,13 @@ snapshots: negotiator@1.0.0: {} + node-emoji@2.2.0: + dependencies: + '@sindresorhus/is': 4.6.0 + char-regex: 1.0.2 + emojilib: 2.4.0 + skin-tone: 2.0.0 + node-html-parser@6.1.13: dependencies: css-select: 5.2.2 @@ -4026,6 +4341,14 @@ snapshots: package-manager-detector@1.6.0: {} + parse5-htmlparser2-tree-adapter@6.0.1: + dependencies: + parse5: 6.0.1 + + parse5@5.1.1: {} + + parse5@6.0.1: {} + parseurl@1.3.3: {} path-exists@4.0.0: {} @@ -4139,6 +4462,8 @@ snapshots: readdirp@4.1.2: {} + require-directory@2.1.1: {} + require-from-string@2.0.2: {} resolve-from@5.0.0: {} @@ -4292,6 +4617,10 @@ snapshots: mrmime: 2.0.1 totalist: 3.0.1 + skin-tone@2.0.0: + dependencies: + unicode-emoji-modifier-base: 1.0.0 + slash@3.0.0: {} source-map-js@1.2.1: {} @@ -4311,6 +4640,12 @@ snapshots: std-env@4.1.0: {} + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -4327,6 +4662,15 @@ snapshots: tinyglobby: 0.2.17 ts-interface-checker: 0.1.13 + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-hyperlinks@3.2.0: + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + svelte-eslint-parser@1.8.0(svelte@5.56.3(@typescript-eslint/types@8.61.0)): dependencies: eslint-scope: 8.4.0 @@ -4451,12 +4795,16 @@ snapshots: transitivePeerDependencies: - supports-color + typescript@5.6.1-rc: {} + typescript@6.0.3: {} ufo@1.6.4: {} undici-types@7.18.2: {} + unicode-emoji-modifier-base@1.0.0: {} + universalify@0.1.2: {} unpipe@1.0.0: {} @@ -4467,6 +4815,8 @@ snapshots: util-deprecate@1.0.2: {} + validate-npm-package-name@5.0.1: {} + vary@1.1.2: {} vite@8.0.16(@types/node@24.13.2)(esbuild@0.27.7): @@ -4523,10 +4873,30 @@ snapshots: word-wrap@1.2.5: {} + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrappy@1.0.2: {} + y18n@5.0.8: {} + yaml@1.10.3: {} + yargs-parser@20.2.9: {} + + yargs@16.2.2: + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + yocto-queue@0.1.0: {} zimmerframe@1.1.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index bd2a00e19..10409b123 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -7,6 +7,7 @@ allowBuilds: esbuild: true catalog: + '@arethetypeswrong/cli': ^0.18.0 '@changesets/cli': ^2.31.0 '@eslint/compat': ^2.1.0 '@modelcontextprotocol/sdk': ^1.29.0 diff --git a/scripts/verify-svelte-import.mjs b/scripts/verify-svelte-import.js similarity index 75% rename from scripts/verify-svelte-import.mjs rename to scripts/verify-svelte-import.js index a15dfd604..2cedea006 100644 --- a/scripts/verify-svelte-import.mjs +++ b/scripts/verify-svelte-import.js @@ -2,12 +2,13 @@ // parses across runtimes. The adapter is Node-only for now; this only verifies // that the import + parse resolve, which is the part that differs per runtime. // -// Node: node scripts/verify-svelte-import.mjs -// Deno: deno run -A scripts/verify-svelte-import.mjs -// Bun: bun run scripts/verify-svelte-import.mjs +// Node: node scripts/verify-svelte-import.js +// Deno: deno run -A scripts/verify-svelte-import.js +// Bun: bun run scripts/verify-svelte-import.js // // `svelte` is a root devDependency, so the bare import resolves from the repo -// root for every runtime. +// root for every runtime. A plain `.js` is already ESM under the repo's +// "type": "module" (issue #20) — no `.mjs` extension needed. import { parse, VERSION } from 'svelte/compiler'; const ast = parse('<svelte:head><title>{data.title}', { modern: true }); From 2813d208ac7ca8e821cb8709c3ddf2c624a66142 Mon Sep 17 00:00:00 2001 From: oekazuma Date: Mon, 22 Jun 2026 16:00:49 +0900 Subject: [PATCH 2/4] chore: bump core & vite to minor in changeset (#20) Dropping top-level main/types can affect consumers resolving entry points without exports support, so a patch (which implies compatibility) is too weak for those two packages; cli/mcp only gain additive sideEffects and stay patch. Co-Authored-By: Claude Opus 4.8 (1M context) --- .changeset/esm-only-guard.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.changeset/esm-only-guard.md b/.changeset/esm-only-guard.md index be9002503..60a177734 100644 --- a/.changeset/esm-only-guard.md +++ b/.changeset/esm-only-guard.md @@ -1,6 +1,6 @@ --- -'@svelte-vitals/core': patch -'@svelte-vitals/vite': patch +'@svelte-vitals/core': minor +'@svelte-vitals/vite': minor 'svelte-vitals': patch '@svelte-vitals/mcp': patch --- @@ -11,3 +11,8 @@ add `sideEffects: false` across all packages for consistent tree-shaking, and do the ESM-only (Node 18+, `require()` unsupported by design) requirement in each README. CI now guards type-resolution with `@arethetypeswrong/cli` (esm-only profile) alongside publint. + +`core` and `vite` get a `minor` bump because dropping top-level `main`/`types` can +affect consumers/tools that resolve entry points without `exports` support (e.g. +`moduleResolution: node`); `svelte-vitals` and `@svelte-vitals/mcp` only gain the +additive `sideEffects: false`, so they stay `patch`. From f39fe153be540d335381cb342b23a3f478130110 Mon Sep 17 00:00:00 2001 From: oekazuma Date: Mon, 22 Jun 2026 16:06:53 +0900 Subject: [PATCH 3/4] chore: declare engines.node ">=18" on all published packages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Make the documented "Node 18+" runtime floor machine-enforceable so npm install warnings, attw, and publint align with the README claim. Additive declaration — core/vite stay minor (entry-point change), cli/mcp stay patch. Co-Authored-By: Claude Opus 4.8 (1M context) --- .changeset/esm-only-guard.md | 11 ++++++----- packages/cli/package.json | 3 +++ packages/core/package.json | 3 +++ packages/mcp/package.json | 3 +++ packages/vite/package.json | 3 +++ 5 files changed, 18 insertions(+), 5 deletions(-) diff --git a/.changeset/esm-only-guard.md b/.changeset/esm-only-guard.md index 60a177734..4b8939085 100644 --- a/.changeset/esm-only-guard.md +++ b/.changeset/esm-only-guard.md @@ -7,12 +7,13 @@ Formalize the ESM-only stance (#20): drop the legacy top-level `main`/`types` from `@svelte-vitals/core` and `@svelte-vitals/vite` so every package is `exports`-only, -add `sideEffects: false` across all packages for consistent tree-shaking, and document -the ESM-only (Node 18+, `require()` unsupported by design) requirement in each README. -CI now guards type-resolution with `@arethetypeswrong/cli` (esm-only profile) alongside -publint. +add `sideEffects: false` across all packages for consistent tree-shaking, declare +`"engines": { "node": ">=18" }` on every package so the documented runtime floor is +machine-enforceable, and document the ESM-only (Node 18+, `require()` unsupported by +design) requirement in each README. CI now guards type-resolution with +`@arethetypeswrong/cli` (esm-only profile) alongside publint. `core` and `vite` get a `minor` bump because dropping top-level `main`/`types` can affect consumers/tools that resolve entry points without `exports` support (e.g. `moduleResolution: node`); `svelte-vitals` and `@svelte-vitals/mcp` only gain the -additive `sideEffects: false`, so they stay `patch`. +additive `sideEffects: false` and `engines` declaration, so they stay `patch`. diff --git a/packages/cli/package.json b/packages/cli/package.json index faa1ee561..db36eb939 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -22,6 +22,9 @@ "url": "https://github.com/oekazuma/svelte-vitals/issues" }, "homepage": "https://github.com/oekazuma/svelte-vitals#readme", + "engines": { + "node": ">=18" + }, "sideEffects": false, "bin": { "svelte-vitals": "./dist/bin.js" diff --git a/packages/core/package.json b/packages/core/package.json index b90169c30..02471d308 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -20,6 +20,9 @@ "url": "https://github.com/oekazuma/svelte-vitals/issues" }, "homepage": "https://github.com/oekazuma/svelte-vitals#readme", + "engines": { + "node": ">=18" + }, "sideEffects": false, "exports": { ".": { diff --git a/packages/mcp/package.json b/packages/mcp/package.json index 54a52b871..107aa566d 100644 --- a/packages/mcp/package.json +++ b/packages/mcp/package.json @@ -22,6 +22,9 @@ "url": "https://github.com/oekazuma/svelte-vitals/issues" }, "homepage": "https://github.com/oekazuma/svelte-vitals#readme", + "engines": { + "node": ">=18" + }, "sideEffects": false, "bin": { "svelte-vitals-mcp": "./dist/bin.js" diff --git a/packages/vite/package.json b/packages/vite/package.json index 7163d20a6..194c1ce38 100644 --- a/packages/vite/package.json +++ b/packages/vite/package.json @@ -21,6 +21,9 @@ "url": "https://github.com/oekazuma/svelte-vitals/issues" }, "homepage": "https://github.com/oekazuma/svelte-vitals#readme", + "engines": { + "node": ">=18" + }, "sideEffects": false, "exports": { ".": { From 3a27f794c33b9df64dd56b3bfca9f145e0776e08 Mon Sep 17 00:00:00 2001 From: oekazuma Date: Mon, 22 Jun 2026 16:15:06 +0900 Subject: [PATCH 4/4] docs(cli): fold ESM-only note into intro blockquote to fix MD028 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two adjacent blockquotes (ESM-only note + [\!NOTE] alert) separated by a blank line tripped markdownlint MD028. Merging them with `>` would have broken the GitHub alert (its first line must be `[\!NOTE]`), so move the ESM-only line into the top tagline blockquote instead — alert stays intact. Co-Authored-By: Claude Opus 4.8 (1M context) --- packages/cli/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/cli/README.md b/packages/cli/README.md index cedb7c171..daaff0d84 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -5,13 +5,13 @@ > **A SvelteKit SEO checker — not a runtime Web Vitals reporter.** > Diagnose your project's SEO health by statically analyzing your source code, before it ships. No browser, no build server, no headless Chrome. +> +> **ESM-only** (Node 18+). Ships ES modules only; `require()` is unsupported by design. ```bash npx svelte-vitals ``` -> **ESM-only** (Node 18+). Ships ES modules only; `require()` is unsupported by design. - > [!NOTE] > **Early development.** Currently ships static-mode analysis and the first SEO rule (`` presence). More rules, scoring, and a build-time plugin are on the roadmap. Output may change before `1.0`.