├── .gitignore ├── .npmrc ├── LICENSE ├── README.md ├── examples └── react │ ├── .gitignore │ ├── README.md │ ├── eslint.config.js │ ├── index.html │ ├── package.json │ ├── postcss.config.js │ ├── src │ ├── App.tsx │ ├── index.css │ ├── main.tsx │ └── vite-env.d.ts │ ├── tailwind.config.js │ ├── tsconfig.app.json │ ├── tsconfig.json │ ├── tsconfig.node.json │ └── vite.config.ts ├── package.json ├── package ├── README.md ├── package.json ├── pnpm-lock.yaml ├── src │ ├── footnotes │ │ ├── footnote.ts │ │ ├── footnotes.ts │ │ ├── reference.ts │ │ ├── rules.ts │ │ └── utils.ts │ └── index.ts ├── tests │ ├── index.test.ts │ └── utils.ts ├── tsconfig.json └── tsup.config.ts ├── pnpm-lock.yaml └── pnpm-workspace.yaml /.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules 3 | .DS_Store 4 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | link-workspace-packages=true 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Buttondown 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ./package/README.md -------------------------------------------------------------------------------- /examples/react/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /examples/react/README.md: -------------------------------------------------------------------------------- 1 | This is an example React project showcasing Tiptap Footnotes in action. 2 | -------------------------------------------------------------------------------- /examples/react/eslint.config.js: -------------------------------------------------------------------------------- 1 | import js from "@eslint/js"; 2 | import globals from "globals"; 3 | import reactHooks from "eslint-plugin-react-hooks"; 4 | import reactRefresh from "eslint-plugin-react-refresh"; 5 | import tseslint from "typescript-eslint"; 6 | 7 | export default tseslint.config( 8 | { ignores: ["dist"] }, 9 | { 10 | extends: [js.configs.recommended, ...tseslint.configs.recommended], 11 | files: ["**/*.{ts,tsx}"], 12 | languageOptions: { 13 | ecmaVersion: 2020, 14 | globals: globals.browser, 15 | }, 16 | plugins: { 17 | "react-hooks": reactHooks, 18 | "react-refresh": reactRefresh, 19 | }, 20 | rules: { 21 | ...reactHooks.configs.recommended.rules, 22 | "react-refresh/only-export-components": [ 23 | "warn", 24 | { allowConstantExport: true }, 25 | ], 26 | }, 27 | } 28 | ); 29 | -------------------------------------------------------------------------------- /examples/react/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite + React + TS 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /examples/react/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tiptap-footnotes-react-example", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "tsc -b && vite build", 9 | "lint": "eslint .", 10 | "preview": "vite preview" 11 | }, 12 | "dependencies": { 13 | "@tiptap/core": "^2.10.0", 14 | "@tiptap/extension-document": "^2.10.0", 15 | "@tiptap/extension-list-item": "^2.10.0", 16 | "@tiptap/extension-ordered-list": "^2.10.0", 17 | "@tiptap/extension-placeholder": "^2.10.0", 18 | "@tiptap/pm": "^2.10.0", 19 | "@tiptap/react": "^2.10.0", 20 | "@tiptap/starter-kit": "^2.10.0", 21 | "react": "^18.3.1", 22 | "react-dom": "^18.3.1", 23 | "tiptap-footnotes": "^2.0.2" 24 | }, 25 | "devDependencies": { 26 | "@eslint/js": "^9.15.0", 27 | "@types/react": "^18.3.12", 28 | "@types/react-dom": "^18.3.1", 29 | "@vitejs/plugin-react": "^4.3.3", 30 | "autoprefixer": "^10.4.20", 31 | "eslint": "^9.15.0", 32 | "eslint-plugin-react-hooks": "5.1.0-rc-fb9a90fa48-20240614", 33 | "eslint-plugin-react-refresh": "^0.4.14", 34 | "globals": "^15.12.0", 35 | "postcss": "^8.4.49", 36 | "tailwindcss": "^3.4.15", 37 | "typescript": "^5.6.3", 38 | "typescript-eslint": "^8.15.0", 39 | "vite": "^5.4.11" 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /examples/react/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /examples/react/src/App.tsx: -------------------------------------------------------------------------------- 1 | import { useEditor, EditorContent } from "@tiptap/react"; 2 | import StarterKit from "@tiptap/starter-kit"; 3 | import Placeholder from "@tiptap/extension-placeholder"; 4 | import { Footnotes, FootnoteReference, Footnote } from "tiptap-footnotes"; 5 | import Document from "@tiptap/extension-document"; 6 | 7 | const extensions = [ 8 | StarterKit.configure({ 9 | document: false, 10 | }), 11 | Document.extend({ 12 | content: "block+ footnotes?", 13 | }), 14 | Placeholder.configure({ 15 | placeholder: "Start typing here...", 16 | }), 17 | Footnotes, 18 | Footnote, 19 | FootnoteReference, 20 | ]; 21 | 22 | const Tiptap = () => { 23 | const editor = useEditor({ 24 | extensions, 25 | content: "Hello world", 26 | }); 27 | 28 | return ( 29 |
30 |

Footnotes Demo

31 | 32 |

33 | Click the "Add footnote" button below or type [^text] to 34 | insert a footnote 35 |

36 | 37 | 43 | 44 | 45 |
46 | ); 47 | }; 48 | 49 | export default Tiptap; 50 | -------------------------------------------------------------------------------- /examples/react/src/index.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | a { 6 | @apply text-sky-600; 7 | @apply font-bold; 8 | 9 | text-decoration: underline; 10 | } 11 | ol.footnotes:has(li) { 12 | border-top: 1px solid black; 13 | } 14 | ol { 15 | margin-top: 20px; 16 | padding: 20px 0; 17 | list-style-type: decimal; 18 | padding-left: 20px; 19 | } 20 | .tiptap p.is-empty:first-child::before { 21 | content: attr(data-placeholder); 22 | float: left; 23 | color: #ced3d9; 24 | pointer-events: none; 25 | height: 0; 26 | } 27 | .tiptap { 28 | width: 1000px; 29 | height: 500px; 30 | border: 1px solid black; 31 | border-radius: 5px; 32 | padding: 20px; 33 | overflow-y: auto; 34 | } 35 | .tiptap:focus { 36 | outline: none; 37 | } 38 | .ProseMirror-selectednode { 39 | outline: 2px solid #0069ff; 40 | } 41 | -------------------------------------------------------------------------------- /examples/react/src/main.tsx: -------------------------------------------------------------------------------- 1 | import { StrictMode } from "react"; 2 | import { createRoot } from "react-dom/client"; 3 | import App from "./App.tsx"; 4 | import "./index.css"; 5 | 6 | createRoot(document.getElementById("root")!).render( 7 | 8 | 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /examples/react/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /examples/react/tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | export default { 3 | content: ["index.html", "src/**/*.{js,jsx,ts,tsx}"], 4 | theme: { 5 | extend: {}, 6 | }, 7 | plugins: [], 8 | }; 9 | -------------------------------------------------------------------------------- /examples/react/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "useDefineForClassFields": true, 5 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 6 | "module": "ESNext", 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "isolatedModules": true, 13 | "moduleDetection": "force", 14 | "noEmit": true, 15 | "jsx": "react-jsx", 16 | 17 | /* Linting */ 18 | "strict": true, 19 | "noUnusedLocals": true, 20 | "noUnusedParameters": true, 21 | "noFallthroughCasesInSwitch": true 22 | }, 23 | "include": ["src"] 24 | } 25 | -------------------------------------------------------------------------------- /examples/react/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [ 4 | { "path": "./tsconfig.app.json" }, 5 | { "path": "./tsconfig.node.json" } 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /examples/react/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2022", 4 | "lib": ["ES2023"], 5 | "module": "ESNext", 6 | "skipLibCheck": true, 7 | 8 | /* Bundler mode */ 9 | "moduleResolution": "bundler", 10 | "allowImportingTsExtensions": true, 11 | "isolatedModules": true, 12 | "moduleDetection": "force", 13 | "noEmit": true, 14 | 15 | /* Linting */ 16 | "strict": true, 17 | "noUnusedLocals": true, 18 | "noUnusedParameters": true, 19 | "noFallthroughCasesInSwitch": true 20 | }, 21 | "include": ["vite.config.ts"] 22 | } 23 | -------------------------------------------------------------------------------- /examples/react/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import react from "@vitejs/plugin-react"; 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | plugins: [react()], 7 | }); 8 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "footnotes", 3 | "version": "1.1.0", 4 | "keywords": [], 5 | "author": "" 6 | } 7 | -------------------------------------------------------------------------------- /package/README.md: -------------------------------------------------------------------------------- 1 | # tiptap-footnotes 2 | 3 | A footnotes extension for Tiptap 4 | 5 | [![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)][demo] 6 | 7 | [demo]: https://stackblitz.com/github/buttondown/tiptap-footnotes/tree/main/examples/react?file=src%2FApp.tsx&title=tiptap-footnotes%20demo 8 | 9 | ## Getting Started 10 | 11 | ### Installation 12 | 13 | ```shell 14 | npm install tiptap-footnotes 15 | ``` 16 | 17 | This extension requires the `@tiptap/extension-list-item`, `@tiptap/extension-ordered-list`, and the `@tiptap/pm` extensions, so you need to install them as well: 18 | 19 | ```shell 20 | npm install @tiptap/extension-list-item @tiptap/extension-ordered-list @tiptap/pm 21 | ``` 22 | 23 | ### Usage 24 | 25 | This package is separated into 3 main extensions: 26 | 27 | - `Footnotes`: The footnotes ordered list extension 28 | - `Footnote`: The footnote list item extension 29 | - `FootnoteReference`: the footnote reference extension 30 | 31 | Typically, the footnotes should be placed at the bottom of the document, so you should adjust the topNode node (i.e. Document) to have the footnotes placed at the end (as shown below): 32 | 33 | ```typescript 34 | import { useEditor, EditorContent } from "@tiptap/react"; 35 | import StarterKit from "@tiptap/starter-kit"; 36 | import { Footnotes, FootnoteReference, Footnote } from "tiptap-footnotes"; 37 | import Document from "@tiptap/extension-document"; 38 | 39 | const Editor = () => { 40 | const editor = useEditor({ 41 | extensions: [ 42 | StarterKit.configure({ 43 | document: false, 44 | }), 45 | Document.extend({ 46 | content: "block+ footnotes?", 47 | }), 48 | Footnotes, 49 | Footnote, 50 | FootnoteReference, 51 | ], 52 | content: "Hello world", 53 | }); 54 | 55 | return ; 56 | }; 57 | 58 | export default Editor; 59 | ``` 60 | 61 | If you want the footnotes to look like the example, you can add this CSS to your app: 62 | 63 | ```css 64 | ol.footnotes { 65 | margin-top: 20px; 66 | padding: 20px 0; 67 | list-style-type: decimal; 68 | padding-left: 20px; 69 | } 70 | 71 | ol.footnotes:has(li) { 72 | border-top: 1px solid black; 73 | } 74 | ``` 75 | -------------------------------------------------------------------------------- /package/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tiptap-footnotes", 3 | "version": "2.0.3", 4 | "description": "A footnotes extension for Tiptap", 5 | "main": "dist/index.js", 6 | "types": "dist/index.d.ts", 7 | "module": "dist/index.mjs", 8 | "scripts": { 9 | "build": "tsup", 10 | "dev": "tsup --watch", 11 | "prepack": "pnpm run build", 12 | "test": "vitest --environment=jsdom" 13 | }, 14 | "exports": { 15 | "import": "./dist/index.mjs", 16 | "require": "./dist/index.js" 17 | }, 18 | "keywords": [ 19 | "tiptap", 20 | "tiptap extension", 21 | "tiptap footnotes", 22 | "footnotes" 23 | ], 24 | "author": "Turki Aloufi", 25 | "files": [ 26 | "dist/" 27 | ], 28 | "license": "MIT", 29 | "devDependencies": { 30 | "@tiptap/core": "^2.10.0", 31 | "@tiptap/extension-document": "^2.10.0", 32 | "@tiptap/extension-list-item": "^2.10.0", 33 | "@tiptap/extension-ordered-list": "^2.10.0", 34 | "@tiptap/extension-paragraph": "^2.10.0", 35 | "@tiptap/extension-text": "^2.10.0", 36 | "@tiptap/pm": "^2.10.0", 37 | "@types/uuid": "^9.0.8", 38 | "esbuild": "^0.21.5", 39 | "jsdom": "^24.1.3", 40 | "tsup": "^8.3.5", 41 | "typescript": "^5.6.3", 42 | "vitest": "^2.1.5" 43 | }, 44 | "peerDependencies": { 45 | "@tiptap/core": "^2.4.0", 46 | "@tiptap/extension-list-item": "^2.4.0", 47 | "@tiptap/extension-ordered-list": "^2.4.0", 48 | "@tiptap/pm": "^2.4.0" 49 | }, 50 | "dependencies": { 51 | "uuid": "^9.0.1" 52 | }, 53 | "repository": { 54 | "type": "git", 55 | "url": "https://github.com/buttondown/tiptap-footnotes", 56 | "directory": "package" 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /package/pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | uuid: 12 | specifier: ^9.0.1 13 | version: 9.0.1 14 | devDependencies: 15 | '@tiptap/core': 16 | specifier: ^2.4.0 17 | version: 2.4.0(@tiptap/pm@2.4.0) 18 | '@tiptap/extension-list-item': 19 | specifier: ^2.4.0 20 | version: 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0)) 21 | '@tiptap/extension-ordered-list': 22 | specifier: ^2.4.0 23 | version: 2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0)) 24 | '@tiptap/pm': 25 | specifier: ^2.4.0 26 | version: 2.4.0 27 | '@types/uuid': 28 | specifier: ^9.0.8 29 | version: 9.0.8 30 | esbuild: 31 | specifier: ^0.21.4 32 | version: 0.21.4 33 | tsup: 34 | specifier: ^8.0.2 35 | version: 8.0.2(typescript@5.4.5) 36 | typescript: 37 | specifier: ^5.4.5 38 | version: 5.4.5 39 | 40 | packages: 41 | 42 | '@esbuild/aix-ppc64@0.19.12': 43 | resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} 44 | engines: {node: '>=12'} 45 | cpu: [ppc64] 46 | os: [aix] 47 | 48 | '@esbuild/aix-ppc64@0.21.4': 49 | resolution: {integrity: sha512-Zrm+B33R4LWPLjDEVnEqt2+SLTATlru1q/xYKVn8oVTbiRBGmK2VIMoIYGJDGyftnGaC788IuzGFAlb7IQ0Y8A==} 50 | engines: {node: '>=12'} 51 | cpu: [ppc64] 52 | os: [aix] 53 | 54 | '@esbuild/android-arm64@0.19.12': 55 | resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} 56 | engines: {node: '>=12'} 57 | cpu: [arm64] 58 | os: [android] 59 | 60 | '@esbuild/android-arm64@0.21.4': 61 | resolution: {integrity: sha512-fYFnz+ObClJ3dNiITySBUx+oNalYUT18/AryMxfovLkYWbutXsct3Wz2ZWAcGGppp+RVVX5FiXeLYGi97umisA==} 62 | engines: {node: '>=12'} 63 | cpu: [arm64] 64 | os: [android] 65 | 66 | '@esbuild/android-arm@0.19.12': 67 | resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} 68 | engines: {node: '>=12'} 69 | cpu: [arm] 70 | os: [android] 71 | 72 | '@esbuild/android-arm@0.21.4': 73 | resolution: {integrity: sha512-E7H/yTd8kGQfY4z9t3nRPk/hrhaCajfA3YSQSBrst8B+3uTcgsi8N+ZWYCaeIDsiVs6m65JPCaQN/DxBRclF3A==} 74 | engines: {node: '>=12'} 75 | cpu: [arm] 76 | os: [android] 77 | 78 | '@esbuild/android-x64@0.19.12': 79 | resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} 80 | engines: {node: '>=12'} 81 | cpu: [x64] 82 | os: [android] 83 | 84 | '@esbuild/android-x64@0.21.4': 85 | resolution: {integrity: sha512-mDqmlge3hFbEPbCWxp4fM6hqq7aZfLEHZAKGP9viq9wMUBVQx202aDIfc3l+d2cKhUJM741VrCXEzRFhPDKH3Q==} 86 | engines: {node: '>=12'} 87 | cpu: [x64] 88 | os: [android] 89 | 90 | '@esbuild/darwin-arm64@0.19.12': 91 | resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} 92 | engines: {node: '>=12'} 93 | cpu: [arm64] 94 | os: [darwin] 95 | 96 | '@esbuild/darwin-arm64@0.21.4': 97 | resolution: {integrity: sha512-72eaIrDZDSiWqpmCzVaBD58c8ea8cw/U0fq/PPOTqE3c53D0xVMRt2ooIABZ6/wj99Y+h4ksT/+I+srCDLU9TA==} 98 | engines: {node: '>=12'} 99 | cpu: [arm64] 100 | os: [darwin] 101 | 102 | '@esbuild/darwin-x64@0.19.12': 103 | resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} 104 | engines: {node: '>=12'} 105 | cpu: [x64] 106 | os: [darwin] 107 | 108 | '@esbuild/darwin-x64@0.21.4': 109 | resolution: {integrity: sha512-uBsuwRMehGmw1JC7Vecu/upOjTsMhgahmDkWhGLWxIgUn2x/Y4tIwUZngsmVb6XyPSTXJYS4YiASKPcm9Zitag==} 110 | engines: {node: '>=12'} 111 | cpu: [x64] 112 | os: [darwin] 113 | 114 | '@esbuild/freebsd-arm64@0.19.12': 115 | resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} 116 | engines: {node: '>=12'} 117 | cpu: [arm64] 118 | os: [freebsd] 119 | 120 | '@esbuild/freebsd-arm64@0.21.4': 121 | resolution: {integrity: sha512-8JfuSC6YMSAEIZIWNL3GtdUT5NhUA/CMUCpZdDRolUXNAXEE/Vbpe6qlGLpfThtY5NwXq8Hi4nJy4YfPh+TwAg==} 122 | engines: {node: '>=12'} 123 | cpu: [arm64] 124 | os: [freebsd] 125 | 126 | '@esbuild/freebsd-x64@0.19.12': 127 | resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} 128 | engines: {node: '>=12'} 129 | cpu: [x64] 130 | os: [freebsd] 131 | 132 | '@esbuild/freebsd-x64@0.21.4': 133 | resolution: {integrity: sha512-8d9y9eQhxv4ef7JmXny7591P/PYsDFc4+STaxC1GBv0tMyCdyWfXu2jBuqRsyhY8uL2HU8uPyscgE2KxCY9imQ==} 134 | engines: {node: '>=12'} 135 | cpu: [x64] 136 | os: [freebsd] 137 | 138 | '@esbuild/linux-arm64@0.19.12': 139 | resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} 140 | engines: {node: '>=12'} 141 | cpu: [arm64] 142 | os: [linux] 143 | 144 | '@esbuild/linux-arm64@0.21.4': 145 | resolution: {integrity: sha512-/GLD2orjNU50v9PcxNpYZi+y8dJ7e7/LhQukN3S4jNDXCKkyyiyAz9zDw3siZ7Eh1tRcnCHAo/WcqKMzmi4eMQ==} 146 | engines: {node: '>=12'} 147 | cpu: [arm64] 148 | os: [linux] 149 | 150 | '@esbuild/linux-arm@0.19.12': 151 | resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} 152 | engines: {node: '>=12'} 153 | cpu: [arm] 154 | os: [linux] 155 | 156 | '@esbuild/linux-arm@0.21.4': 157 | resolution: {integrity: sha512-2rqFFefpYmpMs+FWjkzSgXg5vViocqpq5a1PSRgT0AvSgxoXmGF17qfGAzKedg6wAwyM7UltrKVo9kxaJLMF/g==} 158 | engines: {node: '>=12'} 159 | cpu: [arm] 160 | os: [linux] 161 | 162 | '@esbuild/linux-ia32@0.19.12': 163 | resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} 164 | engines: {node: '>=12'} 165 | cpu: [ia32] 166 | os: [linux] 167 | 168 | '@esbuild/linux-ia32@0.21.4': 169 | resolution: {integrity: sha512-pNftBl7m/tFG3t2m/tSjuYeWIffzwAZT9m08+9DPLizxVOsUl8DdFzn9HvJrTQwe3wvJnwTdl92AonY36w/25g==} 170 | engines: {node: '>=12'} 171 | cpu: [ia32] 172 | os: [linux] 173 | 174 | '@esbuild/linux-loong64@0.19.12': 175 | resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} 176 | engines: {node: '>=12'} 177 | cpu: [loong64] 178 | os: [linux] 179 | 180 | '@esbuild/linux-loong64@0.21.4': 181 | resolution: {integrity: sha512-cSD2gzCK5LuVX+hszzXQzlWya6c7hilO71L9h4KHwqI4qeqZ57bAtkgcC2YioXjsbfAv4lPn3qe3b00Zt+jIfQ==} 182 | engines: {node: '>=12'} 183 | cpu: [loong64] 184 | os: [linux] 185 | 186 | '@esbuild/linux-mips64el@0.19.12': 187 | resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} 188 | engines: {node: '>=12'} 189 | cpu: [mips64el] 190 | os: [linux] 191 | 192 | '@esbuild/linux-mips64el@0.21.4': 193 | resolution: {integrity: sha512-qtzAd3BJh7UdbiXCrg6npWLYU0YpufsV9XlufKhMhYMJGJCdfX/G6+PNd0+v877X1JG5VmjBLUiFB0o8EUSicA==} 194 | engines: {node: '>=12'} 195 | cpu: [mips64el] 196 | os: [linux] 197 | 198 | '@esbuild/linux-ppc64@0.19.12': 199 | resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} 200 | engines: {node: '>=12'} 201 | cpu: [ppc64] 202 | os: [linux] 203 | 204 | '@esbuild/linux-ppc64@0.21.4': 205 | resolution: {integrity: sha512-yB8AYzOTaL0D5+2a4xEy7OVvbcypvDR05MsB/VVPVA7nL4hc5w5Dyd/ddnayStDgJE59fAgNEOdLhBxjfx5+dg==} 206 | engines: {node: '>=12'} 207 | cpu: [ppc64] 208 | os: [linux] 209 | 210 | '@esbuild/linux-riscv64@0.19.12': 211 | resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} 212 | engines: {node: '>=12'} 213 | cpu: [riscv64] 214 | os: [linux] 215 | 216 | '@esbuild/linux-riscv64@0.21.4': 217 | resolution: {integrity: sha512-Y5AgOuVzPjQdgU59ramLoqSSiXddu7F3F+LI5hYy/d1UHN7K5oLzYBDZe23QmQJ9PIVUXwOdKJ/jZahPdxzm9w==} 218 | engines: {node: '>=12'} 219 | cpu: [riscv64] 220 | os: [linux] 221 | 222 | '@esbuild/linux-s390x@0.19.12': 223 | resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} 224 | engines: {node: '>=12'} 225 | cpu: [s390x] 226 | os: [linux] 227 | 228 | '@esbuild/linux-s390x@0.21.4': 229 | resolution: {integrity: sha512-Iqc/l/FFwtt8FoTK9riYv9zQNms7B8u+vAI/rxKuN10HgQIXaPzKZc479lZ0x6+vKVQbu55GdpYpeNWzjOhgbA==} 230 | engines: {node: '>=12'} 231 | cpu: [s390x] 232 | os: [linux] 233 | 234 | '@esbuild/linux-x64@0.19.12': 235 | resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} 236 | engines: {node: '>=12'} 237 | cpu: [x64] 238 | os: [linux] 239 | 240 | '@esbuild/linux-x64@0.21.4': 241 | resolution: {integrity: sha512-Td9jv782UMAFsuLZINfUpoF5mZIbAj+jv1YVtE58rFtfvoKRiKSkRGQfHTgKamLVT/fO7203bHa3wU122V/Bdg==} 242 | engines: {node: '>=12'} 243 | cpu: [x64] 244 | os: [linux] 245 | 246 | '@esbuild/netbsd-x64@0.19.12': 247 | resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} 248 | engines: {node: '>=12'} 249 | cpu: [x64] 250 | os: [netbsd] 251 | 252 | '@esbuild/netbsd-x64@0.21.4': 253 | resolution: {integrity: sha512-Awn38oSXxsPMQxaV0Ipb7W/gxZtk5Tx3+W+rAPdZkyEhQ6968r9NvtkjhnhbEgWXYbgV+JEONJ6PcdBS+nlcpA==} 254 | engines: {node: '>=12'} 255 | cpu: [x64] 256 | os: [netbsd] 257 | 258 | '@esbuild/openbsd-x64@0.19.12': 259 | resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} 260 | engines: {node: '>=12'} 261 | cpu: [x64] 262 | os: [openbsd] 263 | 264 | '@esbuild/openbsd-x64@0.21.4': 265 | resolution: {integrity: sha512-IsUmQeCY0aU374R82fxIPu6vkOybWIMc3hVGZ3ChRwL9hA1TwY+tS0lgFWV5+F1+1ssuvvXt3HFqe8roCip8Hg==} 266 | engines: {node: '>=12'} 267 | cpu: [x64] 268 | os: [openbsd] 269 | 270 | '@esbuild/sunos-x64@0.19.12': 271 | resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} 272 | engines: {node: '>=12'} 273 | cpu: [x64] 274 | os: [sunos] 275 | 276 | '@esbuild/sunos-x64@0.21.4': 277 | resolution: {integrity: sha512-hsKhgZ4teLUaDA6FG/QIu2q0rI6I36tZVfM4DBZv3BG0mkMIdEnMbhc4xwLvLJSS22uWmaVkFkqWgIS0gPIm+A==} 278 | engines: {node: '>=12'} 279 | cpu: [x64] 280 | os: [sunos] 281 | 282 | '@esbuild/win32-arm64@0.19.12': 283 | resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} 284 | engines: {node: '>=12'} 285 | cpu: [arm64] 286 | os: [win32] 287 | 288 | '@esbuild/win32-arm64@0.21.4': 289 | resolution: {integrity: sha512-UUfMgMoXPoA/bvGUNfUBFLCh0gt9dxZYIx9W4rfJr7+hKe5jxxHmfOK8YSH4qsHLLN4Ck8JZ+v7Q5fIm1huErg==} 290 | engines: {node: '>=12'} 291 | cpu: [arm64] 292 | os: [win32] 293 | 294 | '@esbuild/win32-ia32@0.19.12': 295 | resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} 296 | engines: {node: '>=12'} 297 | cpu: [ia32] 298 | os: [win32] 299 | 300 | '@esbuild/win32-ia32@0.21.4': 301 | resolution: {integrity: sha512-yIxbspZb5kGCAHWm8dexALQ9en1IYDfErzjSEq1KzXFniHv019VT3mNtTK7t8qdy4TwT6QYHI9sEZabONHg+aw==} 302 | engines: {node: '>=12'} 303 | cpu: [ia32] 304 | os: [win32] 305 | 306 | '@esbuild/win32-x64@0.19.12': 307 | resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} 308 | engines: {node: '>=12'} 309 | cpu: [x64] 310 | os: [win32] 311 | 312 | '@esbuild/win32-x64@0.21.4': 313 | resolution: {integrity: sha512-sywLRD3UK/qRJt0oBwdpYLBibk7KiRfbswmWRDabuncQYSlf8aLEEUor/oP6KRz8KEG+HoiVLBhPRD5JWjS8Sg==} 314 | engines: {node: '>=12'} 315 | cpu: [x64] 316 | os: [win32] 317 | 318 | '@isaacs/cliui@8.0.2': 319 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 320 | engines: {node: '>=12'} 321 | 322 | '@jridgewell/gen-mapping@0.3.5': 323 | resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} 324 | engines: {node: '>=6.0.0'} 325 | 326 | '@jridgewell/resolve-uri@3.1.2': 327 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 328 | engines: {node: '>=6.0.0'} 329 | 330 | '@jridgewell/set-array@1.2.1': 331 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 332 | engines: {node: '>=6.0.0'} 333 | 334 | '@jridgewell/sourcemap-codec@1.4.15': 335 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 336 | 337 | '@jridgewell/trace-mapping@0.3.25': 338 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 339 | 340 | '@nodelib/fs.scandir@2.1.5': 341 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 342 | engines: {node: '>= 8'} 343 | 344 | '@nodelib/fs.stat@2.0.5': 345 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 346 | engines: {node: '>= 8'} 347 | 348 | '@nodelib/fs.walk@1.2.8': 349 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 350 | engines: {node: '>= 8'} 351 | 352 | '@pkgjs/parseargs@0.11.0': 353 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 354 | engines: {node: '>=14'} 355 | 356 | '@remirror/core-constants@2.0.2': 357 | resolution: {integrity: sha512-dyHY+sMF0ihPus3O27ODd4+agdHMEmuRdyiZJ2CCWjPV5UFmn17ZbElvk6WOGVE4rdCJKZQCrPV2BcikOMLUGQ==} 358 | 359 | '@rollup/rollup-android-arm-eabi@4.18.0': 360 | resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} 361 | cpu: [arm] 362 | os: [android] 363 | 364 | '@rollup/rollup-android-arm64@4.18.0': 365 | resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==} 366 | cpu: [arm64] 367 | os: [android] 368 | 369 | '@rollup/rollup-darwin-arm64@4.18.0': 370 | resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==} 371 | cpu: [arm64] 372 | os: [darwin] 373 | 374 | '@rollup/rollup-darwin-x64@4.18.0': 375 | resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==} 376 | cpu: [x64] 377 | os: [darwin] 378 | 379 | '@rollup/rollup-linux-arm-gnueabihf@4.18.0': 380 | resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==} 381 | cpu: [arm] 382 | os: [linux] 383 | 384 | '@rollup/rollup-linux-arm-musleabihf@4.18.0': 385 | resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==} 386 | cpu: [arm] 387 | os: [linux] 388 | 389 | '@rollup/rollup-linux-arm64-gnu@4.18.0': 390 | resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==} 391 | cpu: [arm64] 392 | os: [linux] 393 | 394 | '@rollup/rollup-linux-arm64-musl@4.18.0': 395 | resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==} 396 | cpu: [arm64] 397 | os: [linux] 398 | 399 | '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': 400 | resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==} 401 | cpu: [ppc64] 402 | os: [linux] 403 | 404 | '@rollup/rollup-linux-riscv64-gnu@4.18.0': 405 | resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==} 406 | cpu: [riscv64] 407 | os: [linux] 408 | 409 | '@rollup/rollup-linux-s390x-gnu@4.18.0': 410 | resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==} 411 | cpu: [s390x] 412 | os: [linux] 413 | 414 | '@rollup/rollup-linux-x64-gnu@4.18.0': 415 | resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==} 416 | cpu: [x64] 417 | os: [linux] 418 | 419 | '@rollup/rollup-linux-x64-musl@4.18.0': 420 | resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==} 421 | cpu: [x64] 422 | os: [linux] 423 | 424 | '@rollup/rollup-win32-arm64-msvc@4.18.0': 425 | resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==} 426 | cpu: [arm64] 427 | os: [win32] 428 | 429 | '@rollup/rollup-win32-ia32-msvc@4.18.0': 430 | resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==} 431 | cpu: [ia32] 432 | os: [win32] 433 | 434 | '@rollup/rollup-win32-x64-msvc@4.18.0': 435 | resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==} 436 | cpu: [x64] 437 | os: [win32] 438 | 439 | '@tiptap/core@2.4.0': 440 | resolution: {integrity: sha512-YJSahk8pkxpCs8SflCZfTnJpE7IPyUWIylfgXM2DefjRQa5DZ+c6sNY0s/zbxKYFQ6AuHVX40r9pCfcqHChGxQ==} 441 | peerDependencies: 442 | '@tiptap/pm': ^2.0.0 443 | 444 | '@tiptap/extension-list-item@2.4.0': 445 | resolution: {integrity: sha512-reUVUx+2cI2NIAqMZhlJ9uK/+zvRzm1GTmlU2Wvzwc7AwLN4yemj6mBDsmBLEXAKPvitfLh6EkeHaruOGymQtg==} 446 | peerDependencies: 447 | '@tiptap/core': ^2.0.0 448 | 449 | '@tiptap/extension-ordered-list@2.4.0': 450 | resolution: {integrity: sha512-Zo0c9M0aowv+2+jExZiAvhCB83GZMjZsxywmuOrdUbq5EGYKb7q8hDyN3hkrktVHr9UPXdPAYTmLAHztTOHYRA==} 451 | peerDependencies: 452 | '@tiptap/core': ^2.0.0 453 | 454 | '@tiptap/pm@2.4.0': 455 | resolution: {integrity: sha512-B1HMEqGS4MzIVXnpgRZDLm30mxDWj51LkBT/if1XD+hj5gm8B9Q0c84bhvODX6KIs+c6z+zsY9VkVu8w9Yfgxg==} 456 | 457 | '@types/estree@1.0.5': 458 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} 459 | 460 | '@types/uuid@9.0.8': 461 | resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} 462 | 463 | ansi-regex@5.0.1: 464 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 465 | engines: {node: '>=8'} 466 | 467 | ansi-regex@6.0.1: 468 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} 469 | engines: {node: '>=12'} 470 | 471 | ansi-styles@4.3.0: 472 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 473 | engines: {node: '>=8'} 474 | 475 | ansi-styles@6.2.1: 476 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 477 | engines: {node: '>=12'} 478 | 479 | any-promise@1.3.0: 480 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 481 | 482 | anymatch@3.1.3: 483 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 484 | engines: {node: '>= 8'} 485 | 486 | argparse@2.0.1: 487 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 488 | 489 | array-union@2.1.0: 490 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 491 | engines: {node: '>=8'} 492 | 493 | balanced-match@1.0.2: 494 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 495 | 496 | binary-extensions@2.3.0: 497 | resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} 498 | engines: {node: '>=8'} 499 | 500 | brace-expansion@2.0.1: 501 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 502 | 503 | braces@3.0.3: 504 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 505 | engines: {node: '>=8'} 506 | 507 | bundle-require@4.1.0: 508 | resolution: {integrity: sha512-FeArRFM+ziGkRViKRnSTbHZc35dgmR9yNog05Kn0+ItI59pOAISGvnnIwW1WgFZQW59IxD9QpJnUPkdIPfZuXg==} 509 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 510 | peerDependencies: 511 | esbuild: '>=0.17' 512 | 513 | cac@6.7.14: 514 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 515 | engines: {node: '>=8'} 516 | 517 | chokidar@3.6.0: 518 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 519 | engines: {node: '>= 8.10.0'} 520 | 521 | color-convert@2.0.1: 522 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 523 | engines: {node: '>=7.0.0'} 524 | 525 | color-name@1.1.4: 526 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 527 | 528 | commander@4.1.1: 529 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 530 | engines: {node: '>= 6'} 531 | 532 | crelt@1.0.6: 533 | resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} 534 | 535 | cross-spawn@7.0.3: 536 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 537 | engines: {node: '>= 8'} 538 | 539 | debug@4.3.4: 540 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 541 | engines: {node: '>=6.0'} 542 | peerDependencies: 543 | supports-color: '*' 544 | peerDependenciesMeta: 545 | supports-color: 546 | optional: true 547 | 548 | dir-glob@3.0.1: 549 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 550 | engines: {node: '>=8'} 551 | 552 | eastasianwidth@0.2.0: 553 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 554 | 555 | emoji-regex@8.0.0: 556 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 557 | 558 | emoji-regex@9.2.2: 559 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 560 | 561 | entities@4.5.0: 562 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 563 | engines: {node: '>=0.12'} 564 | 565 | esbuild@0.19.12: 566 | resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} 567 | engines: {node: '>=12'} 568 | hasBin: true 569 | 570 | esbuild@0.21.4: 571 | resolution: {integrity: sha512-sFMcNNrj+Q0ZDolrp5pDhH0nRPN9hLIM3fRPwgbLYJeSHHgnXSnbV3xYgSVuOeLWH9c73VwmEverVzupIv5xuA==} 572 | engines: {node: '>=12'} 573 | hasBin: true 574 | 575 | escape-string-regexp@4.0.0: 576 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 577 | engines: {node: '>=10'} 578 | 579 | execa@5.1.1: 580 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} 581 | engines: {node: '>=10'} 582 | 583 | fast-glob@3.3.2: 584 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 585 | engines: {node: '>=8.6.0'} 586 | 587 | fastq@1.17.1: 588 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 589 | 590 | fill-range@7.1.1: 591 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 592 | engines: {node: '>=8'} 593 | 594 | foreground-child@3.1.1: 595 | resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} 596 | engines: {node: '>=14'} 597 | 598 | fsevents@2.3.3: 599 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 600 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 601 | os: [darwin] 602 | 603 | get-stream@6.0.1: 604 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 605 | engines: {node: '>=10'} 606 | 607 | glob-parent@5.1.2: 608 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 609 | engines: {node: '>= 6'} 610 | 611 | glob@10.4.1: 612 | resolution: {integrity: sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==} 613 | engines: {node: '>=16 || 14 >=14.18'} 614 | hasBin: true 615 | 616 | globby@11.1.0: 617 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 618 | engines: {node: '>=10'} 619 | 620 | human-signals@2.1.0: 621 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} 622 | engines: {node: '>=10.17.0'} 623 | 624 | ignore@5.3.1: 625 | resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} 626 | engines: {node: '>= 4'} 627 | 628 | is-binary-path@2.1.0: 629 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 630 | engines: {node: '>=8'} 631 | 632 | is-extglob@2.1.1: 633 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 634 | engines: {node: '>=0.10.0'} 635 | 636 | is-fullwidth-code-point@3.0.0: 637 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 638 | engines: {node: '>=8'} 639 | 640 | is-glob@4.0.3: 641 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 642 | engines: {node: '>=0.10.0'} 643 | 644 | is-number@7.0.0: 645 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 646 | engines: {node: '>=0.12.0'} 647 | 648 | is-stream@2.0.1: 649 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 650 | engines: {node: '>=8'} 651 | 652 | isexe@2.0.0: 653 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 654 | 655 | jackspeak@3.1.2: 656 | resolution: {integrity: sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==} 657 | engines: {node: '>=14'} 658 | 659 | joycon@3.1.1: 660 | resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} 661 | engines: {node: '>=10'} 662 | 663 | lilconfig@3.1.1: 664 | resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} 665 | engines: {node: '>=14'} 666 | 667 | lines-and-columns@1.2.4: 668 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 669 | 670 | linkify-it@5.0.0: 671 | resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} 672 | 673 | load-tsconfig@0.2.5: 674 | resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} 675 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 676 | 677 | lodash.sortby@4.7.0: 678 | resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} 679 | 680 | lru-cache@10.2.2: 681 | resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} 682 | engines: {node: 14 || >=16.14} 683 | 684 | markdown-it@14.1.0: 685 | resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} 686 | hasBin: true 687 | 688 | mdurl@2.0.0: 689 | resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} 690 | 691 | merge-stream@2.0.0: 692 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 693 | 694 | merge2@1.4.1: 695 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 696 | engines: {node: '>= 8'} 697 | 698 | micromatch@4.0.7: 699 | resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} 700 | engines: {node: '>=8.6'} 701 | 702 | mimic-fn@2.1.0: 703 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 704 | engines: {node: '>=6'} 705 | 706 | minimatch@9.0.4: 707 | resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} 708 | engines: {node: '>=16 || 14 >=14.17'} 709 | 710 | minipass@7.1.2: 711 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 712 | engines: {node: '>=16 || 14 >=14.17'} 713 | 714 | ms@2.1.2: 715 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 716 | 717 | mz@2.7.0: 718 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 719 | 720 | normalize-path@3.0.0: 721 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 722 | engines: {node: '>=0.10.0'} 723 | 724 | npm-run-path@4.0.1: 725 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 726 | engines: {node: '>=8'} 727 | 728 | object-assign@4.1.1: 729 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 730 | engines: {node: '>=0.10.0'} 731 | 732 | onetime@5.1.2: 733 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 734 | engines: {node: '>=6'} 735 | 736 | orderedmap@2.1.1: 737 | resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} 738 | 739 | path-key@3.1.1: 740 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 741 | engines: {node: '>=8'} 742 | 743 | path-scurry@1.11.1: 744 | resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} 745 | engines: {node: '>=16 || 14 >=14.18'} 746 | 747 | path-type@4.0.0: 748 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 749 | engines: {node: '>=8'} 750 | 751 | picomatch@2.3.1: 752 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 753 | engines: {node: '>=8.6'} 754 | 755 | pirates@4.0.6: 756 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 757 | engines: {node: '>= 6'} 758 | 759 | postcss-load-config@4.0.2: 760 | resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} 761 | engines: {node: '>= 14'} 762 | peerDependencies: 763 | postcss: '>=8.0.9' 764 | ts-node: '>=9.0.0' 765 | peerDependenciesMeta: 766 | postcss: 767 | optional: true 768 | ts-node: 769 | optional: true 770 | 771 | prosemirror-changeset@2.2.1: 772 | resolution: {integrity: sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ==} 773 | 774 | prosemirror-collab@1.3.1: 775 | resolution: {integrity: sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==} 776 | 777 | prosemirror-commands@1.5.2: 778 | resolution: {integrity: sha512-hgLcPaakxH8tu6YvVAaILV2tXYsW3rAdDR8WNkeKGcgeMVQg3/TMhPdVoh7iAmfgVjZGtcOSjKiQaoeKjzd2mQ==} 779 | 780 | prosemirror-dropcursor@1.8.1: 781 | resolution: {integrity: sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw==} 782 | 783 | prosemirror-gapcursor@1.3.2: 784 | resolution: {integrity: sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==} 785 | 786 | prosemirror-history@1.4.0: 787 | resolution: {integrity: sha512-UUiGzDVcqo1lovOPdi9YxxUps3oBFWAIYkXLu3Ot+JPv1qzVogRbcizxK3LhHmtaUxclohgiOVesRw5QSlMnbQ==} 788 | 789 | prosemirror-inputrules@1.4.0: 790 | resolution: {integrity: sha512-6ygpPRuTJ2lcOXs9JkefieMst63wVJBgHZGl5QOytN7oSZs3Co/BYbc3Yx9zm9H37Bxw8kVzCnDsihsVsL4yEg==} 791 | 792 | prosemirror-keymap@1.2.2: 793 | resolution: {integrity: sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ==} 794 | 795 | prosemirror-markdown@1.13.0: 796 | resolution: {integrity: sha512-UziddX3ZYSYibgx8042hfGKmukq5Aljp2qoBiJRejD/8MH70siQNz5RB1TrdTPheqLMy4aCe4GYNF10/3lQS5g==} 797 | 798 | prosemirror-menu@1.2.4: 799 | resolution: {integrity: sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA==} 800 | 801 | prosemirror-model@1.21.0: 802 | resolution: {integrity: sha512-zLpS1mVCZLA7VTp82P+BfMiYVPcX1/z0Mf3gsjKZtzMWubwn2pN7CceMV0DycjlgE5JeXPR7UF4hJPbBV98oWA==} 803 | 804 | prosemirror-schema-basic@1.2.2: 805 | resolution: {integrity: sha512-/dT4JFEGyO7QnNTe9UaKUhjDXbTNkiWTq/N4VpKaF79bBjSExVV2NXmJpcM7z/gD7mbqNjxbmWW5nf1iNSSGnw==} 806 | 807 | prosemirror-schema-list@1.3.0: 808 | resolution: {integrity: sha512-Hz/7gM4skaaYfRPNgr421CU4GSwotmEwBVvJh5ltGiffUJwm7C8GfN/Bc6DR1EKEp5pDKhODmdXXyi9uIsZl5A==} 809 | 810 | prosemirror-state@1.4.3: 811 | resolution: {integrity: sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==} 812 | 813 | prosemirror-tables@1.3.7: 814 | resolution: {integrity: sha512-oEwX1wrziuxMtwFvdDWSFHVUWrFJWt929kVVfHvtTi8yvw+5ppxjXZkMG/fuTdFo+3DXyIPSKfid+Be1npKXDA==} 815 | 816 | prosemirror-trailing-node@2.0.8: 817 | resolution: {integrity: sha512-ujRYhSuhQb1Jsarh1IHqb2KoSnRiD7wAMDGucP35DN7j5af6X7B18PfdPIrbwsPTqIAj0fyOvxbuPsWhNvylmA==} 818 | peerDependencies: 819 | prosemirror-model: ^1.19.0 820 | prosemirror-state: ^1.4.2 821 | prosemirror-view: ^1.31.2 822 | 823 | prosemirror-transform@1.9.0: 824 | resolution: {integrity: sha512-5UXkr1LIRx3jmpXXNKDhv8OyAOeLTGuXNwdVfg8x27uASna/wQkr9p6fD3eupGOi4PLJfbezxTyi/7fSJypXHg==} 825 | 826 | prosemirror-view@1.33.6: 827 | resolution: {integrity: sha512-zRLUNgLIQfd8IfGprsXxWTjdA8xEAFJe8cDNrOptj6Mop9sj+BMeVbJvceyAYCm5G2dOdT2prctH7K9dfnpIMw==} 828 | 829 | punycode.js@2.3.1: 830 | resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} 831 | engines: {node: '>=6'} 832 | 833 | punycode@2.3.1: 834 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 835 | engines: {node: '>=6'} 836 | 837 | queue-microtask@1.2.3: 838 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 839 | 840 | readdirp@3.6.0: 841 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 842 | engines: {node: '>=8.10.0'} 843 | 844 | resolve-from@5.0.0: 845 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 846 | engines: {node: '>=8'} 847 | 848 | reusify@1.0.4: 849 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 850 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 851 | 852 | rollup@4.18.0: 853 | resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==} 854 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 855 | hasBin: true 856 | 857 | rope-sequence@1.3.4: 858 | resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} 859 | 860 | run-parallel@1.2.0: 861 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 862 | 863 | shebang-command@2.0.0: 864 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 865 | engines: {node: '>=8'} 866 | 867 | shebang-regex@3.0.0: 868 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 869 | engines: {node: '>=8'} 870 | 871 | signal-exit@3.0.7: 872 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 873 | 874 | signal-exit@4.1.0: 875 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 876 | engines: {node: '>=14'} 877 | 878 | slash@3.0.0: 879 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 880 | engines: {node: '>=8'} 881 | 882 | source-map@0.8.0-beta.0: 883 | resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} 884 | engines: {node: '>= 8'} 885 | 886 | string-width@4.2.3: 887 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 888 | engines: {node: '>=8'} 889 | 890 | string-width@5.1.2: 891 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 892 | engines: {node: '>=12'} 893 | 894 | strip-ansi@6.0.1: 895 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 896 | engines: {node: '>=8'} 897 | 898 | strip-ansi@7.1.0: 899 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 900 | engines: {node: '>=12'} 901 | 902 | strip-final-newline@2.0.0: 903 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 904 | engines: {node: '>=6'} 905 | 906 | sucrase@3.35.0: 907 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 908 | engines: {node: '>=16 || 14 >=14.17'} 909 | hasBin: true 910 | 911 | thenify-all@1.6.0: 912 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 913 | engines: {node: '>=0.8'} 914 | 915 | thenify@3.3.1: 916 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 917 | 918 | to-regex-range@5.0.1: 919 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 920 | engines: {node: '>=8.0'} 921 | 922 | tr46@1.0.1: 923 | resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} 924 | 925 | tree-kill@1.2.2: 926 | resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} 927 | hasBin: true 928 | 929 | ts-interface-checker@0.1.13: 930 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 931 | 932 | tsup@8.0.2: 933 | resolution: {integrity: sha512-NY8xtQXdH7hDUAZwcQdY/Vzlw9johQsaqf7iwZ6g1DOUlFYQ5/AtVAjTvihhEyeRlGo4dLRVHtrRaL35M1daqQ==} 934 | engines: {node: '>=18'} 935 | hasBin: true 936 | peerDependencies: 937 | '@microsoft/api-extractor': ^7.36.0 938 | '@swc/core': ^1 939 | postcss: ^8.4.12 940 | typescript: '>=4.5.0' 941 | peerDependenciesMeta: 942 | '@microsoft/api-extractor': 943 | optional: true 944 | '@swc/core': 945 | optional: true 946 | postcss: 947 | optional: true 948 | typescript: 949 | optional: true 950 | 951 | typescript@5.4.5: 952 | resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} 953 | engines: {node: '>=14.17'} 954 | hasBin: true 955 | 956 | uc.micro@2.1.0: 957 | resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} 958 | 959 | uuid@9.0.1: 960 | resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} 961 | hasBin: true 962 | 963 | w3c-keyname@2.2.8: 964 | resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} 965 | 966 | webidl-conversions@4.0.2: 967 | resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} 968 | 969 | whatwg-url@7.1.0: 970 | resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} 971 | 972 | which@2.0.2: 973 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 974 | engines: {node: '>= 8'} 975 | hasBin: true 976 | 977 | wrap-ansi@7.0.0: 978 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 979 | engines: {node: '>=10'} 980 | 981 | wrap-ansi@8.1.0: 982 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 983 | engines: {node: '>=12'} 984 | 985 | yaml@2.4.2: 986 | resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} 987 | engines: {node: '>= 14'} 988 | hasBin: true 989 | 990 | snapshots: 991 | 992 | '@esbuild/aix-ppc64@0.19.12': 993 | optional: true 994 | 995 | '@esbuild/aix-ppc64@0.21.4': 996 | optional: true 997 | 998 | '@esbuild/android-arm64@0.19.12': 999 | optional: true 1000 | 1001 | '@esbuild/android-arm64@0.21.4': 1002 | optional: true 1003 | 1004 | '@esbuild/android-arm@0.19.12': 1005 | optional: true 1006 | 1007 | '@esbuild/android-arm@0.21.4': 1008 | optional: true 1009 | 1010 | '@esbuild/android-x64@0.19.12': 1011 | optional: true 1012 | 1013 | '@esbuild/android-x64@0.21.4': 1014 | optional: true 1015 | 1016 | '@esbuild/darwin-arm64@0.19.12': 1017 | optional: true 1018 | 1019 | '@esbuild/darwin-arm64@0.21.4': 1020 | optional: true 1021 | 1022 | '@esbuild/darwin-x64@0.19.12': 1023 | optional: true 1024 | 1025 | '@esbuild/darwin-x64@0.21.4': 1026 | optional: true 1027 | 1028 | '@esbuild/freebsd-arm64@0.19.12': 1029 | optional: true 1030 | 1031 | '@esbuild/freebsd-arm64@0.21.4': 1032 | optional: true 1033 | 1034 | '@esbuild/freebsd-x64@0.19.12': 1035 | optional: true 1036 | 1037 | '@esbuild/freebsd-x64@0.21.4': 1038 | optional: true 1039 | 1040 | '@esbuild/linux-arm64@0.19.12': 1041 | optional: true 1042 | 1043 | '@esbuild/linux-arm64@0.21.4': 1044 | optional: true 1045 | 1046 | '@esbuild/linux-arm@0.19.12': 1047 | optional: true 1048 | 1049 | '@esbuild/linux-arm@0.21.4': 1050 | optional: true 1051 | 1052 | '@esbuild/linux-ia32@0.19.12': 1053 | optional: true 1054 | 1055 | '@esbuild/linux-ia32@0.21.4': 1056 | optional: true 1057 | 1058 | '@esbuild/linux-loong64@0.19.12': 1059 | optional: true 1060 | 1061 | '@esbuild/linux-loong64@0.21.4': 1062 | optional: true 1063 | 1064 | '@esbuild/linux-mips64el@0.19.12': 1065 | optional: true 1066 | 1067 | '@esbuild/linux-mips64el@0.21.4': 1068 | optional: true 1069 | 1070 | '@esbuild/linux-ppc64@0.19.12': 1071 | optional: true 1072 | 1073 | '@esbuild/linux-ppc64@0.21.4': 1074 | optional: true 1075 | 1076 | '@esbuild/linux-riscv64@0.19.12': 1077 | optional: true 1078 | 1079 | '@esbuild/linux-riscv64@0.21.4': 1080 | optional: true 1081 | 1082 | '@esbuild/linux-s390x@0.19.12': 1083 | optional: true 1084 | 1085 | '@esbuild/linux-s390x@0.21.4': 1086 | optional: true 1087 | 1088 | '@esbuild/linux-x64@0.19.12': 1089 | optional: true 1090 | 1091 | '@esbuild/linux-x64@0.21.4': 1092 | optional: true 1093 | 1094 | '@esbuild/netbsd-x64@0.19.12': 1095 | optional: true 1096 | 1097 | '@esbuild/netbsd-x64@0.21.4': 1098 | optional: true 1099 | 1100 | '@esbuild/openbsd-x64@0.19.12': 1101 | optional: true 1102 | 1103 | '@esbuild/openbsd-x64@0.21.4': 1104 | optional: true 1105 | 1106 | '@esbuild/sunos-x64@0.19.12': 1107 | optional: true 1108 | 1109 | '@esbuild/sunos-x64@0.21.4': 1110 | optional: true 1111 | 1112 | '@esbuild/win32-arm64@0.19.12': 1113 | optional: true 1114 | 1115 | '@esbuild/win32-arm64@0.21.4': 1116 | optional: true 1117 | 1118 | '@esbuild/win32-ia32@0.19.12': 1119 | optional: true 1120 | 1121 | '@esbuild/win32-ia32@0.21.4': 1122 | optional: true 1123 | 1124 | '@esbuild/win32-x64@0.19.12': 1125 | optional: true 1126 | 1127 | '@esbuild/win32-x64@0.21.4': 1128 | optional: true 1129 | 1130 | '@isaacs/cliui@8.0.2': 1131 | dependencies: 1132 | string-width: 5.1.2 1133 | string-width-cjs: string-width@4.2.3 1134 | strip-ansi: 7.1.0 1135 | strip-ansi-cjs: strip-ansi@6.0.1 1136 | wrap-ansi: 8.1.0 1137 | wrap-ansi-cjs: wrap-ansi@7.0.0 1138 | 1139 | '@jridgewell/gen-mapping@0.3.5': 1140 | dependencies: 1141 | '@jridgewell/set-array': 1.2.1 1142 | '@jridgewell/sourcemap-codec': 1.4.15 1143 | '@jridgewell/trace-mapping': 0.3.25 1144 | 1145 | '@jridgewell/resolve-uri@3.1.2': {} 1146 | 1147 | '@jridgewell/set-array@1.2.1': {} 1148 | 1149 | '@jridgewell/sourcemap-codec@1.4.15': {} 1150 | 1151 | '@jridgewell/trace-mapping@0.3.25': 1152 | dependencies: 1153 | '@jridgewell/resolve-uri': 3.1.2 1154 | '@jridgewell/sourcemap-codec': 1.4.15 1155 | 1156 | '@nodelib/fs.scandir@2.1.5': 1157 | dependencies: 1158 | '@nodelib/fs.stat': 2.0.5 1159 | run-parallel: 1.2.0 1160 | 1161 | '@nodelib/fs.stat@2.0.5': {} 1162 | 1163 | '@nodelib/fs.walk@1.2.8': 1164 | dependencies: 1165 | '@nodelib/fs.scandir': 2.1.5 1166 | fastq: 1.17.1 1167 | 1168 | '@pkgjs/parseargs@0.11.0': 1169 | optional: true 1170 | 1171 | '@remirror/core-constants@2.0.2': {} 1172 | 1173 | '@rollup/rollup-android-arm-eabi@4.18.0': 1174 | optional: true 1175 | 1176 | '@rollup/rollup-android-arm64@4.18.0': 1177 | optional: true 1178 | 1179 | '@rollup/rollup-darwin-arm64@4.18.0': 1180 | optional: true 1181 | 1182 | '@rollup/rollup-darwin-x64@4.18.0': 1183 | optional: true 1184 | 1185 | '@rollup/rollup-linux-arm-gnueabihf@4.18.0': 1186 | optional: true 1187 | 1188 | '@rollup/rollup-linux-arm-musleabihf@4.18.0': 1189 | optional: true 1190 | 1191 | '@rollup/rollup-linux-arm64-gnu@4.18.0': 1192 | optional: true 1193 | 1194 | '@rollup/rollup-linux-arm64-musl@4.18.0': 1195 | optional: true 1196 | 1197 | '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': 1198 | optional: true 1199 | 1200 | '@rollup/rollup-linux-riscv64-gnu@4.18.0': 1201 | optional: true 1202 | 1203 | '@rollup/rollup-linux-s390x-gnu@4.18.0': 1204 | optional: true 1205 | 1206 | '@rollup/rollup-linux-x64-gnu@4.18.0': 1207 | optional: true 1208 | 1209 | '@rollup/rollup-linux-x64-musl@4.18.0': 1210 | optional: true 1211 | 1212 | '@rollup/rollup-win32-arm64-msvc@4.18.0': 1213 | optional: true 1214 | 1215 | '@rollup/rollup-win32-ia32-msvc@4.18.0': 1216 | optional: true 1217 | 1218 | '@rollup/rollup-win32-x64-msvc@4.18.0': 1219 | optional: true 1220 | 1221 | '@tiptap/core@2.4.0(@tiptap/pm@2.4.0)': 1222 | dependencies: 1223 | '@tiptap/pm': 2.4.0 1224 | 1225 | '@tiptap/extension-list-item@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))': 1226 | dependencies: 1227 | '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) 1228 | 1229 | '@tiptap/extension-ordered-list@2.4.0(@tiptap/core@2.4.0(@tiptap/pm@2.4.0))': 1230 | dependencies: 1231 | '@tiptap/core': 2.4.0(@tiptap/pm@2.4.0) 1232 | 1233 | '@tiptap/pm@2.4.0': 1234 | dependencies: 1235 | prosemirror-changeset: 2.2.1 1236 | prosemirror-collab: 1.3.1 1237 | prosemirror-commands: 1.5.2 1238 | prosemirror-dropcursor: 1.8.1 1239 | prosemirror-gapcursor: 1.3.2 1240 | prosemirror-history: 1.4.0 1241 | prosemirror-inputrules: 1.4.0 1242 | prosemirror-keymap: 1.2.2 1243 | prosemirror-markdown: 1.13.0 1244 | prosemirror-menu: 1.2.4 1245 | prosemirror-model: 1.21.0 1246 | prosemirror-schema-basic: 1.2.2 1247 | prosemirror-schema-list: 1.3.0 1248 | prosemirror-state: 1.4.3 1249 | prosemirror-tables: 1.3.7 1250 | prosemirror-trailing-node: 2.0.8(prosemirror-model@1.21.0)(prosemirror-state@1.4.3)(prosemirror-view@1.33.6) 1251 | prosemirror-transform: 1.9.0 1252 | prosemirror-view: 1.33.6 1253 | 1254 | '@types/estree@1.0.5': {} 1255 | 1256 | '@types/uuid@9.0.8': {} 1257 | 1258 | ansi-regex@5.0.1: {} 1259 | 1260 | ansi-regex@6.0.1: {} 1261 | 1262 | ansi-styles@4.3.0: 1263 | dependencies: 1264 | color-convert: 2.0.1 1265 | 1266 | ansi-styles@6.2.1: {} 1267 | 1268 | any-promise@1.3.0: {} 1269 | 1270 | anymatch@3.1.3: 1271 | dependencies: 1272 | normalize-path: 3.0.0 1273 | picomatch: 2.3.1 1274 | 1275 | argparse@2.0.1: {} 1276 | 1277 | array-union@2.1.0: {} 1278 | 1279 | balanced-match@1.0.2: {} 1280 | 1281 | binary-extensions@2.3.0: {} 1282 | 1283 | brace-expansion@2.0.1: 1284 | dependencies: 1285 | balanced-match: 1.0.2 1286 | 1287 | braces@3.0.3: 1288 | dependencies: 1289 | fill-range: 7.1.1 1290 | 1291 | bundle-require@4.1.0(esbuild@0.19.12): 1292 | dependencies: 1293 | esbuild: 0.19.12 1294 | load-tsconfig: 0.2.5 1295 | 1296 | cac@6.7.14: {} 1297 | 1298 | chokidar@3.6.0: 1299 | dependencies: 1300 | anymatch: 3.1.3 1301 | braces: 3.0.3 1302 | glob-parent: 5.1.2 1303 | is-binary-path: 2.1.0 1304 | is-glob: 4.0.3 1305 | normalize-path: 3.0.0 1306 | readdirp: 3.6.0 1307 | optionalDependencies: 1308 | fsevents: 2.3.3 1309 | 1310 | color-convert@2.0.1: 1311 | dependencies: 1312 | color-name: 1.1.4 1313 | 1314 | color-name@1.1.4: {} 1315 | 1316 | commander@4.1.1: {} 1317 | 1318 | crelt@1.0.6: {} 1319 | 1320 | cross-spawn@7.0.3: 1321 | dependencies: 1322 | path-key: 3.1.1 1323 | shebang-command: 2.0.0 1324 | which: 2.0.2 1325 | 1326 | debug@4.3.4: 1327 | dependencies: 1328 | ms: 2.1.2 1329 | 1330 | dir-glob@3.0.1: 1331 | dependencies: 1332 | path-type: 4.0.0 1333 | 1334 | eastasianwidth@0.2.0: {} 1335 | 1336 | emoji-regex@8.0.0: {} 1337 | 1338 | emoji-regex@9.2.2: {} 1339 | 1340 | entities@4.5.0: {} 1341 | 1342 | esbuild@0.19.12: 1343 | optionalDependencies: 1344 | '@esbuild/aix-ppc64': 0.19.12 1345 | '@esbuild/android-arm': 0.19.12 1346 | '@esbuild/android-arm64': 0.19.12 1347 | '@esbuild/android-x64': 0.19.12 1348 | '@esbuild/darwin-arm64': 0.19.12 1349 | '@esbuild/darwin-x64': 0.19.12 1350 | '@esbuild/freebsd-arm64': 0.19.12 1351 | '@esbuild/freebsd-x64': 0.19.12 1352 | '@esbuild/linux-arm': 0.19.12 1353 | '@esbuild/linux-arm64': 0.19.12 1354 | '@esbuild/linux-ia32': 0.19.12 1355 | '@esbuild/linux-loong64': 0.19.12 1356 | '@esbuild/linux-mips64el': 0.19.12 1357 | '@esbuild/linux-ppc64': 0.19.12 1358 | '@esbuild/linux-riscv64': 0.19.12 1359 | '@esbuild/linux-s390x': 0.19.12 1360 | '@esbuild/linux-x64': 0.19.12 1361 | '@esbuild/netbsd-x64': 0.19.12 1362 | '@esbuild/openbsd-x64': 0.19.12 1363 | '@esbuild/sunos-x64': 0.19.12 1364 | '@esbuild/win32-arm64': 0.19.12 1365 | '@esbuild/win32-ia32': 0.19.12 1366 | '@esbuild/win32-x64': 0.19.12 1367 | 1368 | esbuild@0.21.4: 1369 | optionalDependencies: 1370 | '@esbuild/aix-ppc64': 0.21.4 1371 | '@esbuild/android-arm': 0.21.4 1372 | '@esbuild/android-arm64': 0.21.4 1373 | '@esbuild/android-x64': 0.21.4 1374 | '@esbuild/darwin-arm64': 0.21.4 1375 | '@esbuild/darwin-x64': 0.21.4 1376 | '@esbuild/freebsd-arm64': 0.21.4 1377 | '@esbuild/freebsd-x64': 0.21.4 1378 | '@esbuild/linux-arm': 0.21.4 1379 | '@esbuild/linux-arm64': 0.21.4 1380 | '@esbuild/linux-ia32': 0.21.4 1381 | '@esbuild/linux-loong64': 0.21.4 1382 | '@esbuild/linux-mips64el': 0.21.4 1383 | '@esbuild/linux-ppc64': 0.21.4 1384 | '@esbuild/linux-riscv64': 0.21.4 1385 | '@esbuild/linux-s390x': 0.21.4 1386 | '@esbuild/linux-x64': 0.21.4 1387 | '@esbuild/netbsd-x64': 0.21.4 1388 | '@esbuild/openbsd-x64': 0.21.4 1389 | '@esbuild/sunos-x64': 0.21.4 1390 | '@esbuild/win32-arm64': 0.21.4 1391 | '@esbuild/win32-ia32': 0.21.4 1392 | '@esbuild/win32-x64': 0.21.4 1393 | 1394 | escape-string-regexp@4.0.0: {} 1395 | 1396 | execa@5.1.1: 1397 | dependencies: 1398 | cross-spawn: 7.0.3 1399 | get-stream: 6.0.1 1400 | human-signals: 2.1.0 1401 | is-stream: 2.0.1 1402 | merge-stream: 2.0.0 1403 | npm-run-path: 4.0.1 1404 | onetime: 5.1.2 1405 | signal-exit: 3.0.7 1406 | strip-final-newline: 2.0.0 1407 | 1408 | fast-glob@3.3.2: 1409 | dependencies: 1410 | '@nodelib/fs.stat': 2.0.5 1411 | '@nodelib/fs.walk': 1.2.8 1412 | glob-parent: 5.1.2 1413 | merge2: 1.4.1 1414 | micromatch: 4.0.7 1415 | 1416 | fastq@1.17.1: 1417 | dependencies: 1418 | reusify: 1.0.4 1419 | 1420 | fill-range@7.1.1: 1421 | dependencies: 1422 | to-regex-range: 5.0.1 1423 | 1424 | foreground-child@3.1.1: 1425 | dependencies: 1426 | cross-spawn: 7.0.3 1427 | signal-exit: 4.1.0 1428 | 1429 | fsevents@2.3.3: 1430 | optional: true 1431 | 1432 | get-stream@6.0.1: {} 1433 | 1434 | glob-parent@5.1.2: 1435 | dependencies: 1436 | is-glob: 4.0.3 1437 | 1438 | glob@10.4.1: 1439 | dependencies: 1440 | foreground-child: 3.1.1 1441 | jackspeak: 3.1.2 1442 | minimatch: 9.0.4 1443 | minipass: 7.1.2 1444 | path-scurry: 1.11.1 1445 | 1446 | globby@11.1.0: 1447 | dependencies: 1448 | array-union: 2.1.0 1449 | dir-glob: 3.0.1 1450 | fast-glob: 3.3.2 1451 | ignore: 5.3.1 1452 | merge2: 1.4.1 1453 | slash: 3.0.0 1454 | 1455 | human-signals@2.1.0: {} 1456 | 1457 | ignore@5.3.1: {} 1458 | 1459 | is-binary-path@2.1.0: 1460 | dependencies: 1461 | binary-extensions: 2.3.0 1462 | 1463 | is-extglob@2.1.1: {} 1464 | 1465 | is-fullwidth-code-point@3.0.0: {} 1466 | 1467 | is-glob@4.0.3: 1468 | dependencies: 1469 | is-extglob: 2.1.1 1470 | 1471 | is-number@7.0.0: {} 1472 | 1473 | is-stream@2.0.1: {} 1474 | 1475 | isexe@2.0.0: {} 1476 | 1477 | jackspeak@3.1.2: 1478 | dependencies: 1479 | '@isaacs/cliui': 8.0.2 1480 | optionalDependencies: 1481 | '@pkgjs/parseargs': 0.11.0 1482 | 1483 | joycon@3.1.1: {} 1484 | 1485 | lilconfig@3.1.1: {} 1486 | 1487 | lines-and-columns@1.2.4: {} 1488 | 1489 | linkify-it@5.0.0: 1490 | dependencies: 1491 | uc.micro: 2.1.0 1492 | 1493 | load-tsconfig@0.2.5: {} 1494 | 1495 | lodash.sortby@4.7.0: {} 1496 | 1497 | lru-cache@10.2.2: {} 1498 | 1499 | markdown-it@14.1.0: 1500 | dependencies: 1501 | argparse: 2.0.1 1502 | entities: 4.5.0 1503 | linkify-it: 5.0.0 1504 | mdurl: 2.0.0 1505 | punycode.js: 2.3.1 1506 | uc.micro: 2.1.0 1507 | 1508 | mdurl@2.0.0: {} 1509 | 1510 | merge-stream@2.0.0: {} 1511 | 1512 | merge2@1.4.1: {} 1513 | 1514 | micromatch@4.0.7: 1515 | dependencies: 1516 | braces: 3.0.3 1517 | picomatch: 2.3.1 1518 | 1519 | mimic-fn@2.1.0: {} 1520 | 1521 | minimatch@9.0.4: 1522 | dependencies: 1523 | brace-expansion: 2.0.1 1524 | 1525 | minipass@7.1.2: {} 1526 | 1527 | ms@2.1.2: {} 1528 | 1529 | mz@2.7.0: 1530 | dependencies: 1531 | any-promise: 1.3.0 1532 | object-assign: 4.1.1 1533 | thenify-all: 1.6.0 1534 | 1535 | normalize-path@3.0.0: {} 1536 | 1537 | npm-run-path@4.0.1: 1538 | dependencies: 1539 | path-key: 3.1.1 1540 | 1541 | object-assign@4.1.1: {} 1542 | 1543 | onetime@5.1.2: 1544 | dependencies: 1545 | mimic-fn: 2.1.0 1546 | 1547 | orderedmap@2.1.1: {} 1548 | 1549 | path-key@3.1.1: {} 1550 | 1551 | path-scurry@1.11.1: 1552 | dependencies: 1553 | lru-cache: 10.2.2 1554 | minipass: 7.1.2 1555 | 1556 | path-type@4.0.0: {} 1557 | 1558 | picomatch@2.3.1: {} 1559 | 1560 | pirates@4.0.6: {} 1561 | 1562 | postcss-load-config@4.0.2: 1563 | dependencies: 1564 | lilconfig: 3.1.1 1565 | yaml: 2.4.2 1566 | 1567 | prosemirror-changeset@2.2.1: 1568 | dependencies: 1569 | prosemirror-transform: 1.9.0 1570 | 1571 | prosemirror-collab@1.3.1: 1572 | dependencies: 1573 | prosemirror-state: 1.4.3 1574 | 1575 | prosemirror-commands@1.5.2: 1576 | dependencies: 1577 | prosemirror-model: 1.21.0 1578 | prosemirror-state: 1.4.3 1579 | prosemirror-transform: 1.9.0 1580 | 1581 | prosemirror-dropcursor@1.8.1: 1582 | dependencies: 1583 | prosemirror-state: 1.4.3 1584 | prosemirror-transform: 1.9.0 1585 | prosemirror-view: 1.33.6 1586 | 1587 | prosemirror-gapcursor@1.3.2: 1588 | dependencies: 1589 | prosemirror-keymap: 1.2.2 1590 | prosemirror-model: 1.21.0 1591 | prosemirror-state: 1.4.3 1592 | prosemirror-view: 1.33.6 1593 | 1594 | prosemirror-history@1.4.0: 1595 | dependencies: 1596 | prosemirror-state: 1.4.3 1597 | prosemirror-transform: 1.9.0 1598 | prosemirror-view: 1.33.6 1599 | rope-sequence: 1.3.4 1600 | 1601 | prosemirror-inputrules@1.4.0: 1602 | dependencies: 1603 | prosemirror-state: 1.4.3 1604 | prosemirror-transform: 1.9.0 1605 | 1606 | prosemirror-keymap@1.2.2: 1607 | dependencies: 1608 | prosemirror-state: 1.4.3 1609 | w3c-keyname: 2.2.8 1610 | 1611 | prosemirror-markdown@1.13.0: 1612 | dependencies: 1613 | markdown-it: 14.1.0 1614 | prosemirror-model: 1.21.0 1615 | 1616 | prosemirror-menu@1.2.4: 1617 | dependencies: 1618 | crelt: 1.0.6 1619 | prosemirror-commands: 1.5.2 1620 | prosemirror-history: 1.4.0 1621 | prosemirror-state: 1.4.3 1622 | 1623 | prosemirror-model@1.21.0: 1624 | dependencies: 1625 | orderedmap: 2.1.1 1626 | 1627 | prosemirror-schema-basic@1.2.2: 1628 | dependencies: 1629 | prosemirror-model: 1.21.0 1630 | 1631 | prosemirror-schema-list@1.3.0: 1632 | dependencies: 1633 | prosemirror-model: 1.21.0 1634 | prosemirror-state: 1.4.3 1635 | prosemirror-transform: 1.9.0 1636 | 1637 | prosemirror-state@1.4.3: 1638 | dependencies: 1639 | prosemirror-model: 1.21.0 1640 | prosemirror-transform: 1.9.0 1641 | prosemirror-view: 1.33.6 1642 | 1643 | prosemirror-tables@1.3.7: 1644 | dependencies: 1645 | prosemirror-keymap: 1.2.2 1646 | prosemirror-model: 1.21.0 1647 | prosemirror-state: 1.4.3 1648 | prosemirror-transform: 1.9.0 1649 | prosemirror-view: 1.33.6 1650 | 1651 | prosemirror-trailing-node@2.0.8(prosemirror-model@1.21.0)(prosemirror-state@1.4.3)(prosemirror-view@1.33.6): 1652 | dependencies: 1653 | '@remirror/core-constants': 2.0.2 1654 | escape-string-regexp: 4.0.0 1655 | prosemirror-model: 1.21.0 1656 | prosemirror-state: 1.4.3 1657 | prosemirror-view: 1.33.6 1658 | 1659 | prosemirror-transform@1.9.0: 1660 | dependencies: 1661 | prosemirror-model: 1.21.0 1662 | 1663 | prosemirror-view@1.33.6: 1664 | dependencies: 1665 | prosemirror-model: 1.21.0 1666 | prosemirror-state: 1.4.3 1667 | prosemirror-transform: 1.9.0 1668 | 1669 | punycode.js@2.3.1: {} 1670 | 1671 | punycode@2.3.1: {} 1672 | 1673 | queue-microtask@1.2.3: {} 1674 | 1675 | readdirp@3.6.0: 1676 | dependencies: 1677 | picomatch: 2.3.1 1678 | 1679 | resolve-from@5.0.0: {} 1680 | 1681 | reusify@1.0.4: {} 1682 | 1683 | rollup@4.18.0: 1684 | dependencies: 1685 | '@types/estree': 1.0.5 1686 | optionalDependencies: 1687 | '@rollup/rollup-android-arm-eabi': 4.18.0 1688 | '@rollup/rollup-android-arm64': 4.18.0 1689 | '@rollup/rollup-darwin-arm64': 4.18.0 1690 | '@rollup/rollup-darwin-x64': 4.18.0 1691 | '@rollup/rollup-linux-arm-gnueabihf': 4.18.0 1692 | '@rollup/rollup-linux-arm-musleabihf': 4.18.0 1693 | '@rollup/rollup-linux-arm64-gnu': 4.18.0 1694 | '@rollup/rollup-linux-arm64-musl': 4.18.0 1695 | '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0 1696 | '@rollup/rollup-linux-riscv64-gnu': 4.18.0 1697 | '@rollup/rollup-linux-s390x-gnu': 4.18.0 1698 | '@rollup/rollup-linux-x64-gnu': 4.18.0 1699 | '@rollup/rollup-linux-x64-musl': 4.18.0 1700 | '@rollup/rollup-win32-arm64-msvc': 4.18.0 1701 | '@rollup/rollup-win32-ia32-msvc': 4.18.0 1702 | '@rollup/rollup-win32-x64-msvc': 4.18.0 1703 | fsevents: 2.3.3 1704 | 1705 | rope-sequence@1.3.4: {} 1706 | 1707 | run-parallel@1.2.0: 1708 | dependencies: 1709 | queue-microtask: 1.2.3 1710 | 1711 | shebang-command@2.0.0: 1712 | dependencies: 1713 | shebang-regex: 3.0.0 1714 | 1715 | shebang-regex@3.0.0: {} 1716 | 1717 | signal-exit@3.0.7: {} 1718 | 1719 | signal-exit@4.1.0: {} 1720 | 1721 | slash@3.0.0: {} 1722 | 1723 | source-map@0.8.0-beta.0: 1724 | dependencies: 1725 | whatwg-url: 7.1.0 1726 | 1727 | string-width@4.2.3: 1728 | dependencies: 1729 | emoji-regex: 8.0.0 1730 | is-fullwidth-code-point: 3.0.0 1731 | strip-ansi: 6.0.1 1732 | 1733 | string-width@5.1.2: 1734 | dependencies: 1735 | eastasianwidth: 0.2.0 1736 | emoji-regex: 9.2.2 1737 | strip-ansi: 7.1.0 1738 | 1739 | strip-ansi@6.0.1: 1740 | dependencies: 1741 | ansi-regex: 5.0.1 1742 | 1743 | strip-ansi@7.1.0: 1744 | dependencies: 1745 | ansi-regex: 6.0.1 1746 | 1747 | strip-final-newline@2.0.0: {} 1748 | 1749 | sucrase@3.35.0: 1750 | dependencies: 1751 | '@jridgewell/gen-mapping': 0.3.5 1752 | commander: 4.1.1 1753 | glob: 10.4.1 1754 | lines-and-columns: 1.2.4 1755 | mz: 2.7.0 1756 | pirates: 4.0.6 1757 | ts-interface-checker: 0.1.13 1758 | 1759 | thenify-all@1.6.0: 1760 | dependencies: 1761 | thenify: 3.3.1 1762 | 1763 | thenify@3.3.1: 1764 | dependencies: 1765 | any-promise: 1.3.0 1766 | 1767 | to-regex-range@5.0.1: 1768 | dependencies: 1769 | is-number: 7.0.0 1770 | 1771 | tr46@1.0.1: 1772 | dependencies: 1773 | punycode: 2.3.1 1774 | 1775 | tree-kill@1.2.2: {} 1776 | 1777 | ts-interface-checker@0.1.13: {} 1778 | 1779 | tsup@8.0.2(typescript@5.4.5): 1780 | dependencies: 1781 | bundle-require: 4.1.0(esbuild@0.19.12) 1782 | cac: 6.7.14 1783 | chokidar: 3.6.0 1784 | debug: 4.3.4 1785 | esbuild: 0.19.12 1786 | execa: 5.1.1 1787 | globby: 11.1.0 1788 | joycon: 3.1.1 1789 | postcss-load-config: 4.0.2 1790 | resolve-from: 5.0.0 1791 | rollup: 4.18.0 1792 | source-map: 0.8.0-beta.0 1793 | sucrase: 3.35.0 1794 | tree-kill: 1.2.2 1795 | optionalDependencies: 1796 | typescript: 5.4.5 1797 | transitivePeerDependencies: 1798 | - supports-color 1799 | - ts-node 1800 | 1801 | typescript@5.4.5: {} 1802 | 1803 | uc.micro@2.1.0: {} 1804 | 1805 | uuid@9.0.1: {} 1806 | 1807 | w3c-keyname@2.2.8: {} 1808 | 1809 | webidl-conversions@4.0.2: {} 1810 | 1811 | whatwg-url@7.1.0: 1812 | dependencies: 1813 | lodash.sortby: 4.7.0 1814 | tr46: 1.0.1 1815 | webidl-conversions: 4.0.2 1816 | 1817 | which@2.0.2: 1818 | dependencies: 1819 | isexe: 2.0.0 1820 | 1821 | wrap-ansi@7.0.0: 1822 | dependencies: 1823 | ansi-styles: 4.3.0 1824 | string-width: 4.2.3 1825 | strip-ansi: 6.0.1 1826 | 1827 | wrap-ansi@8.1.0: 1828 | dependencies: 1829 | ansi-styles: 6.2.1 1830 | string-width: 5.1.2 1831 | strip-ansi: 7.1.0 1832 | 1833 | yaml@2.4.2: {} 1834 | -------------------------------------------------------------------------------- /package/src/footnotes/footnote.ts: -------------------------------------------------------------------------------- 1 | import { mergeAttributes } from "@tiptap/core"; 2 | import ListItem, { ListItemOptions } from "@tiptap/extension-list-item"; 3 | 4 | declare module "@tiptap/core" { 5 | interface Commands { 6 | footnote: { 7 | /** 8 | * scrolls to & sets the text selection at the end of the footnote with the given id 9 | * @param id the id of the footote (i.e. the `data-id` attribute value of the footnote) 10 | * @example editor.commands.focusFootnote("a43956c1-1ab8-462f-96e4-be3a4b27fd50") 11 | */ 12 | focusFootnote: (id: string) => ReturnType; 13 | }; 14 | } 15 | } 16 | 17 | export interface FootnoteOptions extends ListItemOptions { 18 | /** 19 | * Content expression for this node 20 | * @default "paragraph+" 21 | */ 22 | content: string; 23 | } 24 | 25 | const Footnote = ListItem.extend({ 26 | name: "footnote", 27 | content() { 28 | return this.options.content; 29 | }, 30 | isolating: true, 31 | defining: true, 32 | draggable: false, 33 | 34 | // @ts-expect-error 35 | addOptions() { 36 | return { 37 | ...this.parent?.(), 38 | content: "paragraph+", 39 | }; 40 | }, 41 | 42 | addAttributes() { 43 | return { 44 | id: { 45 | isRequired: true, 46 | }, 47 | // the data-id field should match the data-id field of a footnote reference. 48 | // it's used to link footnotes and references together. 49 | "data-id": { 50 | isRequired: true, 51 | }, 52 | }; 53 | }, 54 | parseHTML() { 55 | return [ 56 | { 57 | tag: "li", 58 | getAttrs(node) { 59 | const id = node.getAttribute("data-id"); 60 | if (id) { 61 | return { 62 | "data-id": node.getAttribute("data-id"), 63 | }; 64 | } 65 | return false; 66 | }, 67 | priority: 1000, 68 | }, 69 | ]; 70 | }, 71 | renderHTML({ HTMLAttributes }) { 72 | return [ 73 | "li", 74 | mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 75 | 0, 76 | ]; 77 | }, 78 | 79 | addCommands() { 80 | return { 81 | focusFootnote: 82 | (id: string) => 83 | ({ editor, chain }) => { 84 | const matchedFootnote = editor.$node("footnote", { 85 | "data-id": id, 86 | }); 87 | if (matchedFootnote) { 88 | // sets the text selection to the end of the footnote definition and scroll to it. 89 | chain() 90 | .focus() 91 | .setTextSelection( 92 | matchedFootnote.from + matchedFootnote.content.size 93 | ) 94 | .run(); 95 | 96 | matchedFootnote.element.scrollIntoView(); 97 | return true; 98 | } 99 | return false; 100 | }, 101 | }; 102 | }, 103 | addKeyboardShortcuts() { 104 | return { 105 | // when the user presses tab, adjust the text selection to be at the end of the next footnote 106 | Tab: ({ editor }) => { 107 | try { 108 | const { selection } = editor.state; 109 | const pos = editor.$pos(selection.anchor); 110 | if (!pos.after) return false; 111 | // if the next node is "footnotes", place the text selection at the end of the first footnote 112 | if (pos.after.node.type.name == "footnotes") { 113 | const firstChild = pos.after.node.child(0); 114 | editor 115 | .chain() 116 | .setTextSelection(pos.after.from + firstChild.content.size) 117 | .scrollIntoView() 118 | .run(); 119 | return true; 120 | } else { 121 | const startPos = selection.$from.start(2); 122 | if (Number.isNaN(startPos)) return false; 123 | const parent = editor.$pos(startPos); 124 | if (parent.node.type.name != "footnote" || !parent.after) { 125 | return false; 126 | } 127 | // if the next node is a footnote, place the text selection at the end of it 128 | editor 129 | .chain() 130 | .setTextSelection(parent.after.to - 1) 131 | .scrollIntoView() 132 | .run(); 133 | return true; 134 | } 135 | } catch { 136 | return false; 137 | } 138 | }, 139 | // inverse of the tab command - place the text selection at the end of the previous footnote 140 | "Shift-Tab": ({ editor }) => { 141 | const { selection } = editor.state; 142 | const startPos = selection.$from.start(2); 143 | if (Number.isNaN(startPos)) return false; 144 | const parent = editor.$pos(startPos); 145 | if (parent.node.type.name != "footnote" || !parent.before) { 146 | return false; 147 | } 148 | 149 | editor 150 | .chain() 151 | .setTextSelection(parent.before.to - 1) 152 | .scrollIntoView() 153 | .run(); 154 | return true; 155 | }, 156 | }; 157 | }, 158 | }); 159 | 160 | export default Footnote; 161 | -------------------------------------------------------------------------------- /package/src/footnotes/footnotes.ts: -------------------------------------------------------------------------------- 1 | import OrderedList from "@tiptap/extension-ordered-list"; 2 | import FootnoteRules from "./rules"; 3 | 4 | const Footnotes = OrderedList.extend({ 5 | name: "footnotes", 6 | group: "", // removed the default group of the ordered list extension 7 | isolating: true, 8 | defining: true, 9 | draggable: false, 10 | 11 | content() { 12 | return "footnote*"; 13 | }, 14 | addAttributes() { 15 | return { 16 | class: { 17 | default: "footnotes", 18 | }, 19 | }; 20 | }, 21 | parseHTML() { 22 | return [ 23 | { 24 | tag: "ol.footnotes", 25 | priority: 1000, 26 | }, 27 | ]; 28 | }, 29 | 30 | addKeyboardShortcuts() { 31 | return { 32 | // override the default behavior of Mod-a: 33 | // rather than selecting the whole text content of the editor, only select the text inside the current footnote 34 | "Mod-a": ({ editor }) => { 35 | try { 36 | const { selection } = editor.state; 37 | const { $from } = selection; 38 | // footnote listItems are at depth 2, we are getting the start & end position of the parent list item from the current cursor position 39 | const start = $from.start(2); 40 | const startNode = editor.$pos(start); 41 | 42 | if (startNode.node.type.name != "footnote") return false; 43 | 44 | const end = $from.end(2); 45 | 46 | editor.commands.setTextSelection({ 47 | from: start + 1, 48 | to: end - 1, 49 | }); 50 | return true; 51 | } catch (e) { 52 | return false; 53 | } 54 | }, 55 | }; 56 | }, 57 | addCommands() { 58 | return {}; 59 | }, 60 | addInputRules() { 61 | return []; 62 | }, 63 | 64 | addExtensions() { 65 | return [FootnoteRules]; 66 | }, 67 | }); 68 | 69 | export default Footnotes; 70 | -------------------------------------------------------------------------------- /package/src/footnotes/reference.ts: -------------------------------------------------------------------------------- 1 | import { mergeAttributes, Node } from "@tiptap/core"; 2 | import { NodeSelection, Plugin, PluginKey } from "@tiptap/pm/state"; 3 | 4 | import { v4 as uuid } from "uuid"; 5 | 6 | const REFNUM_ATTR = "data-reference-number"; 7 | const REF_CLASS = "footnote-ref"; 8 | 9 | declare module "@tiptap/core" { 10 | interface Commands { 11 | footnoteReference: { 12 | /** 13 | * add a new footnote reference 14 | * @example editor.commands.addFootnote() 15 | */ 16 | addFootnote: () => ReturnType; 17 | }; 18 | } 19 | } 20 | 21 | const FootnoteReference = Node.create({ 22 | name: "footnoteReference", 23 | inline: true, 24 | content: "text*", 25 | group: "inline", 26 | atom: true, 27 | draggable: true, 28 | 29 | parseHTML() { 30 | return [ 31 | { 32 | tag: `sup`, 33 | priority: 1000, 34 | getAttrs(node) { 35 | const anchor = node.querySelector( 36 | `a.${REF_CLASS}:first-child` 37 | ); 38 | 39 | if (!anchor) { 40 | return false; 41 | } 42 | 43 | const id = anchor.getAttribute("data-id"); 44 | const ref = anchor.getAttribute(REFNUM_ATTR); 45 | 46 | return { 47 | "data-id": id ?? uuid(), 48 | referenceNumber: ref ?? anchor.innerText, 49 | }; 50 | }, 51 | contentElement(node) { 52 | return node.firstChild as HTMLElement; 53 | }, 54 | }, 55 | ]; 56 | }, 57 | 58 | addAttributes() { 59 | return { 60 | class: { 61 | default: REF_CLASS, 62 | }, 63 | "data-id": { 64 | renderHTML(attributes) { 65 | return { 66 | "data-id": attributes["data-id"] || uuid(), 67 | }; 68 | }, 69 | }, 70 | referenceNumber: {}, 71 | 72 | href: { 73 | renderHTML(attributes) { 74 | return { 75 | href: `#fn:${attributes["referenceNumber"]}`, 76 | }; 77 | }, 78 | }, 79 | }; 80 | }, 81 | 82 | renderHTML({ HTMLAttributes }) { 83 | const { referenceNumber, ...attributes } = HTMLAttributes; 84 | const attrs = mergeAttributes(this.options.HTMLAttributes, attributes); 85 | attrs[REFNUM_ATTR] = referenceNumber; 86 | 87 | return [ 88 | "sup", 89 | { id: `fnref:${referenceNumber}` }, 90 | ["a", attrs, HTMLAttributes.referenceNumber], 91 | ]; 92 | }, 93 | 94 | addProseMirrorPlugins() { 95 | const { editor } = this; 96 | return [ 97 | new Plugin({ 98 | key: new PluginKey("footnoteRefClick"), 99 | 100 | props: { 101 | // on double-click, focus on the footnote 102 | handleDoubleClickOn(view, pos, node, nodePos, event) { 103 | if (node.type.name != "footnoteReference") return false; 104 | event.preventDefault(); 105 | const id = node.attrs["data-id"]; 106 | return editor.commands.focusFootnote(id); 107 | }, 108 | // click the footnote reference once to get focus, click twice to scroll to the footnote 109 | handleClickOn(view, pos, node, nodePos, event) { 110 | if (node.type.name != "footnoteReference") return false; 111 | event.preventDefault(); 112 | const { selection } = editor.state.tr; 113 | if (selection instanceof NodeSelection && selection.node.eq(node)) { 114 | const id = node.attrs["data-id"]; 115 | return editor.commands.focusFootnote(id); 116 | } else { 117 | editor.chain().setNodeSelection(nodePos).run(); 118 | return true; 119 | } 120 | }, 121 | }, 122 | }), 123 | ]; 124 | }, 125 | 126 | addCommands() { 127 | return { 128 | addFootnote: 129 | () => 130 | ({ state, tr }) => { 131 | const node = this.type.create({ 132 | "data-id": uuid(), 133 | }); 134 | tr.insert(state.selection.anchor, node); 135 | return true; 136 | }, 137 | }; 138 | }, 139 | 140 | addInputRules() { 141 | // when a user types [^text], add a new footnote 142 | return [ 143 | { 144 | find: /\[\^(.*?)\]/, 145 | type: this.type, 146 | handler({ range, match, chain }) { 147 | const start = range.from; 148 | let end = range.to; 149 | if (match[1]) { 150 | chain().deleteRange({ from: start, to: end }).addFootnote().run(); 151 | } 152 | }, 153 | }, 154 | ]; 155 | }, 156 | }); 157 | 158 | export default FootnoteReference; 159 | -------------------------------------------------------------------------------- /package/src/footnotes/rules.ts: -------------------------------------------------------------------------------- 1 | import { Plugin, PluginKey, TextSelection } from "@tiptap/pm/state"; 2 | import { ReplaceStep } from "@tiptap/pm/transform"; 3 | import { Extension, minMax } from "@tiptap/core"; 4 | import { updateFootnotesList } from "./utils"; 5 | 6 | const FootnoteRules = Extension.create({ 7 | name: "footnoteRules", 8 | priority: 1000, 9 | addProseMirrorPlugins() { 10 | return [ 11 | new Plugin({ 12 | key: new PluginKey("footnoteRules"), 13 | filterTransaction(tr) { 14 | const { from, to } = tr.selection; 15 | 16 | // allow transactions on the whole document 17 | const minPos = TextSelection.atStart(tr.doc).from; 18 | const maxPos = TextSelection.atEnd(tr.doc).to; 19 | const resolvedFrom = minMax(0, minPos, maxPos); 20 | const resolvedEnd = minMax(tr.doc.content.size, minPos, maxPos); 21 | if (from == resolvedFrom && to == resolvedEnd) return true; 22 | 23 | let selectedFootnotes = false; 24 | let selectedContent = false; 25 | let footnoteCount = 0; 26 | tr.doc.nodesBetween(from, to, (node, _, parent) => { 27 | if (parent?.type.name == "doc" && node.type.name != "footnotes") { 28 | selectedContent = true; 29 | } else if (node.type.name == "footnote") { 30 | footnoteCount += 1; 31 | } else if (node.type.name == "footnotes") { 32 | selectedFootnotes = true; 33 | } 34 | }); 35 | const overSelected = selectedContent && selectedFootnotes; 36 | /* 37 | * Here, we don't allow any transaction that spans between the "content" nodes and the "footnotes" node. This also rejects any transaction that spans between more than 1 footnote. 38 | */ 39 | return !overSelected && footnoteCount <= 1; 40 | }, 41 | 42 | // if there are some to the footnote references (added/deleted/dragged), append a transaction that updates the footnotes list accordingly 43 | appendTransaction(transactions, oldState, newState) { 44 | let newTr = newState.tr; 45 | let refsChanged = false; // true if the footnote references have been changed, false otherwise 46 | for (let tr of transactions) { 47 | if (!tr.docChanged) continue; 48 | if (refsChanged) break; 49 | 50 | for (let step of tr.steps) { 51 | if (!(step instanceof ReplaceStep)) continue; 52 | if (refsChanged) break; 53 | 54 | const isDelete = step.from != step.to; // the user deleted items from the document (from != to & the step is a replace step) 55 | const isInsert = step.slice.size > 0; 56 | 57 | // check if any footnote references have been inserted 58 | if (isInsert) { 59 | step.slice.content.descendants((node) => { 60 | if (node?.type.name == "footnoteReference") { 61 | refsChanged = true; 62 | return false; 63 | } 64 | }); 65 | } 66 | if (isDelete && !refsChanged) { 67 | // check if any footnote references have been deleted 68 | tr.before.nodesBetween( 69 | step.from, 70 | Math.min(tr.before.content.size, step.to), // make sure to not go over the old document's limit 71 | (node) => { 72 | if (node.type.name == "footnoteReference") { 73 | refsChanged = true; 74 | return false; 75 | } 76 | }, 77 | ); 78 | } 79 | } 80 | } 81 | 82 | if (refsChanged) { 83 | updateFootnotesList(newTr, newState); 84 | return newTr; 85 | } 86 | 87 | return null; 88 | }, 89 | }), 90 | ]; 91 | }, 92 | }); 93 | export default FootnoteRules; 94 | -------------------------------------------------------------------------------- /package/src/footnotes/utils.ts: -------------------------------------------------------------------------------- 1 | import { EditorState, Transaction } from "@tiptap/pm/state"; 2 | import { Fragment, Node } from "@tiptap/pm/model"; 3 | 4 | // update the reference number of all the footnote references in the document 5 | export function updateFootnoteReferences(tr: Transaction) { 6 | let count = 1; 7 | 8 | const nodes: any[] = []; 9 | 10 | tr.doc.descendants((node, pos) => { 11 | if (node.type.name == "footnoteReference") { 12 | tr.setNodeAttribute(pos, "referenceNumber", `${count}`); 13 | 14 | nodes.push(node); 15 | count += 1; 16 | } 17 | }); 18 | // return the updated footnote references (in the order that they appear in the document) 19 | return nodes; 20 | } 21 | 22 | function getFootnotes(tr: Transaction) { 23 | let footnotesRange: { from: number; to: number } | undefined; 24 | const footnotes: Node[] = []; 25 | tr.doc.descendants((node, pos) => { 26 | if (node.type.name == "footnote") { 27 | footnotes.push(node); 28 | } else if (node.type.name == "footnotes") { 29 | footnotesRange = { from: pos, to: pos + node.nodeSize }; 30 | } else { 31 | return false; 32 | } 33 | }); 34 | return { footnotesRange, footnotes }; 35 | } 36 | 37 | // update the "footnotes" ordered list based on the footnote references in the document 38 | export function updateFootnotesList(tr: Transaction, state: EditorState) { 39 | const footnoteReferences = updateFootnoteReferences(tr); 40 | 41 | const footnoteType = state.schema.nodes.footnote; 42 | const footnotesType = state.schema.nodes.footnotes; 43 | 44 | const emptyParagraph = state.schema.nodeFromJSON({ 45 | type: "paragraph", 46 | content: [], 47 | }); 48 | 49 | const { footnotesRange, footnotes } = getFootnotes(tr); 50 | 51 | // a mapping of footnote id -> footnote node 52 | const footnoteIds: { [key: string]: Node } = footnotes.reduce( 53 | (obj, footnote) => { 54 | obj[footnote.attrs["data-id"]] = footnote; 55 | return obj; 56 | }, 57 | {} as any, 58 | ); 59 | 60 | const newFootnotes: Node[] = []; 61 | 62 | let footnoteRefIds = new Set( 63 | footnoteReferences.map((ref) => ref.attrs["data-id"]), 64 | ); 65 | const deleteFootnoteIds: Set = new Set(); 66 | for (let footnote of footnotes) { 67 | const id = footnote.attrs["data-id"]; 68 | if (!footnoteRefIds.has(id) || deleteFootnoteIds.has(id)) { 69 | deleteFootnoteIds.add(id); 70 | // we traverse through this footnote's content because it may contain footnote references. 71 | // we want to delete the footnotes associated with these references, so we add them to the delete set. 72 | footnote.content.descendants((node) => { 73 | if (node.type.name == "footnoteReference") 74 | deleteFootnoteIds.add(node.attrs["data-id"]); 75 | }); 76 | } 77 | } 78 | 79 | for (let i = 0; i < footnoteReferences.length; i++) { 80 | let refId = footnoteReferences[i].attrs["data-id"]; 81 | 82 | if (deleteFootnoteIds.has(refId)) continue; 83 | // if there is a footnote w/ the same id as this `ref`, we preserve its content and update its id attribute 84 | if (refId in footnoteIds) { 85 | let footnote = footnoteIds[refId]; 86 | newFootnotes.push( 87 | footnoteType.create( 88 | { ...footnote.attrs, id: `fn:${i + 1}` }, 89 | footnote.content, 90 | ), 91 | ); 92 | } else { 93 | let newNode = footnoteType.create( 94 | { 95 | "data-id": refId, 96 | id: `fn:${i + 1}`, 97 | }, 98 | [emptyParagraph], 99 | ); 100 | newFootnotes.push(newNode); 101 | } 102 | } 103 | 104 | if (newFootnotes.length == 0) { 105 | // no footnotes in the doc, delete the "footnotes" node 106 | if (footnotesRange) { 107 | tr.delete(footnotesRange.from, footnotesRange.to); 108 | } 109 | } else if (!footnotesRange) { 110 | // there is no footnotes node present in the doc, add it 111 | tr.insert( 112 | tr.doc.content.size, 113 | footnotesType.create(undefined, Fragment.from(newFootnotes)), 114 | ); 115 | } else { 116 | tr.replaceWith( 117 | footnotesRange!.from + 1, // add 1 to point at the position after the opening ol tag 118 | footnotesRange!.to - 1, // substract 1 to point to the position before the closing ol tag 119 | Fragment.from(newFootnotes), 120 | ); 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /package/src/index.ts: -------------------------------------------------------------------------------- 1 | import Footnotes from "./footnotes/footnotes"; 2 | import FootnoteReference from "./footnotes/reference"; 3 | import Footnote from "./footnotes/footnote"; 4 | 5 | export { Footnotes, Footnote, FootnoteReference }; 6 | -------------------------------------------------------------------------------- /package/tests/index.test.ts: -------------------------------------------------------------------------------- 1 | import { Editor } from "@tiptap/core"; 2 | import Document from "@tiptap/extension-document"; 3 | import Paragraph from "@tiptap/extension-paragraph"; 4 | import Text from "@tiptap/extension-text"; 5 | import { expect, test } from "vitest"; 6 | 7 | import { Footnote, FootnoteReference, Footnotes } from "../src"; 8 | import { GatheredFootnotes, gatherFootnotes, newEditor } from "./utils"; 9 | 10 | function testMatchingFootnotes(footnotes: GatheredFootnotes) { 11 | expect(footnotes.refs.length).toEqual(footnotes.footnotes.length); 12 | 13 | for (let i = 0; i < footnotes.refs.length; i++) { 14 | const ref = footnotes.refs[i]; 15 | const footnote = footnotes.footnotes[i]; 16 | let refNumber = String(i + 1); 17 | 18 | expect(ref.attrs!["data-id"]).toEqual(footnote.attrs!["data-id"]); 19 | expect(ref.attrs!["referenceNumber"]).toEqual(refNumber); 20 | expect(footnote.attrs!["id"]).toEqual(`fn:${refNumber}`); 21 | } 22 | } 23 | 24 | test("basic footnote reference insertion", () => { 25 | const editor = newEditor(); 26 | editor.commands.addFootnote(); 27 | const footnotes = gatherFootnotes(editor); 28 | testMatchingFootnotes(footnotes); 29 | }); 30 | 31 | test("footnote insertion between two refs ", () => { 32 | const editor = newEditor(); 33 | editor.commands.addFootnote(); 34 | editor.commands.insertContent("-----------"); 35 | editor.commands.addFootnote(); 36 | 37 | // add footnote betwween refs 1 & 2 38 | editor.commands.setTextSelection(10); 39 | editor.commands.addFootnote(); 40 | 41 | const footnotes = gatherFootnotes(editor); 42 | 43 | testMatchingFootnotes(footnotes); 44 | }); 45 | 46 | test("footnote insertion between two refs (with chained command)", () => { 47 | const editor = newEditor(); 48 | editor.commands.addFootnote(); 49 | editor.commands.insertContent("-----------"); 50 | editor.commands.addFootnote(); 51 | 52 | // add footnote betwween refs 1 & 2 53 | editor.commands.setTextSelection(10); 54 | 55 | editor.chain().deleteRange({ from: 2, to: 5 }).addFootnote().run(); 56 | 57 | const footnotes = gatherFootnotes(editor); 58 | 59 | testMatchingFootnotes(footnotes); 60 | }); 61 | 62 | test("test footnote reference deletion", () => { 63 | const editor = newEditor(); 64 | editor.commands.addFootnote(); 65 | editor.commands.addFootnote(); 66 | editor.commands.addFootnote(); 67 | 68 | const prevFootnotes = gatherFootnotes(editor); 69 | 70 | // delete the first footnote ref 71 | editor.commands.deleteRange({ from: 1, to: 3 }); 72 | 73 | const footnotes = gatherFootnotes(editor); 74 | 75 | expect(footnotes.refs.length).toEqual(2); 76 | 77 | expect(footnotes.refs[0].attrs["data-id"]).toEqual( 78 | prevFootnotes.refs[1].attrs["data-id"] 79 | ); 80 | expect(footnotes.refs[1].attrs["data-id"]).toEqual( 81 | prevFootnotes.refs[2].attrs["data-id"] 82 | ); 83 | 84 | testMatchingFootnotes(footnotes); 85 | }); 86 | 87 | test("test footnote content options", () => { 88 | { 89 | const editor = new Editor({ 90 | extensions: [ 91 | Document.extend({ 92 | content: "block+ footnotes?", 93 | }), 94 | Text, 95 | Paragraph, 96 | Footnotes, 97 | Footnote, 98 | FootnoteReference, 99 | ], 100 | }); 101 | 102 | const spec = editor.state.schema.nodes.footnote.spec; 103 | expect(spec.content).toBe("paragraph+"); 104 | } 105 | 106 | { 107 | const editor = new Editor({ 108 | extensions: [ 109 | Document.extend({ 110 | content: "block+ footnotes?", 111 | }), 112 | Text, 113 | Paragraph, 114 | Footnotes, 115 | Footnote.configure({ 116 | content: "paragraph block*", 117 | }), 118 | FootnoteReference, 119 | ], 120 | }); 121 | 122 | const spec = editor.state.schema.nodes.footnote.spec; 123 | expect(spec.content).toBe("paragraph block*"); 124 | } 125 | }); 126 | -------------------------------------------------------------------------------- /package/tests/utils.ts: -------------------------------------------------------------------------------- 1 | import { Editor } from "@tiptap/core"; 2 | import { Node } from "@tiptap/pm/model"; 3 | import Document from "@tiptap/extension-document"; 4 | import Paragraph from "@tiptap/extension-paragraph"; 5 | import Text from "@tiptap/extension-text"; 6 | import { Footnote, Footnotes, FootnoteReference } from "../src/index"; 7 | 8 | export type GatheredFootnotes = { 9 | refs: Node[]; 10 | footnotes: Node[]; 11 | }; 12 | export function gatherFootnotes(editor: Editor) { 13 | const footnotes: GatheredFootnotes = { refs: [], footnotes: [] }; 14 | 15 | editor.state.doc.descendants((node) => { 16 | if (node.type.name == "footnoteReference") { 17 | footnotes.refs.push(node); 18 | } else if (node.type.name == "footnote") { 19 | footnotes.footnotes.push(node); 20 | } 21 | }); 22 | return footnotes; 23 | } 24 | 25 | const createEditorEl = () => { 26 | const editorEl = document.createElement("div"); 27 | 28 | editorEl.classList.add("tiptap"); 29 | document.body.appendChild(editorEl); 30 | 31 | return editorEl; 32 | }; 33 | export function newEditor() { 34 | return new Editor({ 35 | element: createEditorEl(), 36 | extensions: [ 37 | Document.extend({ 38 | content: "block+ footnotes?", 39 | }), 40 | Text, 41 | Paragraph, 42 | Footnotes, 43 | Footnote, 44 | FootnoteReference, 45 | ], 46 | }); 47 | } 48 | -------------------------------------------------------------------------------- /package/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2020", 4 | "module": "esnext", 5 | "strict": true, 6 | "importHelpers": true, 7 | "moduleResolution": "node", 8 | "esModuleInterop": true, 9 | "allowSyntheticDefaultImports": true, 10 | "sourceMap": true, 11 | "baseUrl": ".", 12 | "rootDir": ".", 13 | "lib": ["esnext", "dom", "dom.iterable"], 14 | "noEmit": true, 15 | "isolatedModules": true, 16 | "outDir": "./dist", 17 | "declaration": true 18 | }, 19 | "include": ["src"], 20 | "exclude": ["**/node_modules", "**/dist"] 21 | } 22 | -------------------------------------------------------------------------------- /package/tsup.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "tsup"; 2 | import pkg from "./package.json"; 3 | 4 | export default defineConfig({ 5 | format: ["cjs", "esm"], 6 | entry: ["./src/index.ts"], 7 | dts: true, 8 | shims: true, 9 | skipNodeModulesBundle: true, 10 | clean: true, 11 | minify: false, 12 | sourcemap: true, 13 | external: [ 14 | "@tiptap/*", 15 | ...Object.keys(pkg.dependencies), 16 | ...Object.keys(pkg.peerDependencies), 17 | ], 18 | }); 19 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - package/ 3 | - examples/react/ --------------------------------------------------------------------------------