diff --git a/bun.lock b/bun.lock index f1b0c41..5042c56 100644 --- a/bun.lock +++ b/bun.lock @@ -17,27 +17,37 @@ "@codemirror/theme-one-dark": "^6.1.3", "@codemirror/view": "^6.39.14", "@heroicons/react": "^2.2.0", - "@raystack/apsara": "^0.56.0", - "@types/unist": "^3.0.3", + "@raystack/apsara": "0.55.1", + "@shikijs/rehype": "^4.0.2", + "@vitejs/plugin-react": "^6.0.1", "chalk": "^5.6.2", "class-variance-authority": "^0.7.1", "codemirror": "^6.0.2", "commander": "^14.0.2", "fumadocs-core": "16.6.15", "fumadocs-mdx": "^14.2.6", + "glob": "^11.0.0", + "gray-matter": "^4.0.3", + "h3": "^2.0.1-rc.16", "lodash": "^4.17.23", "mermaid": "^11.13.0", - "next": "16.1.6", + "minisearch": "^7.2.0", + "nitro": "latest", + "openapi-types": "^12.1.3", "react": "^19.0.0", - "react-device-detect": "^2.2.3", "react-dom": "^19.0.0", - "remark-attr": "^0.11.1", + "react-router": "^7.13.1", "remark-directive": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.1", + "remark-mdx-frontmatter": "^5.2.0", + "remark-parse": "^11.0.0", + "satori": "^0.25.0", "slugify": "^1.6.6", "unified": "^11.0.5", "unist-util-visit": "^5.1.0", + "vite": "^8.0.0", "yaml": "^2.8.2", - "zod": "^4.3.6", }, "devDependencies": { "@biomejs/biome": "^2.3.13", @@ -48,7 +58,6 @@ "@types/react": "^19.2.10", "@types/react-dom": "^19.2.3", "@types/semver": "^7.7.1", - "openapi-types": "^12.1.3", "semver": "^7.7.4", "typescript": "5.9.3", }, @@ -113,8 +122,12 @@ "@date-fns/tz": ["@date-fns/tz@1.4.1", "", {}, "sha512-P5LUNhtbj6YfI3iJjw5EL9eUAG6OitD0W3fWQcpQjDRc/QIsL0tRNuO1PcDvPccWL1fSTXXdE1ds+l95DV/OFA=="], + "@emnapi/core": ["@emnapi/core@1.9.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.0", "tslib": "^2.4.0" } }, "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA=="], + "@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="], + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg=="], + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg=="], "@esbuild/android-arm": ["@esbuild/android-arm@0.27.3", "", { "os": "android", "cpu": "arm" }, "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA=="], @@ -235,6 +248,8 @@ "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="], + "@isaacs/cliui": ["@isaacs/cliui@9.0.0", "", {}, "sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg=="], + "@lezer/common": ["@lezer/common@1.5.1", "", {}, "sha512-6YRVG9vBkaY7p1IVxL4s44n5nUnaNnGM2/AckNgYOnxTG2kWh1vR8BMxPseWPjRNpb5VtXnMpeYAEAADoRV1Iw=="], "@lezer/highlight": ["@lezer/highlight@1.2.3", "", { "dependencies": { "@lezer/common": "^1.3.0" } }, "sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g=="], @@ -249,6 +264,8 @@ "@mermaid-js/parser": ["@mermaid-js/parser@1.0.1", "", { "dependencies": { "langium": "^4.0.0" } }, "sha512-opmV19kN1JsK0T6HhhokHpcVkqKpF+x2pPDKKM2ThHtZAB5F4PROopk0amuVYK5qMrIA4erzpNm8gmPNJgMDxQ=="], + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.1", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" } }, "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A=="], + "@next/env": ["@next/env@16.1.6", "", {}, "sha512-N1ySLuZjnAtN3kFnwhAwPvZah8RJxKasD7x1f8shFqhncnWZn4JMfg37diLNuoHsLAlrDfM3g4mawVdtAG8XLQ=="], "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@16.1.6", "", { "os": "darwin", "cpu": "arm64" }, "sha512-wTzYulosJr/6nFnqGW7FrG3jfUUlEf8UjGA0/pyypJl42ExdVgC6xJgcXQ+V8QFn6niSG2Pb8+MIG1mZr2vczw=="], @@ -269,6 +286,8 @@ "@orama/orama": ["@orama/orama@3.1.18", "", {}, "sha512-a61ljmRVVyG5MC/698C8/FfFDw5a8LOIvyOLW5fztgUXqUpc1jOfQzOitSCbge657OgXXThmY3Tk8fpiDb4UcA=="], + "@oxc-project/types": ["@oxc-project/types@0.120.0", "", {}, "sha512-k1YNu55DuvAip/MGE1FTsIuU3FUCn6v/ujG9V7Nq5Df/kX2CWb13hhwD0lmJGMGqE+bE1MXvv9SZVnMzEXlWcg=="], + "@radix-ui/number": ["@radix-ui/number@1.1.1", "", {}, "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g=="], "@radix-ui/primitive": ["@radix-ui/primitive@1.1.3", "", {}, "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg=="], @@ -391,12 +410,44 @@ "@radix-ui/rect": ["@radix-ui/rect@1.1.1", "", {}, "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw=="], - "@raystack/apsara": ["@raystack/apsara@0.56.2", "", { "dependencies": { "@ariakit/react": "^0.4.16", "@radix-ui/react-icons": "^1.3.2", "@tanstack/match-sorter-utils": "^8.8.4", "@tanstack/react-table": "^8.9.2", "@tanstack/react-virtual": "^3.13.13", "@tanstack/table-core": "^8.9.2", "class-variance-authority": "^0.7.1", "cmdk": "^1.1.1", "color": "^5.0.0", "dayjs": "^1.11.11", "prism-react-renderer": "^2.4.1", "radix-ui": "^1.4.2", "react-day-picker": "^9.6.7", "sonner": "^2.0.6" }, "peerDependencies": { "@types/react": "^18 || ^19", "react": "^18 || ^19", "react-dom": "^18 || ^19" }, "optionalPeers": ["@types/react"] }, "sha512-kAZh+ir2TdXH1s3a/smWFz8Ebhl3kXPzQp8YEKbxUDipw0//jO6QC1R2reZF5FWKZefLmLW0INMw373W9I6cjg=="], + "@raystack/apsara": ["@raystack/apsara@0.55.1", "", { "dependencies": { "@ariakit/react": "^0.4.16", "@radix-ui/react-icons": "^1.3.2", "@tanstack/match-sorter-utils": "^8.8.4", "@tanstack/react-table": "^8.9.2", "@tanstack/table-core": "^8.9.2", "class-variance-authority": "^0.7.1", "cmdk": "^1.1.1", "color": "^5.0.0", "dayjs": "^1.11.11", "prism-react-renderer": "^2.4.1", "radix-ui": "^1.4.2", "react-day-picker": "^9.6.7", "sonner": "^2.0.6" }, "peerDependencies": { "@types/react": "^18 || ^19", "react": "^18 || ^19", "react-dom": "^18 || ^19" }, "optionalPeers": ["@types/react"] }, "sha512-/7ek/ylQT3GBoxJVd6CMQRmqRO6rHpjXRuSoI6DctrUTEXx3G+lbtovwxJJsKTzf9f2+sIakozhi3W0rQIfi4w=="], "@raystack/chronicle": ["@raystack/chronicle@workspace:packages/chronicle"], "@raystack/tools-config": ["@raystack/tools-config@0.56.0", "", { "peerDependencies": { "@biomejs/biome": ">=2.0.0" }, "optionalPeers": ["@biomejs/biome"] }, "sha512-Vh4Ei++2g0hycTFmCF5vjp8VIUasl9TUiQRNv517otYJDY49/C6gqjDt137NDrBRPyguJ+CL+SPY4sRt7UxQxQ=="], + "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0-rc.10", "", { "os": "android", "cpu": "arm64" }, "sha512-jOHxwXhxmFKuXztiu1ORieJeTbx5vrTkcOkkkn2d35726+iwhrY1w/+nYY/AGgF12thg33qC3R1LMBF5tHTZHg=="], + + "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-rc.10", "", { "os": "darwin", "cpu": "arm64" }, "sha512-gED05Teg/vtTZbIJBc4VNMAxAFDUPkuO/rAIyyxZjTj1a1/s6z5TII/5yMGZ0uLRCifEtwUQn8OlYzuYc0m70w=="], + + "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.0-rc.10", "", { "os": "darwin", "cpu": "x64" }, "sha512-rI15NcM1mA48lqrIxVkHfAqcyFLcQwyXWThy+BQ5+mkKKPvSO26ir+ZDp36AgYoYVkqvMcdS8zOE6SeBsR9e8A=="], + + "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.0-rc.10", "", { "os": "freebsd", "cpu": "x64" }, "sha512-XZRXHdTa+4ME1MuDVp021+doQ+z6Ei4CCFmNc5/sKbqb8YmkiJdj8QKlV3rCI0AJtAeSB5n0WGPuJWNL9p/L2w=="], + + "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.10", "", { "os": "linux", "cpu": "arm" }, "sha512-R0SQMRluISSLzFE20sPWYHVmJdDQnRyc/FzSCN72BqQmh2SOZUFG+N3/vBZpR4C6WpEUVYJLrYUXaj43sJsNLA=="], + + "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.0-rc.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-Y1reMrV/o+cwpduYhJuOE3OMKx32RMYCidf14y+HssARRmhDuWXJ4yVguDg2R/8SyyGNo+auzz64LnPK9Hq6jg=="], + + "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.0-rc.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-vELN+HNb2IzuzSBUOD4NHmP9yrGwl1DVM29wlQvx1OLSclL0NgVWnVDKl/8tEks79EFek/kebQKnNJkIAA4W2g=="], + + "@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.10", "", { "os": "linux", "cpu": "ppc64" }, "sha512-ZqrufYTgzxbHwpqOjzSsb0UV/aV2TFIY5rP8HdsiPTv/CuAgCRjM6s9cYFwQ4CNH+hf9Y4erHW1GjZuZ7WoI7w=="], + + "@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.0.0-rc.10", "", { "os": "linux", "cpu": "s390x" }, "sha512-gSlmVS1FZJSRicA6IyjoRoKAFK7IIHBs7xJuHRSmjImqk3mPPWbR7RhbnfH2G6bcmMEllCt2vQ/7u9e6bBnByg=="], + + "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.0-rc.10", "", { "os": "linux", "cpu": "x64" }, "sha512-eOCKUpluKgfObT2pHjztnaWEIbUabWzk3qPZ5PuacuPmr4+JtQG4k2vGTY0H15edaTnicgU428XW/IH6AimcQw=="], + + "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0-rc.10", "", { "os": "linux", "cpu": "x64" }, "sha512-Xdf2jQbfQowJnLcgYfD/m0Uu0Qj5OdxKallD78/IPPfzaiaI4KRAwZzHcKQ4ig1gtg1SuzC7jovNiM2TzQsBXA=="], + + "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.0-rc.10", "", { "os": "none", "cpu": "arm64" }, "sha512-o1hYe8hLi1EY6jgPFyxQgQ1wcycX+qz8eEbVmot2hFkgUzPxy9+kF0u0NIQBeDq+Mko47AkaFFaChcvZa9UX9Q=="], + + "@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0-rc.10", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.1.1" }, "cpu": "none" }, "sha512-Ugv9o7qYJudqQO5Y5y2N2SOo6S4WiqiNOpuQyoPInnhVzCY+wi/GHltcLHypG9DEUYMB0iTB/huJrpadiAcNcA=="], + + "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.0-rc.10", "", { "os": "win32", "cpu": "arm64" }, "sha512-7UODQb4fQUNT/vmgDZBl3XOBAIOutP5R3O/rkxg0aLfEGQ4opbCgU5vOw/scPe4xOqBwL9fw7/RP1vAMZ6QlAQ=="], + + "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-rc.10", "", { "os": "win32", "cpu": "x64" }, "sha512-PYxKHMVHOb5NJuDL53vBUl1VwUjymDcYI6rzpIni0C9+9mTiJedvUxSk7/RPp7OOAm3v+EjgMu9bIy3N6b408w=="], + + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.7", "", {}, "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA=="], + "@shikijs/core": ["@shikijs/core@4.0.2", "", { "dependencies": { "@shikijs/primitive": "4.0.2", "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-hxT0YF4ExEqB8G/qFdtJvpmHXBYJ2lWW7qTHDarVkIudPFE6iCIrqdgWxGn5s+ppkGXI0aEGlibI0PAyzP3zlw=="], "@shikijs/engine-javascript": ["@shikijs/engine-javascript@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.4" } }, "sha512-7PW0Nm49DcoUIQEXlJhNNBHyoGMjalRETTCcjMqEaMoJRLljy1Bi/EGV3/qLBgLKQejdspiiYuHGQW6dX94Nag=="], @@ -417,6 +468,8 @@ "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="], + "@shuding/opentype.js": ["@shuding/opentype.js@1.4.0-beta.0", "", { "dependencies": { "fflate": "^0.7.3", "string.prototype.codepointat": "^0.2.1" }, "bin": { "ot": "bin/ot" } }, "sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA=="], + "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], "@swc/helpers": ["@swc/helpers@0.5.15", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g=="], @@ -425,11 +478,9 @@ "@tanstack/react-table": ["@tanstack/react-table@8.21.3", "", { "dependencies": { "@tanstack/table-core": "8.21.3" }, "peerDependencies": { "react": ">=16.8", "react-dom": ">=16.8" } }, "sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww=="], - "@tanstack/react-virtual": ["@tanstack/react-virtual@3.13.18", "", { "dependencies": { "@tanstack/virtual-core": "3.13.18" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-dZkhyfahpvlaV0rIKnvQiVoWPyURppl6w4m9IwMDpuIjcJ1sD9YGWrt0wISvgU7ewACXx2Ct46WPgI6qAD4v6A=="], - "@tanstack/table-core": ["@tanstack/table-core@8.21.3", "", {}, "sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg=="], - "@tanstack/virtual-core": ["@tanstack/virtual-core@3.13.18", "", {}, "sha512-Mx86Hqu1k39icq2Zusq+Ey2J6dDWTjDvEv43PJtRCoEYTLyfaPnxIQ6iy7YAOK0NV/qOEmZQ/uCufrppZxTgcg=="], + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], "@types/d3": ["@types/d3@7.4.3", "", { "dependencies": { "@types/d3-array": "*", "@types/d3-axis": "*", "@types/d3-brush": "*", "@types/d3-chord": "*", "@types/d3-color": "*", "@types/d3-contour": "*", "@types/d3-delaunay": "*", "@types/d3-dispatch": "*", "@types/d3-drag": "*", "@types/d3-dsv": "*", "@types/d3-ease": "*", "@types/d3-fetch": "*", "@types/d3-force": "*", "@types/d3-format": "*", "@types/d3-geo": "*", "@types/d3-hierarchy": "*", "@types/d3-interpolate": "*", "@types/d3-path": "*", "@types/d3-polygon": "*", "@types/d3-quadtree": "*", "@types/d3-random": "*", "@types/d3-scale": "*", "@types/d3-scale-chromatic": "*", "@types/d3-selection": "*", "@types/d3-shape": "*", "@types/d3-time": "*", "@types/d3-time-format": "*", "@types/d3-timer": "*", "@types/d3-transition": "*", "@types/d3-zoom": "*" } }, "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww=="], @@ -529,6 +580,8 @@ "@upsetjs/venn.js": ["@upsetjs/venn.js@2.0.0", "", { "optionalDependencies": { "d3-selection": "^3.0.0", "d3-transition": "^3.0.1" } }, "sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw=="], + "@vitejs/plugin-react": ["@vitejs/plugin-react@6.0.1", "", { "dependencies": { "@rolldown/pluginutils": "1.0.0-rc.7" }, "peerDependencies": { "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", "babel-plugin-react-compiler": "^1.0.0", "vite": "^8.0.0" }, "optionalPeers": ["@rolldown/plugin-babel", "babel-plugin-react-compiler"] }, "sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ=="], + "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="], "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], @@ -541,8 +594,16 @@ "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], + "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + + "base64-js": ["base64-js@0.0.8", "", {}, "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.10.0", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA=="], + "brace-expansion": ["brace-expansion@5.0.4", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg=="], + + "camelize": ["camelize@1.0.1", "", {}, "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ=="], + "caniuse-lite": ["caniuse-lite@1.0.30001770", "", {}, "sha512-x/2CLQ1jHENRbHg5PSId2sXq1CIO1CISvwWAj027ltMVG2UNgW+w9oH2+HzgEIRFembL8bUlXtfbBHR1fCg2xw=="], "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], @@ -579,7 +640,7 @@ "color-convert": ["color-convert@3.1.3", "", { "dependencies": { "color-name": "^2.0.0" } }, "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg=="], - "color-name": ["color-name@2.1.0", "", {}, "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg=="], + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], "color-string": ["color-string@2.1.4", "", { "dependencies": { "color-name": "^2.0.0" } }, "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg=="], @@ -591,10 +652,28 @@ "confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], + "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="], + + "cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="], + "cose-base": ["cose-base@1.0.3", "", { "dependencies": { "layout-base": "^1.0.0" } }, "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg=="], "crelt": ["crelt@1.0.6", "", {}, "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g=="], + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "crossws": ["crossws@0.4.4", "", { "peerDependencies": { "srvx": ">=0.7.1" }, "optionalPeers": ["srvx"] }, "sha512-w6c4OdpRNnudVmcgr7brb/+/HmYjMQvYToO/oTrprTwxRUiom3LYWU1PMWuD006okbUWpII1Ea9/+kwpUfmyRg=="], + + "css-background-parser": ["css-background-parser@0.1.0", "", {}, "sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA=="], + + "css-box-shadow": ["css-box-shadow@1.0.0-3", "", {}, "sha512-9jaqR6e7Ohds+aWwmhe6wILJ99xYQbfmK9QQB9CcMjDbTxPZjwEmUQpU91OG05Xgm8BahT5fW+svbsQGjS/zPg=="], + + "css-color-keywords": ["css-color-keywords@1.0.0", "", {}, "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg=="], + + "css-gradient-parser": ["css-gradient-parser@0.0.17", "", {}, "sha512-w2Xy9UMMwlKtou0vlRnXvWglPAceXCTtcmVSo8ZBUvqCV5aXEFP/PC6d+I464810I9FT++UACwTD5511bmGPUg=="], + + "css-to-react-native": ["css-to-react-native@3.2.0", "", { "dependencies": { "camelize": "^1.0.0", "css-color-keywords": "^1.0.0", "postcss-value-parser": "^4.0.2" } }, "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ=="], + "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], "cytoscape": ["cytoscape@3.33.1", "", {}, "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ=="], @@ -675,6 +754,8 @@ "dayjs": ["dayjs@1.11.19", "", {}, "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw=="], + "db0": ["db0@0.3.4", "", { "peerDependencies": { "@electric-sql/pglite": "*", "@libsql/client": "*", "better-sqlite3": "*", "drizzle-orm": "*", "mysql2": "*", "sqlite3": "*" }, "optionalPeers": ["@electric-sql/pglite", "@libsql/client", "better-sqlite3", "drizzle-orm", "mysql2", "sqlite3"] }, "sha512-RiXXi4WaNzPTHEOu8UPQKMooIbqOEyqA1t7Z6MsdxSCeb8iUC9ko3LcmsLmeUt2SM5bctfArZKkRQggKZz7JNw=="], + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], "decode-named-character-reference": ["decode-named-character-reference@1.3.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q=="], @@ -691,14 +772,22 @@ "dompurify": ["dompurify@3.3.2", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-6obghkliLdmKa56xdbLOpUZ43pAR6xFy1uOrxBaIDjT+yaRuuybLjGS9eVBoSR/UPU5fq3OXClEHLJNGvbxKpQ=="], + "emoji-regex-xs": ["emoji-regex-xs@2.0.1", "", {}, "sha512-1QFuh8l7LqUcKe24LsPUNzjrzJQ7pgRwp1QMcZ5MX6mFplk2zQ08NVCM84++1cveaUUYtcCYHmeFEuNg16sU4g=="], + + "env-runner": ["env-runner@0.1.6", "", { "dependencies": { "crossws": "^0.4.4", "httpxy": "^0.3.1", "srvx": "^0.11.9" }, "peerDependencies": { "miniflare": "^4.0.0" }, "optionalPeers": ["miniflare"], "bin": { "env-runner": "dist/cli.mjs" } }, "sha512-fSb7X1zdda8k6611a6/SdSQpDe7a/bqMz2UWdbHjk9YWzpUR4/fn9YtE/hqgGQ2nhvVN0zUtcL1SRMKwIsDbAA=="], + "esast-util-from-estree": ["esast-util-from-estree@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "unist-util-position-from-estree": "^2.0.0" } }, "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ=="], "esast-util-from-js": ["esast-util-from-js@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "acorn": "^8.0.0", "esast-util-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw=="], "esbuild": ["esbuild@0.27.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.3", "@esbuild/android-arm": "0.27.3", "@esbuild/android-arm64": "0.27.3", "@esbuild/android-x64": "0.27.3", "@esbuild/darwin-arm64": "0.27.3", "@esbuild/darwin-x64": "0.27.3", "@esbuild/freebsd-arm64": "0.27.3", "@esbuild/freebsd-x64": "0.27.3", "@esbuild/linux-arm": "0.27.3", "@esbuild/linux-arm64": "0.27.3", "@esbuild/linux-ia32": "0.27.3", "@esbuild/linux-loong64": "0.27.3", "@esbuild/linux-mips64el": "0.27.3", "@esbuild/linux-ppc64": "0.27.3", "@esbuild/linux-riscv64": "0.27.3", "@esbuild/linux-s390x": "0.27.3", "@esbuild/linux-x64": "0.27.3", "@esbuild/netbsd-arm64": "0.27.3", "@esbuild/netbsd-x64": "0.27.3", "@esbuild/openbsd-arm64": "0.27.3", "@esbuild/openbsd-x64": "0.27.3", "@esbuild/openharmony-arm64": "0.27.3", "@esbuild/sunos-x64": "0.27.3", "@esbuild/win32-arm64": "0.27.3", "@esbuild/win32-ia32": "0.27.3", "@esbuild/win32-x64": "0.27.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg=="], + "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], + "escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], + "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + "estree-util-attach-comments": ["estree-util-attach-comments@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw=="], "estree-util-build-jsx": ["estree-util-build-jsx@3.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-walker": "^3.0.0" } }, "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ=="], @@ -717,8 +806,20 @@ "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], + "extend-shallow": ["extend-shallow@2.0.1", "", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="], + + "fault": ["fault@2.0.1", "", { "dependencies": { "format": "^0.2.0" } }, "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ=="], + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], + "fflate": ["fflate@0.7.4", "", {}, "sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw=="], + + "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], + + "format": ["format@0.2.2", "", {}, "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + "fumadocs-core": ["fumadocs-core@16.6.15", "", { "dependencies": { "@formatjs/intl-localematcher": "^0.8.1", "@orama/orama": "^3.1.18", "@shikijs/rehype": "^4.0.2", "@shikijs/transformers": "^4.0.2", "estree-util-value-to-estree": "^3.5.0", "github-slugger": "^2.0.0", "hast-util-to-estree": "^3.1.3", "hast-util-to-jsx-runtime": "^2.3.6", "image-size": "^2.0.2", "mdast-util-mdx": "^3.0.0", "mdast-util-to-markdown": "^2.1.2", "negotiator": "^1.0.0", "npm-to-yarn": "^3.0.1", "path-to-regexp": "^8.3.0", "remark": "^15.0.1", "remark-gfm": "^4.0.1", "remark-rehype": "^11.1.2", "scroll-into-view-if-needed": "^3.1.0", "shiki": "^4.0.2", "tinyglobby": "^0.2.15", "unified": "^11.0.5", "unist-util-visit": "^5.1.0", "vfile": "^6.0.3" }, "peerDependencies": { "@mdx-js/mdx": "*", "@mixedbread/sdk": "^0.46.0", "@orama/core": "1.x.x", "@oramacloud/client": "2.x.x", "@tanstack/react-router": "1.x.x", "@types/estree-jsx": "*", "@types/hast": "*", "@types/mdast": "*", "@types/react": "*", "algoliasearch": "5.x.x", "flexsearch": "*", "lucide-react": "*", "next": "16.x.x", "react": "^19.2.0", "react-dom": "^19.2.0", "react-router": "7.x.x", "waku": "^0.26.0 || ^0.27.0 || ^1.0.0", "zod": "4.x.x" }, "optionalPeers": ["@mdx-js/mdx", "@mixedbread/sdk", "@orama/core", "@oramacloud/client", "@tanstack/react-router", "@types/estree-jsx", "@types/hast", "@types/mdast", "@types/react", "algoliasearch", "flexsearch", "lucide-react", "next", "react", "react-dom", "react-router", "waku", "zod"] }, "sha512-N6gbXicmaylWeaEFu9vpw25dZK29rPPjalrcIqDRgDklCFkxHn0fsagDMZiSjFBn4RfWRErL6mYmu24WSwosew=="], "fumadocs-mdx": ["fumadocs-mdx@14.2.7", "", { "dependencies": { "@mdx-js/mdx": "^3.1.1", "@standard-schema/spec": "^1.1.0", "chokidar": "^5.0.0", "esbuild": "^0.27.3", "estree-util-value-to-estree": "^3.5.0", "js-yaml": "^4.1.1", "mdast-util-to-markdown": "^2.1.2", "picocolors": "^1.1.1", "picomatch": "^4.0.3", "remark-mdx": "^3.1.1", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.1.0", "vfile": "^6.0.3", "zod": "^4.3.6" }, "peerDependencies": { "@fumadocs/mdx-remote": "^1.4.0", "@types/mdast": "*", "@types/mdx": "*", "@types/react": "*", "fumadocs-core": "^15.0.0 || ^16.0.0", "mdast-util-directive": "*", "mdast-util-mdx-jsx": "*", "next": "^15.3.0 || ^16.0.0", "react": "*", "vite": "6.x.x || 7.x.x" }, "optionalPeers": ["@fumadocs/mdx-remote", "@types/mdast", "@types/mdx", "@types/react", "mdast-util-directive", "mdast-util-mdx-jsx", "next", "react", "vite"], "bin": { "fumadocs-mdx": "dist/bin.js" } }, "sha512-Q2W79F7wpwhq4HoYPw9GnMpf5ZmpdU7YzZND7EWwwOiWddfyzPh6EH/z7MFhhdhsTqRh9/kwwsu9XslWDRRPsg=="], @@ -727,6 +828,12 @@ "github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="], + "glob": ["glob@11.1.0", "", { "dependencies": { "foreground-child": "^3.3.1", "jackspeak": "^4.1.1", "minimatch": "^10.1.1", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^2.0.0" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw=="], + + "gray-matter": ["gray-matter@4.0.3", "", { "dependencies": { "js-yaml": "^3.13.1", "kind-of": "^6.0.2", "section-matter": "^1.0.0", "strip-bom-string": "^1.0.0" } }, "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q=="], + + "h3": ["h3@2.0.1-rc.18", "", { "dependencies": { "rou3": "^0.8.1", "srvx": "^0.11.12" }, "peerDependencies": { "crossws": "^0.4.1" }, "optionalPeers": ["crossws"], "bin": { "h3": "bin/h3.mjs" } }, "sha512-2EdYEOIJwZHfhfdxvqZsmmUz4tgwzQSuzre+l50j+voHJV4m7j3zw2lYLgHoyfkCF9EAZcaH4ea0zH/hgcs9Yg=="], + "hachure-fill": ["hachure-fill@0.5.2", "", {}, "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg=="], "hast-util-to-estree": ["hast-util-to-estree@3.1.3", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-attach-comments": "^3.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w=="], @@ -739,10 +846,14 @@ "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="], - "html-element-attributes": ["html-element-attributes@2.3.0", "", {}, "sha512-RJv2v3BBaYSc0ODHwT0sqWI+2lFs6DATBvCRnW20BDmULxoAWvfT6r28uL8LcW1a9/eqUl+1DccUOJzw00qVXQ=="], + "hex-rgb": ["hex-rgb@4.3.0", "", {}, "sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw=="], + + "hookable": ["hookable@6.1.0", "", {}, "sha512-ZoKZSJgu8voGK2geJS+6YtYjvIzu9AOM/KZXsBxr83uhLL++e9pEv/dlgwgy3dvHg06kTz6JOh1hk3C8Ceiymw=="], "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="], + "httpxy": ["httpxy@0.3.1", "", {}, "sha512-XjG/CEoofEisMrnFr0D6U6xOZ4mRfnwcYQ9qvvnT4lvnX8BoeA3x3WofB75D+vZwpaobFVkBIHrZzoK40w8XSw=="], + "iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], "image-size": ["image-size@2.0.2", "", { "bin": { "image-size": "bin/image-size.js" } }, "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w=="], @@ -757,11 +868,15 @@ "is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="], + "is-extendable": ["is-extendable@0.1.1", "", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="], + "is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="], "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], - "is-whitespace-character": ["is-whitespace-character@1.0.4", "", {}, "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w=="], + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "jackspeak": ["jackspeak@4.2.3", "", { "dependencies": { "@isaacs/cliui": "^9.0.0" } }, "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg=="], "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], @@ -769,30 +884,60 @@ "khroma": ["khroma@2.1.0", "", {}, "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw=="], + "kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="], + "langium": ["langium@4.2.1", "", { "dependencies": { "chevrotain": "~11.1.1", "chevrotain-allstar": "~0.3.1", "vscode-languageserver": "~9.0.1", "vscode-languageserver-textdocument": "~1.0.11", "vscode-uri": "~3.1.0" } }, "sha512-zu9QWmjpzJcomzdJQAHgDVhLGq5bLosVak1KVa40NzQHXfqr4eAHupvnPOVXEoLkg6Ocefvf/93d//SB7du4YQ=="], "layout-base": ["layout-base@1.0.2", "", {}, "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg=="], + "lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="], + + "lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="], + + "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.32.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ=="], + + "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.32.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w=="], + + "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.32.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig=="], + + "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw=="], + + "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ=="], + + "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg=="], + + "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA=="], + + "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg=="], + + "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.32.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw=="], + + "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="], + + "linebreak": ["linebreak@1.1.0", "", { "dependencies": { "base64-js": "0.0.8", "unicode-trie": "^2.0.0" } }, "sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ=="], + "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="], "lodash-es": ["lodash-es@4.17.23", "", {}, "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], + "lru-cache": ["lru-cache@11.2.7", "", {}, "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA=="], + "markdown-extensions": ["markdown-extensions@2.0.0", "", {}, "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q=="], "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="], "marked": ["marked@16.4.2", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA=="], - "md-attr-parser": ["md-attr-parser@1.3.0", "", {}, "sha512-KTVlfU5Oxo/6kd0YZ2mLP3eWJj+5vzh5mBCxLo3yGl1fzHIgxmtadbE9tHb7TbUBi3XZbl+P0xKeGmakat135w=="], - "mdast-util-directive": ["mdast-util-directive@3.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q=="], "mdast-util-find-and-replace": ["mdast-util-find-and-replace@3.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg=="], "mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA=="], + "mdast-util-frontmatter": ["mdast-util-frontmatter@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "escape-string-regexp": "^5.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "micromark-extension-frontmatter": "^2.0.0" } }, "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA=="], + "mdast-util-gfm": ["mdast-util-gfm@3.1.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", "mdast-util-gfm-footnote": "^2.0.0", "mdast-util-gfm-strikethrough": "^2.0.0", "mdast-util-gfm-table": "^2.0.0", "mdast-util-gfm-task-list-item": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ=="], "mdast-util-gfm-autolink-literal": ["mdast-util-gfm-autolink-literal@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "ccount": "^2.0.0", "devlop": "^1.0.0", "mdast-util-find-and-replace": "^3.0.0", "micromark-util-character": "^2.0.0" } }, "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ=="], @@ -829,6 +974,8 @@ "micromark-extension-directive": ["micromark-extension-directive@4.0.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "parse-entities": "^4.0.0" } }, "sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg=="], + "micromark-extension-frontmatter": ["micromark-extension-frontmatter@2.0.0", "", { "dependencies": { "fault": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg=="], + "micromark-extension-gfm": ["micromark-extension-gfm@3.0.0", "", { "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", "micromark-extension-gfm-footnote": "^2.0.0", "micromark-extension-gfm-strikethrough": "^2.0.0", "micromark-extension-gfm-table": "^2.0.0", "micromark-extension-gfm-tagfilter": "^2.0.0", "micromark-extension-gfm-task-list-item": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w=="], "micromark-extension-gfm-autolink-literal": ["micromark-extension-gfm-autolink-literal@2.1.0", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw=="], @@ -895,6 +1042,12 @@ "micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="], + "minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="], + + "minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], + + "minisearch": ["minisearch@7.2.0", "", {}, "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg=="], + "mlly": ["mlly@1.8.1", "", { "dependencies": { "acorn": "^8.16.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.3" } }, "sha512-SnL6sNutTwRWWR/vcmCYHSADjiEesp5TGQQ0pXyLhW5IoeibRlF/CbSLailbB3CNqJUk9cVJ9dUDnbD7GrcHBQ=="], "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], @@ -905,20 +1058,40 @@ "next": ["next@16.1.6", "", { "dependencies": { "@next/env": "16.1.6", "@swc/helpers": "0.5.15", "baseline-browser-mapping": "^2.8.3", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "16.1.6", "@next/swc-darwin-x64": "16.1.6", "@next/swc-linux-arm64-gnu": "16.1.6", "@next/swc-linux-arm64-musl": "16.1.6", "@next/swc-linux-x64-gnu": "16.1.6", "@next/swc-linux-x64-musl": "16.1.6", "@next/swc-win32-arm64-msvc": "16.1.6", "@next/swc-win32-x64-msvc": "16.1.6", "sharp": "^0.34.4" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw=="], + "nf3": ["nf3@0.3.13", "", {}, "sha512-drDt0yl4d/yUhlpD0GzzqahSpA5eUNeIfFq0/aoZb0UlPY0ZwP4u1EfREVvZrYdEnJ3OU9Le9TrzbvWgEkkeKw=="], + + "nitro": ["nitro@3.0.260311-beta", "", { "dependencies": { "consola": "^3.4.2", "crossws": "^0.4.4", "db0": "^0.3.4", "env-runner": "^0.1.6", "h3": "^2.0.1-rc.16", "hookable": "^6.0.1", "nf3": "^0.3.11", "ocache": "^0.1.2", "ofetch": "^2.0.0-alpha.3", "ohash": "^2.0.11", "rolldown": "^1.0.0-rc.8", "srvx": "^0.11.9", "unenv": "^2.0.0-rc.24", "unstorage": "^2.0.0-alpha.6" }, "peerDependencies": { "dotenv": "*", "giget": "*", "jiti": "^2.6.1", "rollup": "^4.59.0", "vite": "^7 || ^8 || >=8.0.0-0", "xml2js": "^0.6.2", "zephyr-agent": "^0.1.15" }, "optionalPeers": ["dotenv", "giget", "jiti", "rollup", "vite", "xml2js", "zephyr-agent"], "bin": { "nitro": "dist/cli/index.mjs" } }, "sha512-0o0fJ9LUh4WKUqJNX012jyieUOtMCnadkNDWr0mHzdraoHpJP/1CGNefjRyZyMXSpoJfwoWdNEZu2iGf35TUvQ=="], + "npm-to-yarn": ["npm-to-yarn@3.0.1", "", {}, "sha512-tt6PvKu4WyzPwWUzy/hvPFqn+uwXO0K1ZHka8az3NnrhWJDmSqI8ncWq0fkL0k/lmmi5tAC11FXwXuh0rFbt1A=="], + "ocache": ["ocache@0.1.4", "", { "dependencies": { "ohash": "^2.0.11" } }, "sha512-e7geNdWjxSnvsSgvLuPvgKgu7ubM10ZmTPOgpr7mz2BXYtvjMKTiLhjFi/gWU8chkuP6hNkZBsa9LzOusyaqkQ=="], + + "ofetch": ["ofetch@2.0.0-alpha.3", "", {}, "sha512-zpYTCs2byOuft65vI3z43Dd6iSdFbOZZLb9/d21aCpx2rGastVU9dOCv0lu4ykc1Ur1anAYjDi3SUvR0vq50JA=="], + + "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], + "oniguruma-parser": ["oniguruma-parser@0.12.1", "", {}, "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w=="], "oniguruma-to-es": ["oniguruma-to-es@4.3.4", "", { "dependencies": { "oniguruma-parser": "^0.12.1", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA=="], "openapi-types": ["openapi-types@12.1.3", "", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="], + "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], + "package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="], + "pako": ["pako@0.2.9", "", {}, "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA=="], + + "parse-css-color": ["parse-css-color@0.2.1", "", { "dependencies": { "color-name": "^1.1.4", "hex-rgb": "^4.1.0" } }, "sha512-bwS/GGIFV3b6KS4uwpzCFj4w297Yl3uqnSgIPsoQkx7GMLROXfMnWvxfNkL0oh8HVhZA4hvJoEoEIqonfJ3BWg=="], + "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="], "path-data-parser": ["path-data-parser@0.1.0", "", {}, "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w=="], + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="], + "path-to-regexp": ["path-to-regexp@8.3.0", "", {}, "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA=="], "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], @@ -933,7 +1106,9 @@ "points-on-path": ["points-on-path@0.2.1", "", { "dependencies": { "path-data-parser": "0.1.0", "points-on-curve": "0.2.0" } }, "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g=="], - "postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="], + "postcss": ["postcss@8.5.8", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg=="], + + "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], "prism-react-renderer": ["prism-react-renderer@2.4.1", "", { "dependencies": { "@types/prismjs": "^1.26.0", "clsx": "^2.0.0" }, "peerDependencies": { "react": ">=16.0.0" } }, "sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig=="], @@ -945,14 +1120,14 @@ "react-day-picker": ["react-day-picker@9.13.2", "", { "dependencies": { "@date-fns/tz": "^1.4.1", "date-fns": "^4.1.0", "date-fns-jalali": "^4.1.0-0" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-IMPiXfXVIAuR5Yk58DDPBC8QKClrhdXV+Tr/alBrwrHUw0qDDYB1m5zPNuTnnPIr/gmJ4ChMxmtqPdxm8+R4Eg=="], - "react-device-detect": ["react-device-detect@2.2.3", "", { "dependencies": { "ua-parser-js": "^1.0.33" }, "peerDependencies": { "react": ">= 0.14.0", "react-dom": ">= 0.14.0" } }, "sha512-buYY3qrCnQVlIFHrC5UcUoAj7iANs/+srdkwsnNjI7anr3Tt7UY6MqNxtMLlr0tMBied0O49UZVK8XKs3ZIiPw=="], - "react-dom": ["react-dom@19.2.4", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.4" } }, "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ=="], "react-remove-scroll": ["react-remove-scroll@2.7.2", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q=="], "react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="], + "react-router": ["react-router@7.13.1", "", { "dependencies": { "cookie": "^1.0.1", "set-cookie-parser": "^2.6.0" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" }, "optionalPeers": ["react-dom"] }, "sha512-td+xP4X2/6BJvZoX6xw++A2DdEi++YypA69bJUV5oVvqf6/9/9nNlD70YO1e9d3MyamJEBQFEzk6mbfDYbqrSA=="], + "react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="], "readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], @@ -975,16 +1150,16 @@ "remark": ["remark@15.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A=="], - "remark-attr": ["remark-attr@0.11.1", "", { "dependencies": { "html-element-attributes": "^2.0.0", "is-whitespace-character": "^1.0.4", "md-attr-parser": "^1.3.0", "remark-footnotes": "^1.0.0" } }, "sha512-NnzURvBJ52c58L3AohBk5qSTBPXdMKsf5+w9L0YNhi/HCtv7ZA9dNRz5NsPIxLtIHhoZIjTqQsMzoyggyPVvkQ=="], - "remark-directive": ["remark-directive@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-directive": "^3.0.0", "micromark-extension-directive": "^4.0.0", "unified": "^11.0.0" } }, "sha512-7sxn4RfF1o3izevPV1DheyGDD6X4c9hrGpfdUpm7uC++dqrnJxIZVkk7CoKqcLm0VUMAuOol7Mno3m6g8cfMuA=="], - "remark-footnotes": ["remark-footnotes@1.0.0", "", {}, "sha512-X9Ncj4cj3/CIvLI2Z9IobHtVi8FVdUrdJkCNaL9kdX8ohfsi18DXHsCVd/A7ssARBdccdDb5ODnt62WuEWaM/g=="], + "remark-frontmatter": ["remark-frontmatter@5.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-frontmatter": "^2.0.0", "micromark-extension-frontmatter": "^2.0.0", "unified": "^11.0.0" } }, "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ=="], "remark-gfm": ["remark-gfm@4.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", "micromark-extension-gfm": "^3.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg=="], "remark-mdx": ["remark-mdx@3.1.1", "", { "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" } }, "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg=="], + "remark-mdx-frontmatter": ["remark-mdx-frontmatter@5.2.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "estree-util-value-to-estree": "^3.0.0", "toml": "^3.0.0", "unified": "^11.0.0", "unist-util-mdx-define": "^1.0.0", "yaml": "^2.0.0" } }, "sha512-U/hjUYTkQqNjjMRYyilJgLXSPF65qbLPdoESOkXyrwz2tVyhAnm4GUKhfXqOOS9W34M3545xEMq+aMpHgVjEeQ=="], + "remark-parse": ["remark-parse@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "micromark-util-types": "^2.0.0", "unified": "^11.0.0" } }, "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA=="], "remark-rehype": ["remark-rehype@11.1.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "mdast-util-to-hast": "^13.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw=="], @@ -995,22 +1170,38 @@ "robust-predicates": ["robust-predicates@3.0.2", "", {}, "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg=="], + "rolldown": ["rolldown@1.0.0-rc.10", "", { "dependencies": { "@oxc-project/types": "=0.120.0", "@rolldown/pluginutils": "1.0.0-rc.10" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-rc.10", "@rolldown/binding-darwin-arm64": "1.0.0-rc.10", "@rolldown/binding-darwin-x64": "1.0.0-rc.10", "@rolldown/binding-freebsd-x64": "1.0.0-rc.10", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.10", "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.10", "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.10", "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.10", "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.10", "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.10", "@rolldown/binding-linux-x64-musl": "1.0.0-rc.10", "@rolldown/binding-openharmony-arm64": "1.0.0-rc.10", "@rolldown/binding-wasm32-wasi": "1.0.0-rc.10", "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.10", "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.10" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-q7j6vvarRFmKpgJUT8HCAUljkgzEp4LAhPlJUvQhA5LA1SUL36s5QCysMutErzL3EbNOZOkoziSx9iZC4FddKA=="], + + "rou3": ["rou3@0.8.1", "", {}, "sha512-ePa+XGk00/3HuCqrEnK3LxJW7I0SdNg6EFzKUJG73hMAdDcOUC/i/aSz7LSDwLrGr33kal/rqOGydzwl6U7zBA=="], + "roughjs": ["roughjs@4.6.6", "", { "dependencies": { "hachure-fill": "^0.5.2", "path-data-parser": "^0.1.0", "points-on-curve": "^0.2.0", "points-on-path": "^0.2.1" } }, "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ=="], "rw": ["rw@1.3.3", "", {}, "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ=="], "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + "satori": ["satori@0.25.0", "", { "dependencies": { "@shuding/opentype.js": "1.4.0-beta.0", "css-background-parser": "^0.1.0", "css-box-shadow": "1.0.0-3", "css-gradient-parser": "^0.0.17", "css-to-react-native": "^3.0.0", "emoji-regex-xs": "^2.0.1", "escape-html": "^1.0.3", "linebreak": "^1.1.0", "parse-css-color": "^0.2.1", "postcss-value-parser": "^4.2.0", "yoga-layout": "^3.2.1" } }, "sha512-utINfLxrYrmSnLvxFT4ZwgwWa8KOjrz7ans32V5wItgHVmzESl/9i33nE38uG0miycab8hUqQtDlOpqrIpB/iw=="], + "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], "scroll-into-view-if-needed": ["scroll-into-view-if-needed@3.1.0", "", { "dependencies": { "compute-scroll-into-view": "^3.0.2" } }, "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ=="], + "section-matter": ["section-matter@1.0.0", "", { "dependencies": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" } }, "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA=="], + "semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], + "set-cookie-parser": ["set-cookie-parser@2.7.2", "", {}, "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw=="], + "sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-ppc64": "1.2.4", "@img/sharp-libvips-linux-riscv64": "1.2.4", "@img/sharp-libvips-linux-s390x": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm": "0.34.5", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-ppc64": "0.34.5", "@img/sharp-linux-riscv64": "0.34.5", "@img/sharp-linux-s390x": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-wasm32": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-ia32": "0.34.5", "@img/sharp-win32-x64": "0.34.5" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="], + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + "shiki": ["shiki@4.0.2", "", { "dependencies": { "@shikijs/core": "4.0.2", "@shikijs/engine-javascript": "4.0.2", "@shikijs/engine-oniguruma": "4.0.2", "@shikijs/langs": "4.0.2", "@shikijs/themes": "4.0.2", "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-eAVKTMedR5ckPo4xne/PjYQYrU3qx78gtJZ+sHlXEg5IHhhoQhMfZVzetTYuaJS0L2Ef3AcCRzCHV8T0WI6nIQ=="], + "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + "slugify": ["slugify@1.6.6", "", {}, "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw=="], "sonner": ["sonner@2.0.7", "", { "peerDependencies": { "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w=="], @@ -1021,8 +1212,16 @@ "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], + "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], + + "srvx": ["srvx@0.11.12", "", { "bin": { "srvx": "bin/srvx.mjs" } }, "sha512-AQfrGqntqVPXgP03pvBDN1KyevHC+KmYVqb8vVf4N+aomQqdhaZxjvoVp+AOm4u6x+GgNQY3MVzAUIn+TqwkOA=="], + + "string.prototype.codepointat": ["string.prototype.codepointat@0.2.1", "", {}, "sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg=="], + "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], + "strip-bom-string": ["strip-bom-string@1.0.0", "", {}, "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g=="], + "style-mod": ["style-mod@4.1.3", "", {}, "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ=="], "style-to-js": ["style-to-js@1.1.21", "", { "dependencies": { "style-to-object": "1.0.14" } }, "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ=="], @@ -1033,10 +1232,14 @@ "stylis": ["stylis@4.3.6", "", {}, "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ=="], + "tiny-inflate": ["tiny-inflate@1.0.3", "", {}, "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="], + "tinyexec": ["tinyexec@1.0.2", "", {}, "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg=="], "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], + "toml": ["toml@3.0.0", "", {}, "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w=="], + "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], @@ -1047,16 +1250,20 @@ "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], - "ua-parser-js": ["ua-parser-js@1.0.41", "", { "bin": { "ua-parser-js": "script/cli.js" } }, "sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug=="], - "ufo": ["ufo@1.6.3", "", {}, "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q=="], "undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="], + "unenv": ["unenv@2.0.0-rc.24", "", { "dependencies": { "pathe": "^2.0.3" } }, "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw=="], + + "unicode-trie": ["unicode-trie@2.0.0", "", { "dependencies": { "pako": "^0.2.5", "tiny-inflate": "^1.0.0" } }, "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ=="], + "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="], "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="], + "unist-util-mdx-define": ["unist-util-mdx-define@1.1.2", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-util-scope": "^1.0.0", "estree-walker": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-9ncH7i7TN5Xn7/tzX5bE3rXgz1X/u877gYVAUB3mLeTKYJmQHmqKTDBi6BTGXV7AeolBCI9ErcVsOt2qryoD0g=="], + "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="], "unist-util-position-from-estree": ["unist-util-position-from-estree@2.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ=="], @@ -1069,6 +1276,8 @@ "unist-util-visit-parents": ["unist-util-visit-parents@6.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ=="], + "unstorage": ["unstorage@2.0.0-alpha.7", "", { "peerDependencies": { "@azure/app-configuration": "^1.11.0", "@azure/cosmos": "^4.9.1", "@azure/data-tables": "^13.3.2", "@azure/identity": "^4.13.0", "@azure/keyvault-secrets": "^4.10.0", "@azure/storage-blob": "^12.31.0", "@capacitor/preferences": "^6 || ^7 || ^8", "@deno/kv": ">=0.13.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.36.2", "@vercel/blob": ">=0.27.3", "@vercel/functions": "^2.2.12 || ^3.0.0", "@vercel/kv": "^1.0.1", "aws4fetch": "^1.0.20", "chokidar": "^4 || ^5", "db0": ">=0.3.4", "idb-keyval": "^6.2.2", "ioredis": "^5.9.3", "lru-cache": "^11.2.6", "mongodb": "^6 || ^7", "ofetch": "*", "uploadthing": "^7.7.4" }, "optionalPeers": ["@azure/app-configuration", "@azure/cosmos", "@azure/data-tables", "@azure/identity", "@azure/keyvault-secrets", "@azure/storage-blob", "@capacitor/preferences", "@deno/kv", "@netlify/blobs", "@planetscale/database", "@upstash/redis", "@vercel/blob", "@vercel/functions", "@vercel/kv", "aws4fetch", "chokidar", "db0", "idb-keyval", "ioredis", "lru-cache", "mongodb", "ofetch", "uploadthing"] }, "sha512-ELPztchk2zgFJnakyodVY3vJWGW9jy//keJ32IOJVGUMyaPydwcA1FtVvWqT0TNRch9H+cMNEGllfVFfScImog=="], + "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="], "use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="], @@ -1081,6 +1290,8 @@ "vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="], + "vite": ["vite@8.0.1", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.3", "postcss": "^8.5.8", "rolldown": "1.0.0-rc.10", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.1.0", "esbuild": "^0.27.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-wt+Z2qIhfFt85uiyRt5LPU4oVEJBXj8hZNWKeqFG4gRG/0RaRGJ7njQCwzFVjO+v4+Ipmf5CY7VdmZRAYYBPHw=="], + "vscode-jsonrpc": ["vscode-jsonrpc@8.2.0", "", {}, "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA=="], "vscode-languageserver": ["vscode-languageserver@9.0.1", "", { "dependencies": { "vscode-languageserver-protocol": "3.17.5" }, "bin": { "installServerIntoExtension": "bin/installServerIntoExtension" } }, "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g=="], @@ -1095,8 +1306,12 @@ "w3c-keyname": ["w3c-keyname@2.2.8", "", {}, "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ=="], + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + "yaml": ["yaml@2.8.2", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A=="], + "yoga-layout": ["yoga-layout@3.2.1", "", {}, "sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ=="], + "zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], @@ -1181,6 +1396,10 @@ "@radix-ui/react-visually-hidden/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], + "color-convert/color-name": ["color-name@2.1.0", "", {}, "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg=="], + + "color-string/color-name": ["color-name@2.1.0", "", {}, "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg=="], + "cytoscape-fcose/cose-base": ["cose-base@2.2.0", "", { "dependencies": { "layout-base": "^2.0.0" } }, "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g=="], "d3-dsv/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="], @@ -1189,16 +1408,24 @@ "d3-sankey/d3-shape": ["d3-shape@1.3.7", "", { "dependencies": { "d3-path": "1" } }, "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw=="], + "gray-matter/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="], + "katex/commander": ["commander@8.3.0", "", {}, "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="], + "next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="], + "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], "radix-ui/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], + "rolldown/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.10", "", {}, "sha512-UkVDEFk1w3mveXeKgaTuYfKWtPbvgck1dT8TUG3bnccrH0XtLTuAyfCoks4Q/M5ZGToSVJTIQYCzy2g/atAOeg=="], + "cytoscape-fcose/cose-base/layout-base": ["layout-base@2.0.1", "", {}, "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg=="], "d3-sankey/d3-array/internmap": ["internmap@1.0.1", "", {}, "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw=="], "d3-sankey/d3-shape/d3-path": ["d3-path@1.0.9", "", {}, "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg=="], + + "gray-matter/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], } } diff --git a/packages/chronicle/.gitignore b/packages/chronicle/.gitignore new file mode 100644 index 0000000..db04592 --- /dev/null +++ b/packages/chronicle/.gitignore @@ -0,0 +1,5 @@ +node_modules +dist +.source +.content +.output diff --git a/packages/chronicle/biome.json b/packages/chronicle/biome.json index 22b44af..29c5617 100644 --- a/packages/chronicle/biome.json +++ b/packages/chronicle/biome.json @@ -1,3 +1,3 @@ { - "extends": ["@raystack/tools-config/biome.json"] + "extends": ["@raystack/tools-config/biome"] } diff --git a/packages/chronicle/build-cli.ts b/packages/chronicle/build-cli.ts index 2f0a6f7..8d0142e 100644 --- a/packages/chronicle/build-cli.ts +++ b/packages/chronicle/build-cli.ts @@ -1,13 +1,14 @@ -import path from 'path' +import pkg from './package.json'; const result = await Bun.build({ entrypoints: ['src/cli/index.ts'], outdir: 'dist/cli', target: 'node', format: 'esm', -}) + external: Object.keys(pkg.dependencies), +}); if (!result.success) { - for (const log of result.logs) console.error(log) - process.exit(1) + for (const log of result.logs) console.error(log); + process.exit(1); } diff --git a/packages/chronicle/next.config.mjs b/packages/chronicle/next.config.mjs deleted file mode 100644 index 4b50b92..0000000 --- a/packages/chronicle/next.config.mjs +++ /dev/null @@ -1,10 +0,0 @@ -import { createMDX } from 'fumadocs-mdx/next' - -const withMDX = createMDX() - -/** @type {import('next').NextConfig} */ -const nextConfig = { - reactStrictMode: true, -} - -export default withMDX(nextConfig) diff --git a/packages/chronicle/package.json b/packages/chronicle/package.json index 6f508a7..a23682e 100644 --- a/packages/chronicle/package.json +++ b/packages/chronicle/package.json @@ -9,15 +9,14 @@ "dist", "src", "templates", - "next.config.mjs", - "source.config.ts", "tsconfig.json" ], "bin": { "chronicle": "./bin/chronicle.js" }, "scripts": { - "build:cli": "bun build-cli.ts" + "build:cli": "bun build-cli.ts", + "lint": "biome lint src/" }, "devDependencies": { "@biomejs/biome": "^2.3.13", @@ -37,27 +36,36 @@ "@codemirror/theme-one-dark": "^6.1.3", "@codemirror/view": "^6.39.14", "@heroicons/react": "^2.2.0", - "@raystack/apsara": "^0.56.0", - "@types/unist": "^3.0.3", + "@raystack/apsara": "0.55.1", + "@shikijs/rehype": "^4.0.2", + "@vitejs/plugin-react": "^6.0.1", "chalk": "^5.6.2", "class-variance-authority": "^0.7.1", "codemirror": "^6.0.2", "commander": "^14.0.2", "fumadocs-core": "16.6.15", "fumadocs-mdx": "^14.2.6", + "glob": "^11.0.0", + "gray-matter": "^4.0.3", + "h3": "^2.0.1-rc.16", "lodash": "^4.17.23", "mermaid": "^11.13.0", - "next": "16.1.6", + "minisearch": "^7.2.0", + "nitro": "latest", + "openapi-types": "^12.1.3", "react": "^19.0.0", - "react-device-detect": "^2.2.3", "react-dom": "^19.0.0", - "remark-attr": "^0.11.1", + "react-router": "^7.13.1", "remark-directive": "^4.0.0", + "remark-parse": "^11.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.1", + "remark-mdx-frontmatter": "^5.2.0", + "satori": "^0.25.0", "slugify": "^1.6.6", "unified": "^11.0.5", "unist-util-visit": "^5.1.0", - "openapi-types": "^12.1.3", - "yaml": "^2.8.2", - "zod": "^4.3.6" + "vite": "^8.0.0", + "yaml": "^2.8.2" } } \ No newline at end of file diff --git a/packages/chronicle/source.config.ts b/packages/chronicle/source.config.ts deleted file mode 100644 index eb8b3ec..0000000 --- a/packages/chronicle/source.config.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { defineDocs, defineConfig, frontmatterSchema } from 'fumadocs-mdx/config' -import { z } from 'zod' -import remarkDirective from 'remark-directive' -import { remarkDirectiveAdmonition, remarkMdxMermaid } from 'fumadocs-core/mdx-plugins' -import remarkUnusedDirectives from './src/lib/remark-unused-directives' - -const contentDir = process.env.CHRONICLE_CONTENT_DIR || './content' - -export const docs = defineDocs({ - dir: contentDir, - docs: { - schema: frontmatterSchema.extend({ - order: z.number().optional(), - lastModified: z.string().optional(), - }), - postprocess: { - includeProcessedMarkdown: true, - }, - files: ['**/*.mdx', '**/*.md', '!**/node_modules/**'], - }, -}) - -export default defineConfig({ - mdxOptions: { - remarkPlugins: [ - remarkDirective, - [ - remarkDirectiveAdmonition, - { - tags: { - CalloutContainer: 'Callout', - CalloutTitle: 'CalloutTitle', - CalloutDescription: 'CalloutDescription', - }, - types: { - note: 'accent', - tip: 'accent', - info: 'accent', - warn: 'attention', - warning: 'attention', - danger: 'alert', - caution: 'alert', - success: 'success', - }, - }, - ], - remarkUnusedDirectives, - remarkMdxMermaid, - ], - }, -}) diff --git a/packages/chronicle/src/app/[[...slug]]/layout.tsx b/packages/chronicle/src/app/[[...slug]]/layout.tsx deleted file mode 100644 index 17b40bf..0000000 --- a/packages/chronicle/src/app/[[...slug]]/layout.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { loadConfig } from '@/lib/config' -import { buildPageTree } from '@/lib/source' -import { getTheme } from '@/themes/registry' - -export default function DocsLayout({ children }: { children: React.ReactNode }) { - const config = loadConfig() - const tree = buildPageTree() - const { Layout, className } = getTheme(config.theme?.name) - - return ( - - {children} - - ) -} diff --git a/packages/chronicle/src/app/[[...slug]]/page.tsx b/packages/chronicle/src/app/[[...slug]]/page.tsx deleted file mode 100644 index c40a615..0000000 --- a/packages/chronicle/src/app/[[...slug]]/page.tsx +++ /dev/null @@ -1,106 +0,0 @@ -import type { Metadata, ResolvingMetadata } from 'next' -import { notFound } from 'next/navigation' -import type { MDXContent } from 'mdx/types' -import { loadConfig } from '@/lib/config' -import { source, buildPageTree } from '@/lib/source' -import { getTheme } from '@/themes/registry' -import { mdxComponents } from '@/components/mdx' - -interface PageProps { - params: Promise<{ slug?: string[] }> -} - -interface PageData { - title: string - description?: string - body: MDXContent - toc: { title: string; url: string; depth: number }[] -} - -export async function generateMetadata( - { params }: PageProps, - parent: ResolvingMetadata, -): Promise { - const { slug } = await params - const page = source.getPage(slug) - if (!page) return {} - const config = loadConfig() - const data = page.data as PageData - const parentMetadata = await parent - - const metadata: Metadata = { - title: data.title, - description: data.description, - } - - if (config.url) { - const ogParams = new URLSearchParams({ title: data.title }) - if (data.description) ogParams.set('description', data.description) - metadata.openGraph = { - ...parentMetadata.openGraph, - title: data.title, - description: data.description, - images: [{ url: `/og?${ogParams.toString()}`, width: 1200, height: 630 }], - } - metadata.twitter = { - ...parentMetadata.twitter, - title: data.title, - description: data.description, - } - } - - return metadata -} - -export default async function DocsPage({ params }: PageProps) { - const { slug } = await params - const config = loadConfig() - - const page = source.getPage(slug) - - if (!page) { - notFound() - } - - const { Page } = getTheme(config.theme?.name) - - const data = page.data as PageData - const MDXBody = data.body - - const tree = buildPageTree() - - const pageUrl = config.url ? `${config.url}/${(slug ?? []).join('/')}` : undefined - - return ( - <> - - , - toc: data.toc ?? [], - }} - config={config} - tree={tree} - /> - - ) -} - -export function generateStaticParams() { - return source.getPages().map((page) => ({ - slug: page.slugs, - })) -} diff --git a/packages/chronicle/src/app/api/apis-proxy/route.ts b/packages/chronicle/src/app/api/apis-proxy/route.ts deleted file mode 100644 index 5ceeb1b..0000000 --- a/packages/chronicle/src/app/api/apis-proxy/route.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { NextRequest, NextResponse } from "next/server"; -import { loadConfig } from "@/lib/config"; -import { loadApiSpecs } from "@/lib/openapi"; - -export async function POST(request: NextRequest) { - const { specName, method, path, headers, body } = await request.json(); - - if (!specName || !method || !path) { - return NextResponse.json( - { error: "Missing specName, method, or path" }, - { status: 400 }, - ); - } - - const config = loadConfig(); - const specs = loadApiSpecs(config.api ?? []); - const spec = specs.find((s) => s.name === specName); - - if (!spec) { - return NextResponse.json( - { error: `Unknown spec: ${specName}` }, - { status: 404 }, - ); - } - - const url = spec.server.url + path; - - try { - const response = await fetch(url, { - method, - headers, - body: body ? JSON.stringify(body) : undefined, - }); - - const contentType = response.headers.get("content-type") ?? ""; - const responseBody = contentType.includes("application/json") - ? await response.json() - : await response.text(); - - return NextResponse.json({ - status: response.status, - statusText: response.statusText, - body: responseBody, - }, { status: response.status }); - } catch (error) { - const message = - error instanceof Error - ? `${error.message}${error.cause ? `: ${(error.cause as Error).message}` : ""}` - : "Request failed"; - return NextResponse.json( - { - status: 502, - statusText: "Bad Gateway", - body: `Could not reach ${url}\n${message}`, - }, - { status: 502 }, - ); - } -} diff --git a/packages/chronicle/src/app/api/health/route.ts b/packages/chronicle/src/app/api/health/route.ts deleted file mode 100644 index 5ebc71e..0000000 --- a/packages/chronicle/src/app/api/health/route.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function GET() { - return Response.json({ status: 'ok' }) -} diff --git a/packages/chronicle/src/app/api/search/route.ts b/packages/chronicle/src/app/api/search/route.ts deleted file mode 100644 index 0286227..0000000 --- a/packages/chronicle/src/app/api/search/route.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { source } from '@/lib/source' -import { createSearchAPI, type AdvancedIndex } from 'fumadocs-core/search/server' -import type { StructuredData } from 'fumadocs-core/mdx-plugins' -import type { OpenAPIV3 } from 'openapi-types' -import { loadConfig } from '@/lib/config' -import { loadApiSpecs, type ApiSpec } from '@/lib/openapi' -import { getSpecSlug } from '@/lib/api-routes' - -interface PageData { - title?: string - description?: string - structuredData?: StructuredData - load?: () => Promise<{ structuredData?: StructuredData }> -} - -const HTTP_METHODS = ['get', 'post', 'put', 'delete', 'patch'] as const -type HttpMethod = (typeof HTTP_METHODS)[number] - -function getParamNames(op: OpenAPIV3.OperationObject): string[] { - const params = (op.parameters as OpenAPIV3.ParameterObject[] | undefined) ?? [] - return params.map((p) => p.name) -} - -function buildStructuredData(op: OpenAPIV3.OperationObject, method: string, pathStr: string) { - return { - headings: [{ id: op.operationId!, content: `${method.toUpperCase()} ${pathStr}` }], - contents: [{ heading: op.operationId!, content: `${method.toUpperCase()} ${[op.description, ...getParamNames(op)].filter(Boolean).join(' ')}` }], - } -} - -function operationToIndex(specSlug: string, pathStr: string, method: HttpMethod, op: OpenAPIV3.OperationObject): AdvancedIndex { - const url = `/apis/${specSlug}/${encodeURIComponent(op.operationId!)}` - return { - id: url, - url, - title: `${method.toUpperCase()} ${op.summary ?? op.operationId!}`, - description: op.description ?? '', - structuredData: buildStructuredData(op, method, pathStr), - } -} - -function pathEntryToIndexes(specSlug: string) { - return ([pathStr, pathItem]: [string, OpenAPIV3.PathItemObject | undefined]): AdvancedIndex[] => { - if (!pathItem) return [] - const hasOp = (m: HttpMethod) => !!pathItem[m]?.operationId - const toIndex = (m: HttpMethod) => operationToIndex(specSlug, pathStr, m, pathItem[m]!) - return HTTP_METHODS.filter(hasOp).map(toIndex) - } -} - -function specToIndexes(spec: ApiSpec): AdvancedIndex[] { - const specSlug = getSpecSlug(spec) - return Object.entries(spec.document.paths ?? {}).flatMap(pathEntryToIndexes(specSlug)) -} - -function buildApiIndexes(): AdvancedIndex[] { - const config = loadConfig() - if (!config.api?.length) return [] - return loadApiSpecs(config.api).flatMap(specToIndexes) -} - -export const { GET } = createSearchAPI('advanced', { - indexes: async (): Promise => { - const pages = source.getPages() - const indexes = await Promise.all( - pages.map(async (page): Promise => { - const data = page.data as PageData - let structuredData: StructuredData | undefined = data.structuredData - - if (!structuredData && data.load) { - try { - const loaded = await data.load() - structuredData = loaded.structuredData - } catch (error) { - console.error(`Failed to load structured data for ${page.url}:`, error) - } - } - - return { - id: page.url, - url: page.url, - title: data.title ?? '', - description: data.description ?? '', - structuredData: structuredData ?? { headings: [], contents: [] }, - } - }) - ) - return [...indexes, ...buildApiIndexes()] - }, -}) diff --git a/packages/chronicle/src/app/apis/[[...slug]]/layout.tsx b/packages/chronicle/src/app/apis/[[...slug]]/layout.tsx deleted file mode 100644 index 98c18cf..0000000 --- a/packages/chronicle/src/app/apis/[[...slug]]/layout.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { cx } from 'class-variance-authority' -import { loadConfig } from '@/lib/config' -import { loadApiSpecs } from '@/lib/openapi' -import { buildApiPageTree } from '@/lib/api-routes' -import { getTheme } from '@/themes/registry' -import { Search } from '@/components/ui/search' -import styles from './layout.module.css' - -export default function ApiLayout({ children }: { children: React.ReactNode }) { - const config = loadConfig() - const { Layout, className } = getTheme(config.theme?.name) - const specs = loadApiSpecs(config.api ?? []) - const tree = buildApiPageTree(specs) - - return ( - - - {children} - - ) -} diff --git a/packages/chronicle/src/app/apis/[[...slug]]/page.tsx b/packages/chronicle/src/app/apis/[[...slug]]/page.tsx deleted file mode 100644 index 8c9c831..0000000 --- a/packages/chronicle/src/app/apis/[[...slug]]/page.tsx +++ /dev/null @@ -1,117 +0,0 @@ -import type { Metadata, ResolvingMetadata } from 'next' -import { notFound } from 'next/navigation' -import type { OpenAPIV3 } from 'openapi-types' -import { Flex, Headline, Text } from '@raystack/apsara' -import { loadConfig } from '@/lib/config' -import { loadApiSpecs } from '@/lib/openapi' -import { buildApiRoutes, findApiOperation } from '@/lib/api-routes' -import { EndpointPage } from '@/components/api' - -interface PageProps { - params: Promise<{ slug?: string[] }> -} - -export async function generateMetadata( - { params }: PageProps, - parent: ResolvingMetadata, -): Promise { - const { slug } = await params - const config = loadConfig() - const specs = loadApiSpecs(config.api ?? []) - const parentMetadata = await parent - - if (!slug || slug.length === 0) { - const apiDescription = `API documentation for ${config.title}` - const metadata: Metadata = { - title: 'API Reference', - description: apiDescription, - } - if (config.url) { - metadata.openGraph = { - ...parentMetadata.openGraph, - title: 'API Reference', - description: apiDescription, - images: [{ url: `/og?title=${encodeURIComponent('API Reference')}&description=${encodeURIComponent(apiDescription)}`, width: 1200, height: 630 }], - } - metadata.twitter = { - ...parentMetadata.twitter, - title: 'API Reference', - description: apiDescription, - } - } - return metadata - } - - const match = findApiOperation(specs, slug) - if (!match) return {} - - const operation = match.operation as OpenAPIV3.OperationObject - const title = operation.summary ?? `${match.method.toUpperCase()} ${match.path}` - const description = operation.description - - const metadata: Metadata = { title, description } - - if (config.url) { - const ogParams = new URLSearchParams({ title }) - if (description) ogParams.set('description', description) - metadata.openGraph = { - ...parentMetadata.openGraph, - title, - description, - images: [{ url: `/og?${ogParams.toString()}`, width: 1200, height: 630 }], - } - metadata.twitter = { - ...parentMetadata.twitter, - title, - description, - } - } - - return metadata -} - -export default async function ApiPage({ params }: PageProps) { - const { slug } = await params - const config = loadConfig() - const specs = loadApiSpecs(config.api ?? []) - - if (!slug || slug.length === 0) { - return - } - - const match = findApiOperation(specs, slug) - if (!match) notFound() - - return ( - - ) -} - -function ApiLanding({ specs }: { specs: { name: string; document: OpenAPIV3.Document }[] }) { - return ( - - API Reference - {specs.map((spec) => ( - - {spec.name} - {spec.document.info.description && ( - {spec.document.info.description} - )} - - ))} - - ) -} - -export function generateStaticParams() { - const config = loadConfig() - const specs = loadApiSpecs(config.api ?? []) - return [{ slug: [] }, ...buildApiRoutes(specs)] -} diff --git a/packages/chronicle/src/app/layout.tsx b/packages/chronicle/src/app/layout.tsx deleted file mode 100644 index c71ed16..0000000 --- a/packages/chronicle/src/app/layout.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import '@raystack/apsara/normalize.css' -import '@raystack/apsara/style.css' -import type { Metadata } from 'next' -import { loadConfig } from '@/lib/config' -import { Providers } from './providers' - -const config = loadConfig() - -export const metadata: Metadata = { - title: { - default: config.title, - template: `%s | ${config.title}`, - }, - description: config.description, - ...(config.url && { - metadataBase: new URL(config.url), - openGraph: { - title: config.title, - description: config.description, - url: config.url, - siteName: config.title, - type: 'website', - images: [{ url: '/og?title=' + encodeURIComponent(config.title), width: 1200, height: 630 }], - }, - twitter: { - card: 'summary_large_image', - title: config.title, - description: config.description, - images: ['/og?title=' + encodeURIComponent(config.title)], - }, - }), -} - -export default function RootLayout({ - children, -}: { - children: React.ReactNode -}) { - return ( - - - {config.url && ( - - )} - {children} - - - ) -} diff --git a/packages/chronicle/src/app/llms-full.txt/route.ts b/packages/chronicle/src/app/llms-full.txt/route.ts deleted file mode 100644 index beb9c70..0000000 --- a/packages/chronicle/src/app/llms-full.txt/route.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { source } from '@/lib/source' -import { loadConfig } from '@/lib/config' -import { getLLMText } from '@/lib/get-llm-text' - -export const revalidate = false - -export async function GET() { - const config = loadConfig() - - if (!config.llms?.enabled) { - return new Response('Not Found', { status: 404 }) - } - - const scan = source.getPages().map(getLLMText) - const scanned = await Promise.all(scan) - - return new Response(scanned.join('\n\n')) -} diff --git a/packages/chronicle/src/app/llms.txt/route.ts b/packages/chronicle/src/app/llms.txt/route.ts deleted file mode 100644 index 664c6cf..0000000 --- a/packages/chronicle/src/app/llms.txt/route.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { source } from '@/lib/source' -import { loadConfig } from '@/lib/config' -import { llms } from 'fumadocs-core/source' - -export const revalidate = false - -export function GET() { - const config = loadConfig() - - if (!config.llms?.enabled) { - return new Response('Not Found', { status: 404 }) - } - - return new Response(llms(source).index()) -} diff --git a/packages/chronicle/src/app/og/route.tsx b/packages/chronicle/src/app/og/route.tsx deleted file mode 100644 index cef9a6f..0000000 --- a/packages/chronicle/src/app/og/route.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import { ImageResponse } from 'next/og' -import type { NextRequest } from 'next/server' -import { loadConfig } from '@/lib/config' - -export async function GET(request: NextRequest) { - const { searchParams } = request.nextUrl - const title = searchParams.get('title') ?? loadConfig().title - const description = searchParams.get('description') ?? '' - const siteName = loadConfig().title - - return new ImageResponse( - ( -
-
- {siteName} -
-
- {title} -
- {description && ( -
- {description} -
- )} -
- ), - { - width: 1200, - height: 630, - } - ) -} diff --git a/packages/chronicle/src/app/providers.tsx b/packages/chronicle/src/app/providers.tsx deleted file mode 100644 index 389b797..0000000 --- a/packages/chronicle/src/app/providers.tsx +++ /dev/null @@ -1,8 +0,0 @@ -'use client' - -import { ThemeProvider } from '@raystack/apsara' -import type { ReactNode } from 'react' - -export function Providers({ children }: { children: ReactNode }) { - return {children} -} diff --git a/packages/chronicle/src/app/robots.ts b/packages/chronicle/src/app/robots.ts deleted file mode 100644 index 9b43e68..0000000 --- a/packages/chronicle/src/app/robots.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { MetadataRoute } from 'next' -import { loadConfig } from '@/lib/config' - -export default function robots(): MetadataRoute.Robots { - const config = loadConfig() - return { - rules: { userAgent: '*', allow: '/' }, - ...(config.url && { sitemap: `${config.url}/sitemap.xml` }), - } -} diff --git a/packages/chronicle/src/app/sitemap.ts b/packages/chronicle/src/app/sitemap.ts deleted file mode 100644 index 4da7cdf..0000000 --- a/packages/chronicle/src/app/sitemap.ts +++ /dev/null @@ -1,29 +0,0 @@ -import type { MetadataRoute } from 'next' -import { loadConfig } from '@/lib/config' -import { source } from '@/lib/source' -import { loadApiSpecs } from '@/lib/openapi' -import { buildApiRoutes } from '@/lib/api-routes' - -export default function sitemap(): MetadataRoute.Sitemap { - const config = loadConfig() - if (!config.url) return [] - - const baseUrl = config.url.replace(/\/$/, '') - - const docPages = source.getPages().map((page) => ({ - url: `${baseUrl}/${page.slugs.join('/')}`, - ...(page.data.lastModified && { lastModified: new Date(page.data.lastModified) }), - })) - - const apiPages = config.api?.length - ? buildApiRoutes(loadApiSpecs(config.api)).map((route) => ({ - url: `${baseUrl}/apis/${route.slug.join('/')}`, - })) - : [] - - return [ - { url: baseUrl }, - ...docPages, - ...apiPages, - ] -} diff --git a/packages/chronicle/src/cli/commands/build.ts b/packages/chronicle/src/cli/commands/build.ts index 7ff457c..c920813 100644 --- a/packages/chronicle/src/cli/commands/build.ts +++ b/packages/chronicle/src/cli/commands/build.ts @@ -1,38 +1,34 @@ -import { Command } from 'commander' -import { spawn } from 'child_process' -import path from 'path' -import fs from 'fs' -import chalk from 'chalk' -import { attachLifecycleHandlers, resolveNextCli } from '@/cli/utils' +import chalk from 'chalk'; +import { Command } from 'commander'; +import { resolveContentDir } from '@/cli/utils/config'; +import { PACKAGE_ROOT } from '@/cli/utils/resolve'; +import { linkContent } from '@/cli/utils/scaffold'; export const buildCommand = new Command('build') .description('Build for production') - .action(() => { - const scaffoldPath = path.join(process.cwd(), '.chronicle') - if (!fs.existsSync(scaffoldPath)) { - console.log(chalk.red('Error: .chronicle/ not found. Run'), chalk.cyan('chronicle init'), chalk.red('first.')) - process.exit(1) - } + .option('-c, --content ', 'Content directory') + .option( + '--preset ', + 'Deploy preset (vercel, cloudflare, node-server)' + ) + .action(async options => { + const contentDir = resolveContentDir(options.content); + await linkContent(contentDir); - let nextCli: string - try { - nextCli = resolveNextCli() - } catch { - console.log(chalk.red('Error: Next.js CLI not found. Run'), chalk.cyan('chronicle init'), chalk.red('first.')) - process.exit(1) - } + console.log(chalk.cyan('Building for production...')); - console.log(chalk.cyan('Building for production...')) + const { createBuilder } = await import('vite'); + const { createViteConfig } = await import('@/server/vite-config'); - const child = spawn(process.execPath, [nextCli, 'build'], { - stdio: 'inherit', - cwd: scaffoldPath, - env: { - ...process.env, - CHRONICLE_PROJECT_ROOT: process.cwd(), - CHRONICLE_CONTENT_DIR: './content', - }, - }) + const config = await createViteConfig({ + packageRoot: PACKAGE_ROOT, + projectRoot: process.cwd(), + contentDir, + preset: options.preset + }); - attachLifecycleHandlers(child) - }) + const builder = await createBuilder({ ...config, builder: {} }); + await builder.buildApp(); + + console.log(chalk.green('Build complete')); + }); diff --git a/packages/chronicle/src/cli/commands/dev.ts b/packages/chronicle/src/cli/commands/dev.ts index 84c6110..82bbbe2 100644 --- a/packages/chronicle/src/cli/commands/dev.ts +++ b/packages/chronicle/src/cli/commands/dev.ts @@ -1,39 +1,32 @@ -import { Command } from 'commander' -import { spawn } from 'child_process' -import path from 'path' -import fs from 'fs' -import chalk from 'chalk' -import { attachLifecycleHandlers, resolveNextCli } from '@/cli/utils' +import fs from 'node:fs'; +import path from 'node:path'; +import chalk from 'chalk'; +import { Command } from 'commander'; +import { resolveContentDir } from '@/cli/utils/config'; +import { PACKAGE_ROOT } from '@/cli/utils/resolve'; +import { linkContent } from '@/cli/utils/scaffold'; export const devCommand = new Command('dev') .description('Start development server') .option('-p, --port ', 'Port number', '3000') - .action((options) => { - const scaffoldPath = path.join(process.cwd(), '.chronicle') - if (!fs.existsSync(scaffoldPath)) { - console.log(chalk.red('Error: .chronicle/ not found. Run'), chalk.cyan('chronicle init'), chalk.red('first.')) - process.exit(1) - } + .option('-c, --content ', 'Content directory') + .action(async options => { + const contentDir = resolveContentDir(options.content); + const port = parseInt(options.port, 10); - let nextCli: string - try { - nextCli = resolveNextCli() - } catch { - console.log(chalk.red('Error: Next.js CLI not found. Run'), chalk.cyan('chronicle init'), chalk.red('first.')) - process.exit(1) - } + await linkContent(contentDir); - console.log(chalk.cyan('Starting dev server...')) + console.log(chalk.cyan('Starting dev server...')); - const child = spawn(process.execPath, [nextCli, 'dev', '-p', options.port], { - stdio: 'inherit', - cwd: scaffoldPath, - env: { - ...process.env, - CHRONICLE_PROJECT_ROOT: process.cwd(), - CHRONICLE_CONTENT_DIR: './content', - }, - }) + const { createServer } = await import('vite'); + const { createViteConfig } = await import('@/server/vite-config'); - attachLifecycleHandlers(child) - }) + const config = await createViteConfig({ packageRoot: PACKAGE_ROOT, projectRoot: process.cwd(), contentDir }); + const server = await createServer({ + ...config, + server: { ...config.server, port } + }); + + await server.listen(); + server.printUrls(); + }); diff --git a/packages/chronicle/src/cli/commands/init.ts b/packages/chronicle/src/cli/commands/init.ts index f79ce1e..d72734d 100644 --- a/packages/chronicle/src/cli/commands/init.ts +++ b/packages/chronicle/src/cli/commands/init.ts @@ -1,44 +1,16 @@ -import { Command } from 'commander' -import { execSync } from 'child_process' -import fs from 'fs' -import path from 'path' -import chalk from 'chalk' -import { stringify } from 'yaml' -import type { ChronicleConfig } from '@/types' -import { loadCLIConfig, scaffoldDir, detectPackageManager, getChronicleVersion } from '@/cli/utils' - - -function createConfig(): ChronicleConfig { - return { - title: 'My Documentation', - description: 'Documentation powered by Chronicle', - theme: { name: 'default' }, - search: { enabled: true, placeholder: 'Search documentation...' }, - } -} - -function createPackageJson(name: string): Record { - return { - name, - private: true, - type: 'module', - scripts: { - dev: 'chronicle dev', - build: 'chronicle build', - start: 'chronicle start', - }, - dependencies: { - '@raystack/chronicle': `^${getChronicleVersion()}`, - }, - devDependencies: { - '@raystack/tools-config': '0.56.0', - 'openapi-types': '^12.1.3', - typescript: '5.9.3', - '@types/react': '^19.2.10', - '@types/node': '^25.1.0', - }, - } -} +import fs from 'node:fs'; +import path from 'node:path'; +import chalk from 'chalk'; +import { Command } from 'commander'; +import { stringify } from 'yaml'; +import type { ChronicleConfig } from '@/types'; + +const defaultConfig: ChronicleConfig = { + title: 'My Documentation', + description: 'Documentation powered by Chronicle', + theme: { name: 'default' }, + search: { enabled: true, placeholder: 'Search documentation...' } +}; const sampleMdx = `--- title: Welcome @@ -49,115 +21,49 @@ order: 1 # Welcome This is your documentation home page. -` +`; export const initCommand = new Command('init') .description('Initialize a new Chronicle project') .option('-c, --content ', 'Content directory name', 'content') - .action((options) => { - const projectDir = process.cwd() - const dirName = path.basename(projectDir) || 'docs' - const contentDir = path.join(projectDir, options.content) + .action(options => { + const projectDir = process.cwd(); + const contentDir = path.join(projectDir, options.content); - // Create content directory if it doesn't exist if (!fs.existsSync(contentDir)) { - fs.mkdirSync(contentDir, { recursive: true }) - console.log(chalk.green('✓'), 'Created', contentDir) - } - - // Create or update package.json in project root - const packageJsonPath = path.join(projectDir, 'package.json') - if (!fs.existsSync(packageJsonPath)) { - fs.writeFileSync(packageJsonPath, JSON.stringify(createPackageJson(dirName), null, 2) + '\n') - console.log(chalk.green('✓'), 'Created', packageJsonPath) - } else { - const existing = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8')) - const template = createPackageJson(dirName) - let updated = false - - // Set type to module - if (existing.type !== 'module') { - existing.type = 'module' - updated = true - } - - // Merge missing scripts - if (!existing.scripts) existing.scripts = {} - for (const [key, value] of Object.entries(template.scripts as Record)) { - if (!existing.scripts[key]) { - existing.scripts[key] = value - updated = true - } - } - - // Merge missing dependencies - if (!existing.dependencies) existing.dependencies = {} - for (const [key, value] of Object.entries(template.dependencies as Record)) { - if (!existing.dependencies[key]) { - existing.dependencies[key] = value - updated = true - } - } - - // Merge missing devDependencies - if (!existing.devDependencies) existing.devDependencies = {} - for (const [key, value] of Object.entries(template.devDependencies as Record)) { - if (!existing.devDependencies[key]) { - existing.devDependencies[key] = value - updated = true - } - } - - if (updated) { - fs.writeFileSync(packageJsonPath, JSON.stringify(existing, null, 2) + '\n') - console.log(chalk.green('✓'), 'Updated', packageJsonPath, 'with missing scripts/deps') - } else { - console.log(chalk.yellow('⚠'), packageJsonPath, 'already has all required entries') - } + fs.mkdirSync(contentDir, { recursive: true }); + console.log(chalk.green('\u2713'), 'Created', contentDir); } - // Create chronicle.yaml in project root - const configPath = path.join(projectDir, 'chronicle.yaml') + const configPath = path.join(projectDir, 'chronicle.yaml'); if (!fs.existsSync(configPath)) { - fs.writeFileSync(configPath, stringify(createConfig())) - console.log(chalk.green('✓'), 'Created', configPath) + fs.writeFileSync(configPath, stringify(defaultConfig)); + console.log(chalk.green('\u2713'), 'Created', configPath); } else { - console.log(chalk.yellow('⚠'), configPath, 'already exists') + console.log(chalk.yellow('\u26a0'), configPath, 'already exists'); } - // Create sample index.mdx only if content dir is empty - const contentFiles = fs.readdirSync(contentDir) + const contentFiles = fs.readdirSync(contentDir); if (contentFiles.length === 0) { - const indexPath = path.join(contentDir, 'index.mdx') - fs.writeFileSync(indexPath, sampleMdx) - console.log(chalk.green('✓'), 'Created', indexPath) + const indexPath = path.join(contentDir, 'index.mdx'); + fs.writeFileSync(indexPath, sampleMdx); + console.log(chalk.green('\u2713'), 'Created', indexPath); } - // Add entries to .gitignore - const gitignorePath = path.join(projectDir, '.gitignore') - const gitignoreEntries = ['.chronicle', 'node_modules', '.next'] + const gitignorePath = path.join(projectDir, '.gitignore'); + const gitignoreEntries = ['node_modules', 'dist', '.output']; if (fs.existsSync(gitignorePath)) { - const existing = fs.readFileSync(gitignorePath, 'utf-8') - const missing = gitignoreEntries.filter(e => !existing.includes(e)) + const existing = fs.readFileSync(gitignorePath, 'utf-8'); + const missing = gitignoreEntries.filter(e => !existing.includes(e)); if (missing.length > 0) { - fs.appendFileSync(gitignorePath, `\n${missing.join('\n')}\n`) - console.log(chalk.green('✓'), 'Added', missing.join(', '), 'to .gitignore') + fs.appendFileSync(gitignorePath, `\n${missing.join('\n')}\n`); + console.log(chalk.green('\u2713'), 'Added', missing.join(', '), 'to .gitignore'); } } else { - fs.writeFileSync(gitignorePath, `${gitignoreEntries.join('\n')}\n`) - console.log(chalk.green('✓'), 'Created .gitignore') + fs.writeFileSync(gitignorePath, `${gitignoreEntries.join('\n')}\n`); + console.log(chalk.green('\u2713'), 'Created .gitignore'); } - // Install dependencies - const pm = detectPackageManager() - console.log(chalk.cyan(`\nInstalling dependencies with ${pm}...`)) - execSync(`${pm} install`, { cwd: projectDir, stdio: 'inherit' }) - - // Scaffold .chronicle/ directory - loadCLIConfig(contentDir) - scaffoldDir(contentDir) - - const runCmd = pm === 'npm' ? 'npx' : pm === 'bun' ? 'bunx' : `${pm} dlx` - console.log(chalk.green('\n✓ Chronicle initialized!')) - console.log('\nRun', chalk.cyan(`${runCmd} chronicle dev`), 'to start development server') - }) + console.log(chalk.green('\n\u2713 Chronicle initialized!')); + console.log('\nRun', chalk.cyan('chronicle dev'), 'to start development server'); + }); diff --git a/packages/chronicle/src/cli/commands/serve.ts b/packages/chronicle/src/cli/commands/serve.ts index 77de8b5..65cfd33 100644 --- a/packages/chronicle/src/cli/commands/serve.ts +++ b/packages/chronicle/src/cli/commands/serve.ts @@ -1,59 +1,40 @@ -import { Command } from 'commander' -import { spawn } from 'child_process' -import path from 'path' -import fs from 'fs' -import chalk from 'chalk' -import { attachLifecycleHandlers, resolveNextCli } from '@/cli/utils' +import chalk from 'chalk'; +import { Command } from 'commander'; +import { resolveContentDir } from '@/cli/utils/config'; +import { PACKAGE_ROOT } from '@/cli/utils/resolve'; +import { linkContent } from '@/cli/utils/scaffold'; export const serveCommand = new Command('serve') .description('Build and start production server') .option('-p, --port ', 'Port number', '3000') - .action((options) => { - const scaffoldPath = path.join(process.cwd(), '.chronicle') - if (!fs.existsSync(scaffoldPath)) { - console.log(chalk.red('Error: .chronicle/ not found. Run'), chalk.cyan('chronicle init'), chalk.red('first.')) - process.exit(1) - } - - let nextCli: string - try { - nextCli = resolveNextCli() - } catch { - console.log(chalk.red('Error: Next.js CLI not found. Run'), chalk.cyan('chronicle init'), chalk.red('first.')) - process.exit(1) - } - - const env = { - ...process.env, - CHRONICLE_PROJECT_ROOT: process.cwd(), - CHRONICLE_CONTENT_DIR: './content', - } - - console.log(chalk.cyan('Building for production...')) - - const buildChild = spawn(process.execPath, [nextCli, 'build'], { - stdio: 'inherit', - cwd: scaffoldPath, - env, - }) - - process.once('SIGINT', () => buildChild.kill('SIGINT')) - process.once('SIGTERM', () => buildChild.kill('SIGTERM')) - - buildChild.on('close', (code) => { - if (code !== 0) { - console.log(chalk.red('Build failed')) - process.exit(code ?? 1) - } - - console.log(chalk.cyan('Starting production server...')) - - const startChild = spawn(process.execPath, [nextCli, 'start', '-p', options.port], { - stdio: 'inherit', - cwd: scaffoldPath, - env, - }) - - attachLifecycleHandlers(startChild) - }) - }) + .option('-c, --content ', 'Content directory') + .option( + '--preset ', + 'Deploy preset (vercel, cloudflare, node-server)' + ) + .action(async options => { + const contentDir = resolveContentDir(options.content); + const port = parseInt(options.port, 10); + await linkContent(contentDir); + + const { build, preview } = await import('vite'); + const { createViteConfig } = await import('@/server/vite-config'); + + const config = await createViteConfig({ + packageRoot: PACKAGE_ROOT, + projectRoot: process.cwd(), + contentDir, + preset: options.preset + }); + + console.log(chalk.cyan('Building for production...')); + await build(config); + + console.log(chalk.cyan('Starting production server...')); + const server = await preview({ + ...config, + preview: { port } + }); + + server.printUrls(); + }); diff --git a/packages/chronicle/src/cli/commands/start.ts b/packages/chronicle/src/cli/commands/start.ts index f29d376..ed0ee85 100644 --- a/packages/chronicle/src/cli/commands/start.ts +++ b/packages/chronicle/src/cli/commands/start.ts @@ -1,39 +1,28 @@ -import { Command } from 'commander' -import { spawn } from 'child_process' -import path from 'path' -import fs from 'fs' -import chalk from 'chalk' -import { attachLifecycleHandlers, resolveNextCli } from '@/cli/utils' +import chalk from 'chalk'; +import { Command } from 'commander'; +import { resolveContentDir } from '@/cli/utils/config'; +import { PACKAGE_ROOT } from '@/cli/utils/resolve'; +import { linkContent } from '@/cli/utils/scaffold'; export const startCommand = new Command('start') .description('Start production server') .option('-p, --port ', 'Port number', '3000') - .action((options) => { - const scaffoldPath = path.join(process.cwd(), '.chronicle') - if (!fs.existsSync(scaffoldPath)) { - console.log(chalk.red('Error: .chronicle/ not found. Run'), chalk.cyan('chronicle init'), chalk.red('first.')) - process.exit(1) - } + .option('-c, --content ', 'Content directory') + .action(async options => { + const contentDir = resolveContentDir(options.content); + const port = parseInt(options.port, 10); + await linkContent(contentDir); - let nextCli: string - try { - nextCli = resolveNextCli() - } catch { - console.log(chalk.red('Error: Next.js CLI not found. Run'), chalk.cyan('chronicle init'), chalk.red('first.')) - process.exit(1) - } + console.log(chalk.cyan('Starting production server...')); - console.log(chalk.cyan('Starting production server...')) + const { preview } = await import('vite'); + const { createViteConfig } = await import('@/server/vite-config'); - const child = spawn(process.execPath, [nextCli, 'start', '-p', options.port], { - stdio: 'inherit', - cwd: scaffoldPath, - env: { - ...process.env, - CHRONICLE_PROJECT_ROOT: process.cwd(), - CHRONICLE_CONTENT_DIR: './content', - }, - }) + const config = await createViteConfig({ packageRoot: PACKAGE_ROOT, projectRoot: process.cwd(), contentDir }); + const server = await preview({ + ...config, + preview: { port } + }); - attachLifecycleHandlers(child) - }) + server.printUrls(); + }); diff --git a/packages/chronicle/src/cli/index.ts b/packages/chronicle/src/cli/index.ts index 2c5ba37..ad89726 100644 --- a/packages/chronicle/src/cli/index.ts +++ b/packages/chronicle/src/cli/index.ts @@ -1,21 +1,21 @@ -import { Command } from 'commander' -import { initCommand } from './commands/init' -import { devCommand } from './commands/dev' -import { buildCommand } from './commands/build' -import { startCommand } from './commands/start' -import { serveCommand } from './commands/serve' +import { Command } from 'commander'; +import { buildCommand } from './commands/build'; +import { devCommand } from './commands/dev'; +import { initCommand } from './commands/init'; +import { serveCommand } from './commands/serve'; +import { startCommand } from './commands/start'; -const program = new Command() +const program = new Command(); program .name('chronicle') .description('Config-driven documentation framework') - .version('0.1.0') + .version('0.1.0'); -program.addCommand(initCommand) -program.addCommand(devCommand) -program.addCommand(buildCommand) -program.addCommand(startCommand) -program.addCommand(serveCommand) +program.addCommand(initCommand); +program.addCommand(devCommand); +program.addCommand(buildCommand); +program.addCommand(startCommand); +program.addCommand(serveCommand); -program.parse() +program.parse(); diff --git a/packages/chronicle/src/cli/utils/config.ts b/packages/chronicle/src/cli/utils/config.ts index 3bc20d4..eba3ea1 100644 --- a/packages/chronicle/src/cli/utils/config.ts +++ b/packages/chronicle/src/cli/utils/config.ts @@ -1,43 +1,42 @@ -import fs from 'fs' -import path from 'path' -import { parse } from 'yaml' -import chalk from 'chalk' -import type { ChronicleConfig } from '@/types' +import fs from 'node:fs'; +import path from 'node:path'; +import chalk from 'chalk'; +import { parse } from 'yaml'; +import type { ChronicleConfig } from '@/types'; export interface CLIConfig { - config: ChronicleConfig - configPath: string - contentDir: string + config: ChronicleConfig; + configPath: string; + contentDir: string; } export function resolveContentDir(contentFlag?: string): string { - if (contentFlag) return path.resolve(contentFlag) - if (process.env.CHRONICLE_CONTENT_DIR) return path.resolve(process.env.CHRONICLE_CONTENT_DIR) - return path.resolve('content') + if (contentFlag) return path.resolve(contentFlag); + return path.resolve('content'); } function resolveConfigPath(contentDir: string): string | null { - const cwdPath = path.join(process.cwd(), 'chronicle.yaml') - if (fs.existsSync(cwdPath)) return cwdPath - const contentPath = path.join(contentDir, 'chronicle.yaml') - if (fs.existsSync(contentPath)) return contentPath - return null + const cwdPath = path.join(process.cwd(), 'chronicle.yaml'); + if (fs.existsSync(cwdPath)) return cwdPath; + const contentPath = path.join(contentDir, 'chronicle.yaml'); + if (fs.existsSync(contentPath)) return contentPath; + return null; } export function loadCLIConfig(contentDir: string): CLIConfig { - const configPath = resolveConfigPath(contentDir) + const configPath = resolveConfigPath(contentDir); if (!configPath) { - console.log(chalk.red(`Error: chronicle.yaml not found in '${process.cwd()}' or '${contentDir}'`)) - console.log(chalk.gray(`Run 'chronicle init' to create one`)) - process.exit(1) + console.log( + chalk.red( + `Error: chronicle.yaml not found in '${process.cwd()}' or '${contentDir}'` + ) + ); + console.log(chalk.gray("Run 'chronicle init' to create one")); + process.exit(1); } - const config = parse(fs.readFileSync(configPath, 'utf-8')) as ChronicleConfig + const config = parse(fs.readFileSync(configPath, 'utf-8')) as ChronicleConfig; - return { - config, - configPath, - contentDir, - } + return { config, configPath, contentDir }; } diff --git a/packages/chronicle/src/cli/utils/index.ts b/packages/chronicle/src/cli/utils/index.ts index 7b2a393..9db18b5 100644 --- a/packages/chronicle/src/cli/utils/index.ts +++ b/packages/chronicle/src/cli/utils/index.ts @@ -1,3 +1,3 @@ -export * from './config' -export * from './process' -export * from './scaffold' +export * from './config'; +export * from './resolve'; +export * from './scaffold'; diff --git a/packages/chronicle/src/cli/utils/process.ts b/packages/chronicle/src/cli/utils/process.ts deleted file mode 100644 index eda3e09..0000000 --- a/packages/chronicle/src/cli/utils/process.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type { ChildProcess } from 'child_process' - -export function attachLifecycleHandlers(child: ChildProcess) { - child.on('close', (code) => process.exit(code ?? 0)) - process.on('SIGINT', () => child.kill('SIGINT')) - process.on('SIGTERM', () => child.kill('SIGTERM')) -} diff --git a/packages/chronicle/src/cli/utils/resolve.ts b/packages/chronicle/src/cli/utils/resolve.ts index 5178c73..3a4eac3 100644 --- a/packages/chronicle/src/cli/utils/resolve.ts +++ b/packages/chronicle/src/cli/utils/resolve.ts @@ -1,6 +1,10 @@ -import path from 'path' -import { fileURLToPath } from 'url' +import path from 'path'; +import { fileURLToPath } from 'url'; // After bundling: dist/cli/index.js → ../.. = package root // After install: node_modules/@raystack/chronicle/dist/cli/index.js → ../.. = package root -export const PACKAGE_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..') +export const PACKAGE_ROOT = path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + '..', + '..' +); diff --git a/packages/chronicle/src/cli/utils/scaffold.ts b/packages/chronicle/src/cli/utils/scaffold.ts index ed64f27..a27af8b 100644 --- a/packages/chronicle/src/cli/utils/scaffold.ts +++ b/packages/chronicle/src/cli/utils/scaffold.ts @@ -1,137 +1,18 @@ -import { execSync } from 'child_process' -import { createRequire } from 'module' -import fs from 'fs' -import path from 'path' -import chalk from 'chalk' -import { PACKAGE_ROOT } from './resolve' +import fs from 'node:fs/promises'; +import path from 'node:path'; +import { PACKAGE_ROOT } from './resolve'; -const COPY_FILES = ['src', 'source.config.ts', 'tsconfig.json'] +export async function linkContent(contentDir: string): Promise { + const linkPath = path.join(PACKAGE_ROOT, '.content'); + const target = path.resolve(contentDir); -function copyRecursive(src: string, dest: string) { - const stat = fs.statSync(src) - if (stat.isDirectory()) { - fs.mkdirSync(dest, { recursive: true }) - for (const entry of fs.readdirSync(src)) { - copyRecursive(path.join(src, entry), path.join(dest, entry)) - } - } else { - fs.copyFileSync(src, dest) - } -} - -function ensureRemoved(targetPath: string) { try { - fs.lstatSync(targetPath) - fs.rmSync(targetPath, { recursive: true, force: true }) + const existing = await fs.readlink(linkPath); + if (existing === target) return; + await fs.unlink(linkPath); } catch { - // nothing exists, proceed - } -} - -export function detectPackageManager(): string { - if (process.env.npm_config_user_agent) { - return process.env.npm_config_user_agent.split('/')[0] - } - const cwd = process.cwd() - if (fs.existsSync(path.join(cwd, 'bun.lock')) || fs.existsSync(path.join(cwd, 'bun.lockb'))) return 'bun' - if (fs.existsSync(path.join(cwd, 'pnpm-lock.yaml'))) return 'pnpm' - if (fs.existsSync(path.join(cwd, 'yarn.lock'))) return 'yarn' - return 'npm' -} - -function generateNextConfig(scaffoldPath: string) { - const config = `import { createMDX } from 'fumadocs-mdx/next' - -const withMDX = createMDX() - -/** @type {import('next').NextConfig} */ -const nextConfig = { - reactStrictMode: true, -} - -export default withMDX(nextConfig) -` - fs.writeFileSync(path.join(scaffoldPath, 'next.config.mjs'), config) -} - -function createPackageJson(): Record { - return { - name: 'chronicle-docs', - private: true, - dependencies: { - '@raystack/chronicle': `^${getChronicleVersion()}`, - }, - devDependencies: { - '@raystack/tools-config': '0.56.0', - 'openapi-types': '^12.1.3', - typescript: '5.9.3', - '@types/react': '^19.2.10', - '@types/node': '^25.1.0', - }, - } -} - -function ensureDeps() { - const cwd = process.cwd() - const cwdPkgJson = path.join(cwd, 'package.json') - const cwdNodeModules = path.join(cwd, 'node_modules') - - if (fs.existsSync(cwdPkgJson) && fs.existsSync(cwdNodeModules)) { - // Case 1: existing project with deps installed - return + // link doesn't exist } - // Case 2: no package.json — create in cwd and install - if (!fs.existsSync(cwdPkgJson)) { - fs.writeFileSync(cwdPkgJson, JSON.stringify(createPackageJson(), null, 2) + '\n') - } - - if (!fs.existsSync(cwdNodeModules)) { - const pm = detectPackageManager() - console.log(chalk.cyan(`Installing dependencies with ${pm}...`)) - execSync(`${pm} install`, { cwd, stdio: 'inherit' }) - } -} - -export function getChronicleVersion(): string { - const pkgPath = path.join(PACKAGE_ROOT, 'package.json') - const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')) - return pkg.version -} - -export function resolveNextCli(): string { - const chronicleRequire = createRequire(path.join(PACKAGE_ROOT, 'package.json')) - return chronicleRequire.resolve('next/dist/bin/next') -} - -export function scaffoldDir(contentDir: string): string { - const scaffoldPath = path.join(process.cwd(), '.chronicle') - - // Create .chronicle/ if not exists - if (!fs.existsSync(scaffoldPath)) { - fs.mkdirSync(scaffoldPath, { recursive: true }) - } - - // Copy package files - for (const name of COPY_FILES) { - const src = path.join(PACKAGE_ROOT, name) - const dest = path.join(scaffoldPath, name) - ensureRemoved(dest) - copyRecursive(src, dest) - } - - // Generate next.config.mjs - generateNextConfig(scaffoldPath) - - // Symlink content dir - const contentLink = path.join(scaffoldPath, 'content') - ensureRemoved(contentLink) - fs.symlinkSync(path.resolve(contentDir), contentLink) - - // Ensure dependencies are available - ensureDeps() - - console.log(chalk.gray(`Scaffold: ${scaffoldPath}`)) - - return scaffoldPath + await fs.symlink(target, linkPath); } diff --git a/packages/chronicle/src/components/mdx/code.tsx b/packages/chronicle/src/components/mdx/code.tsx index c977a01..82dd8b9 100644 --- a/packages/chronicle/src/components/mdx/code.tsx +++ b/packages/chronicle/src/components/mdx/code.tsx @@ -1,6 +1,7 @@ 'use client' -import type { ComponentProps } from 'react' +import { type ComponentProps, isValidElement, Children } from 'react' +import { Mermaid } from './mermaid' import styles from './code.module.css' type PreProps = ComponentProps<'pre'> & { @@ -16,6 +17,14 @@ export function MdxCode({ children, className, ...props }: ComponentProps<'code' } export function MdxPre({ children, title, className, ...props }: PreProps) { + // Detect mermaid code blocks + if (isValidElement(children)) { + const childProps = children.props as { className?: string; children?: string } + if (childProps.className?.includes('language-mermaid') && typeof childProps.children === 'string') { + return + } + } + return (
{title &&
{title}
} diff --git a/packages/chronicle/src/components/mdx/details.module.css b/packages/chronicle/src/components/mdx/details.module.css index f79a00a..e3a6eec 100644 --- a/packages/chronicle/src/components/mdx/details.module.css +++ b/packages/chronicle/src/components/mdx/details.module.css @@ -1,35 +1,10 @@ .details { - border: 1px solid var(--rs-color-border-base-primary); - border-radius: var(--rs-radius-2); margin: var(--rs-space-5) 0; } -.summary { - padding: var(--rs-space-4) var(--rs-space-5); - cursor: pointer; +.trigger { font-weight: 500; font-size: var(--rs-font-size-small); - color: var(--rs-color-text-base-primary); - background: var(--rs-color-background-base-secondary); - list-style: none; - display: flex; - align-items: center; - gap: var(--rs-space-3); -} - -.summary::-webkit-details-marker { - display: none; -} - -.summary::before { - content: '▶'; - font-size: 10px; - transition: transform 0.2s ease; - color: var(--rs-color-text-base-secondary); -} - -.details[open] > .summary::before { - transform: rotate(90deg); } .content { diff --git a/packages/chronicle/src/components/mdx/details.tsx b/packages/chronicle/src/components/mdx/details.tsx index 2d29ac0..aa98714 100644 --- a/packages/chronicle/src/components/mdx/details.tsx +++ b/packages/chronicle/src/components/mdx/details.tsx @@ -1,9 +1,8 @@ import type { ComponentProps } from 'react' -import styles from './details.module.css' export function MdxDetails({ children, className, ...props }: ComponentProps<'details'>) { return ( -
+
{children}
) @@ -11,7 +10,7 @@ export function MdxDetails({ children, className, ...props }: ComponentProps<'de export function MdxSummary({ children, className, ...props }: ComponentProps<'summary'>) { return ( - + {children} ) diff --git a/packages/chronicle/src/components/mdx/image.tsx b/packages/chronicle/src/components/mdx/image.tsx index fcf511d..0f7aa80 100644 --- a/packages/chronicle/src/components/mdx/image.tsx +++ b/packages/chronicle/src/components/mdx/image.tsx @@ -1,38 +1,9 @@ -'use client' +import type { ComponentProps } from 'react'; -import NextImage from 'next/image' -import type { ComponentProps } from 'react' +type ImageProps = ComponentProps<'img'>; -type ImageProps = Omit, 'src'> & { - src?: string - width?: number | string - height?: number | string -} - -export function Image({ src, alt, width, height, ...props }: ImageProps) { - if (!src || typeof src !== 'string') return null - - const isExternal = src.startsWith('http://') || src.startsWith('https://') - - if (isExternal) { - return ( - // eslint-disable-next-line @next/next/no-img-element - {alt - ) - } +export function Image({ src, alt, ...props }: ImageProps) { + if (!src) return null; - return ( - - ) + return {alt; } diff --git a/packages/chronicle/src/components/mdx/index.tsx b/packages/chronicle/src/components/mdx/index.tsx index b22d73e..b2aecec 100644 --- a/packages/chronicle/src/components/mdx/index.tsx +++ b/packages/chronicle/src/components/mdx/index.tsx @@ -8,6 +8,20 @@ import { Mermaid } from './mermaid' import { MdxParagraph } from './paragraph' import { CalloutContainer, CalloutTitle, CalloutDescription, MdxBlockquote } from '@/components/common/callout' import { Tabs } from '@raystack/apsara' +import { type ComponentProps, useEffect, useState } from 'react' + +function ClientOnly({ children }: { children: React.ReactNode }) { + const [mounted, setMounted] = useState(false) + useEffect(() => setMounted(true), []) + return mounted ? <>{children} : null +} + +function MdxTabs(props: ComponentProps) { + return +} +MdxTabs.List = Tabs.List +MdxTabs.Trigger = Tabs.Trigger +MdxTabs.Content = Tabs.Content export const mdxComponents: MDXComponents = { p: MdxParagraph, @@ -27,7 +41,7 @@ export const mdxComponents: MDXComponents = { Callout: CalloutContainer, CalloutTitle, CalloutDescription, - Tabs, + Tabs: MdxTabs, Mermaid, } diff --git a/packages/chronicle/src/components/mdx/link.tsx b/packages/chronicle/src/components/mdx/link.tsx index 8193d6f..18f30d6 100644 --- a/packages/chronicle/src/components/mdx/link.tsx +++ b/packages/chronicle/src/components/mdx/link.tsx @@ -1,38 +1,41 @@ -'use client' +import { Link as ApsaraLink } from '@raystack/apsara'; +import type { ComponentProps } from 'react'; +import { Link as RouterLink } from 'react-router'; -import NextLink from 'next/link' -import { Link as ApsaraLink } from '@raystack/apsara' -import type { ComponentProps } from 'react' - -type LinkProps = ComponentProps<'a'> +type LinkProps = ComponentProps<'a'>; export function Link({ href, children, ...props }: LinkProps) { if (!href) { - return {children} + return {children}; } - const isExternal = href.startsWith('http://') || href.startsWith('https://') - const isAnchor = href.startsWith('#') + const isExternal = href.startsWith('http://') || href.startsWith('https://'); + const isAnchor = href.startsWith('#'); if (isAnchor) { return ( {children} - ) + ); } if (isExternal) { return ( - + {children} - ) + ); } return ( - + {children} - - ) + + ); } diff --git a/packages/chronicle/src/components/ui/breadcrumbs.tsx b/packages/chronicle/src/components/ui/breadcrumbs.tsx index 4eaff20..6babcd7 100644 --- a/packages/chronicle/src/components/ui/breadcrumbs.tsx +++ b/packages/chronicle/src/components/ui/breadcrumbs.tsx @@ -1,53 +1,19 @@ 'use client' import { Breadcrumb } from '@raystack/apsara' -import type { PageTree, PageTreeItem } from '@/types' +import { getBreadcrumbItems } from 'fumadocs-core/breadcrumb' +import type { Root } from 'fumadocs-core/page-tree' interface BreadcrumbsProps { slug: string[] - tree: PageTree -} - -function findInTree(items: PageTreeItem[], targetPath: string): PageTreeItem | undefined { - for (const item of items) { - const itemUrl = item.url || `/${item.name.toLowerCase().replace(/\s+/g, '-')}` - if (itemUrl === targetPath || itemUrl === `/${targetPath}`) { - return item - } - if (item.children) { - const found = findInTree(item.children, targetPath) - if (found) return found - } - } - return undefined -} - -function getFirstPageUrl(item: PageTreeItem): string | undefined { - if (item.type === 'page' && item.url) { - return item.url - } - if (item.children) { - for (const child of item.children) { - const url = getFirstPageUrl(child) - if (url) return url - } - } - return undefined + tree: Root } export function Breadcrumbs({ slug, tree }: BreadcrumbsProps) { - const items: { label: string; href: string }[] = [] + const url = slug.length === 0 ? '/' : `/${slug.join('/')}` + const items = getBreadcrumbItems(url, tree, { includePage: true }) - for (let i = 0; i < slug.length; i++) { - const currentPath = `/${slug.slice(0, i + 1).join('/')}` - const node = findInTree(tree.children, currentPath) - const href = node?.url || (node && getFirstPageUrl(node)) || currentPath - const label = node?.name ?? slug[i] - items.push({ - label: label.charAt(0).toUpperCase() + label.slice(1), - href, - }) - } + if (items.length === 0) return null return ( @@ -55,10 +21,10 @@ export function Breadcrumbs({ slug, tree }: BreadcrumbsProps) { const breadcrumbItem = ( - {item.label} + {item.name} ) if (index === 0) return [breadcrumbItem] diff --git a/packages/chronicle/src/components/ui/search.tsx b/packages/chronicle/src/components/ui/search.tsx index fb56aaa..293893d 100644 --- a/packages/chronicle/src/components/ui/search.tsx +++ b/packages/chronicle/src/components/ui/search.tsx @@ -1,21 +1,19 @@ -"use client"; - -import { useState, useEffect, useCallback } from "react"; -import { useRouter } from "next/navigation"; -import { Button, Command, Dialog, Text } from "@raystack/apsara"; -import { cx } from "class-variance-authority"; -import { useDocsSearch } from "fumadocs-core/search/client"; -import type { SortedResult } from "fumadocs-core/search"; -import { DocumentIcon, HashtagIcon } from "@heroicons/react/24/outline"; -import { isMacOs } from "react-device-detect"; -import { MethodBadge } from "@/components/api/method-badge"; -import styles from "./search.module.css"; +import { DocumentIcon, HashtagIcon } from '@heroicons/react/24/outline'; +import { Button, Command, Dialog, Text } from '@raystack/apsara'; +import { cx } from 'class-variance-authority'; +import type { SortedResult } from 'fumadocs-core/search'; +import { useDocsSearch } from 'fumadocs-core/search/client'; +import { useCallback, useEffect, useState } from 'react'; +import { useNavigate } from 'react-router'; +import { MethodBadge } from '@/components/api/method-badge'; +import styles from './search.module.css'; function SearchShortcutKey({ className }: { className?: string }) { - const [key, setKey] = useState("⌘"); + const [key, setKey] = useState('⌘'); useEffect(() => { - setKey(isMacOs ? "⌘" : "Ctrl"); + const isMac = navigator.platform?.toUpperCase().includes('MAC'); + setKey(isMac ? '⌘' : 'Ctrl'); }, []); return ( @@ -26,50 +24,50 @@ function SearchShortcutKey({ className }: { className?: string }) { } interface SearchProps { - className?: string + className?: string; } export function Search({ className }: SearchProps) { const [open, setOpen] = useState(false); - const router = useRouter(); + const navigate = useNavigate(); const { search, setSearch, query } = useDocsSearch({ - type: "fetch", - api: "/api/search", + type: 'fetch', + api: '/api/search', delayMs: 100, - allowEmpty: true, + allowEmpty: true }); const onSelect = useCallback( (url: string) => { setOpen(false); - router.push(url); + navigate(url); }, - [router], + [navigate] ); useEffect(() => { const down = (e: KeyboardEvent) => { - if (e.key === "k" && (e.metaKey || e.ctrlKey)) { + if (e.key === 'k' && (e.metaKey || e.ctrlKey)) { e.preventDefault(); - setOpen((open) => !open); + setOpen(open => !open); } }; - document.addEventListener("keydown", down); - return () => document.removeEventListener("keydown", down); + document.addEventListener('keydown', down); + return () => document.removeEventListener('keydown', down); }, []); const results = deduplicateByUrl( - query.data === "empty" ? [] : (query.data ?? []), + query.data === 'empty' ? [] : (query.data ?? []) ); return ( <>
@@ -129,10 +129,12 @@ export function Search({ className }: SearchProps) {
{getResultIcon(result)}
- {result.type === "heading" ? ( + {result.type === 'heading' ? ( <> - + - @@ -141,7 +143,9 @@ export function Search({ className }: SearchProps) { ) : ( - + )}
@@ -158,49 +162,57 @@ export function Search({ className }: SearchProps) { function deduplicateByUrl(results: SortedResult[]): SortedResult[] { const seen = new Set(); - return results.filter((r) => { - const base = r.url.split("#")[0]; + return results.filter(r => { + const base = r.url.split('#')[0]; if (seen.has(base)) return false; seen.add(base); return true; }); } -const API_METHODS = new Set(["GET", "POST", "PUT", "DELETE", "PATCH"]); +const API_METHODS = new Set(['GET', 'POST', 'PUT', 'DELETE', 'PATCH']); function extractMethod(content: string): string | null { - const first = content.split(" ")[0]; + const first = content.split(' ')[0]; return API_METHODS.has(first) ? first : null; } function stripMethod(content: string): string { - const first = content.split(" ")[0]; + const first = content.split(' ')[0]; return API_METHODS.has(first) ? content.slice(first.length + 1) : content; } -function HighlightedText({ html, className }: { html: string; className?: string }) { - return ; +function HighlightedText({ + html, + className +}: { + html: string; + className?: string; +}) { + return ( + + ); } function getResultIcon(result: SortedResult): React.ReactNode { - if (!result.url.startsWith("/apis/")) { - return result.type === "page" ? ( + if (!result.url.startsWith('/apis/')) { + return result.type === 'page' ? ( ) : ( ); } const method = extractMethod(result.content); - return method ? : null; + return method ? : null; } function getPageTitle(url: string): string { - const path = url.split("#")[0]; - const segments = path.split("/").filter(Boolean); + const path = url.split('#')[0]; + const segments = path.split('/').filter(Boolean); const lastSegment = segments[segments.length - 1]; - if (!lastSegment) return "Home"; + if (!lastSegment) return 'Home'; return lastSegment - .split("-") - .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) - .join(" "); + .split('-') + .map(word => word.charAt(0).toUpperCase() + word.slice(1)) + .join(' '); } diff --git a/packages/chronicle/src/lib/api-routes.ts b/packages/chronicle/src/lib/api-routes.ts index 828d5e2..ce30fc0 100644 --- a/packages/chronicle/src/lib/api-routes.ts +++ b/packages/chronicle/src/lib/api-routes.ts @@ -1,6 +1,6 @@ import type { OpenAPIV3 } from 'openapi-types' import slugify from 'slugify' -import type { PageTree, PageTreeItem } from '@/types/content' +import type { Root, Node, Item, Folder } from 'fumadocs-core/page-tree' import type { ApiSpec } from './openapi' export function getSpecSlug(spec: ApiSpec): string { @@ -56,16 +56,15 @@ export function findApiOperation(specs: ApiSpec[], slug: string[]): ApiRouteMatc return null } -export function buildApiPageTree(specs: ApiSpec[]): PageTree { - const children: PageTreeItem[] = [] +export function buildApiPageTree(specs: ApiSpec[]): Root { + const children: Node[] = [] for (const spec of specs) { const specSlug = getSpecSlug(spec) const paths = spec.document.paths ?? {} const tags = spec.document.tags ?? [] - // Group operations by tag (case-insensitive to avoid duplicates) - const opsByTag = new Map() + const opsByTag = new Map() const tagDisplayName = new Map() for (const [, pathItem] of Object.entries(paths)) { @@ -90,7 +89,6 @@ export function buildApiPageTree(specs: ApiSpec[]): PageTree { } } - // Use doc.tags display names where available for (const t of tags) { const key = t.name.toLowerCase() if (opsByTag.has(key)) { @@ -98,7 +96,7 @@ export function buildApiPageTree(specs: ApiSpec[]): PageTree { } } - const tagFolders: PageTreeItem[] = Array.from(opsByTag.entries()).map(([key, ops]) => ({ + const tagFolders: Folder[] = Array.from(opsByTag.entries()).map(([key, ops]) => ({ type: 'folder' as const, name: tagDisplayName.get(key) ?? key, icon: 'rectangle-stack', @@ -110,7 +108,7 @@ export function buildApiPageTree(specs: ApiSpec[]): PageTree { type: 'folder', name: spec.name, children: tagFolders, - }) + } as Folder) } else { children.push(...tagFolders) } diff --git a/packages/chronicle/src/lib/config.ts b/packages/chronicle/src/lib/config.ts index aa77280..8237c64 100644 --- a/packages/chronicle/src/lib/config.ts +++ b/packages/chronicle/src/lib/config.ts @@ -1,56 +1,32 @@ -import fs from 'fs' -import path from 'path' -import { parse } from 'yaml' -import type { ChronicleConfig } from '@/types' - -const CONFIG_FILE = 'chronicle.yaml' +import { parse } from 'yaml'; +import type { ChronicleConfig } from '@/types'; const defaultConfig: ChronicleConfig = { title: 'Documentation', theme: { name: 'default' }, - search: { enabled: true, placeholder: 'Search...' }, -} - -function resolveConfigPath(): string | null { - // Check project root via env var - const projectRoot = process.env.CHRONICLE_PROJECT_ROOT - if (projectRoot) { - const rootPath = path.join(projectRoot, CONFIG_FILE) - if (fs.existsSync(rootPath)) return rootPath - } - // Check cwd - const cwdPath = path.join(process.cwd(), CONFIG_FILE) - if (fs.existsSync(cwdPath)) return cwdPath - // Check content dir - const contentDir = process.env.CHRONICLE_CONTENT_DIR - if (contentDir) { - const contentPath = path.join(contentDir, CONFIG_FILE) - if (fs.existsSync(contentPath)) return contentPath - } - return null -} + search: { enabled: true, placeholder: 'Search...' } +}; export function loadConfig(): ChronicleConfig { - const configPath = resolveConfigPath() + const raw = typeof __CHRONICLE_CONFIG_RAW__ !== 'undefined' ? __CHRONICLE_CONFIG_RAW__ : null; - if (!configPath) { - return defaultConfig + if (!raw) { + return defaultConfig; } - const raw = fs.readFileSync(configPath, 'utf-8') - const userConfig = parse(raw) as Partial + const userConfig = parse(raw) as Partial; return { ...defaultConfig, ...userConfig, theme: { name: userConfig.theme?.name ?? defaultConfig.theme!.name, - colors: { ...defaultConfig.theme?.colors, ...userConfig.theme?.colors }, + colors: { ...defaultConfig.theme?.colors, ...userConfig.theme?.colors } }, search: { ...defaultConfig.search, ...userConfig.search }, footer: userConfig.footer, api: userConfig.api, llms: { enabled: false, ...userConfig.llms }, - analytics: { enabled: false, ...userConfig.analytics }, - } -} \ No newline at end of file + analytics: { enabled: false, ...userConfig.analytics } + }; +} diff --git a/packages/chronicle/src/lib/head.tsx b/packages/chronicle/src/lib/head.tsx new file mode 100644 index 0000000..74b0621 --- /dev/null +++ b/packages/chronicle/src/lib/head.tsx @@ -0,0 +1,49 @@ +import type { ChronicleConfig } from '@/types'; + +export interface HeadProps { + title: string; + description?: string; + config: ChronicleConfig; + jsonLd?: Record; +} + +export function Head({ title, description, config, jsonLd }: HeadProps) { + const fullTitle = `${title} | ${config.title}`; + const ogParams = new URLSearchParams({ title }); + if (description) ogParams.set('description', description); + + return ( + <> + {fullTitle} + {description && } + + {config.url && ( + <> + + {description && ( + + )} + + + + + + + + + {description && ( + + )} + + + )} + + {jsonLd && ( +