From 5d33ffffb5b2d9bdda0877de7b1705f7a876f8a3 Mon Sep 17 00:00:00 2001 From: Joost de Valk Date: Thu, 18 Jun 2026 15:06:55 +0200 Subject: [PATCH 1/2] chore: support emdash ^0.21.0 (v0.12.0) Bump the emdash peer dependency from ^0.6.0 to ^0.21.0 to track the current EmDash release. The plugin's hooks (page:metadata, content:afterPublish, content:afterUnpublish) and capabilities (read:content, page:inject, network:fetch) are unchanged across the range, so no source changes were needed. - peerDependencies.emdash: ^0.6.0 -> ^0.21.0 - regenerate package-lock.json and pnpm-lock.yaml (both stale at 0.6.0) - bump package version + internal src/index.ts version strings to 0.12.0 - add CHANGELOG entry Verified against emdash@0.21.0: typecheck clean, all 69 tests passing. Co-Authored-By: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 7 + package-lock.json | 1517 ++++++++++++++++++++++++++++++--------------- package.json | 6 +- pnpm-lock.yaml | 879 +++++++++++--------------- src/index.ts | 4 +- 5 files changed, 1406 insertions(+), 1007 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b855cb1..7265bdb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.12.0] - 2026-06-18 + +### Changed + +- **`peerDependencies.emdash` bumped to `^0.21.0`.** Tracks the current EmDash release. The plugin API surface this plugin depends on — the `page:metadata`, `content:afterPublish`, and `content:afterUnpublish` hooks, plus the `read:content`, `page:inject`, and `network:fetch` capabilities — is unchanged from `0.6.0`, so no source changes were required. Verified against `emdash@0.21.0`: typecheck clean, all tests passing. +- Internal plugin `version` strings in `src/index.ts` bumped to `0.12.0` to match the package version. + ## [0.11.0] - 2026-04-21 ### Changed diff --git a/package-lock.json b/package-lock.json index 5d535c7..c9d973b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@jdevalk/seo-graph-core": "^0.6.0" }, "devDependencies": { - "emdash": "^0.6.0", + "emdash": "^0.21.0", "typescript": "^5.6.0", "vitest": "^4.1.8" }, @@ -198,6 +198,113 @@ "yaml": "^2.8.2" } }, + "node_modules/@atcute/atproto": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@atcute/atproto/-/atproto-4.0.2.tgz", + "integrity": "sha512-hLnvjiIOStpdUm0cEN+R5YydvbV0d6ap17Iv+t7i/nhSCN3TGMya7M0ftCWtCo+xoQ1EU6HK74R8jqXWlyrM0w==", + "dev": true, + "license": "0BSD", + "dependencies": { + "@atcute/lexicons": "^2.0.0" + }, + "peerDependencies": { + "@atcute/lexicons": "^2.0.0" + } + }, + "node_modules/@atcute/client": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@atcute/client/-/client-5.1.0.tgz", + "integrity": "sha512-l2LYCY43QvrOsvS+q1d959x0yVeXQ5F7haloCB8MLzrTKT3s9fc4S3Kr+8JkgjPtdapgOPIeEdhWcrzP5WNLRg==", + "dev": true, + "license": "0BSD", + "dependencies": { + "@atcute/identity": "^2.0.0", + "@atcute/lexicons": "^2.0.0" + }, + "peerDependencies": { + "@atcute/lexicons": "^2.0.0" + } + }, + "node_modules/@atcute/identity": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@atcute/identity/-/identity-2.0.0.tgz", + "integrity": "sha512-YXFsggO7eJYifqkN85+kUXJE2a1iI9AyuzPTDjtS/4WE1Zs1/XiPkWmwZlAgtp+pYhVtjm3mJqy/h/mZ0OnIVw==", + "dev": true, + "license": "0BSD", + "dependencies": { + "@atcute/lexicons": "^2.0.0", + "valibot": "^1.4.0" + }, + "peerDependencies": { + "@atcute/lexicons": "^2.0.0" + } + }, + "node_modules/@atcute/identity-resolver": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@atcute/identity-resolver/-/identity-resolver-2.0.0.tgz", + "integrity": "sha512-IKg1BDQAF2bIdN10DL6KAXmTjK+3enTU2IRbuani9TsFahBwGZ7O5FiVmTiL6QlGfauGNW5S0xNCOxWXWMoR2Q==", + "dev": true, + "license": "0BSD", + "dependencies": { + "@atcute/lexicons": "^2.0.0", + "@atcute/util-fetch": "^2.0.0", + "valibot": "^1.4.0" + }, + "peerDependencies": { + "@atcute/identity": "^2.0.0", + "@atcute/lexicons": "^2.0.0" + } + }, + "node_modules/@atcute/lexicons": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@atcute/lexicons/-/lexicons-2.0.1.tgz", + "integrity": "sha512-MsgGYgZ7bXcXWg/CzAQX+d+/u4YrelQYnxtX6NW3Bc+6eOyzxozBPRWVFzfsR9OCT10Qzqmuujul/8bRYNCZ6w==", + "dev": true, + "license": "0BSD", + "dependencies": { + "@atcute/uint8array": "^1.1.2", + "@atcute/util-text": "^1.3.1", + "@standard-schema/spec": "^1.1.0", + "esm-env": "^1.2.2" + } + }, + "node_modules/@atcute/multibase": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@atcute/multibase/-/multibase-1.2.3.tgz", + "integrity": "sha512-hliOXcgYS3x0afs8JsjSvA5c15Zf36ggCcxIHspSM7wrae3zhwaTigYRU6NvghkPMAal4tRRbhv98AuP5YzJ6w==", + "dev": true, + "license": "0BSD", + "dependencies": { + "@atcute/uint8array": "^1.1.2" + } + }, + "node_modules/@atcute/uint8array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@atcute/uint8array/-/uint8array-1.1.2.tgz", + "integrity": "sha512-n+lutnbN9mKzSjSVdfsYfzJ40u2971H+iLSL46D6d7zcrA4delxusf/ftGFvj5oGW03OioaFgQOy3Lqa3JmTeA==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@atcute/util-fetch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@atcute/util-fetch/-/util-fetch-2.0.0.tgz", + "integrity": "sha512-v+4aFQ/tuBqTV+URDJaFgm3mASWdglKXiPaGutJ1bs7QtQKmPZeesPY5MzW/a+MtI8GWCEJk8X9wOfalPOFSlg==", + "dev": true, + "license": "0BSD", + "dependencies": { + "valibot": "^1.4.0" + } + }, + "node_modules/@atcute/util-text": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@atcute/util-text/-/util-text-1.3.1.tgz", + "integrity": "sha512-MRgJXkx67znuBXuoAYCJkBZyd3OApL7zZlNf5kXhuoCXcdiu1nblRDycYTADSkym4epBSQWxh26kmI9sewaq6A==", + "dev": true, + "license": "0BSD", + "dependencies": { + "unicode-segmenter": "^0.14.5" + } + }, "node_modules/@babel/code-frame": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", @@ -669,17 +776,22 @@ } }, "node_modules/@emdash-cms/admin": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@emdash-cms/admin/-/admin-0.6.0.tgz", - "integrity": "sha512-RH3HQ8ZovTrKA6l3GvGhp1xifdNxINOUV2ohsVa43dbSLRL+h5ojExCOCQ/g7YoUAYg11F3jjzdDOZxnlOcxcA==", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@emdash-cms/admin/-/admin-0.21.0.tgz", + "integrity": "sha512-67eIt3g4tjOFQAHj6tHHC6NW/wFw2T/q7BzFizaIk+FY6DtRD/pUs3xtbvqCEmhOKQVZGovK/oYNuV8KMt0iXw==", "dev": true, "license": "MIT", "dependencies": { - "@cloudflare/kumo": "^1.16.0", + "@atcute/identity-resolver": "^2.0.0", + "@atcute/lexicons": "^2.0.0", + "@cloudflare/kumo": "^2.4.0", "@dnd-kit/core": "^6.3.1", "@dnd-kit/sortable": "^10.0.0", "@dnd-kit/utilities": "^3.2.2", - "@emdash-cms/blocks": "0.6.0", + "@emdash-cms/blocks": "0.21.0", + "@emdash-cms/plugin-types": "0.1.0", + "@emdash-cms/registry-client": "0.3.2", + "@emdash-cms/registry-lexicons": "0.1.1", "@floating-ui/react": "^0.27.16", "@lingui/core": "^5.9.4", "@lingui/react": "^5.9.4", @@ -688,6 +800,7 @@ "@tanstack/react-router": "1.163.2", "@tiptap/core": "^3.20.0", "@tiptap/extension-character-count": "^3.20.0", + "@tiptap/extension-code-block": "^3.20.0", "@tiptap/extension-drag-handle": "^3.20.0", "@tiptap/extension-drag-handle-react": "^3.20.0", "@tiptap/extension-dropcursor": "^3.20.0", @@ -695,6 +808,10 @@ "@tiptap/extension-link": "^3.20.0", "@tiptap/extension-node-range": "^3.20.0", "@tiptap/extension-placeholder": "^3.20.0", + "@tiptap/extension-table": "^3.20.0", + "@tiptap/extension-table-cell": "^3.20.0", + "@tiptap/extension-table-header": "^3.20.0", + "@tiptap/extension-table-row": "^3.20.0", "@tiptap/extension-text-align": "^3.20.0", "@tiptap/extension-typography": "^3.20.0", "@tiptap/extension-underline": "^3.20.0", @@ -705,8 +822,6 @@ "clsx": "^2.1.1", "dompurify": "^3.3.2", "marked": "^17.0.3", - "react": "19.2.4", - "react-dom": "19.2.4", "react-hotkeys-hook": "^5.2.4", "tailwind-merge": "^3.3.0" }, @@ -716,13 +831,13 @@ } }, "node_modules/@emdash-cms/admin/node_modules/@cloudflare/kumo": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@cloudflare/kumo/-/kumo-1.19.0.tgz", - "integrity": "sha512-Ob91fqIbVwXMk/DTrod8oqs/uLiHOA1AbddJxfoPAuKRSjvVeImck34aow6ZJhWrfJi3uxLFOAI3569r5QFE0A==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@cloudflare/kumo/-/kumo-2.5.2.tgz", + "integrity": "sha512-HUNi40VG3ExJ7lV8HjqPQcGpCmm2CqG/SzjJ+K+NhCwZRYTBvagdoMDPX2XZ8AW/ZPEeuFoId0VYmzrX+luyXQ==", "dev": true, "license": "MIT", "dependencies": { - "@base-ui/react": "^1.2.0", + "@base-ui/react": "^1.5.0", "@shikijs/langs": "^4.0.0", "@shikijs/themes": "^4.0.0", "clsx": "^2.1.1", @@ -742,129 +857,398 @@ "zod": "^4.0.0" }, "peerDependenciesMeta": { + "echarts": { + "optional": true + }, "zod": { "optional": true } } }, - "node_modules/@emdash-cms/admin/node_modules/@tanstack/history": { - "version": "1.161.4", - "resolved": "https://registry.npmjs.org/@tanstack/history/-/history-1.161.4.tgz", - "integrity": "sha512-Kp/WSt411ZWYvgXy6uiv5RmhHrz9cAml05AQPrtdAp7eUqvIDbMGPnML25OKbzR3RJ1q4wgENxDTvlGPa9+Mww==", + "node_modules/@emdash-cms/admin/node_modules/@tiptap/core": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-3.27.0.tgz", + "integrity": "sha512-X53TQUq2xYn21FOC526GlVIycnDkiN9XPYO/NEsg3hXS/SUs1Q6ZLtaM8y3Ox7d+bnTW6CpWKlfyvUWp3scKEw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=20.19" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/pm": "3.27.0" + } + }, + "node_modules/@emdash-cms/admin/node_modules/@tiptap/extension-bubble-menu": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-3.27.0.tgz", + "integrity": "sha512-cy52iePYfzaUUBg3S+00KN+18KMZH+UIlE4wRTEBW/c7OA6M/nkrVkxHYfKeJ3OEbZsRYv+GiRzASchDJVVTZg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@floating-ui/dom": "^1.0.0" }, "funding": { "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.27.0", + "@tiptap/pm": "3.27.0" } }, - "node_modules/@emdash-cms/admin/node_modules/@tanstack/query-core": { - "version": "5.90.20", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.20.tgz", - "integrity": "sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg==", + "node_modules/@emdash-cms/admin/node_modules/@tiptap/extension-character-count": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-character-count/-/extension-character-count-3.27.0.tgz", + "integrity": "sha512-42SsBVYum5ZaejmHsIwbJxrPC+E3HHJ1JOein73ncjGrvAlG6Yb7tzLB/qlL8NMg0BPde2DySBy7sI6zoUNnUA==", "dev": true, "license": "MIT", "funding": { "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/extensions": "3.27.0" } }, - "node_modules/@emdash-cms/admin/node_modules/@tanstack/react-query": { - "version": "5.90.21", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.21.tgz", - "integrity": "sha512-0Lu6y5t+tvlTJMTO7oh5NSpJfpg/5D41LlThfepTixPYkJ0sE2Jj0m0f6yYqujBwIXlId87e234+MxG3D3g7kg==", + "node_modules/@emdash-cms/admin/node_modules/@tiptap/extension-code-block": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-3.27.0.tgz", + "integrity": "sha512-t4cQ093ZRumHG954WKwAVYoZC6bkDrZCP9uqjHWUe1wBMzhqAWQ1OuHfaHpMnzsrdtm/svDO9rB26zBTQ0yZ/Q==", "dev": true, "license": "MIT", - "dependencies": { - "@tanstack/query-core": "5.90.20" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" }, + "peerDependencies": { + "@tiptap/core": "3.27.0", + "@tiptap/pm": "3.27.0" + } + }, + "node_modules/@emdash-cms/admin/node_modules/@tiptap/extension-collaboration": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-collaboration/-/extension-collaboration-3.27.0.tgz", + "integrity": "sha512-IzLOp6mUL0UBMYO37g2cWtx277nz9cdEUJOSH9KzG8MsftnL5teGnVIcqaLoXu+t11yY0kXlqL9rO8S3qPRMNA==", + "dev": true, + "license": "MIT", + "peer": true, "funding": { "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" + "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "react": "^18 || ^19" + "@tiptap/core": "3.27.0", + "@tiptap/pm": "3.27.0", + "@tiptap/y-tiptap": "^3.0.5", + "yjs": "^13" } }, - "node_modules/@emdash-cms/admin/node_modules/@tanstack/react-router": { - "version": "1.163.2", - "resolved": "https://registry.npmjs.org/@tanstack/react-router/-/react-router-1.163.2.tgz", - "integrity": "sha512-1LosUlpL2mRMWxUZXmkEg5+Br5P5j9TrLngqRgHVbZoFkjnbcj1x9fQN2OVLrBv9Npw97NRsHeJljnAH/c7oSw==", + "node_modules/@emdash-cms/admin/node_modules/@tiptap/extension-drag-handle": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-drag-handle/-/extension-drag-handle-3.27.0.tgz", + "integrity": "sha512-UHkGeSDZ53PJwdnIPgBLqdflZlQ/thR5O34jid3gdapAR+4W3DwGvAHcAYKBNqqIj8LpuZZIFKBvn749adgc8A==", "dev": true, "license": "MIT", "dependencies": { - "@tanstack/history": "1.161.4", - "@tanstack/react-store": "^0.9.1", - "@tanstack/router-core": "1.163.2", - "isbot": "^5.1.22", - "tiny-invariant": "^1.3.3", - "tiny-warning": "^1.0.3" + "@floating-ui/dom": "^1.6.13" }, - "engines": { - "node": ">=20.19" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" }, + "peerDependencies": { + "@tiptap/core": "3.27.0", + "@tiptap/extension-collaboration": "3.27.0", + "@tiptap/extension-node-range": "3.27.0", + "@tiptap/pm": "3.27.0", + "@tiptap/y-tiptap": "^3.0.5" + } + }, + "node_modules/@emdash-cms/admin/node_modules/@tiptap/extension-drag-handle-react": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-drag-handle-react/-/extension-drag-handle-react-3.27.0.tgz", + "integrity": "sha512-aZx6ddH7swEfq1XeBUDP03z+7ZQ9sMo/a6yREN3/VfQF9WPDKiUpOGiOXr508oNw2/uvfEjbBF/n1UBj8CtdjA==", + "dev": true, + "license": "MIT", "funding": { "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" + "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "react": ">=18.0.0 || >=19.0.0", - "react-dom": ">=18.0.0 || >=19.0.0" + "@tiptap/extension-drag-handle": "3.27.0", + "@tiptap/pm": "3.27.0", + "@tiptap/react": "3.27.0", + "react": "^16.8 || ^17 || ^18 || ^19", + "react-dom": "^16.8 || ^17 || ^18 || ^19" } }, - "node_modules/@emdash-cms/admin/node_modules/@tanstack/router-core": { - "version": "1.163.2", - "resolved": "https://registry.npmjs.org/@tanstack/router-core/-/router-core-1.163.2.tgz", - "integrity": "sha512-mD0Pav6kcpS317XSJN+wCZaxLLngDhlwgzPNca56dWCp8YKPEvhhj/Zdl+LdRlJQ2VJ5BOy7FbOV1hErc9Nj5Q==", + "node_modules/@emdash-cms/admin/node_modules/@tiptap/extension-dropcursor": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-3.27.0.tgz", + "integrity": "sha512-unWa4Fs2p081Dh/VC9rShby6MqVuom5FdOuLa3JKio6PufsT+Arb87yP6bdsiyUHmWb8ZXXGtxzlCTEt/bm/TA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/extensions": "3.27.0" + } + }, + "node_modules/@emdash-cms/admin/node_modules/@tiptap/extension-floating-menu": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-3.27.0.tgz", + "integrity": "sha512-S9NV/3f1IFkPtIUClLUsJj98AOL3PrYMhPAH/b7SFtsvvfp2QXfL+I12ykPqOcPmj4KXw0Zc40E0QKg67M3pjw==", + "dev": true, + "license": "MIT", + "optional": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@floating-ui/dom": "^1.0.0", + "@tiptap/core": "3.27.0", + "@tiptap/pm": "3.27.0" + } + }, + "node_modules/@emdash-cms/admin/node_modules/@tiptap/extension-focus": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-focus/-/extension-focus-3.27.0.tgz", + "integrity": "sha512-gBrGLYzIa3q/+xD5r/oqw9rddqH+RzctRdarj0HxJS7f/FhAlPCvJ4kwK3Zmmy2PQdYG+H3y5A+OH9//EHoDvw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/extensions": "3.27.0" + } + }, + "node_modules/@emdash-cms/admin/node_modules/@tiptap/extension-link": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-3.27.0.tgz", + "integrity": "sha512-c0fxb1cccM/1JNk7HOoJytKJ9kcpKPeGq86FNHQkqf+Bn+IzPgLb8Q3W89lOp33NlCOx2xiSrUFMBWcPX34z8A==", "dev": true, "license": "MIT", "dependencies": { - "@tanstack/history": "1.161.4", - "@tanstack/store": "^0.9.1", - "cookie-es": "^2.0.0", - "seroval": "^1.4.2", - "seroval-plugins": "^1.4.2", - "tiny-invariant": "^1.3.3", - "tiny-warning": "^1.0.3" + "linkifyjs": "^4.3.3" }, - "engines": { - "node": ">=20.19" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" }, + "peerDependencies": { + "@tiptap/core": "3.27.0", + "@tiptap/pm": "3.27.0" + } + }, + "node_modules/@emdash-cms/admin/node_modules/@tiptap/extension-node-range": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-node-range/-/extension-node-range-3.27.0.tgz", + "integrity": "sha512-WiBF8N9Jc5nhlOFjVAskLdSKuEzxtpM10XAVVPbF2oih+VytB033ipD6GDYdXRYGVDkVqi0mpXKn5eVix/or4A==", + "dev": true, + "license": "MIT", "funding": { "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.27.0", + "@tiptap/pm": "3.27.0" } }, - "node_modules/@emdash-cms/admin/node_modules/react": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", - "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "node_modules/@emdash-cms/admin/node_modules/@tiptap/extension-placeholder": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-placeholder/-/extension-placeholder-3.27.0.tgz", + "integrity": "sha512-lT/wUype2OLoTPuSrWTZQJxcfJZfnBYhPmMAPk0NkGp9V5xml5m4dQ6W0+Cz1CW5lglshvn8c8C9rWs70XCHvA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/extensions": "3.27.0" + } + }, + "node_modules/@emdash-cms/admin/node_modules/@tiptap/extension-table": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-table/-/extension-table-3.27.0.tgz", + "integrity": "sha512-p4QGpX5qVbvaM+AyZrzk/1GhPX7fe14otTmgGsV4MBRMZTU26bfXYerKhadnuYUee7CAfUJKMsNXzfx0gzLbGQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.27.0", + "@tiptap/pm": "3.27.0" + } + }, + "node_modules/@emdash-cms/admin/node_modules/@tiptap/extension-table-cell": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-table-cell/-/extension-table-cell-3.27.0.tgz", + "integrity": "sha512-e0JO0qz0jvI2BNrlw/CoOrD0zD8gpgM3cCS/gp/LCLRsHxzNJewEx8lKrjjyH4c0jvQfeqMX+HeDsglntGF8pg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/extension-table": "3.27.0" + } + }, + "node_modules/@emdash-cms/admin/node_modules/@tiptap/extension-table-header": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-table-header/-/extension-table-header-3.27.0.tgz", + "integrity": "sha512-CrZ4HJB0N3ekIiHvOee1CU+cm4EXn5vfOSPzMRAoUsocBSXuDKnzjoKt5TQMHohns0y241JJqsdFOnwN7EV4TA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/extension-table": "3.27.0" + } + }, + "node_modules/@emdash-cms/admin/node_modules/@tiptap/extension-table-row": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-table-row/-/extension-table-row-3.27.0.tgz", + "integrity": "sha512-dhmMuoMGJ0RI3Ad5CqLto1vRy67yM671cIZQaFjtqhTJhI9Ja/E+AFgzliU/pYN4BhmbX08Y3VQS/Y59fsblxQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/extension-table": "3.27.0" + } + }, + "node_modules/@emdash-cms/admin/node_modules/@tiptap/extension-text-align": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text-align/-/extension-text-align-3.27.0.tgz", + "integrity": "sha512-9KTDxoKUdPkzZ8WYbcbn5TAFi2towAdXiegbT+2sX7YQH4efsPBwMBOvlFnQyDkDuvt5Sh1Yc3QoMaK+HNKyUg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.27.0" + } + }, + "node_modules/@emdash-cms/admin/node_modules/@tiptap/extension-typography": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-typography/-/extension-typography-3.27.0.tgz", + "integrity": "sha512-n9aV713nfBXyiSuBOp2lvMjUwhdtz7HcMDaqe9Embo8cSDLOwVhvO9A9bE/WT2FIuPrdhdYOsYIIvo3CSPR8xw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.27.0" + } + }, + "node_modules/@emdash-cms/admin/node_modules/@tiptap/extension-underline": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-3.27.0.tgz", + "integrity": "sha512-0w3GDF5rC0oZXYh6jBt8jPS+SQ5mtJsyDjP94A0Qjh/7tsfeDzCzZMAadE4i+9g6DI1Hce4GqYDAAfPkoj4y5Q==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.27.0" + } + }, + "node_modules/@emdash-cms/admin/node_modules/@tiptap/extensions": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extensions/-/extensions-3.27.0.tgz", + "integrity": "sha512-G4ufNa/F4upDI/2YWFBCVBs4skcCeQ2jvRQiFrLJCitUFcl03evP0znAvx5JKj9+nfm4ILYpPpncEFyMq4mFEg==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.27.0", + "@tiptap/pm": "3.27.0" } }, - "node_modules/@emdash-cms/admin/node_modules/react-dom": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", - "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "node_modules/@emdash-cms/admin/node_modules/@tiptap/pm": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-3.27.0.tgz", + "integrity": "sha512-cWuyaY19SoTOGwdPzhNrUuFMMILuR7mq/Ec02FO+y5jUnQiJYOy9pVx4RUIjBT24LYXrvA9YRhxL1v+KQKTz3A==", "dev": true, "license": "MIT", "dependencies": { - "scheduler": "^0.27.0" + "prosemirror-changeset": "^2.3.0", + "prosemirror-commands": "^1.6.2", + "prosemirror-dropcursor": "^1.8.1", + "prosemirror-gapcursor": "^1.3.2", + "prosemirror-history": "^1.4.1", + "prosemirror-inputrules": "^1.4.0", + "prosemirror-keymap": "^1.2.3", + "prosemirror-model": "^1.25.7", + "prosemirror-schema-list": "^1.5.0", + "prosemirror-state": "^1.4.4", + "prosemirror-tables": "^1.8.0", + "prosemirror-transform": "^1.12.0", + "prosemirror-view": "^1.41.8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + } + }, + "node_modules/@emdash-cms/admin/node_modules/@tiptap/react": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-3.27.0.tgz", + "integrity": "sha512-C7FSa5yNPKaCll/Bvm0GmlJh2VLVJXNpKxC9I/L5BJdeVWXV3Prbt56U9FFYd8hjydFZ32GF3jUYQlVYHxnwHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/use-sync-external-store": "^0.0.6", + "fast-equals": "^5.3.3", + "use-sync-external-store": "^1.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "optionalDependencies": { + "@tiptap/extension-bubble-menu": "^3.27.0", + "@tiptap/extension-floating-menu": "^3.27.0" }, "peerDependencies": { - "react": "^19.2.4" + "@tiptap/core": "3.27.0", + "@tiptap/pm": "3.27.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "@types/react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/@emdash-cms/auth": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@emdash-cms/auth/-/auth-0.6.0.tgz", - "integrity": "sha512-1ikvF2jYifAMvAIn5ulS8ljnl5eDy3qNKZoVIfGaqtTKQqxtpXcVBH4AY6W7ssebrei7Kpyz/IfRRsxLQZRSOw==", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@emdash-cms/auth/-/auth-0.21.0.tgz", + "integrity": "sha512-YNb5nINyOWBGtSj00EdXgE3cYAWWCzp6I4R6KZOkJ4fiTDsemVEfeMg6Mnia7j58ulVOkSKTxe2PIZ5ycqgyyA==", "dev": true, "license": "MIT", "dependencies": { @@ -872,11 +1256,11 @@ "@oslojs/encoding": "^1.1.0", "@oslojs/webauthn": "^1.0.0", "ulidx": "^2.4.1", - "zod": "^4.3.5" + "zod": "^4.4.1" }, "peerDependencies": { "astro": ">=6.0.0-beta.0", - "kysely": "^0.27.0" + "kysely": "^0.29.0" }, "peerDependenciesMeta": { "kysely": { @@ -895,13 +1279,13 @@ } }, "node_modules/@emdash-cms/blocks": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@emdash-cms/blocks/-/blocks-0.6.0.tgz", - "integrity": "sha512-Sh9Iy180+wexCkoyz12EEQMfdae3U8+sLY/Kgqvi54ZpplSibsWbwQ/ASnI/ONZ10uo4Vxy0zY1Hj/PEJ/09ww==", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@emdash-cms/blocks/-/blocks-0.21.0.tgz", + "integrity": "sha512-w1eNhigksiZrBZ1r6U9wSvEr/so9lR37kPzSOX79E4ozTKMvwXErd4zdIYwVf7hlMjTzYuPZM8LuPRnbsYgvbg==", "dev": true, "license": "MIT", "dependencies": { - "@cloudflare/kumo": "^1.10.0", + "@cloudflare/kumo": "^2.4.0", "@phosphor-icons/react": "^2.1.10", "clsx": "^2.1.1", "echarts": "^6.0.0", @@ -913,13 +1297,13 @@ } }, "node_modules/@emdash-cms/blocks/node_modules/@cloudflare/kumo": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@cloudflare/kumo/-/kumo-1.19.0.tgz", - "integrity": "sha512-Ob91fqIbVwXMk/DTrod8oqs/uLiHOA1AbddJxfoPAuKRSjvVeImck34aow6ZJhWrfJi3uxLFOAI3569r5QFE0A==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@cloudflare/kumo/-/kumo-2.5.2.tgz", + "integrity": "sha512-HUNi40VG3ExJ7lV8HjqPQcGpCmm2CqG/SzjJ+K+NhCwZRYTBvagdoMDPX2XZ8AW/ZPEeuFoId0VYmzrX+luyXQ==", "dev": true, "license": "MIT", "dependencies": { - "@base-ui/react": "^1.2.0", + "@base-ui/react": "^1.5.0", "@shikijs/langs": "^4.0.0", "@shikijs/themes": "^4.0.0", "clsx": "^2.1.1", @@ -939,15 +1323,18 @@ "zod": "^4.0.0" }, "peerDependenciesMeta": { + "echarts": { + "optional": true + }, "zod": { "optional": true } } }, "node_modules/@emdash-cms/gutenberg-to-portable-text": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@emdash-cms/gutenberg-to-portable-text/-/gutenberg-to-portable-text-0.6.0.tgz", - "integrity": "sha512-8Mp4+0joY59Jd8U5pzyapRiGZaSYPy1z+7JIeJX3t2a6pcP6cJMPfbSHx5ObChP0pDYWR68DcdPnWGrOcUsRNw==", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@emdash-cms/gutenberg-to-portable-text/-/gutenberg-to-portable-text-0.21.0.tgz", + "integrity": "sha512-VQn5EvR8qwh/OOLroUAGZdZFt5M03gbUXyqjY6k817DqaYoqppWGLvv+IQcnUlnaGzUDGopMkqBVSEsFTZSt/g==", "dev": true, "license": "MIT", "dependencies": { @@ -955,6 +1342,37 @@ "parse5": "^7.2.1" } }, + "node_modules/@emdash-cms/plugin-types": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@emdash-cms/plugin-types/-/plugin-types-0.1.0.tgz", + "integrity": "sha512-aV6bQ/XUK/KBjuG6wVMhtMPWjG4n5VM5qjZY1SVJed9qFWKmzvyMlf00x2Y/nQfp5Hik2Yj2AVeAGf0dtuhvOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@emdash-cms/registry-client": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@emdash-cms/registry-client/-/registry-client-0.3.2.tgz", + "integrity": "sha512-2mjKuMUbFNeLVuRoBwbB4xu1AXpsCWFSJLIJcH0tceddd6MZEAYpkaiQLFpBhrIDYKFM5Gg73Qha7UX9PmQ7PA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@atcute/atproto": "^4.0.2", + "@atcute/client": "^5.0.0", + "@atcute/lexicons": "^2.0.0", + "@emdash-cms/registry-lexicons": "0.1.1" + } + }, + "node_modules/@emdash-cms/registry-lexicons": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@emdash-cms/registry-lexicons/-/registry-lexicons-0.1.1.tgz", + "integrity": "sha512-0en1SWbqP4lICGafxHhJzxpCbAYB2fk2uPYmsAAi4lILGtR0/fY6HCLZ17ta16zTf12Q7H0VhuA0zEl9Gc93Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@atcute/atproto": "^4.0.2", + "@atcute/lexicons": "^2.0.0" + } + }, "node_modules/@emmetio/abbreviation": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/@emmetio/abbreviation/-/abbreviation-2.3.3.tgz", @@ -3077,12 +3495,11 @@ } }, "node_modules/@tanstack/history": { - "version": "1.161.6", - "resolved": "https://registry.npmjs.org/@tanstack/history/-/history-1.161.6.tgz", - "integrity": "sha512-NaOGLRrddszbQj9upGat6HG/4TKvXLvu+osAIgfxPYA+eIvYKv8GKDJOrY2D3/U9MRnKfMWD7bU4jeD4xmqyIg==", + "version": "1.161.4", + "resolved": "https://registry.npmjs.org/@tanstack/history/-/history-1.161.4.tgz", + "integrity": "sha512-Kp/WSt411ZWYvgXy6uiv5RmhHrz9cAml05AQPrtdAp7eUqvIDbMGPnML25OKbzR3RJ1q4wgENxDTvlGPa9+Mww==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=20.19" }, @@ -3092,26 +3509,24 @@ } }, "node_modules/@tanstack/query-core": { - "version": "5.97.0", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.97.0.tgz", - "integrity": "sha512-QdpLP5VzVMgo4VtaPppRA2W04UFjIqX+bxke/ZJhE5cfd5UPkRzqIAJQt9uXkQJjqE8LBOMbKv7f8HCsZltXlg==", + "version": "5.90.20", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.20.tgz", + "integrity": "sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg==", "dev": true, "license": "MIT", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" } }, "node_modules/@tanstack/react-query": { - "version": "5.97.0", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.97.0.tgz", - "integrity": "sha512-y4So4eGcQoK2WVMAcDNZE9ofB/p5v1OlKvtc1F3uqHwrtifobT7q+ZnXk2mRkc8E84HKYSlAE9z6HXl2V0+ySQ==", + "version": "5.90.21", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.21.tgz", + "integrity": "sha512-0Lu6y5t+tvlTJMTO7oh5NSpJfpg/5D41LlThfepTixPYkJ0sE2Jj0m0f6yYqujBwIXlId87e234+MxG3D3g7kg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@tanstack/query-core": "5.97.0" + "@tanstack/query-core": "5.90.20" }, "funding": { "type": "github", @@ -3122,17 +3537,18 @@ } }, "node_modules/@tanstack/react-router": { - "version": "1.168.10", - "resolved": "https://registry.npmjs.org/@tanstack/react-router/-/react-router-1.168.10.tgz", - "integrity": "sha512-/RmDlOwDkCug609KdPB3U+U1zmrtadJpvsmRg2zEn8TRCKRNri7dYZIjQZbNg8PgUiRL4T6njrZBV1ChzblNaA==", + "version": "1.163.2", + "resolved": "https://registry.npmjs.org/@tanstack/react-router/-/react-router-1.163.2.tgz", + "integrity": "sha512-1LosUlpL2mRMWxUZXmkEg5+Br5P5j9TrLngqRgHVbZoFkjnbcj1x9fQN2OVLrBv9Npw97NRsHeJljnAH/c7oSw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@tanstack/history": "1.161.6", - "@tanstack/react-store": "^0.9.3", - "@tanstack/router-core": "1.168.9", - "isbot": "^5.1.22" + "@tanstack/history": "1.161.4", + "@tanstack/react-store": "^0.9.1", + "@tanstack/router-core": "1.163.2", + "isbot": "^5.1.22", + "tiny-invariant": "^1.3.3", + "tiny-warning": "^1.0.3" }, "engines": { "node": ">=20.19" @@ -3166,20 +3582,19 @@ } }, "node_modules/@tanstack/router-core": { - "version": "1.168.9", - "resolved": "https://registry.npmjs.org/@tanstack/router-core/-/router-core-1.168.9.tgz", - "integrity": "sha512-18oeEwEDyXOIuO1VBP9ACaK7tYHZUjynGDCoUh/5c/BNhia9vCJCp9O0LfhZXOorDc/PmLSgvmweFhVmIxF10g==", + "version": "1.163.2", + "resolved": "https://registry.npmjs.org/@tanstack/router-core/-/router-core-1.163.2.tgz", + "integrity": "sha512-mD0Pav6kcpS317XSJN+wCZaxLLngDhlwgzPNca56dWCp8YKPEvhhj/Zdl+LdRlJQ2VJ5BOy7FbOV1hErc9Nj5Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@tanstack/history": "1.161.6", + "@tanstack/history": "1.161.4", + "@tanstack/store": "^0.9.1", "cookie-es": "^2.0.0", "seroval": "^1.4.2", - "seroval-plugins": "^1.4.2" - }, - "bin": { - "intent": "bin/intent.js" + "seroval-plugins": "^1.4.2", + "tiny-invariant": "^1.3.3", + "tiny-warning": "^1.0.3" }, "engines": { "node": ">=20.19" @@ -3206,6 +3621,7 @@ "integrity": "sha512-7jTed/RirIVsp+lLdLvGzGqF3EBGpnGHGYKOwz6t28V2BIJLAFdUhfEVdWie7xPxQNWK0TP+fPlsqZS0vxfHBg==", "dev": true, "license": "MIT", + "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3214,99 +3630,10 @@ "@tiptap/pm": "3.26.0" } }, - "node_modules/@tiptap/extension-blockquote": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-3.26.0.tgz", - "integrity": "sha512-57accpka9affjiJRjP2LMNCDJDTMjTvO23RJCxtP43sp9cTIZ7YZnyDfRxCINTRBNK0X4o4w2+emOLyRwsk3CA==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "3.26.0" - } - }, - "node_modules/@tiptap/extension-bold": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-3.26.0.tgz", - "integrity": "sha512-j6CzTMofcGJ5iMoUgDRQpM0FkG00jBID3aKqs+UBbgtzLgtG/CI/91tMFv0XPC30LeFA895qYgvGZtHdejZhiQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "3.26.0" - } - }, - "node_modules/@tiptap/extension-bubble-menu": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-3.26.0.tgz", - "integrity": "sha512-H2E3Hp0lV79jQV8YGtdDJkXkUalXZeYzKCx+vCZlDpb2ChS7/rNT9YY7poRA1NlJLUO0DH1wbAnFhx9KZMUx5g==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@floating-ui/dom": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "3.26.0", - "@tiptap/pm": "3.26.0" - } - }, - "node_modules/@tiptap/extension-bullet-list": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-3.26.0.tgz", - "integrity": "sha512-Jv7BX+kBB2wUIvO/NhuUjv+T3kAed2Tjr664fgQ2zKT6X69jKIkYuCCedrIHuOyaOQ+SBDuH9h51wYv/E97QgQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/extension-list": "3.26.0" - } - }, - "node_modules/@tiptap/extension-character-count": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-character-count/-/extension-character-count-3.26.0.tgz", - "integrity": "sha512-/QmKuVlECmp/8+hN6f9Vunud5XEGf8F5l/oq1nCOU8WUIUPPCKEyKwbWguHqVsiqAYKBqZt6tvTsdX8dGItgQQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/extensions": "3.26.0" - } - }, - "node_modules/@tiptap/extension-code": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-3.26.0.tgz", - "integrity": "sha512-VJYcV6rvjnENRTroOi9tDcHWW6G0pmCoRETwatlbgfDzuCmkTOwVwQjeJCXOVMMLNPzNiXZzibsRCUt+Azq/jw==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "3.26.0" - } - }, - "node_modules/@tiptap/extension-code-block": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-3.26.0.tgz", - "integrity": "sha512-WPN9iZ3UjeDD2ckDzSs9tleibXv0cLj7j575NxuvjhwZTehYGNeYDSUTi+6DQUG6bKbhGg9Wcei5H0131vvJHg==", + "node_modules/@tiptap/extension-image": { + "version": "3.22.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-image/-/extension-image-3.22.3.tgz", + "integrity": "sha512-Qpp8c5LOQaNpHrzjqZtoxtIR+8sSqJ7k8v+8anmYw3nxjvt2kpfT28Vd7aWMX55ZS43LaxMx+MkZqbmgUmMP0w==", "dev": true, "license": "MIT", "funding": { @@ -3314,85 +3641,77 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.26.0", - "@tiptap/pm": "3.26.0" + "@tiptap/core": "^3.22.3" } }, - "node_modules/@tiptap/extension-collaboration": { + "node_modules/@tiptap/pm": { "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-collaboration/-/extension-collaboration-3.26.0.tgz", - "integrity": "sha512-zSNsjznGSpYC9CYg3acvLOt36ldjs4dA2qEsh7jaONqo6sKJo76UuZAN0N38V8qnH8WtAWes4uGmwWcWcRg90A==", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-3.26.0.tgz", + "integrity": "sha512-q4RDeWwVrhOL0jJCGRgGxLSdjOYwzQ4h2InURZVhC66433ipcHd6f3bqSOhcXZ4r0sFmMNsuF7aZmUntjWLc7w==", "dev": true, "license": "MIT", "peer": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "3.26.0", - "@tiptap/pm": "3.26.0", - "@tiptap/y-tiptap": "^3.0.4", - "yjs": "^13" - } - }, - "node_modules/@tiptap/extension-document": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-3.26.0.tgz", - "integrity": "sha512-Xhd6DCjaxCN4otQNvV6qra+XuoIjk6Vyjm87E5xn5Y/BMw7UGAG7LTkk3C2IEvxKrVZwJjalfxEqdHOgXQzVfw==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "3.26.0" - } - }, - "node_modules/@tiptap/extension-drag-handle": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-drag-handle/-/extension-drag-handle-3.26.0.tgz", - "integrity": "sha512-TUnSbNVKGwUfGZnIrOKf97CY8po6R0oy3Wx0yRVlXiLej+wlGNqOp4xgjLSuUNkNP0ZikifWZAhYjnqiVNBfIA==", - "dev": true, - "license": "MIT", "dependencies": { - "@floating-ui/dom": "^1.6.13" + "prosemirror-changeset": "^2.3.0", + "prosemirror-commands": "^1.6.2", + "prosemirror-dropcursor": "^1.8.1", + "prosemirror-gapcursor": "^1.3.2", + "prosemirror-history": "^1.4.1", + "prosemirror-inputrules": "^1.4.0", + "prosemirror-keymap": "^1.2.3", + "prosemirror-model": "^1.25.7", + "prosemirror-schema-list": "^1.5.0", + "prosemirror-state": "^1.4.4", + "prosemirror-tables": "^1.8.0", + "prosemirror-transform": "^1.12.0", + "prosemirror-view": "^1.41.8" }, "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "3.26.0", - "@tiptap/extension-collaboration": "3.26.0", - "@tiptap/extension-node-range": "3.26.0", - "@tiptap/pm": "3.26.0", - "@tiptap/y-tiptap": "^3.0.2" } }, - "node_modules/@tiptap/extension-drag-handle-react": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-drag-handle-react/-/extension-drag-handle-react-3.26.0.tgz", - "integrity": "sha512-iIl1LRpxKRcMYHUQ0391CyrzQ9BNpFLSeSlubmhVrrwHXfo1Hk+GoKo5Jsxgn4LA32FVDJBT0MQu14f+IYv+UQ==", - "dev": true, - "license": "MIT", + "node_modules/@tiptap/starter-kit": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-3.27.0.tgz", + "integrity": "sha512-AFrNuIpeyr2FJsWP5sjD0uhJfPBHdEKBByrqLu4O9h/OI8qJYKaPo9PxMXA2jQlWgDq6z0r8GPrr3PbJCMe1JA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tiptap/core": "^3.27.0", + "@tiptap/extension-blockquote": "^3.27.0", + "@tiptap/extension-bold": "^3.27.0", + "@tiptap/extension-bullet-list": "^3.27.0", + "@tiptap/extension-code": "^3.27.0", + "@tiptap/extension-code-block": "^3.27.0", + "@tiptap/extension-document": "^3.27.0", + "@tiptap/extension-dropcursor": "^3.27.0", + "@tiptap/extension-gapcursor": "^3.27.0", + "@tiptap/extension-hard-break": "^3.27.0", + "@tiptap/extension-heading": "^3.27.0", + "@tiptap/extension-horizontal-rule": "^3.27.0", + "@tiptap/extension-italic": "^3.27.0", + "@tiptap/extension-link": "^3.27.0", + "@tiptap/extension-list": "^3.27.0", + "@tiptap/extension-list-item": "^3.27.0", + "@tiptap/extension-list-keymap": "^3.27.0", + "@tiptap/extension-ordered-list": "^3.27.0", + "@tiptap/extension-paragraph": "^3.27.0", + "@tiptap/extension-strike": "^3.27.0", + "@tiptap/extension-text": "^3.27.0", + "@tiptap/extension-underline": "^3.27.0", + "@tiptap/extensions": "^3.27.0", + "@tiptap/pm": "^3.27.0" + }, "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/extension-drag-handle": "3.26.0", - "@tiptap/pm": "3.26.0", - "@tiptap/react": "3.26.0", - "react": "^16.8 || ^17 || ^18 || ^19", - "react-dom": "^16.8 || ^17 || ^18 || ^19" } }, - "node_modules/@tiptap/extension-dropcursor": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-3.26.0.tgz", - "integrity": "sha512-rhAtp5J/YVDUCUIc5T7b0XY9dLeuI72JgOr53w0QQc0VA0uwbfTn7sx0LI9PDCE9uwmDH8H3snVRZRnAvlM8oA==", + "node_modules/@tiptap/starter-kit/node_modules/@tiptap/core": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-3.27.0.tgz", + "integrity": "sha512-X53TQUq2xYn21FOC526GlVIycnDkiN9XPYO/NEsg3hXS/SUs1Q6ZLtaM8y3Ox7d+bnTW6CpWKlfyvUWp3scKEw==", "dev": true, "license": "MIT", "funding": { @@ -3400,30 +3719,27 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extensions": "3.26.0" + "@tiptap/pm": "3.27.0" } }, - "node_modules/@tiptap/extension-floating-menu": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-3.26.0.tgz", - "integrity": "sha512-reQ77NRYAOP7iPudsNbzLBuBTdL2aGxZzjccUFmE2lNdmwP23n9A/JhkuUhshVBs/6IozvahI+smG3Bnea0TCQ==", + "node_modules/@tiptap/starter-kit/node_modules/@tiptap/extension-blockquote": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-3.27.0.tgz", + "integrity": "sha512-xQvy+n1m4oxv/QLjWdg+FrrKpkyQqU1qbLjVQTdQP/kczqvaJhjzbJFBc38K0vvzMUvBKH0x6sr3GQVl4D84wg==", "dev": true, "license": "MIT", - "optional": true, "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@floating-ui/dom": "^1.0.0", - "@tiptap/core": "3.26.0", - "@tiptap/pm": "3.26.0" + "@tiptap/core": "3.27.0" } }, - "node_modules/@tiptap/extension-focus": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-focus/-/extension-focus-3.26.0.tgz", - "integrity": "sha512-9+kyjiAuYeFMs8Q/iMwm5nDpWZoYuXPIt+mCZ/jMDZ8lXsWQF4UBZeYEfE8bfYJG3QMB3oxeoVDYRYaEnPZ1CA==", + "node_modules/@tiptap/starter-kit/node_modules/@tiptap/extension-bold": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-3.27.0.tgz", + "integrity": "sha512-GbnnDVbChgp9KWv+6EBuNNYEvNVbtLPYXPm809DQPi7rvb2SI/LOzLgWgVKByQqhoh498WWVBhsg/pvQ9Va9tw==", "dev": true, "license": "MIT", "funding": { @@ -3431,13 +3747,13 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extensions": "3.26.0" + "@tiptap/core": "3.27.0" } }, - "node_modules/@tiptap/extension-gapcursor": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-3.26.0.tgz", - "integrity": "sha512-SIe68SDwx2fozt/XKG0FhCwzz/yRN6Bvo4D5TqvfDg6NK3PQb1DS4GN9PilmJqbY+kXryuiWEEJOWi7HpO8SuQ==", + "node_modules/@tiptap/starter-kit/node_modules/@tiptap/extension-bullet-list": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-3.27.0.tgz", + "integrity": "sha512-86x8y0IzhOnRLnq5P9eTE/kgs6j383fTME+h0uNfOFfkQmzR4GLph8nkdGraormzI3+GKQUQaO4k/6bE+PSVpg==", "dev": true, "license": "MIT", "funding": { @@ -3445,13 +3761,13 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extensions": "3.26.0" + "@tiptap/extension-list": "3.27.0" } }, - "node_modules/@tiptap/extension-hard-break": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-3.26.0.tgz", - "integrity": "sha512-baXvv/rtOTVd2Axjb7Zbb41Y9Qmy3U2fP7EHqLuhViqGxVX8LwQtP0PHUXEZkPokbBpRez10+dmOlvvsYFKAZQ==", + "node_modules/@tiptap/starter-kit/node_modules/@tiptap/extension-code": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-3.27.0.tgz", + "integrity": "sha512-lKJqy75GRxiNncaaBs9lutsEuVQR7AKZGFfy9Sg2nRTweWLpD6eNhSHI4N04EJvTIjxZjHAe9fGU50ZhS2ONiA==", "dev": true, "license": "MIT", "funding": { @@ -3459,13 +3775,13 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.26.0" + "@tiptap/core": "3.27.0" } }, - "node_modules/@tiptap/extension-heading": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-3.26.0.tgz", - "integrity": "sha512-qenEQEgzE5FjQay/H6iKOnwIt6DPO27cS+v0mGhXmrL1MjrNER4X0ZkATJbVd0WA6ffsAGaP44NKYDworGeidw==", + "node_modules/@tiptap/starter-kit/node_modules/@tiptap/extension-code-block": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-3.27.0.tgz", + "integrity": "sha512-t4cQ093ZRumHG954WKwAVYoZC6bkDrZCP9uqjHWUe1wBMzhqAWQ1OuHfaHpMnzsrdtm/svDO9rB26zBTQ0yZ/Q==", "dev": true, "license": "MIT", "funding": { @@ -3473,13 +3789,14 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.26.0" + "@tiptap/core": "3.27.0", + "@tiptap/pm": "3.27.0" } }, - "node_modules/@tiptap/extension-horizontal-rule": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-3.26.0.tgz", - "integrity": "sha512-a+N/C4wkQV+/8x4ShdoiC2JdTW3Tw84C5cAloYLFMeaWmRa2me9ACSI+zo0SO9bbH9RJwsoRp7eaxBbk27eF1Q==", + "node_modules/@tiptap/starter-kit/node_modules/@tiptap/extension-document": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-3.27.0.tgz", + "integrity": "sha512-xE+rUAPAA+65Usxbn5OoPVh0I0FSPz5dYprj+uo1mogPgqpcPLGVNMMoRLZ4WdiZ3I451d5+U7CUynIjD/iikw==", "dev": true, "license": "MIT", "funding": { @@ -3487,14 +3804,13 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.26.0", - "@tiptap/pm": "3.26.0" + "@tiptap/core": "3.27.0" } }, - "node_modules/@tiptap/extension-image": { - "version": "3.22.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-image/-/extension-image-3.22.3.tgz", - "integrity": "sha512-Qpp8c5LOQaNpHrzjqZtoxtIR+8sSqJ7k8v+8anmYw3nxjvt2kpfT28Vd7aWMX55ZS43LaxMx+MkZqbmgUmMP0w==", + "node_modules/@tiptap/starter-kit/node_modules/@tiptap/extension-dropcursor": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-3.27.0.tgz", + "integrity": "sha512-unWa4Fs2p081Dh/VC9rShby6MqVuom5FdOuLa3JKio6PufsT+Arb87yP6bdsiyUHmWb8ZXXGtxzlCTEt/bm/TA==", "dev": true, "license": "MIT", "funding": { @@ -3502,13 +3818,13 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.22.3" + "@tiptap/extensions": "3.27.0" } }, - "node_modules/@tiptap/extension-italic": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-3.26.0.tgz", - "integrity": "sha512-s8oFpH+0xmhvY19f452/2dExO3p1tjxh761g6cg4irwEUNUEAJKF2VLcjiaeOhNJ+pmnQYxb+VSkwkXvO+7vHQ==", + "node_modules/@tiptap/starter-kit/node_modules/@tiptap/extension-gapcursor": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-3.27.0.tgz", + "integrity": "sha512-tHIUQmtebBytVpd2f5oCUMAivdN5Yj8zRDpkA5uT3x38s9OdXLjLLYZHDD7b0ANQnN0r1vkxPXi9YF6+2XWZvA==", "dev": true, "license": "MIT", "funding": { @@ -3516,31 +3832,27 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.26.0" + "@tiptap/extensions": "3.27.0" } }, - "node_modules/@tiptap/extension-link": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-3.26.0.tgz", - "integrity": "sha512-FA/d157aBxyvZFvsdc5eSu46tmHWXebAsqOQSvivOMyw+deBb00VlMsf+iD2J8+sekjbMYwx/hvbsu+xUoX43Q==", + "node_modules/@tiptap/starter-kit/node_modules/@tiptap/extension-hard-break": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-3.27.0.tgz", + "integrity": "sha512-/DDTnvuW1/3qGfX5VKEFwTDHV1/ks5jMFXgMPlHXb/ASo+kb4HEohzuUYcO74Y3vtU2zENWJ2UBqsJ96TkjgOA==", "dev": true, "license": "MIT", - "dependencies": { - "linkifyjs": "^4.3.3" - }, "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.26.0", - "@tiptap/pm": "3.26.0" + "@tiptap/core": "3.27.0" } }, - "node_modules/@tiptap/extension-list": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-list/-/extension-list-3.26.0.tgz", - "integrity": "sha512-EM8woyHDNKLEQ+lWUEoDtA4KrwP6fei/mYX1NxseMzKHHo7LFecx7wk6sovAXZrUvdML/yFBihgiMiO5VIsfkg==", + "node_modules/@tiptap/starter-kit/node_modules/@tiptap/extension-heading": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-3.27.0.tgz", + "integrity": "sha512-KDN/8RyL3/VoXpSzRtNQ3hsreBUbHgMGmpqJpRvbykQ6wJ/W421uHfZR/hCsB3RNRB0kHZJdw4hDLfP73Ff6Ig==", "dev": true, "license": "MIT", "funding": { @@ -3548,14 +3860,13 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.26.0", - "@tiptap/pm": "3.26.0" + "@tiptap/core": "3.27.0" } }, - "node_modules/@tiptap/extension-list-item": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-3.26.0.tgz", - "integrity": "sha512-MccGyj9HY4fkl04eIiFoTCkr8067Jku/VVdJNtRWW104Spx43C/7V2zpbxPvpcDhq3dW384fDxYXfpnb186xLg==", + "node_modules/@tiptap/starter-kit/node_modules/@tiptap/extension-horizontal-rule": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-3.27.0.tgz", + "integrity": "sha512-04Xga9CqIqzKb1cqDk9AV9pTbtleqF+o8X3bb3n7HDgplYHxLjHId6RCzhfSZU6U8VZZF/RJQ1jbTebeYqGSBw==", "dev": true, "license": "MIT", "funding": { @@ -3563,13 +3874,14 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extension-list": "3.26.0" + "@tiptap/core": "3.27.0", + "@tiptap/pm": "3.27.0" } }, - "node_modules/@tiptap/extension-list-keymap": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-list-keymap/-/extension-list-keymap-3.26.0.tgz", - "integrity": "sha512-oBcj6qaNrRHQ+N0+pDuOVAQa4Nx9r8Cm5ANvyM2lTpoy60sOLOizuVvcvw1andVxbSrsZ1N/Sk+RZWyv1uoWyQ==", + "node_modules/@tiptap/starter-kit/node_modules/@tiptap/extension-italic": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-3.27.0.tgz", + "integrity": "sha512-z/EomYhfaf9oxtYz4+yxaIO6cw9Sa2CVw7jsnGR0jf0CZk6B+5iTbNeJDMxpSeYg+dAPOWYiO8vWOeKM0gYPFQ==", "dev": true, "license": "MIT", "funding": { @@ -3577,28 +3889,31 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extension-list": "3.26.0" + "@tiptap/core": "3.27.0" } }, - "node_modules/@tiptap/extension-node-range": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-node-range/-/extension-node-range-3.26.0.tgz", - "integrity": "sha512-LYPStSzfVicp3AGqIl5nsUbd86bqZCz0F1+N03cJIZ2hAj3kXU8ouLLGhE+EIq66Y8vh/SdN/imyIEoqtuA1QQ==", + "node_modules/@tiptap/starter-kit/node_modules/@tiptap/extension-link": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-3.27.0.tgz", + "integrity": "sha512-c0fxb1cccM/1JNk7HOoJytKJ9kcpKPeGq86FNHQkqf+Bn+IzPgLb8Q3W89lOp33NlCOx2xiSrUFMBWcPX34z8A==", "dev": true, "license": "MIT", + "dependencies": { + "linkifyjs": "^4.3.3" + }, "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.26.0", - "@tiptap/pm": "3.26.0" + "@tiptap/core": "3.27.0", + "@tiptap/pm": "3.27.0" } }, - "node_modules/@tiptap/extension-ordered-list": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-3.26.0.tgz", - "integrity": "sha512-ItLdFlcMsJz2vhbs1PcUfcN7nzVqGBOwPeCrrWxjrgscp+K3JoOGD+HhVVpBACOMwivUrlh8Ry5Ohvues2nOeA==", + "node_modules/@tiptap/starter-kit/node_modules/@tiptap/extension-list": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list/-/extension-list-3.27.0.tgz", + "integrity": "sha512-27L9zP3SeKxW8DBfXcJtVnlfW6lJr6xm8C/WJ/iSlts/JHv1GwWwE7FWErmpkGeX6FwLnuaZbTMbfyyTlm4Dtg==", "dev": true, "license": "MIT", "funding": { @@ -3606,13 +3921,14 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extension-list": "3.26.0" + "@tiptap/core": "3.27.0", + "@tiptap/pm": "3.27.0" } }, - "node_modules/@tiptap/extension-paragraph": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-3.26.0.tgz", - "integrity": "sha512-h8fYLikg4qN39IghQ1y9g+zzUsgxBpDi5YS3IZbWoxWYYx1YqLL8nAvOiPr7Us14aQ0TjA2/xY7zqmyf29rX1A==", + "node_modules/@tiptap/starter-kit/node_modules/@tiptap/extension-list-item": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-3.27.0.tgz", + "integrity": "sha512-e2yb7Vjh5YV2ELEwxAu3EQr4fKJPwfAWAgbZbUuEOh8FX8R+bnJyBW9oWwxnivwPsxVPtYseWuKNEJb7wW+c8w==", "dev": true, "license": "MIT", "funding": { @@ -3620,13 +3936,13 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.26.0" + "@tiptap/extension-list": "3.27.0" } }, - "node_modules/@tiptap/extension-placeholder": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-placeholder/-/extension-placeholder-3.26.0.tgz", - "integrity": "sha512-q9RsGWmL0xEwrMK5Wx53eMdZlkA3J1cqloIc69rEugjOCjoExEkfF4e2nC9YK49qGxJZBKKksw1Ij7oCWEyu+g==", + "node_modules/@tiptap/starter-kit/node_modules/@tiptap/extension-list-keymap": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list-keymap/-/extension-list-keymap-3.27.0.tgz", + "integrity": "sha512-GV8miiDOTjSduesrO4arzC7F5T78vCy0YeVmtegtA2u5w8RBjKx3sRbS45IBF08bf4GRMRGbpGeLnqe/O0rZHQ==", "dev": true, "license": "MIT", "funding": { @@ -3634,13 +3950,13 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extensions": "3.26.0" + "@tiptap/extension-list": "3.27.0" } }, - "node_modules/@tiptap/extension-strike": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-3.26.0.tgz", - "integrity": "sha512-jUll3Pqhq7u1JKvO0B6USW/bmVmUsO6sRcxo/d5tXqLhS0tWAobOGoGU2IgwXnQDSjf+vF73RYD5tRGDLkRC9Q==", + "node_modules/@tiptap/starter-kit/node_modules/@tiptap/extension-ordered-list": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-3.27.0.tgz", + "integrity": "sha512-hiI8xcAPGOgCny8cg2md708adIdjIe2C2nNh/6TROVGfpm/tAWK13jwE1sgY+eLZTsILqpBLsEUsdF9zoS0XqQ==", "dev": true, "license": "MIT", "funding": { @@ -3648,13 +3964,13 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.26.0" + "@tiptap/extension-list": "3.27.0" } }, - "node_modules/@tiptap/extension-text": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-3.26.0.tgz", - "integrity": "sha512-yZXdevp3/8omGbb40Z52VfvID+tsRNhPQ1GNUToD56XSr2BjdJyAzAb9rWGgDKgVMUPLgJ26yT0O278RFqOKhA==", + "node_modules/@tiptap/starter-kit/node_modules/@tiptap/extension-paragraph": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-3.27.0.tgz", + "integrity": "sha512-miy096NqJJwD3ulGnOleXEIYP+pOICd5A9M3Zqy1Jpc7mw0+/YMZeR5JAXqdsYV3eq/pgYpykKlF4k+Gi84RYw==", "dev": true, "license": "MIT", "funding": { @@ -3662,13 +3978,13 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.26.0" + "@tiptap/core": "3.27.0" } }, - "node_modules/@tiptap/extension-text-align": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text-align/-/extension-text-align-3.26.0.tgz", - "integrity": "sha512-yEtgrEJyE7sfcIAzk9cmJUQUMQZ/J0RU3k7mE+hy5o7t8j78Zs+KcsH+hrczn0MNzblg4gfX2erN+1/SGfSlpA==", + "node_modules/@tiptap/starter-kit/node_modules/@tiptap/extension-strike": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-3.27.0.tgz", + "integrity": "sha512-srDgYCxu2OdYGB8rtJraYzrXCvj5qRmyrSG4NObVfDYNoMuVdkbNlxA8/LNJeKKZ9H8PZlrspvmxM4F91Lvb9g==", "dev": true, "license": "MIT", "funding": { @@ -3676,13 +3992,13 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.26.0" + "@tiptap/core": "3.27.0" } }, - "node_modules/@tiptap/extension-typography": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-typography/-/extension-typography-3.26.0.tgz", - "integrity": "sha512-dNOPmVPCcC57SpTDIxSlrSSNZt4zVG0eNCQHCLyTGh3/1y9TCjdJFSEy9uffQdgfv05tjIwRakGmctENlX3SxQ==", + "node_modules/@tiptap/starter-kit/node_modules/@tiptap/extension-text": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-3.27.0.tgz", + "integrity": "sha512-3ZiEeDDbvhvXwqSre62yxhe0Rc7t2+BGSNoVCCUFPsNUNvBL9s9bOwwnOG4fPZNBCyF38qBnTxblDwJ92E4AGw==", "dev": true, "license": "MIT", "funding": { @@ -3690,13 +4006,13 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.26.0" + "@tiptap/core": "3.27.0" } }, - "node_modules/@tiptap/extension-underline": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-3.26.0.tgz", - "integrity": "sha512-LlVkivH5cBwov/EMD8BL7ZRcU6YcadiSVIffLW1hyalw9YfhaFzoLxjtWhL7jiU/n2Kg+9dXSZxmV2hTeTwyrQ==", + "node_modules/@tiptap/starter-kit/node_modules/@tiptap/extension-underline": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-3.27.0.tgz", + "integrity": "sha512-0w3GDF5rC0oZXYh6jBt8jPS+SQ5mtJsyDjP94A0Qjh/7tsfeDzCzZMAadE4i+9g6DI1Hce4GqYDAAfPkoj4y5Q==", "dev": true, "license": "MIT", "funding": { @@ -3704,13 +4020,13 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.26.0" + "@tiptap/core": "3.27.0" } }, - "node_modules/@tiptap/extensions": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/extensions/-/extensions-3.26.0.tgz", - "integrity": "sha512-4wajuqnO2X0+LVvsBjW/xk3/tmdb16bNL939QhicAay4YYqXITeV2v3XJsryzmG4L5GkK1yLxvRGk4aLoxWrnA==", + "node_modules/@tiptap/starter-kit/node_modules/@tiptap/extensions": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extensions/-/extensions-3.27.0.tgz", + "integrity": "sha512-G4ufNa/F4upDI/2YWFBCVBs4skcCeQ2jvRQiFrLJCitUFcl03evP0znAvx5JKj9+nfm4ILYpPpncEFyMq4mFEg==", "dev": true, "license": "MIT", "funding": { @@ -3718,14 +4034,14 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.26.0", - "@tiptap/pm": "3.26.0" + "@tiptap/core": "3.27.0", + "@tiptap/pm": "3.27.0" } }, - "node_modules/@tiptap/pm": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-3.26.0.tgz", - "integrity": "sha512-q4RDeWwVrhOL0jJCGRgGxLSdjOYwzQ4h2InURZVhC66433ipcHd6f3bqSOhcXZ4r0sFmMNsuF7aZmUntjWLc7w==", + "node_modules/@tiptap/starter-kit/node_modules/@tiptap/pm": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-3.27.0.tgz", + "integrity": "sha512-cWuyaY19SoTOGwdPzhNrUuFMMILuR7mq/Ec02FO+y5jUnQiJYOy9pVx4RUIjBT24LYXrvA9YRhxL1v+KQKTz3A==", "dev": true, "license": "MIT", "dependencies": { @@ -3748,71 +4064,6 @@ "url": "https://github.com/sponsors/ueberdosis" } }, - "node_modules/@tiptap/react": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-3.26.0.tgz", - "integrity": "sha512-NLPAG6tk4/AsfOsUNsbGqdgIHuGsD4A/hlYriozuo+LCAAduuluhzsL/MEHZXtFT4GXUOlCdaEqNCOrMuz/zaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/use-sync-external-store": "^0.0.6", - "fast-equals": "^5.3.3", - "use-sync-external-store": "^1.4.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "optionalDependencies": { - "@tiptap/extension-bubble-menu": "^3.26.0", - "@tiptap/extension-floating-menu": "^3.26.0" - }, - "peerDependencies": { - "@tiptap/core": "3.26.0", - "@tiptap/pm": "3.26.0", - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "@types/react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/@tiptap/starter-kit": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-3.26.0.tgz", - "integrity": "sha512-o34EtMfqtBaljdmeElZsRG/067oGx9Zcq+j2GWo71KlZe22ga/ALexeTf1c+ETsjCxSTKR6eyQ4RZvz/2JpYfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@tiptap/core": "^3.26.0", - "@tiptap/extension-blockquote": "^3.26.0", - "@tiptap/extension-bold": "^3.26.0", - "@tiptap/extension-bullet-list": "^3.26.0", - "@tiptap/extension-code": "^3.26.0", - "@tiptap/extension-code-block": "^3.26.0", - "@tiptap/extension-document": "^3.26.0", - "@tiptap/extension-dropcursor": "^3.26.0", - "@tiptap/extension-gapcursor": "^3.26.0", - "@tiptap/extension-hard-break": "^3.26.0", - "@tiptap/extension-heading": "^3.26.0", - "@tiptap/extension-horizontal-rule": "^3.26.0", - "@tiptap/extension-italic": "^3.26.0", - "@tiptap/extension-link": "^3.26.0", - "@tiptap/extension-list": "^3.26.0", - "@tiptap/extension-list-item": "^3.26.0", - "@tiptap/extension-list-keymap": "^3.26.0", - "@tiptap/extension-ordered-list": "^3.26.0", - "@tiptap/extension-paragraph": "^3.26.0", - "@tiptap/extension-strike": "^3.26.0", - "@tiptap/extension-text": "^3.26.0", - "@tiptap/extension-underline": "^3.26.0", - "@tiptap/extensions": "^3.26.0", - "@tiptap/pm": "^3.26.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - } - }, "node_modules/@tiptap/suggestion": { "version": "3.22.3", "resolved": "https://registry.npmjs.org/@tiptap/suggestion/-/suggestion-3.22.3.tgz", @@ -3829,9 +4080,9 @@ } }, "node_modules/@tiptap/y-tiptap": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@tiptap/y-tiptap/-/y-tiptap-3.0.4.tgz", - "integrity": "sha512-I7NnntIPR9PgCuBEjZ0hco+eeLvTpMDnXxsyhwn8z7Se0/Ac6RIq903wn6KoMn7FRVXpTtXAfZphFtpErjabVw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@tiptap/y-tiptap/-/y-tiptap-3.0.5.tgz", + "integrity": "sha512-WoK5z3jMW+9nzumcWAxEDRCSC7yQmdq4NN0157MaxQBl9dGWwjxJx3+11mb+WAqR37oDeAMKMmSNy+/hm2XGlA==", "dev": true, "license": "MIT", "peer": true, @@ -4284,9 +4535,9 @@ "license": "MIT" }, "node_modules/@wordpress/block-serialization-default-parser": { - "version": "5.48.0", - "resolved": "https://registry.npmjs.org/@wordpress/block-serialization-default-parser/-/block-serialization-default-parser-5.48.0.tgz", - "integrity": "sha512-bbG7qlz3BZNnZRLtwwFl/VK/ynDtZ3XDbLiTCXrOGF3ij4RdA+Vng3nTNBxxPKLy8gB5t8Fgl5DGK3MXhn+RWA==", + "version": "5.48.1", + "resolved": "https://registry.npmjs.org/@wordpress/block-serialization-default-parser/-/block-serialization-default-parser-5.48.1.tgz", + "integrity": "sha512-REsjN6tT2lXekrjuiu2O0+FYW13QHhy23j7C458zzSjpYcxROtl/T8AozOJYRvG9SkdC9Og3PkEP/9/nGC4IVw==", "dev": true, "license": "GPL-2.0-or-later", "engines": { @@ -5495,9 +5746,9 @@ } }, "node_modules/dompurify": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.8.tgz", - "integrity": "sha512-yb1cEmaOum7wFvOCSQxyfgVlv5D47Rc30iZWoMpbDIWTnJ6grDDQyu2KFJzB2k7u0pMuJcQ1zphH//fFnw2tjQ==", + "version": "3.4.11", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.11.tgz", + "integrity": "sha512-zhlUV12GsaRzMsf9q5M254YhA4+VuF0fG+QFqu6aYpoGlKtz+w8//jBcGVYBgQkR5GHjUomejY84AV+/uPbWdw==", "dev": true, "license": "(MPL-2.0 OR Apache-2.0)", "optionalDependencies": { @@ -5577,19 +5828,27 @@ "peer": true }, "node_modules/emdash": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/emdash/-/emdash-0.6.0.tgz", - "integrity": "sha512-lc9AinEPoJ9xD1dCN5TuyKL3PtMLDL1jUTncwfFQNoRlUvq5UGo5djrrWWpqav8iEwVucH+GkgHqVB4Tk13s8A==", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/emdash/-/emdash-0.21.0.tgz", + "integrity": "sha512-ARY995PIemIhIjiThvEOivPqbUTlUd+JapWUOObrjVj7SOuX3RfEcucCIrLSzuV5ndONUSwjnPJqqwgzrum0hA==", "dev": true, "license": "MIT", "dependencies": { - "@emdash-cms/admin": "0.6.0", - "@emdash-cms/auth": "0.6.0", - "@emdash-cms/gutenberg-to-portable-text": "0.6.0", + "@atcute/client": "^5.0.0", + "@atcute/lexicons": "^2.0.0", + "@atcute/multibase": "^1.2.0", + "@emdash-cms/admin": "0.21.0", + "@emdash-cms/auth": "0.21.0", + "@emdash-cms/gutenberg-to-portable-text": "0.21.0", + "@emdash-cms/plugin-types": "0.1.0", + "@emdash-cms/registry-client": "0.3.2", "@floating-ui/react": "^0.27.16", "@modelcontextprotocol/sdk": "^1.26.0", + "@oslojs/crypto": "^1.0.1", + "@oslojs/encoding": "^1.1.0", "@portabletext/toolkit": "^5.0.1", "@tiptap/core": "^3.20.0", + "@tiptap/extension-code-block": "^3.20.0", "@tiptap/extension-focus": "^3.20.0", "@tiptap/extension-image": "^3.20.0", "@tiptap/extension-link": "^3.20.0", @@ -5611,7 +5870,7 @@ "image-size": "^2.0.2", "jose": "^6.1.3", "jpeg-js": "^0.4.4", - "kysely": "^0.27.0", + "kysely": "^0.29.0", "mime": "^4.1.0", "modern-tar": "^0.7.5", "picocolors": "^1.1.1", @@ -5619,7 +5878,7 @@ "sax": "^1.4.1", "ulidx": "^2.4.1", "upng-js": "^2.1.0", - "zod": "^4.3.5" + "zod": "^4.4.1" }, "bin": { "em": "dist/cli/index.mjs", @@ -5631,17 +5890,245 @@ }, "peerDependencies": { "@astrojs/react": ">=5.0.0-beta.0", - "@tanstack/react-query": ">=5.0.0", - "@tanstack/react-router": ">=1.100.0", + "@emdash-cms/auth-atproto": ">=0.2.8", "astro": ">=6.0.0-beta.0", "react": ">=18.0.0", "react-dom": ">=18.0.0" + }, + "peerDependenciesMeta": { + "@emdash-cms/auth-atproto": { + "optional": true + } + } + }, + "node_modules/emdash/node_modules/@tiptap/core": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-3.27.0.tgz", + "integrity": "sha512-X53TQUq2xYn21FOC526GlVIycnDkiN9XPYO/NEsg3hXS/SUs1Q6ZLtaM8y3Ox7d+bnTW6CpWKlfyvUWp3scKEw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/pm": "3.27.0" + } + }, + "node_modules/emdash/node_modules/@tiptap/extension-bubble-menu": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-3.27.0.tgz", + "integrity": "sha512-cy52iePYfzaUUBg3S+00KN+18KMZH+UIlE4wRTEBW/c7OA6M/nkrVkxHYfKeJ3OEbZsRYv+GiRzASchDJVVTZg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.27.0", + "@tiptap/pm": "3.27.0" + } + }, + "node_modules/emdash/node_modules/@tiptap/extension-code-block": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-3.27.0.tgz", + "integrity": "sha512-t4cQ093ZRumHG954WKwAVYoZC6bkDrZCP9uqjHWUe1wBMzhqAWQ1OuHfaHpMnzsrdtm/svDO9rB26zBTQ0yZ/Q==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.27.0", + "@tiptap/pm": "3.27.0" + } + }, + "node_modules/emdash/node_modules/@tiptap/extension-floating-menu": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-3.27.0.tgz", + "integrity": "sha512-S9NV/3f1IFkPtIUClLUsJj98AOL3PrYMhPAH/b7SFtsvvfp2QXfL+I12ykPqOcPmj4KXw0Zc40E0QKg67M3pjw==", + "dev": true, + "license": "MIT", + "optional": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@floating-ui/dom": "^1.0.0", + "@tiptap/core": "3.27.0", + "@tiptap/pm": "3.27.0" + } + }, + "node_modules/emdash/node_modules/@tiptap/extension-focus": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-focus/-/extension-focus-3.27.0.tgz", + "integrity": "sha512-gBrGLYzIa3q/+xD5r/oqw9rddqH+RzctRdarj0HxJS7f/FhAlPCvJ4kwK3Zmmy2PQdYG+H3y5A+OH9//EHoDvw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/extensions": "3.27.0" + } + }, + "node_modules/emdash/node_modules/@tiptap/extension-link": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-3.27.0.tgz", + "integrity": "sha512-c0fxb1cccM/1JNk7HOoJytKJ9kcpKPeGq86FNHQkqf+Bn+IzPgLb8Q3W89lOp33NlCOx2xiSrUFMBWcPX34z8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "linkifyjs": "^4.3.3" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.27.0", + "@tiptap/pm": "3.27.0" + } + }, + "node_modules/emdash/node_modules/@tiptap/extension-placeholder": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-placeholder/-/extension-placeholder-3.27.0.tgz", + "integrity": "sha512-lT/wUype2OLoTPuSrWTZQJxcfJZfnBYhPmMAPk0NkGp9V5xml5m4dQ6W0+Cz1CW5lglshvn8c8C9rWs70XCHvA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/extensions": "3.27.0" + } + }, + "node_modules/emdash/node_modules/@tiptap/extension-text-align": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text-align/-/extension-text-align-3.27.0.tgz", + "integrity": "sha512-9KTDxoKUdPkzZ8WYbcbn5TAFi2towAdXiegbT+2sX7YQH4efsPBwMBOvlFnQyDkDuvt5Sh1Yc3QoMaK+HNKyUg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.27.0" + } + }, + "node_modules/emdash/node_modules/@tiptap/extension-typography": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-typography/-/extension-typography-3.27.0.tgz", + "integrity": "sha512-n9aV713nfBXyiSuBOp2lvMjUwhdtz7HcMDaqe9Embo8cSDLOwVhvO9A9bE/WT2FIuPrdhdYOsYIIvo3CSPR8xw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.27.0" + } + }, + "node_modules/emdash/node_modules/@tiptap/extension-underline": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-3.27.0.tgz", + "integrity": "sha512-0w3GDF5rC0oZXYh6jBt8jPS+SQ5mtJsyDjP94A0Qjh/7tsfeDzCzZMAadE4i+9g6DI1Hce4GqYDAAfPkoj4y5Q==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.27.0" + } + }, + "node_modules/emdash/node_modules/@tiptap/extensions": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/extensions/-/extensions-3.27.0.tgz", + "integrity": "sha512-G4ufNa/F4upDI/2YWFBCVBs4skcCeQ2jvRQiFrLJCitUFcl03evP0znAvx5JKj9+nfm4ILYpPpncEFyMq4mFEg==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.27.0", + "@tiptap/pm": "3.27.0" + } + }, + "node_modules/emdash/node_modules/@tiptap/pm": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-3.27.0.tgz", + "integrity": "sha512-cWuyaY19SoTOGwdPzhNrUuFMMILuR7mq/Ec02FO+y5jUnQiJYOy9pVx4RUIjBT24LYXrvA9YRhxL1v+KQKTz3A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "prosemirror-changeset": "^2.3.0", + "prosemirror-commands": "^1.6.2", + "prosemirror-dropcursor": "^1.8.1", + "prosemirror-gapcursor": "^1.3.2", + "prosemirror-history": "^1.4.1", + "prosemirror-inputrules": "^1.4.0", + "prosemirror-keymap": "^1.2.3", + "prosemirror-model": "^1.25.7", + "prosemirror-schema-list": "^1.5.0", + "prosemirror-state": "^1.4.4", + "prosemirror-tables": "^1.8.0", + "prosemirror-transform": "^1.12.0", + "prosemirror-view": "^1.41.8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + } + }, + "node_modules/emdash/node_modules/@tiptap/react": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-3.27.0.tgz", + "integrity": "sha512-C7FSa5yNPKaCll/Bvm0GmlJh2VLVJXNpKxC9I/L5BJdeVWXV3Prbt56U9FFYd8hjydFZ32GF3jUYQlVYHxnwHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/use-sync-external-store": "^0.0.6", + "fast-equals": "^5.3.3", + "use-sync-external-store": "^1.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "optionalDependencies": { + "@tiptap/extension-bubble-menu": "^3.27.0", + "@tiptap/extension-floating-menu": "^3.27.0" + }, + "peerDependencies": { + "@tiptap/core": "3.27.0", + "@tiptap/pm": "3.27.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "@types/react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/emdash/node_modules/zod": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", - "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", "dev": true, "license": "MIT", "funding": { @@ -5811,6 +6298,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/esm-env": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", + "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", + "dev": true, + "license": "MIT" + }, "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", @@ -6810,9 +7304,9 @@ } }, "node_modules/isbot": { - "version": "5.1.37", - "resolved": "https://registry.npmjs.org/isbot/-/isbot-5.1.37.tgz", - "integrity": "sha512-5bcicX81xf6NlTEV8rWdg7Pk01LFizDetuYGHx6d/f6y3lR2/oo8IfxjzJqn1UdDEyCcwT9e7NRloj8DwCYujQ==", + "version": "5.1.43", + "resolved": "https://registry.npmjs.org/isbot/-/isbot-5.1.43.tgz", + "integrity": "sha512-drJhFmibra4LO6Wd7D3Oi6UICRK9244vSZkmxzhlZP0TTdwCA2ueK4PEkUkzPYeuqug9+cqqdWPgihjk5+83Cg==", "dev": true, "license": "Unlicense", "engines": { @@ -6948,13 +7442,13 @@ } }, "node_modules/kysely": { - "version": "0.27.6", - "resolved": "https://registry.npmjs.org/kysely/-/kysely-0.27.6.tgz", - "integrity": "sha512-FIyV/64EkKhJmjgC0g2hygpBv5RNWVPyNCqSAD7eTCv6eFWNIi4PN1UvdSJGicN/o35bnevgis4Y0UDC0qi8jQ==", + "version": "0.29.2", + "resolved": "https://registry.npmjs.org/kysely/-/kysely-0.29.2.tgz", + "integrity": "sha512-s6WVJyEZrbm6jhBpiKHsGHyePMrVQKJ85wZCFCr9W4QHv6WTjWIrdvTmO9hDEA3bNK0xkrE2DqrHsXMLWuZpQg==", "dev": true, "license": "MIT", "engines": { - "node": ">=14.0.0" + "node": ">=22.0.0" } }, "node_modules/layerr": { @@ -9562,7 +10056,8 @@ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/schema-dts": { "version": "2.0.0", @@ -9624,9 +10119,9 @@ } }, "node_modules/seroval": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.5.2.tgz", - "integrity": "sha512-xcRN39BdsnO9Tf+VzsE7b3JyTJASItIV1FVFewJKCFcW4s4haIKS3e6vj8PGB9qBwC7tnuOywQMdv5N4qkzi7Q==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.5.4.tgz", + "integrity": "sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw==", "dev": true, "license": "MIT", "engines": { @@ -9634,9 +10129,9 @@ } }, "node_modules/seroval-plugins": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.5.2.tgz", - "integrity": "sha512-qpY0Cl+fKYFn4GOf3cMiq6l72CpuVaawb6ILjubOQ+diJ54LfOWaSSPsaswN8DRPIPW4Yq+tE1k5aKd7ILyaFg==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.5.4.tgz", + "integrity": "sha512-S0xQPhUTefAhNvNWFg0c1J8qJArHt5KdtJ/cFAofo06KD1MVSeFWyl4iiu+ApDIuw0WhjpOfCdgConOfAnLgkw==", "dev": true, "license": "MIT", "engines": { @@ -10365,6 +10860,13 @@ "license": "MIT", "optional": true }, + "node_modules/unicode-segmenter": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/unicode-segmenter/-/unicode-segmenter-0.14.5.tgz", + "integrity": "sha512-jHGmj2LUuqDcX3hqY12Ql+uhUTn8huuxNZGq7GvtF6bSybzH3aFgedYu/KTzQStEgt1Ra2F3HxadNXsNjb3m3g==", + "dev": true, + "license": "MIT" + }, "node_modules/unified": { "version": "11.0.5", "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", @@ -10730,6 +11232,21 @@ "dev": true, "license": "MIT" }, + "node_modules/valibot": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/valibot/-/valibot-1.4.1.tgz", + "integrity": "sha512-klCmFTz2jeDluy9RwX+F884TCiogtdBJ/YaxSx1EOBYXa3NXNWj8kR1jjN8rzluwojJVWWaHJ4r1U5LfICnM3g==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "typescript": ">=5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", diff --git a/package.json b/package.json index 978270b..ab7c15f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@jdevalk/emdash-plugin-seo", - "version": "0.11.0", + "version": "0.12.0", "description": "SEO plugin for EmDash CMS — meta tags, Open Graph, canonical URLs, robots directives, and JSON-LD schema markup", "type": "module", "exports": { @@ -30,14 +30,14 @@ "test": "vitest run" }, "peerDependencies": { - "emdash": "^0.6.0" + "emdash": "^0.21.0" }, "dependencies": { "@jdevalk/astro-seo-graph": "^0.7.0", "@jdevalk/seo-graph-core": "^0.6.0" }, "devDependencies": { - "emdash": "^0.6.0", + "emdash": "^0.21.0", "typescript": "^5.6.0", "vitest": "^4.1.8" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 571e7a7..710174c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,14 +16,14 @@ importers: version: 0.6.0(typescript@5.9.3) devDependencies: emdash: - specifier: ^0.6.0 - version: 0.6.0(6efdb8802079419a2db620598b63e0a0) + specifier: ^0.21.0 + version: 0.21.0(ad9145494d9c9f98a33ecb0bce4fdd0c) typescript: specifier: ^5.6.0 version: 5.9.3 vitest: - specifier: ^2.1.0 - version: 2.1.9(@types/node@25.6.0) + specifier: ^4.1.8 + version: 4.1.9(@types/node@25.6.0)(vite@7.3.2(@types/node@25.6.0)(yaml@2.8.3)) packages: @@ -77,6 +77,42 @@ packages: '@astrojs/yaml2ts@0.2.3': resolution: {integrity: sha512-PJzRmgQzUxI2uwpdX2lXSHtP4G8ocp24/t+bZyf5Fy0SZLSF9f9KXZoMlFM/XCGue+B0nH/2IZ7FpBYQATBsCg==} + '@atcute/atproto@4.0.2': + resolution: {integrity: sha512-hLnvjiIOStpdUm0cEN+R5YydvbV0d6ap17Iv+t7i/nhSCN3TGMya7M0ftCWtCo+xoQ1EU6HK74R8jqXWlyrM0w==} + peerDependencies: + '@atcute/lexicons': ^2.0.0 + + '@atcute/client@5.1.0': + resolution: {integrity: sha512-l2LYCY43QvrOsvS+q1d959x0yVeXQ5F7haloCB8MLzrTKT3s9fc4S3Kr+8JkgjPtdapgOPIeEdhWcrzP5WNLRg==} + peerDependencies: + '@atcute/lexicons': ^2.0.0 + + '@atcute/identity-resolver@2.0.0': + resolution: {integrity: sha512-IKg1BDQAF2bIdN10DL6KAXmTjK+3enTU2IRbuani9TsFahBwGZ7O5FiVmTiL6QlGfauGNW5S0xNCOxWXWMoR2Q==} + peerDependencies: + '@atcute/identity': ^2.0.0 + '@atcute/lexicons': ^2.0.0 + + '@atcute/identity@2.0.0': + resolution: {integrity: sha512-YXFsggO7eJYifqkN85+kUXJE2a1iI9AyuzPTDjtS/4WE1Zs1/XiPkWmwZlAgtp+pYhVtjm3mJqy/h/mZ0OnIVw==} + peerDependencies: + '@atcute/lexicons': ^2.0.0 + + '@atcute/lexicons@2.0.1': + resolution: {integrity: sha512-MsgGYgZ7bXcXWg/CzAQX+d+/u4YrelQYnxtX6NW3Bc+6eOyzxozBPRWVFzfsR9OCT10Qzqmuujul/8bRYNCZ6w==} + + '@atcute/multibase@1.2.3': + resolution: {integrity: sha512-hliOXcgYS3x0afs8JsjSvA5c15Zf36ggCcxIHspSM7wrae3zhwaTigYRU6NvghkPMAal4tRRbhv98AuP5YzJ6w==} + + '@atcute/uint8array@1.1.2': + resolution: {integrity: sha512-n+lutnbN9mKzSjSVdfsYfzJ40u2971H+iLSL46D6d7zcrA4delxusf/ftGFvj5oGW03OioaFgQOy3Lqa3JmTeA==} + + '@atcute/util-fetch@2.0.0': + resolution: {integrity: sha512-v+4aFQ/tuBqTV+URDJaFgm3mASWdglKXiPaGutJ1bs7QtQKmPZeesPY5MzW/a+MtI8GWCEJk8X9wOfalPOFSlg==} + + '@atcute/util-text@1.3.1': + resolution: {integrity: sha512-MRgJXkx67znuBXuoAYCJkBZyd3OApL7zZlNf5kXhuoCXcdiu1nblRDycYTADSkym4epBSQWxh26kmI9sewaq6A==} + '@babel/code-frame@7.29.0': resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} @@ -164,8 +200,8 @@ packages: resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} - '@base-ui/react@1.4.0': - resolution: {integrity: sha512-QcqdVbr/+ba2/RAKJIV1PV6S02Q5+r6a4Eym8ndBw+ZbBILkkmQAyRxXCg/pArrHnkrGeU8goe26aw0h6eE8pg==} + '@base-ui/react@1.5.0': + resolution: {integrity: sha512-z1gSAlced1yY+iM+mHDEtIkD8UI3Ebs52MuBPxvV6f5hRutk+xvCH/wuB7hDqDzK9JG5FoMz5nhrqtSs1wjt1A==} engines: {node: '>=14.0.0'} peerDependencies: '@date-fns/tz': ^1.2.0 @@ -174,11 +210,15 @@ packages: react: ^17 || ^18 || ^19 react-dom: ^17 || ^18 || ^19 peerDependenciesMeta: + '@date-fns/tz': + optional: true '@types/react': optional: true + date-fns: + optional: true - '@base-ui/utils@0.2.7': - resolution: {integrity: sha512-nXYKhiL/0JafyJE8PfcflipGftOftlIwKd72rU15iZ1M5yqgg5J9P8NHU71GReDuXco5MJA/eVQqUT5WRqX9sA==} + '@base-ui/utils@0.2.9': + resolution: {integrity: sha512-x/PDDCYzoqPpjrdyb3VcyylTI2IjUXEtYDGi5foh7KsnmNJIIaVwA2GLgDH1dps1GgXiJbA60hM+AyuTfQzIvw==} peerDependencies: '@types/react': ^17 || ^18 || ^19 react: ^17 || ^18 || ^19 @@ -197,8 +237,8 @@ packages: '@clack/prompts@1.2.0': resolution: {integrity: sha512-4jmztR9fMqPMjz6H/UZXj0zEmE43ha1euENwkckKKel4XpSfokExPo5AiVStdHSAlHekz4d0CA/r45Ok1E4D3w==} - '@cloudflare/kumo@1.18.0': - resolution: {integrity: sha512-D1OkzYe6rIPe2CqklE+DDt84YB8Q+gV5PH/Hjco8TO1NEHZkaookdl67YU+HHWCBME6TxSwQRzn72hp/cyOrCw==} + '@cloudflare/kumo@2.5.2': + resolution: {integrity: sha512-HUNi40VG3ExJ7lV8HjqPQcGpCmm2CqG/SzjJ+K+NhCwZRYTBvagdoMDPX2XZ8AW/ZPEeuFoId0VYmzrX+luyXQ==} hasBin: true peerDependencies: '@phosphor-icons/react': ^2.1.10 @@ -207,6 +247,8 @@ packages: react-dom: ^18.0.0 || ^19.0.0 zod: ^4.0.0 peerDependenciesMeta: + echarts: + optional: true zod: optional: true @@ -235,29 +277,38 @@ packages: peerDependencies: react: '>=16.8.0' - '@emdash-cms/admin@0.6.0': - resolution: {integrity: sha512-RH3HQ8ZovTrKA6l3GvGhp1xifdNxINOUV2ohsVa43dbSLRL+h5ojExCOCQ/g7YoUAYg11F3jjzdDOZxnlOcxcA==} + '@emdash-cms/admin@0.21.0': + resolution: {integrity: sha512-67eIt3g4tjOFQAHj6tHHC6NW/wFw2T/q7BzFizaIk+FY6DtRD/pUs3xtbvqCEmhOKQVZGovK/oYNuV8KMt0iXw==} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@emdash-cms/auth@0.6.0': - resolution: {integrity: sha512-1ikvF2jYifAMvAIn5ulS8ljnl5eDy3qNKZoVIfGaqtTKQqxtpXcVBH4AY6W7ssebrei7Kpyz/IfRRsxLQZRSOw==} + '@emdash-cms/auth@0.21.0': + resolution: {integrity: sha512-YNb5nINyOWBGtSj00EdXgE3cYAWWCzp6I4R6KZOkJ4fiTDsemVEfeMg6Mnia7j58ulVOkSKTxe2PIZ5ycqgyyA==} peerDependencies: astro: '>=6.0.0-beta.0' - kysely: ^0.27.0 + kysely: ^0.29.0 peerDependenciesMeta: kysely: optional: true - '@emdash-cms/blocks@0.6.0': - resolution: {integrity: sha512-Sh9Iy180+wexCkoyz12EEQMfdae3U8+sLY/Kgqvi54ZpplSibsWbwQ/ASnI/ONZ10uo4Vxy0zY1Hj/PEJ/09ww==} + '@emdash-cms/blocks@0.21.0': + resolution: {integrity: sha512-w1eNhigksiZrBZ1r6U9wSvEr/so9lR37kPzSOX79E4ozTKMvwXErd4zdIYwVf7hlMjTzYuPZM8LuPRnbsYgvbg==} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@emdash-cms/gutenberg-to-portable-text@0.6.0': - resolution: {integrity: sha512-8Mp4+0joY59Jd8U5pzyapRiGZaSYPy1z+7JIeJX3t2a6pcP6cJMPfbSHx5ObChP0pDYWR68DcdPnWGrOcUsRNw==} + '@emdash-cms/gutenberg-to-portable-text@0.21.0': + resolution: {integrity: sha512-VQn5EvR8qwh/OOLroUAGZdZFt5M03gbUXyqjY6k817DqaYoqppWGLvv+IQcnUlnaGzUDGopMkqBVSEsFTZSt/g==} + + '@emdash-cms/plugin-types@0.1.0': + resolution: {integrity: sha512-aV6bQ/XUK/KBjuG6wVMhtMPWjG4n5VM5qjZY1SVJed9qFWKmzvyMlf00x2Y/nQfp5Hik2Yj2AVeAGf0dtuhvOw==} + + '@emdash-cms/registry-client@0.3.2': + resolution: {integrity: sha512-2mjKuMUbFNeLVuRoBwbB4xu1AXpsCWFSJLIJcH0tceddd6MZEAYpkaiQLFpBhrIDYKFM5Gg73Qha7UX9PmQ7PA==} + + '@emdash-cms/registry-lexicons@0.1.1': + resolution: {integrity: sha512-0en1SWbqP4lICGafxHhJzxpCbAYB2fk2uPYmsAAi4lILGtR0/fY6HCLZ17ta16zTf12Q7H0VhuA0zEl9Gc93Sw==} '@emmetio/abbreviation@2.3.3': resolution: {integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==} @@ -283,204 +334,102 @@ packages: '@emnapi/runtime@1.9.2': resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==} - '@esbuild/aix-ppc64@0.21.5': - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.27.7': resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.21.5': - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.27.7': resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.21.5': - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.27.7': resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.21.5': - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.27.7': resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.21.5': - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.27.7': resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.21.5': - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.27.7': resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.21.5': - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.27.7': resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.21.5': - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.27.7': resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.21.5': - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.27.7': resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.21.5': - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.27.7': resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.21.5': - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.27.7': resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.21.5': - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.27.7': resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.21.5': - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.27.7': resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.21.5': - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.27.7': resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.21.5': - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.27.7': resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.21.5': - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.27.7': resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.21.5': - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.27.7': resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} engines: {node: '>=18'} @@ -493,12 +442,6 @@ packages: cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.21.5': - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.27.7': resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} engines: {node: '>=18'} @@ -511,12 +454,6 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.21.5': - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.27.7': resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} engines: {node: '>=18'} @@ -529,48 +466,24 @@ packages: cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.21.5': - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.27.7': resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.21.5': - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.27.7': resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.21.5': - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.27.7': resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.21.5': - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.27.7': resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} engines: {node: '>=18'} @@ -1119,6 +1032,9 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@tabby_ai/hijri-converter@1.0.5': resolution: {integrity: sha512-r5bClKrcIusDoo049dSL8CawnHR6mRdDwhlQuIgZRNty68q0x8k3Lf1BtPAMxRf/GgnHBnIO4ujd3+GQdLWzxQ==} engines: {node: '>=16.0.0'} @@ -1324,6 +1240,27 @@ packages: peerDependencies: '@tiptap/core': ^3.22.3 + '@tiptap/extension-table-cell@3.27.0': + resolution: {integrity: sha512-e0JO0qz0jvI2BNrlw/CoOrD0zD8gpgM3cCS/gp/LCLRsHxzNJewEx8lKrjjyH4c0jvQfeqMX+HeDsglntGF8pg==} + peerDependencies: + '@tiptap/extension-table': 3.27.0 + + '@tiptap/extension-table-header@3.27.0': + resolution: {integrity: sha512-CrZ4HJB0N3ekIiHvOee1CU+cm4EXn5vfOSPzMRAoUsocBSXuDKnzjoKt5TQMHohns0y241JJqsdFOnwN7EV4TA==} + peerDependencies: + '@tiptap/extension-table': 3.27.0 + + '@tiptap/extension-table-row@3.27.0': + resolution: {integrity: sha512-dhmMuoMGJ0RI3Ad5CqLto1vRy67yM671cIZQaFjtqhTJhI9Ja/E+AFgzliU/pYN4BhmbX08Y3VQS/Y59fsblxQ==} + peerDependencies: + '@tiptap/extension-table': 3.27.0 + + '@tiptap/extension-table@3.27.0': + resolution: {integrity: sha512-p4QGpX5qVbvaM+AyZrzk/1GhPX7fe14otTmgGsV4MBRMZTU26bfXYerKhadnuYUee7CAfUJKMsNXzfx0gzLbGQ==} + peerDependencies: + '@tiptap/core': 3.27.0 + '@tiptap/pm': 3.27.0 + '@tiptap/extension-text-align@3.22.3': resolution: {integrity: sha512-dG1NHE0yGf7fYiOdabCJuecI2IJ1uogyY/QvZqvPNaxRjZDoXYuGlMtz9jEDiIdQSaPED2MSsS7KkuNFQIEMGg==} peerDependencies: @@ -1394,9 +1331,15 @@ packages: '@types/babel__traverse@7.28.0': resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + '@types/debug@4.1.13': resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -1446,6 +1389,7 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + deprecated: Potential CWE-502 - Update to 1.3.1 or higher '@unpic/placeholder@0.1.2': resolution: {integrity: sha512-O++tS97biojo5sqn5TeTt+jUjl5gWOdIQuOXe8YluTJWq4L0GM6VuTkaspNpsmxHfioJw/6YBirzOpG4t87l8Q==} @@ -1456,34 +1400,34 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - '@vitest/expect@2.1.9': - resolution: {integrity: sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==} + '@vitest/expect@4.1.9': + resolution: {integrity: sha512-vl/rYsUKcBr3SnQn166+XR5ZQcgMx3DQhFWdfli/cWpLnLUmbxZvyrJZotLFUryib+LtArYMSTJ5RbQ57ZqrlA==} - '@vitest/mocker@2.1.9': - resolution: {integrity: sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==} + '@vitest/mocker@4.1.9': + resolution: {integrity: sha512-EVkXzBjrPGM+cK8/ANWgBrkUCfJfb38/EfTSO8h7pWvKkyPkpWxvR7BkD2MyItMF62C97zAEoqdpUixwR/e+Rw==} peerDependencies: msw: ^2.4.9 - vite: ^5.0.0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@2.1.9': - resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} + '@vitest/pretty-format@4.1.9': + resolution: {integrity: sha512-s0iufns3iIFitdgm+YR7g1whCAaGtXz459VS9/PqyKDEEFgYIhsHOQmXgIgDuYCt7DeQmiZT0Qe2OA2p4ZPu5A==} - '@vitest/runner@2.1.9': - resolution: {integrity: sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==} + '@vitest/runner@4.1.9': + resolution: {integrity: sha512-KXLMDtc7oe70+3mJfGrPUWPesswH+3sTxAMAMl8DG7I8IUQT4XW718dY5ID3vPUcmlu27CcKfY4P3h3I29SLJg==} - '@vitest/snapshot@2.1.9': - resolution: {integrity: sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==} + '@vitest/snapshot@4.1.9': + resolution: {integrity: sha512-Jc7RKGNBo8Z28WYIm0Niej4xdSPByRf6mU58VpHQkd6Zh05rlnA+twjbK5HyeIGHxrzsc3mJgS43uM0CZKzaIA==} - '@vitest/spy@2.1.9': - resolution: {integrity: sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==} + '@vitest/spy@4.1.9': + resolution: {integrity: sha512-fHpsS6mIi+PiEW+vcRVOMkX1oSaPKne3VOclSFICPcGOmfKgXPU5iAah+wcNcj2xPrCCmfq99IDGf+EojhhvhA==} - '@vitest/utils@2.1.9': - resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==} + '@vitest/utils@4.1.9': + resolution: {integrity: sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==} '@volar/kit@2.4.28': resolution: {integrity: sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg==} @@ -1627,10 +1571,6 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -1645,8 +1585,8 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chai@5.3.3: - resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} character-entities-html4@2.1.0: @@ -1658,10 +1598,6 @@ packages: character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - check-error@2.1.3: - resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} - engines: {node: '>= 16'} - chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} @@ -1808,10 +1744,6 @@ packages: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} - deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -1888,16 +1820,18 @@ packages: electron-to-chromium@1.5.336: resolution: {integrity: sha512-AbH9q9J455r/nLmdNZes0G0ZKcRX73FicwowalLs6ijwOmCJSRRrLX63lcAlzy9ux3dWK1w1+1nsBJEWN11hcQ==} - emdash@0.6.0: - resolution: {integrity: sha512-lc9AinEPoJ9xD1dCN5TuyKL3PtMLDL1jUTncwfFQNoRlUvq5UGo5djrrWWpqav8iEwVucH+GkgHqVB4Tk13s8A==} + emdash@0.21.0: + resolution: {integrity: sha512-ARY995PIemIhIjiThvEOivPqbUTlUd+JapWUOObrjVj7SOuX3RfEcucCIrLSzuV5ndONUSwjnPJqqwgzrum0hA==} hasBin: true peerDependencies: '@astrojs/react': '>=5.0.0-beta.0' - '@tanstack/react-query': '>=5.0.0' - '@tanstack/react-router': '>=1.100.0' + '@emdash-cms/auth-atproto': '>=0.2.8' astro: '>=6.0.0-beta.0' react: '>=18.0.0' react-dom: '>=18.0.0' + peerDependenciesMeta: + '@emdash-cms/auth-atproto': + optional: true emmet@2.4.11: resolution: {integrity: sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==} @@ -1932,9 +1866,6 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - es-module-lexer@2.0.0: resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} @@ -1942,11 +1873,6 @@ packages: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} - esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} - hasBin: true - esbuild@0.27.7: resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} engines: {node: '>=18'} @@ -1967,6 +1893,9 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} + esm-env@1.2.2: + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} + estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} @@ -2296,9 +2225,9 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} - kysely@0.27.6: - resolution: {integrity: sha512-FIyV/64EkKhJmjgC0g2hygpBv5RNWVPyNCqSAD7eTCv6eFWNIi4PN1UvdSJGicN/o35bnevgis4Y0UDC0qi8jQ==} - engines: {node: '>=14.0.0'} + kysely@0.29.2: + resolution: {integrity: sha512-s6WVJyEZrbm6jhBpiKHsGHyePMrVQKJ85wZCFCr9W4QHv6WTjWIrdvTmO9hDEA3bNK0xkrE2DqrHsXMLWuZpQg==} + engines: {node: '>=22.0.0'} layerr@3.0.0: resolution: {integrity: sha512-tv754Ki2dXpPVApOrjTyRo4/QegVb9eVFq4mjqp4+NM5NaX7syQvN5BBNfV/ZpAHCEHV24XdUVrBAoka4jt3pA==} @@ -2322,9 +2251,6 @@ packages: longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - loupe@3.2.1: - resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} - lru-cache@11.3.5: resolution: {integrity: sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==} engines: {node: 20 || >=22} @@ -2676,12 +2602,8 @@ packages: path-to-regexp@8.4.2: resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} - pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - - pathval@2.0.1: - resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} - engines: {node: '>= 14.16'} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} pg-cloudflare@1.3.0: resolution: {integrity: sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==} @@ -3100,8 +3022,8 @@ packages: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} - std-env@3.10.0: - resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + 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==} @@ -3155,9 +3077,6 @@ packages: resolution: {integrity: sha512-Ae3OVUqifDw0wBriIBS7yVaW44Dp6eSHQcyq4Igc7eN2TJH/2YsicswaW+J/OuMvhpDPOKEgpAZCjkb4hpoyeA==} engines: {node: ^16.14.0 || >= 17.3.0} - tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyexec@1.1.1: resolution: {integrity: sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==} engines: {node: '>=18'} @@ -3166,16 +3085,8 @@ packages: resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} engines: {node: '>=12.0.0'} - tinypool@1.1.1: - resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} - engines: {node: ^18.0.0 || >=20.0.0} - - tinyrainbow@1.2.0: - resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} - engines: {node: '>=14.0.0'} - - tinyspy@3.0.2: - resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + tinyrainbow@3.1.0: + resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} toidentifier@1.0.1: @@ -3191,6 +3102,7 @@ packages: tsconfck@3.1.6: resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} engines: {node: ^18 || >=20} + deprecated: unmaintained hasBin: true peerDependencies: typescript: ^5.0.0 @@ -3241,6 +3153,9 @@ packages: undici-types@7.19.2: resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} + unicode-segmenter@0.14.5: + resolution: {integrity: sha512-jHGmj2LUuqDcX3hqY12Ql+uhUTn8huuxNZGq7GvtF6bSybzH3aFgedYu/KTzQStEgt1Ra2F3HxadNXsNjb3m3g==} + unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} @@ -3357,6 +3272,14 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + valibot@1.4.1: + resolution: {integrity: sha512-klCmFTz2jeDluy9RwX+F884TCiogtdBJ/YaxSx1EOBYXa3NXNWj8kR1jjN8rzluwojJVWWaHJ4r1U5LfICnM3g==} + peerDependencies: + typescript: '>=5' + peerDependenciesMeta: + typescript: + optional: true + vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -3370,42 +3293,6 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-node@2.1.9: - resolution: {integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - - vite@5.4.21: - resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - vite@7.3.2: resolution: {integrity: sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3454,23 +3341,39 @@ packages: vite: optional: true - vitest@2.1.9: - resolution: {integrity: sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==} - engines: {node: ^18.0.0 || >=20.0.0} + vitest@4.1.9: + resolution: {integrity: sha512-nE3/LEyc0z87uHYLZebqCUOaJr2hdtuPp7BQ4BosVFnfltxgAvMG08NyrSGlPpOUWvR27c5flSmYFTNr78L9GQ==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 2.1.9 - '@vitest/ui': 2.1.9 + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.1.9 + '@vitest/browser-preview': 4.1.9 + '@vitest/browser-webdriverio': 4.1.9 + '@vitest/coverage-istanbul': 4.1.9 + '@vitest/coverage-v8': 4.1.9 + '@vitest/ui': 4.1.9 happy-dom: '*' jsdom: '*' + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: '@edge-runtime/vm': optional: true + '@opentelemetry/api': + optional: true '@types/node': optional: true - '@vitest/browser': + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': optional: true '@vitest/ui': optional: true @@ -3679,6 +3582,9 @@ packages: zod@4.3.6: resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + zrender@6.0.0: resolution: {integrity: sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg==} @@ -3802,6 +3708,56 @@ snapshots: dependencies: yaml: 2.8.3 + '@atcute/atproto@4.0.2(@atcute/lexicons@2.0.1)': + dependencies: + '@atcute/lexicons': 2.0.1 + + '@atcute/client@5.1.0(@atcute/lexicons@2.0.1)(typescript@5.9.3)': + dependencies: + '@atcute/identity': 2.0.0(@atcute/lexicons@2.0.1)(typescript@5.9.3) + '@atcute/lexicons': 2.0.1 + transitivePeerDependencies: + - typescript + + '@atcute/identity-resolver@2.0.0(@atcute/identity@2.0.0(@atcute/lexicons@2.0.1)(typescript@5.9.3))(@atcute/lexicons@2.0.1)(typescript@5.9.3)': + dependencies: + '@atcute/identity': 2.0.0(@atcute/lexicons@2.0.1)(typescript@5.9.3) + '@atcute/lexicons': 2.0.1 + '@atcute/util-fetch': 2.0.0(typescript@5.9.3) + valibot: 1.4.1(typescript@5.9.3) + transitivePeerDependencies: + - typescript + + '@atcute/identity@2.0.0(@atcute/lexicons@2.0.1)(typescript@5.9.3)': + dependencies: + '@atcute/lexicons': 2.0.1 + valibot: 1.4.1(typescript@5.9.3) + transitivePeerDependencies: + - typescript + + '@atcute/lexicons@2.0.1': + dependencies: + '@atcute/uint8array': 1.1.2 + '@atcute/util-text': 1.3.1 + '@standard-schema/spec': 1.1.0 + esm-env: 1.2.2 + + '@atcute/multibase@1.2.3': + dependencies: + '@atcute/uint8array': 1.1.2 + + '@atcute/uint8array@1.1.2': {} + + '@atcute/util-fetch@2.0.0(typescript@5.9.3)': + dependencies: + valibot: 1.4.1(typescript@5.9.3) + transitivePeerDependencies: + - typescript + + '@atcute/util-text@1.3.1': + dependencies: + unicode-segmenter: 0.14.5 + '@babel/code-frame@7.29.0': dependencies: '@babel/helper-validator-identifier': 7.28.5 @@ -3916,21 +3872,21 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 - '@base-ui/react@1.4.0(@date-fns/tz@1.4.1)(@types/react@19.2.14)(date-fns@4.1.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@base-ui/react@1.5.0(@date-fns/tz@1.4.1)(@types/react@19.2.14)(date-fns@4.1.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: '@babel/runtime': 7.29.2 - '@base-ui/utils': 0.2.7(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@date-fns/tz': 1.4.1 + '@base-ui/utils': 0.2.9(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@floating-ui/react-dom': 2.1.8(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@floating-ui/utils': 0.2.11 - date-fns: 4.1.0 react: 19.2.5 react-dom: 19.2.5(react@19.2.5) use-sync-external-store: 1.6.0(react@19.2.5) optionalDependencies: + '@date-fns/tz': 1.4.1 '@types/react': 19.2.14 + date-fns: 4.1.0 - '@base-ui/utils@0.2.7(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@base-ui/utils@0.2.9(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: '@babel/runtime': 7.29.2 '@floating-ui/utils': 0.2.11 @@ -3957,14 +3913,13 @@ snapshots: fast-wrap-ansi: 0.1.6 sisteransi: 1.0.5 - '@cloudflare/kumo@1.18.0(@date-fns/tz@1.4.1)(@phosphor-icons/react@2.1.10(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@types/react@19.2.14)(date-fns@4.1.0)(echarts@6.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod@4.3.6)': + '@cloudflare/kumo@2.5.2(@date-fns/tz@1.4.1)(@phosphor-icons/react@2.1.10(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@types/react@19.2.14)(date-fns@4.1.0)(echarts@6.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod@4.4.3)': dependencies: - '@base-ui/react': 1.4.0(@date-fns/tz@1.4.1)(@types/react@19.2.14)(date-fns@4.1.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@base-ui/react': 1.5.0(@date-fns/tz@1.4.1)(@types/react@19.2.14)(date-fns@4.1.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@phosphor-icons/react': 2.1.10(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@shikijs/langs': 4.0.2 '@shikijs/themes': 4.0.2 clsx: 2.1.1 - echarts: 6.0.0 motion: 12.38.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) react: 19.2.5 react-day-picker: 9.14.0(react@19.2.5) @@ -3972,7 +3927,8 @@ snapshots: shiki: 4.0.2 tailwind-merge: 3.5.0 optionalDependencies: - zod: 4.3.6 + echarts: 6.0.0 + zod: 4.4.3 transitivePeerDependencies: - '@date-fns/tz' - '@emotion/is-prop-valid' @@ -4006,13 +3962,18 @@ snapshots: react: 19.2.5 tslib: 2.8.1 - '@emdash-cms/admin@0.6.0(@date-fns/tz@1.4.1)(@floating-ui/dom@1.7.6)(@tiptap/extension-collaboration@3.22.3(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))(@tiptap/pm@3.22.3)(@tiptap/y-tiptap@3.0.3(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.8)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30))(yjs@13.6.30))(@tiptap/extensions@3.22.3(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))(@tiptap/pm@3.22.3))(@tiptap/y-tiptap@3.0.3(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.8)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30))(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(date-fns@4.1.0)(echarts@6.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod@4.3.6)': + '@emdash-cms/admin@0.21.0(@atcute/identity@2.0.0(@atcute/lexicons@2.0.1)(typescript@5.9.3))(@date-fns/tz@1.4.1)(@floating-ui/dom@1.7.6)(@tiptap/extension-collaboration@3.22.3(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))(@tiptap/pm@3.22.3)(@tiptap/y-tiptap@3.0.3(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.8)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30))(yjs@13.6.30))(@tiptap/extensions@3.22.3(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))(@tiptap/pm@3.22.3))(@tiptap/y-tiptap@3.0.3(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.8)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30))(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(date-fns@4.1.0)(echarts@6.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@5.9.3)(zod@4.4.3)': dependencies: - '@cloudflare/kumo': 1.18.0(@date-fns/tz@1.4.1)(@phosphor-icons/react@2.1.10(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@types/react@19.2.14)(date-fns@4.1.0)(echarts@6.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod@4.3.6) + '@atcute/identity-resolver': 2.0.0(@atcute/identity@2.0.0(@atcute/lexicons@2.0.1)(typescript@5.9.3))(@atcute/lexicons@2.0.1)(typescript@5.9.3) + '@atcute/lexicons': 2.0.1 + '@cloudflare/kumo': 2.5.2(@date-fns/tz@1.4.1)(@phosphor-icons/react@2.1.10(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@types/react@19.2.14)(date-fns@4.1.0)(echarts@6.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod@4.4.3) '@dnd-kit/core': 6.3.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@dnd-kit/sortable': 10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react@19.2.5) '@dnd-kit/utilities': 3.2.2(react@19.2.5) - '@emdash-cms/blocks': 0.6.0(@date-fns/tz@1.4.1)(@types/react@19.2.14)(date-fns@4.1.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod@4.3.6) + '@emdash-cms/blocks': 0.21.0(@date-fns/tz@1.4.1)(@types/react@19.2.14)(date-fns@4.1.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod@4.4.3) + '@emdash-cms/plugin-types': 0.1.0 + '@emdash-cms/registry-client': 0.3.2(typescript@5.9.3) + '@emdash-cms/registry-lexicons': 0.1.1 '@floating-ui/react': 0.27.19(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@lingui/core': 5.9.5 '@lingui/react': 5.9.5(react@19.2.5) @@ -4021,6 +3982,7 @@ snapshots: '@tanstack/react-router': 1.163.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@tiptap/core': 3.22.3(@tiptap/pm@3.22.3) '@tiptap/extension-character-count': 3.22.3(@tiptap/extensions@3.22.3(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))(@tiptap/pm@3.22.3)) + '@tiptap/extension-code-block': 3.22.3(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))(@tiptap/pm@3.22.3) '@tiptap/extension-drag-handle': 3.22.3(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))(@tiptap/extension-collaboration@3.22.3(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))(@tiptap/pm@3.22.3)(@tiptap/y-tiptap@3.0.3(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.8)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30))(yjs@13.6.30))(@tiptap/extension-node-range@3.22.3(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))(@tiptap/pm@3.22.3))(@tiptap/pm@3.22.3)(@tiptap/y-tiptap@3.0.3(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.8)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30)) '@tiptap/extension-drag-handle-react': 3.22.3(@tiptap/extension-drag-handle@3.22.3(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))(@tiptap/extension-collaboration@3.22.3(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))(@tiptap/pm@3.22.3)(@tiptap/y-tiptap@3.0.3(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.8)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30))(yjs@13.6.30))(@tiptap/extension-node-range@3.22.3(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))(@tiptap/pm@3.22.3))(@tiptap/pm@3.22.3)(@tiptap/y-tiptap@3.0.3(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.8)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30)))(@tiptap/pm@3.22.3)(@tiptap/react@3.22.3(@floating-ui/dom@1.7.6)(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))(@tiptap/pm@3.22.3)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@tiptap/extension-dropcursor': 3.22.3(@tiptap/extensions@3.22.3(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))(@tiptap/pm@3.22.3)) @@ -4028,6 +3990,10 @@ snapshots: '@tiptap/extension-link': 3.22.3(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))(@tiptap/pm@3.22.3) '@tiptap/extension-node-range': 3.22.3(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))(@tiptap/pm@3.22.3) '@tiptap/extension-placeholder': 3.22.3(@tiptap/extensions@3.22.3(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))(@tiptap/pm@3.22.3)) + '@tiptap/extension-table': 3.27.0(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))(@tiptap/pm@3.22.3) + '@tiptap/extension-table-cell': 3.27.0(@tiptap/extension-table@3.27.0(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))(@tiptap/pm@3.22.3)) + '@tiptap/extension-table-header': 3.27.0(@tiptap/extension-table@3.27.0(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))(@tiptap/pm@3.22.3)) + '@tiptap/extension-table-row': 3.27.0(@tiptap/extension-table@3.27.0(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))(@tiptap/pm@3.22.3)) '@tiptap/extension-text-align': 3.22.3(@tiptap/core@3.22.3(@tiptap/pm@3.22.3)) '@tiptap/extension-typography': 3.22.3(@tiptap/core@3.22.3(@tiptap/pm@3.22.3)) '@tiptap/extension-underline': 3.22.3(@tiptap/core@3.22.3(@tiptap/pm@3.22.3)) @@ -4043,6 +4009,7 @@ snapshots: react-hotkeys-hook: 5.2.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5) tailwind-merge: 3.5.0 transitivePeerDependencies: + - '@atcute/identity' - '@date-fns/tz' - '@emotion/is-prop-valid' - '@floating-ui/dom' @@ -4055,22 +4022,23 @@ snapshots: - babel-plugin-macros - date-fns - echarts + - typescript - zod - '@emdash-cms/auth@0.6.0(astro@6.1.6(@types/node@25.6.0)(rollup@4.60.1)(typescript@5.9.3)(yaml@2.8.3))(kysely@0.27.6)': + '@emdash-cms/auth@0.21.0(astro@6.1.6(@types/node@25.6.0)(rollup@4.60.1)(typescript@5.9.3)(yaml@2.8.3))(kysely@0.29.2)': dependencies: '@oslojs/crypto': 1.0.1 '@oslojs/encoding': 1.1.0 '@oslojs/webauthn': 1.0.0 astro: 6.1.6(@types/node@25.6.0)(rollup@4.60.1)(typescript@5.9.3)(yaml@2.8.3) ulidx: 2.4.1 - zod: 4.3.6 + zod: 4.4.3 optionalDependencies: - kysely: 0.27.6 + kysely: 0.29.2 - '@emdash-cms/blocks@0.6.0(@date-fns/tz@1.4.1)(@types/react@19.2.14)(date-fns@4.1.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod@4.3.6)': + '@emdash-cms/blocks@0.21.0(@date-fns/tz@1.4.1)(@types/react@19.2.14)(date-fns@4.1.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod@4.4.3)': dependencies: - '@cloudflare/kumo': 1.18.0(@date-fns/tz@1.4.1)(@phosphor-icons/react@2.1.10(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@types/react@19.2.14)(date-fns@4.1.0)(echarts@6.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod@4.3.6) + '@cloudflare/kumo': 2.5.2(@date-fns/tz@1.4.1)(@phosphor-icons/react@2.1.10(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@types/react@19.2.14)(date-fns@4.1.0)(echarts@6.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod@4.4.3) '@phosphor-icons/react': 2.1.10(react-dom@19.2.5(react@19.2.5))(react@19.2.5) clsx: 2.1.1 echarts: 6.0.0 @@ -4084,11 +4052,27 @@ snapshots: - date-fns - zod - '@emdash-cms/gutenberg-to-portable-text@0.6.0': + '@emdash-cms/gutenberg-to-portable-text@0.21.0': dependencies: '@wordpress/block-serialization-default-parser': 5.43.0 parse5: 7.3.0 + '@emdash-cms/plugin-types@0.1.0': {} + + '@emdash-cms/registry-client@0.3.2(typescript@5.9.3)': + dependencies: + '@atcute/atproto': 4.0.2(@atcute/lexicons@2.0.1) + '@atcute/client': 5.1.0(@atcute/lexicons@2.0.1)(typescript@5.9.3) + '@atcute/lexicons': 2.0.1 + '@emdash-cms/registry-lexicons': 0.1.1 + transitivePeerDependencies: + - typescript + + '@emdash-cms/registry-lexicons@0.1.1': + dependencies: + '@atcute/atproto': 4.0.2(@atcute/lexicons@2.0.1) + '@atcute/lexicons': 2.0.1 + '@emmetio/abbreviation@2.3.3': dependencies: '@emmetio/scanner': 1.0.4 @@ -4117,150 +4101,81 @@ snapshots: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.21.5': - optional: true - '@esbuild/aix-ppc64@0.27.7': optional: true - '@esbuild/android-arm64@0.21.5': - optional: true - '@esbuild/android-arm64@0.27.7': optional: true - '@esbuild/android-arm@0.21.5': - optional: true - '@esbuild/android-arm@0.27.7': optional: true - '@esbuild/android-x64@0.21.5': - optional: true - '@esbuild/android-x64@0.27.7': optional: true - '@esbuild/darwin-arm64@0.21.5': - optional: true - '@esbuild/darwin-arm64@0.27.7': optional: true - '@esbuild/darwin-x64@0.21.5': - optional: true - '@esbuild/darwin-x64@0.27.7': optional: true - '@esbuild/freebsd-arm64@0.21.5': - optional: true - '@esbuild/freebsd-arm64@0.27.7': optional: true - '@esbuild/freebsd-x64@0.21.5': - optional: true - '@esbuild/freebsd-x64@0.27.7': optional: true - '@esbuild/linux-arm64@0.21.5': - optional: true - '@esbuild/linux-arm64@0.27.7': optional: true - '@esbuild/linux-arm@0.21.5': - optional: true - '@esbuild/linux-arm@0.27.7': optional: true - '@esbuild/linux-ia32@0.21.5': - optional: true - '@esbuild/linux-ia32@0.27.7': optional: true - '@esbuild/linux-loong64@0.21.5': - optional: true - '@esbuild/linux-loong64@0.27.7': optional: true - '@esbuild/linux-mips64el@0.21.5': - optional: true - '@esbuild/linux-mips64el@0.27.7': optional: true - '@esbuild/linux-ppc64@0.21.5': - optional: true - '@esbuild/linux-ppc64@0.27.7': optional: true - '@esbuild/linux-riscv64@0.21.5': - optional: true - '@esbuild/linux-riscv64@0.27.7': optional: true - '@esbuild/linux-s390x@0.21.5': - optional: true - '@esbuild/linux-s390x@0.27.7': optional: true - '@esbuild/linux-x64@0.21.5': - optional: true - '@esbuild/linux-x64@0.27.7': optional: true '@esbuild/netbsd-arm64@0.27.7': optional: true - '@esbuild/netbsd-x64@0.21.5': - optional: true - '@esbuild/netbsd-x64@0.27.7': optional: true '@esbuild/openbsd-arm64@0.27.7': optional: true - '@esbuild/openbsd-x64@0.21.5': - optional: true - '@esbuild/openbsd-x64@0.27.7': optional: true '@esbuild/openharmony-arm64@0.27.7': optional: true - '@esbuild/sunos-x64@0.21.5': - optional: true - '@esbuild/sunos-x64@0.27.7': optional: true - '@esbuild/win32-arm64@0.21.5': - optional: true - '@esbuild/win32-arm64@0.27.7': optional: true - '@esbuild/win32-ia32@0.21.5': - optional: true - '@esbuild/win32-ia32@0.27.7': optional: true - '@esbuild/win32-x64@0.21.5': - optional: true - '@esbuild/win32-x64@0.27.7': optional: true @@ -4473,10 +4388,10 @@ snapshots: - utf-8-validate optional: true - '@libsql/kysely-libsql@0.4.1(kysely@0.27.6)': + '@libsql/kysely-libsql@0.4.1(kysely@0.29.2)': dependencies: '@libsql/client': 0.8.1 - kysely: 0.27.6 + kysely: 0.29.2 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -4517,7 +4432,7 @@ snapshots: dependencies: moo: 0.5.3 - '@modelcontextprotocol/sdk@1.29.0(zod@4.3.6)': + '@modelcontextprotocol/sdk@1.29.0(zod@4.4.3)': dependencies: '@hono/node-server': 1.19.14(hono@4.12.12) ajv: 8.18.0 @@ -4534,8 +4449,8 @@ snapshots: json-schema-typed: 8.0.2 pkce-challenge: 5.0.1 raw-body: 3.0.2 - zod: 4.3.6 - zod-to-json-schema: 3.25.2(zod@4.3.6) + zod: 4.4.3 + zod-to-json-schema: 3.25.2(zod@4.4.3) transitivePeerDependencies: - supports-color @@ -4724,6 +4639,8 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} + '@standard-schema/spec@1.1.0': {} + '@tabby_ai/hijri-converter@1.0.5': {} '@tanstack/history@1.161.4': {} @@ -4909,6 +4826,23 @@ snapshots: dependencies: '@tiptap/core': 3.22.3(@tiptap/pm@3.22.3) + '@tiptap/extension-table-cell@3.27.0(@tiptap/extension-table@3.27.0(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))(@tiptap/pm@3.22.3))': + dependencies: + '@tiptap/extension-table': 3.27.0(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))(@tiptap/pm@3.22.3) + + '@tiptap/extension-table-header@3.27.0(@tiptap/extension-table@3.27.0(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))(@tiptap/pm@3.22.3))': + dependencies: + '@tiptap/extension-table': 3.27.0(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))(@tiptap/pm@3.22.3) + + '@tiptap/extension-table-row@3.27.0(@tiptap/extension-table@3.27.0(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))(@tiptap/pm@3.22.3))': + dependencies: + '@tiptap/extension-table': 3.27.0(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))(@tiptap/pm@3.22.3) + + '@tiptap/extension-table@3.27.0(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))(@tiptap/pm@3.22.3)': + dependencies: + '@tiptap/core': 3.22.3(@tiptap/pm@3.22.3) + '@tiptap/pm': 3.22.3 + '@tiptap/extension-text-align@3.22.3(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))': dependencies: '@tiptap/core': 3.22.3(@tiptap/pm@3.22.3) @@ -5030,10 +4964,17 @@ snapshots: dependencies: '@babel/types': 7.29.0 + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + '@types/debug@4.1.13': dependencies: '@types/ms': 2.1.0 + '@types/deep-eql@4.0.2': {} + '@types/estree@1.0.8': {} '@types/hast@3.0.4': @@ -5102,45 +5043,46 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/expect@2.1.9': + '@vitest/expect@4.1.9': dependencies: - '@vitest/spy': 2.1.9 - '@vitest/utils': 2.1.9 - chai: 5.3.3 - tinyrainbow: 1.2.0 + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.1.9 + '@vitest/utils': 4.1.9 + chai: 6.2.2 + tinyrainbow: 3.1.0 - '@vitest/mocker@2.1.9(vite@5.4.21(@types/node@25.6.0))': + '@vitest/mocker@4.1.9(vite@7.3.2(@types/node@25.6.0)(yaml@2.8.3))': dependencies: - '@vitest/spy': 2.1.9 + '@vitest/spy': 4.1.9 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 5.4.21(@types/node@25.6.0) + vite: 7.3.2(@types/node@25.6.0)(yaml@2.8.3) - '@vitest/pretty-format@2.1.9': + '@vitest/pretty-format@4.1.9': dependencies: - tinyrainbow: 1.2.0 + tinyrainbow: 3.1.0 - '@vitest/runner@2.1.9': + '@vitest/runner@4.1.9': dependencies: - '@vitest/utils': 2.1.9 - pathe: 1.1.2 + '@vitest/utils': 4.1.9 + pathe: 2.0.3 - '@vitest/snapshot@2.1.9': + '@vitest/snapshot@4.1.9': dependencies: - '@vitest/pretty-format': 2.1.9 + '@vitest/pretty-format': 4.1.9 + '@vitest/utils': 4.1.9 magic-string: 0.30.21 - pathe: 1.1.2 + pathe: 2.0.3 - '@vitest/spy@2.1.9': - dependencies: - tinyspy: 3.0.2 + '@vitest/spy@4.1.9': {} - '@vitest/utils@2.1.9': + '@vitest/utils@4.1.9': dependencies: - '@vitest/pretty-format': 2.1.9 - loupe: 3.2.1 - tinyrainbow: 1.2.0 + '@vitest/pretty-format': 4.1.9 + convert-source-map: 2.0.0 + tinyrainbow: 3.1.0 '@volar/kit@2.4.28(typescript@5.9.3)': dependencies: @@ -5402,8 +5344,6 @@ snapshots: bytes@3.1.2: {} - cac@6.7.14: {} - call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -5418,13 +5358,7 @@ snapshots: ccount@2.0.1: {} - chai@5.3.3: - dependencies: - assertion-error: 2.0.1 - check-error: 2.1.3 - deep-eql: 5.0.2 - loupe: 3.2.1 - pathval: 2.0.1 + chai@6.2.2: {} character-entities-html4@2.1.0: {} @@ -5432,8 +5366,6 @@ snapshots: character-entities@2.0.2: {} - check-error@2.1.3: {} - chokidar@4.0.3: dependencies: readdirp: 4.1.2 @@ -5556,8 +5488,6 @@ snapshots: dependencies: mimic-response: 3.1.0 - deep-eql@5.0.2: {} - deep-extend@0.6.0: {} deepmerge@4.3.1: {} @@ -5624,18 +5554,24 @@ snapshots: electron-to-chromium@1.5.336: {} - emdash@0.6.0(6efdb8802079419a2db620598b63e0a0): + emdash@0.21.0(ad9145494d9c9f98a33ecb0bce4fdd0c): dependencies: '@astrojs/react': 5.0.3(@types/node@25.6.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(yaml@2.8.3) - '@emdash-cms/admin': 0.6.0(@date-fns/tz@1.4.1)(@floating-ui/dom@1.7.6)(@tiptap/extension-collaboration@3.22.3(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))(@tiptap/pm@3.22.3)(@tiptap/y-tiptap@3.0.3(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.8)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30))(yjs@13.6.30))(@tiptap/extensions@3.22.3(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))(@tiptap/pm@3.22.3))(@tiptap/y-tiptap@3.0.3(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.8)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30))(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(date-fns@4.1.0)(echarts@6.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod@4.3.6) - '@emdash-cms/auth': 0.6.0(astro@6.1.6(@types/node@25.6.0)(rollup@4.60.1)(typescript@5.9.3)(yaml@2.8.3))(kysely@0.27.6) - '@emdash-cms/gutenberg-to-portable-text': 0.6.0 + '@atcute/client': 5.1.0(@atcute/lexicons@2.0.1)(typescript@5.9.3) + '@atcute/lexicons': 2.0.1 + '@atcute/multibase': 1.2.3 + '@emdash-cms/admin': 0.21.0(@atcute/identity@2.0.0(@atcute/lexicons@2.0.1)(typescript@5.9.3))(@date-fns/tz@1.4.1)(@floating-ui/dom@1.7.6)(@tiptap/extension-collaboration@3.22.3(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))(@tiptap/pm@3.22.3)(@tiptap/y-tiptap@3.0.3(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.8)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30))(yjs@13.6.30))(@tiptap/extensions@3.22.3(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))(@tiptap/pm@3.22.3))(@tiptap/y-tiptap@3.0.3(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.8)(y-protocols@1.0.7(yjs@13.6.30))(yjs@13.6.30))(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(date-fns@4.1.0)(echarts@6.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@5.9.3)(zod@4.4.3) + '@emdash-cms/auth': 0.21.0(astro@6.1.6(@types/node@25.6.0)(rollup@4.60.1)(typescript@5.9.3)(yaml@2.8.3))(kysely@0.29.2) + '@emdash-cms/gutenberg-to-portable-text': 0.21.0 + '@emdash-cms/plugin-types': 0.1.0 + '@emdash-cms/registry-client': 0.3.2(typescript@5.9.3) '@floating-ui/react': 0.27.19(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@modelcontextprotocol/sdk': 1.29.0(zod@4.3.6) + '@modelcontextprotocol/sdk': 1.29.0(zod@4.4.3) + '@oslojs/crypto': 1.0.1 + '@oslojs/encoding': 1.1.0 '@portabletext/toolkit': 5.0.2 - '@tanstack/react-query': 5.90.21(react@19.2.5) - '@tanstack/react-router': 1.163.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@tiptap/core': 3.22.3(@tiptap/pm@3.22.3) + '@tiptap/extension-code-block': 3.22.3(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))(@tiptap/pm@3.22.3) '@tiptap/extension-focus': 3.22.3(@tiptap/extensions@3.22.3(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))(@tiptap/pm@3.22.3)) '@tiptap/extension-image': 3.22.3(@tiptap/core@3.22.3(@tiptap/pm@3.22.3)) '@tiptap/extension-link': 3.22.3(@tiptap/core@3.22.3(@tiptap/pm@3.22.3))(@tiptap/pm@3.22.3) @@ -5658,7 +5594,7 @@ snapshots: image-size: 2.0.2 jose: 6.2.2 jpeg-js: 0.4.4 - kysely: 0.27.6 + kysely: 0.29.2 mime: 4.1.0 modern-tar: 0.7.6 picocolors: 1.1.1 @@ -5668,11 +5604,12 @@ snapshots: sax: 1.6.0 ulidx: 2.4.1 upng-js: 2.1.0 - zod: 4.3.6 + zod: 4.4.3 optionalDependencies: - '@libsql/kysely-libsql': 0.4.1(kysely@0.27.6) + '@libsql/kysely-libsql': 0.4.1(kysely@0.29.2) pg: 8.20.0 transitivePeerDependencies: + - '@atcute/identity' - '@cfworker/json-schema' - '@date-fns/tz' - '@emotion/is-prop-valid' @@ -5690,6 +5627,7 @@ snapshots: - echarts - pg-native - supports-color + - typescript - utf-8-validate emmet@2.4.11: @@ -5715,40 +5653,12 @@ snapshots: es-errors@1.3.0: {} - es-module-lexer@1.7.0: {} - es-module-lexer@2.0.0: {} es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 - esbuild@0.21.5: - optionalDependencies: - '@esbuild/aix-ppc64': 0.21.5 - '@esbuild/android-arm': 0.21.5 - '@esbuild/android-arm64': 0.21.5 - '@esbuild/android-x64': 0.21.5 - '@esbuild/darwin-arm64': 0.21.5 - '@esbuild/darwin-x64': 0.21.5 - '@esbuild/freebsd-arm64': 0.21.5 - '@esbuild/freebsd-x64': 0.21.5 - '@esbuild/linux-arm': 0.21.5 - '@esbuild/linux-arm64': 0.21.5 - '@esbuild/linux-ia32': 0.21.5 - '@esbuild/linux-loong64': 0.21.5 - '@esbuild/linux-mips64el': 0.21.5 - '@esbuild/linux-ppc64': 0.21.5 - '@esbuild/linux-riscv64': 0.21.5 - '@esbuild/linux-s390x': 0.21.5 - '@esbuild/linux-x64': 0.21.5 - '@esbuild/netbsd-x64': 0.21.5 - '@esbuild/openbsd-x64': 0.21.5 - '@esbuild/sunos-x64': 0.21.5 - '@esbuild/win32-arm64': 0.21.5 - '@esbuild/win32-ia32': 0.21.5 - '@esbuild/win32-x64': 0.21.5 - esbuild@0.27.7: optionalDependencies: '@esbuild/aix-ppc64': 0.27.7 @@ -5786,6 +5696,8 @@ snapshots: escape-string-regexp@5.0.0: {} + esm-env@1.2.2: {} + estree-walker@2.0.2: {} estree-walker@3.0.3: @@ -6147,7 +6059,7 @@ snapshots: kleur@4.1.5: {} - kysely@0.27.6: {} + kysely@0.29.2: {} layerr@3.0.0: {} @@ -6177,8 +6089,6 @@ snapshots: longest-streak@3.1.0: {} - loupe@3.2.1: {} - lru-cache@11.3.5: {} lru-cache@5.1.1: @@ -6677,9 +6587,7 @@ snapshots: path-to-regexp@8.4.2: {} - pathe@1.1.2: {} - - pathval@2.0.1: {} + pathe@2.0.3: {} pg-cloudflare@1.3.0: optional: true @@ -7266,7 +7174,7 @@ snapshots: statuses@2.0.2: {} - std-env@3.10.0: {} + std-env@4.1.0: {} string-width@4.2.3: dependencies: @@ -7328,8 +7236,6 @@ snapshots: tinyclip@0.1.12: {} - tinyexec@0.3.2: {} - tinyexec@1.1.1: {} tinyglobby@0.2.16: @@ -7337,11 +7243,7 @@ snapshots: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 - tinypool@1.1.1: {} - - tinyrainbow@1.2.0: {} - - tinyspy@3.0.2: {} + tinyrainbow@3.1.0: {} toidentifier@1.0.1: {} @@ -7390,6 +7292,8 @@ snapshots: undici-types@7.19.2: optional: true + unicode-segmenter@0.14.5: {} + unified@11.0.5: dependencies: '@types/unist': 3.0.3 @@ -7477,6 +7381,10 @@ snapshots: util-deprecate@1.0.2: {} + valibot@1.4.1(typescript@5.9.3): + optionalDependencies: + typescript: 5.9.3 + vary@1.1.2: {} vfile-location@5.0.3: @@ -7494,33 +7402,6 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-node@2.1.9(@types/node@25.6.0): - dependencies: - cac: 6.7.14 - debug: 4.4.3 - es-module-lexer: 1.7.0 - pathe: 1.1.2 - vite: 5.4.21(@types/node@25.6.0) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - vite@5.4.21(@types/node@25.6.0): - dependencies: - esbuild: 0.21.5 - postcss: 8.5.9 - rollup: 4.60.1 - optionalDependencies: - '@types/node': 25.6.0 - fsevents: 2.3.3 - vite@7.3.2(@types/node@25.6.0)(yaml@2.8.3): dependencies: esbuild: 0.27.7 @@ -7538,40 +7419,32 @@ snapshots: optionalDependencies: vite: 7.3.2(@types/node@25.6.0)(yaml@2.8.3) - vitest@2.1.9(@types/node@25.6.0): + vitest@4.1.9(@types/node@25.6.0)(vite@7.3.2(@types/node@25.6.0)(yaml@2.8.3)): dependencies: - '@vitest/expect': 2.1.9 - '@vitest/mocker': 2.1.9(vite@5.4.21(@types/node@25.6.0)) - '@vitest/pretty-format': 2.1.9 - '@vitest/runner': 2.1.9 - '@vitest/snapshot': 2.1.9 - '@vitest/spy': 2.1.9 - '@vitest/utils': 2.1.9 - chai: 5.3.3 - debug: 4.4.3 + '@vitest/expect': 4.1.9 + '@vitest/mocker': 4.1.9(vite@7.3.2(@types/node@25.6.0)(yaml@2.8.3)) + '@vitest/pretty-format': 4.1.9 + '@vitest/runner': 4.1.9 + '@vitest/snapshot': 4.1.9 + '@vitest/spy': 4.1.9 + '@vitest/utils': 4.1.9 + es-module-lexer: 2.0.0 expect-type: 1.3.0 magic-string: 0.30.21 - pathe: 1.1.2 - std-env: 3.10.0 + obug: 2.1.1 + pathe: 2.0.3 + picomatch: 4.0.4 + std-env: 4.1.0 tinybench: 2.9.0 - tinyexec: 0.3.2 - tinypool: 1.1.1 - tinyrainbow: 1.2.0 - vite: 5.4.21(@types/node@25.6.0) - vite-node: 2.1.9(@types/node@25.6.0) + tinyexec: 1.1.1 + tinyglobby: 0.2.16 + tinyrainbow: 3.1.0 + vite: 7.3.2(@types/node@25.6.0)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 25.6.0 transitivePeerDependencies: - - less - - lightningcss - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser volar-service-css@0.0.70(@volar/language-service@2.4.28): dependencies: @@ -7751,14 +7624,16 @@ snapshots: yocto-queue@1.2.2: {} - zod-to-json-schema@3.25.2(zod@4.3.6): + zod-to-json-schema@3.25.2(zod@4.4.3): dependencies: - zod: 4.3.6 + zod: 4.4.3 zod@3.25.76: {} zod@4.3.6: {} + zod@4.4.3: {} + zrender@6.0.0: dependencies: tslib: 2.3.0 diff --git a/src/index.ts b/src/index.ts index 836edc8..cbff195 100644 --- a/src/index.ts +++ b/src/index.ts @@ -12,7 +12,7 @@ import { listSchemaEntries } from "./schema/endpoints.js"; export function seoPlugin(): PluginDescriptor { return { id: "seo", - version: "0.10.0", + version: "0.12.0", format: "native", entrypoint: new URL("./index.ts", import.meta.url).pathname, adminEntry: new URL("./admin.tsx", import.meta.url).pathname, @@ -27,7 +27,7 @@ export function seoPlugin(): PluginDescriptor { export function createPlugin() { return definePlugin({ id: "seo", - version: "0.10.0", + version: "0.12.0", capabilities: ["read:content", "page:inject", "network:fetch"], allowedHosts: ["api.indexnow.org"], From 74a38e34ef4bf2c7253d5e7287c53256d63cedfc Mon Sep 17 00:00:00 2001 From: Joost de Valk Date: Thu, 18 Jun 2026 15:19:15 +0200 Subject: [PATCH 2/2] feat: broaden IndexNow triggers to saves and permanent deletes Adopt two hooks added in emdash 0.21.0: - content:afterSave -> handleIndexNowPublished. Pings IndexNow whenever published content is saved, closing the gap where edits to an already- published page never notified search engines (afterPublish only fires on the draft->published transition). afterPublish and afterSave both route through this handler; a per-URL 60s debounce collapses the duplicate they fire at the publish moment and absorbs autosave bursts. - content:afterDelete -> handleIndexNowDelete. Pings the dead URL on a permanent delete so engines recrawl and see the 404/410. The delete event carries only { id, collection } (no slug), so published saves cache an id->url mapping in KV that the delete handler resolves and clears. Trashing stays on the afterUnpublish path. Extracted submitUrlToIndexNow from handleIndexNowTransition (now only afterUnpublish). Added 9 tests; README + CHANGELOG updated. Co-Authored-By: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 7 +- README.md | 20 ++++- src/index.ts | 12 ++- src/indexnow.ts | 181 +++++++++++++++++++++++++++++++++++------- test/indexnow.test.ts | 110 +++++++++++++++++++++++++ 5 files changed, 294 insertions(+), 36 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7265bdb..7536da6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,9 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [0.12.0] - 2026-06-18 +### Added + +- **IndexNow now pings on edits to already-published pages.** The new `content:afterSave` hook fires on every save; the handler pings IndexNow whenever *published* content is saved. Previously only the draft→published transition (`content:afterPublish`) pinged, so editing a live page and re-saving never notified search engines. Both hooks route through the same handler; a per-URL debounce (60s, `PING_DEBOUNCE_MS`) collapses the duplicate the two fire at the publish moment and guards against autosave bursts. +- **IndexNow now pings on permanent deletes.** The new `content:afterDelete` hook submits a permanently-deleted page's last-known URL to IndexNow so engines recrawl and see the 404/410. Because the delete event carries only `{ id, collection }` (no slug), published saves record an `id → url` mapping in plugin KV (`indexnow:urlmap::`) that the delete handler resolves and then clears. Trashing is treated as an unpublish and continues to flow through `content:afterUnpublish`. + ### Changed -- **`peerDependencies.emdash` bumped to `^0.21.0`.** Tracks the current EmDash release. The plugin API surface this plugin depends on — the `page:metadata`, `content:afterPublish`, and `content:afterUnpublish` hooks, plus the `read:content`, `page:inject`, and `network:fetch` capabilities — is unchanged from `0.6.0`, so no source changes were required. Verified against `emdash@0.21.0`: typecheck clean, all tests passing. +- **`peerDependencies.emdash` bumped to `^0.21.0`.** Tracks the current EmDash release. The plugin API surface this plugin depends on — the `page:metadata`, `content:afterPublish`, and `content:afterUnpublish` hooks, plus the `read:content`, `page:inject`, and `network:fetch` capabilities — is unchanged from `0.6.0`, so the compatibility bump itself required no source changes. Verified against `emdash@0.21.0`: typecheck clean, all tests passing. - Internal plugin `version` strings in `src/index.ts` bumped to `0.12.0` to match the package version. ## [0.11.0] - 2026-04-21 diff --git a/README.md b/README.md index 7a960ca..5cbeb43 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ An SEO plugin for [EmDash CMS](https://github.com/emdash-cms/emdash) that genera - **Schema map** *(experimental)* — exposes a list of every published URL backed by schema markup at the plugin's `schema/map` route, ready to be wired to a `/schemamap.xml` Astro endpoint for agent/crawler discovery - **Fuzzy Redirects** — admin tool that mines the core 404 log, ranks live URLs by path similarity (Levenshtein + token overlap + last-segment match), and lets you one-click create a 301 redirect for the best target. Catches moved slugs, typos in inbound links, and punctuation drift without having to write regex rules - **NLWeb `` tag** — when the **NLWeb endpoint URL** setting is set, every rendered page carries `` advertising the site's conversational endpoint for agent discovery. Requires EmDash with [emdash-cms/emdash#523](https://github.com/emdash-cms/emdash/pull/523) merged; older versions drop the contribution silently -- **IndexNow** — on publish/unpublish transitions, submits the affected URL to [IndexNow](https://www.indexnow.org) so Bing, Yandex, Seznam, Naver, and Yep recrawl immediately. Opt-in via a single toggle in the settings UI; the key is generated and persisted automatically on first use +- **IndexNow** — on publish, on edits to an already-published page, on unpublish, and on permanent delete, submits the affected URL to [IndexNow](https://www.indexnow.org) so Bing, Yandex, Seznam, Naver, and Yep recrawl immediately. Opt-in via a single toggle in the settings UI; the key is generated and persisted automatically on first use - **Admin settings UI** — auto-generated from `settingsSchema` for configuring Person/Organization identity, social profiles, title separator, and default description ## Installation @@ -129,9 +129,21 @@ URLs become `/fr-ca/…` and `/fr-fr/…`, and the emitted `hreflang` attributes ## IndexNow When enabled via the **IndexNow submission** setting, the plugin submits -the canonical URL of any content item that transitions to or from -published. A 32-character hex key is minted on first use and persisted in -plugin KV. +the canonical URL of a content item whenever it changes in a way search +engines should re-crawl: + +- **Published, or edited while published** (`content:afterPublish` + + `content:afterSave`) — so both first publish and later edits to a live + page are picked up. A per-URL 60-second debounce collapses the duplicate + these two fire at the publish moment and absorbs autosave bursts. +- **Unpublished** (`content:afterUnpublish`) — pings the now-dead URL so + engines see the 404/410. +- **Permanently deleted** (`content:afterDelete`, only when the delete is + permanent rather than a trash) — the delete event carries no slug, so + published saves cache an `id → url` mapping in plugin KV that the delete + handler resolves, submits, and then clears. + +A 32-character hex key is minted on first use and persisted in plugin KV. The front-end Astro site must serve the key-verification file at `/.txt`. Fetch the key from the plugin's `indexnow/key` route and diff --git a/src/index.ts b/src/index.ts index cbff195..4203cd5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,6 +4,8 @@ import { metadataHandler } from "./metadata.js"; import { getKeyFileBody, getOrCreateIndexNowKey, + handleIndexNowDelete, + handleIndexNowPublished, handleIndexNowTransition, } from "./indexnow.js"; import { generateLlmsTxt } from "./llms.js"; @@ -37,13 +39,21 @@ export function createPlugin() { priority: 10, }, "content:afterPublish": { - handler: handleIndexNowTransition, + handler: handleIndexNowPublished, + priority: 50, + }, + "content:afterSave": { + handler: handleIndexNowPublished, priority: 50, }, "content:afterUnpublish": { handler: handleIndexNowTransition, priority: 50, }, + "content:afterDelete": { + handler: handleIndexNowDelete, + priority: 50, + }, }, routes: { diff --git a/src/indexnow.ts b/src/indexnow.ts index 62b70b0..8cd8083 100644 --- a/src/indexnow.ts +++ b/src/indexnow.ts @@ -10,6 +10,36 @@ import { buildPageUrl } from "./urls.js"; const KEY_KV = "indexnow:key"; const ENABLED_KV = "settings:indexnowEnabled"; +/** + * Maps a content record's `id` to the canonical URL it was last published + * at: `indexnow:urlmap::` → absolute URL. We keep this + * because `content:afterDelete` carries only `{ id, collection }` — no + * slug — so the URL of a permanently-deleted item can't be rebuilt from + * the delete event alone. Written whenever published content is saved, + * read (and cleared) on permanent delete. + */ +const URLMAP_PREFIX = "indexnow:urlmap:"; + +/** + * Records the epoch-ms of the last IndexNow submission per URL: + * `indexnow:lastping:` → number. Used to debounce rapid autosaves of + * the same page so each editing burst pings at most once per window. + */ +const LASTPING_PREFIX = "indexnow:lastping:"; + +/** + * Minimum gap between IndexNow submissions for the same URL. Editors + * autosave frequently; without this guard every keystroke-save of a live + * page would re-ping. A genuine edit in a later session (past the window) + * still pings. Tunable trade-off: longer = fewer pings but can swallow a + * real edit made shortly after publishing. + */ +const PING_DEBOUNCE_MS = 60_000; + +function urlMapKey(collection: string, id: string): string { + return `${URLMAP_PREFIX}${collection}:${id}`; +} + /** * Read or lazily generate the IndexNow key. The key is persisted in plugin * KV so subsequent submissions (and the key-file route exposed on the @@ -83,10 +113,47 @@ async function urlForContent( } /** - * Handler for `content:afterPublish` and `content:afterUnpublish`. - * Submits the transitioned URL to IndexNow so participating engines - * recrawl and pick up the new state (including 410/404 for unpublished - * content). Fire-and-forget: never throws, logs errors on ctx.log. + * Submit a single URL to IndexNow for the current site. Resolves the host + * from `ctx.site.url`, mints/reuses the key, and logs each engine result. + * Returns silently when the site URL is missing or unparseable. + */ +async function submitUrlToIndexNow(ctx: PluginContext, url: string): Promise { + const siteUrl = ctx.site.url; + if (!siteUrl) return; + + let host: string; + try { + host = new URL(siteUrl).hostname; + } catch { + return; + } + + const key = await getOrCreateIndexNowKey(ctx); + + const results = await submitToIndexNow({ host, key, urls: [url] }); + + for (const r of results) { + if (r.ok) { + ctx.log.info("IndexNow: submitted", { url, status: r.status }); + } else { + ctx.log.warn("IndexNow: submission failed", { + url, + status: r.status, + message: r.message, + }); + } + } +} + +/** Extract a string `id` from a content record, or null. */ +function contentId(content: Record): string | null { + return typeof content.id === "string" && content.id ? content.id : null; +} + +/** + * Handler for `content:afterUnpublish`. Submits the now-dead URL to + * IndexNow so participating engines recrawl and pick up the 404/410. + * Fire-and-forget: never throws, logs errors on ctx.log. */ export async function handleIndexNowTransition( event: { content: Record; collection: string }, @@ -101,37 +168,91 @@ export async function handleIndexNowTransition( const url = await urlForContent(event.content, event.collection, siteUrl); if (!url) return; - let host: string; - try { - host = new URL(siteUrl).hostname; - } catch { - return; - } - - const key = await getOrCreateIndexNowKey(ctx); - - const results = await submitToIndexNow({ - host, - key, - urls: [url], - }); - - for (const r of results) { - if (r.ok) { - ctx.log.info("IndexNow: submitted", { url, status: r.status }); - } else { - ctx.log.warn("IndexNow: submission failed", { - url, - status: r.status, - message: r.message, - }); - } - } + await submitUrlToIndexNow(ctx, url); } catch (error) { ctx.log.warn("IndexNow: transition handler error", { error }); } } +/** + * Handler for `content:afterPublish` and `content:afterSave`. Pings + * IndexNow whenever *published* content is saved — this covers the + * publish transition (via `afterPublish`) and, crucially, edits to an + * already-published page (via `afterSave`), which `afterPublish` alone + * never sees. Non-published saves (drafts, autosaves of unpublished + * content) are ignored. + * + * Wiring both hooks here is deliberate: `afterPublish` guarantees the + * publish ping even if `afterSave` semantics differ, and the per-URL + * debounce (see `PING_DEBOUNCE_MS`) collapses the duplicate the two hooks + * fire at the publish moment into a single submission. + * + * Also records the `id → url` mapping so a later permanent delete can + * resolve the URL. Fire-and-forget: never throws. + */ +export async function handleIndexNowPublished( + event: { content: Record; collection: string }, + ctx: PluginContext, +): Promise { + try { + if (!(await isIndexNowEnabled(ctx))) return; + + const status = + typeof event.content.status === "string" ? event.content.status : null; + if (status !== "published") return; + + const siteUrl = ctx.site.url; + if (!siteUrl) return; + + const url = await urlForContent(event.content, event.collection, siteUrl); + if (!url) return; + + // Remember where this id lives so afterDelete can ping the dead URL. + const id = contentId(event.content); + if (id) await ctx.kv.set(urlMapKey(event.collection, id), url); + + // Debounce rapid autosaves of the same URL. + const lastKey = `${LASTPING_PREFIX}${url}`; + const now = Date.now(); + const last = await ctx.kv.get(lastKey); + if (typeof last === "number" && now - last < PING_DEBOUNCE_MS) return; + await ctx.kv.set(lastKey, now); + + await submitUrlToIndexNow(ctx, url); + } catch (error) { + ctx.log.warn("IndexNow: published handler error", { error }); + } +} + +/** + * Handler for `content:afterDelete`. On a *permanent* delete of content + * that was previously published, submits its last-known URL to IndexNow + * so engines recrawl and see the 404/410, then clears the cached mapping. + * Trashing (`permanent === false`) is an unpublish and is handled by + * `handleIndexNowTransition`; we skip it here. No-op when the id has no + * cached URL (never published, or already cleaned up). + */ +export async function handleIndexNowDelete( + event: { id: string; collection: string; permanent: boolean }, + ctx: PluginContext, +): Promise { + try { + if (!event.permanent) return; + if (!(await isIndexNowEnabled(ctx))) return; + + const mapKey = urlMapKey(event.collection, event.id); + const url = await ctx.kv.get(mapKey); + if (typeof url !== "string" || !url) return; + + await submitUrlToIndexNow(ctx, url); + + await ctx.kv.delete(mapKey); + await ctx.kv.delete(`${LASTPING_PREFIX}${url}`); + } catch (error) { + ctx.log.warn("IndexNow: delete handler error", { error }); + } +} + /** Returns the plain-text body to serve at `/.txt`. */ export async function getKeyFileBody(ctx: PluginContext): Promise { const key = await getOrCreateIndexNowKey(ctx); diff --git a/test/indexnow.test.ts b/test/indexnow.test.ts index 35110ab..475a07e 100644 --- a/test/indexnow.test.ts +++ b/test/indexnow.test.ts @@ -3,6 +3,8 @@ import type { PluginContext } from "emdash"; import { getOrCreateIndexNowKey, + handleIndexNowDelete, + handleIndexNowPublished, handleIndexNowTransition, isIndexNowEnabled, } from "../src/indexnow.js"; @@ -163,3 +165,111 @@ describe("handleIndexNowTransition", () => { expect((ctx.log.warn as ReturnType)).toHaveBeenCalled(); }); }); + +describe("handleIndexNowPublished", () => { + const fetchSpy = vi.fn( + async (_url: string, _init?: RequestInit) => new Response("", { status: 200 }), + ); + + beforeEach(() => { + fetchSpy.mockClear(); + vi.stubGlobal("fetch", fetchSpy); + }); + + const published = { content: { id: "1", slug: "hello", status: "published" }, collection: "blog" }; + + it("does nothing when disabled", async () => { + const ctx = makeCtx(); + await handleIndexNowPublished(published, ctx); + expect(fetchSpy).not.toHaveBeenCalled(); + }); + + it("does nothing when status is not published", async () => { + const ctx = makeCtx(); + await ctx.kv.set("settings:indexnowEnabled", "true"); + await handleIndexNowPublished( + { content: { id: "1", slug: "hello", status: "draft" }, collection: "blog" }, + ctx, + ); + expect(fetchSpy).not.toHaveBeenCalled(); + }); + + it("submits and caches the id→url mapping when published & enabled", async () => { + const ctx = makeCtx(); + await ctx.kv.set("settings:indexnowEnabled", "true"); + await handleIndexNowPublished(published, ctx); + expect(fetchSpy).toHaveBeenCalledTimes(1); + expect(await ctx.kv.get("indexnow:urlmap:blog:1")).toBe( + "https://example.com/blog/hello/", + ); + }); + + it("debounces a second save of the same URL within the window", async () => { + const ctx = makeCtx(); + await ctx.kv.set("settings:indexnowEnabled", "true"); + await handleIndexNowPublished(published, ctx); + await handleIndexNowPublished(published, ctx); + expect(fetchSpy).toHaveBeenCalledTimes(1); + }); + + it("pings again once the debounce window has elapsed", async () => { + const ctx = makeCtx(); + await ctx.kv.set("settings:indexnowEnabled", "true"); + // Pretend the last ping was two minutes ago. + await ctx.kv.set( + "indexnow:lastping:https://example.com/blog/hello/", + Date.now() - 120_000, + ); + await handleIndexNowPublished(published, ctx); + expect(fetchSpy).toHaveBeenCalledTimes(1); + }); +}); + +describe("handleIndexNowDelete", () => { + const fetchSpy = vi.fn( + async (_url: string, _init?: RequestInit) => new Response("", { status: 200 }), + ); + + beforeEach(() => { + fetchSpy.mockClear(); + vi.stubGlobal("fetch", fetchSpy); + }); + + it("does nothing for a trash (non-permanent) delete", async () => { + const ctx = makeCtx(); + await ctx.kv.set("settings:indexnowEnabled", "true"); + await ctx.kv.set("indexnow:urlmap:blog:1", "https://example.com/blog/hello/"); + await handleIndexNowDelete({ id: "1", collection: "blog", permanent: false }, ctx); + expect(fetchSpy).not.toHaveBeenCalled(); + }); + + it("does nothing when disabled", async () => { + const ctx = makeCtx(); + await ctx.kv.set("indexnow:urlmap:blog:1", "https://example.com/blog/hello/"); + await handleIndexNowDelete({ id: "1", collection: "blog", permanent: true }, ctx); + expect(fetchSpy).not.toHaveBeenCalled(); + }); + + it("no-ops when the id has no cached URL", async () => { + const ctx = makeCtx(); + await ctx.kv.set("settings:indexnowEnabled", "true"); + await handleIndexNowDelete({ id: "99", collection: "blog", permanent: true }, ctx); + expect(fetchSpy).not.toHaveBeenCalled(); + }); + + it("submits the cached URL and clears the mapping on permanent delete", async () => { + const ctx = makeCtx(); + await ctx.kv.set("settings:indexnowEnabled", "true"); + await ctx.kv.set("indexnow:urlmap:blog:1", "https://example.com/blog/hello/"); + await ctx.kv.set("indexnow:lastping:https://example.com/blog/hello/", Date.now()); + await handleIndexNowDelete({ id: "1", collection: "blog", permanent: true }, ctx); + expect(fetchSpy).toHaveBeenCalledTimes(1); + const init = fetchSpy.mock.calls[0][1] as RequestInit; + const body = JSON.parse(init.body as string); + expect(body.urlList).toEqual(["https://example.com/blog/hello/"]); + expect(await ctx.kv.get("indexnow:urlmap:blog:1")).toBeUndefined(); + expect( + await ctx.kv.get("indexnow:lastping:https://example.com/blog/hello/"), + ).toBeUndefined(); + }); +});