From ab3c069f176d6a6cf1f65b09e8aadb92230a3f66 Mon Sep 17 00:00:00 2001
From: Segfault <5221072+Segfaultd@users.noreply.github.com>
Date: Fri, 10 Apr 2026 10:07:07 +0200
Subject: [PATCH 01/10] Scaffold Fumadocs Next.js app in docs/
---
docs/bun.lock | 940 ++++++++++++++++++++++++++++++++++++++++
docs/next.config.mjs | 8 +
docs/package.json | 26 ++
docs/postcss.config.mjs | 7 +
docs/source.config.ts | 7 +
docs/tsconfig.json | 23 +
6 files changed, 1011 insertions(+)
create mode 100644 docs/bun.lock
create mode 100644 docs/next.config.mjs
create mode 100644 docs/package.json
create mode 100644 docs/postcss.config.mjs
create mode 100644 docs/source.config.ts
create mode 100644 docs/tsconfig.json
diff --git a/docs/bun.lock b/docs/bun.lock
new file mode 100644
index 0000000..c2fd9bd
--- /dev/null
+++ b/docs/bun.lock
@@ -0,0 +1,940 @@
+{
+ "lockfileVersion": 1,
+ "configVersion": 1,
+ "workspaces": {
+ "": {
+ "name": "strimulator-docs",
+ "dependencies": {
+ "fumadocs-core": "latest",
+ "fumadocs-mdx": "latest",
+ "fumadocs-openapi": "latest",
+ "fumadocs-ui": "latest",
+ "next": "^15",
+ "react": "^19",
+ "react-dom": "^19",
+ },
+ "devDependencies": {
+ "@tailwindcss/postcss": "^4",
+ "@types/react": "^19",
+ "@types/react-dom": "^19",
+ "tailwindcss": "^4",
+ "typescript": "^5",
+ },
+ },
+ },
+ "packages": {
+ "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="],
+
+ "@emnapi/core": ["@emnapi/core@1.9.2", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA=="],
+
+ "@emnapi/runtime": ["@emnapi/runtime@1.9.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw=="],
+
+ "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="],
+
+ "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.7", "", { "os": "aix", "cpu": "ppc64" }, "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg=="],
+
+ "@esbuild/android-arm": ["@esbuild/android-arm@0.27.7", "", { "os": "android", "cpu": "arm" }, "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ=="],
+
+ "@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.7", "", { "os": "android", "cpu": "arm64" }, "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ=="],
+
+ "@esbuild/android-x64": ["@esbuild/android-x64@0.27.7", "", { "os": "android", "cpu": "x64" }, "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg=="],
+
+ "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw=="],
+
+ "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ=="],
+
+ "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.7", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w=="],
+
+ "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.7", "", { "os": "freebsd", "cpu": "x64" }, "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ=="],
+
+ "@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.7", "", { "os": "linux", "cpu": "arm" }, "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA=="],
+
+ "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A=="],
+
+ "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.7", "", { "os": "linux", "cpu": "ia32" }, "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg=="],
+
+ "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q=="],
+
+ "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw=="],
+
+ "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.7", "", { "os": "linux", "cpu": "ppc64" }, "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ=="],
+
+ "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ=="],
+
+ "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.7", "", { "os": "linux", "cpu": "s390x" }, "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw=="],
+
+ "@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.7", "", { "os": "linux", "cpu": "x64" }, "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA=="],
+
+ "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w=="],
+
+ "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.7", "", { "os": "none", "cpu": "x64" }, "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw=="],
+
+ "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.7", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A=="],
+
+ "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.7", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg=="],
+
+ "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw=="],
+
+ "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.7", "", { "os": "sunos", "cpu": "x64" }, "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA=="],
+
+ "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA=="],
+
+ "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.7", "", { "os": "win32", "cpu": "ia32" }, "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw=="],
+
+ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.7", "", { "os": "win32", "cpu": "x64" }, "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg=="],
+
+ "@fastify/deepmerge": ["@fastify/deepmerge@3.2.1", "", {}, "sha512-N5Oqvltoa2r9z1tbx4xjky0oRR60v+T47Ic4J1ukoVQcptLOrIdRnCSdTGmOmajZuHVKlTnfcmrjyqsGEW1ztA=="],
+
+ "@floating-ui/core": ["@floating-ui/core@1.7.5", "", { "dependencies": { "@floating-ui/utils": "^0.2.11" } }, "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ=="],
+
+ "@floating-ui/dom": ["@floating-ui/dom@1.7.6", "", { "dependencies": { "@floating-ui/core": "^1.7.5", "@floating-ui/utils": "^0.2.11" } }, "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ=="],
+
+ "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.8", "", { "dependencies": { "@floating-ui/dom": "^1.7.6" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A=="],
+
+ "@floating-ui/utils": ["@floating-ui/utils@0.2.11", "", {}, "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg=="],
+
+ "@formatjs/fast-memoize": ["@formatjs/fast-memoize@3.1.1", "", {}, "sha512-CbNbf+tlJn1baRnPkNePnBqTLxGliG6DDgNa/UtV66abwIjwsliPMOt0172tzxABYzSuxZBZfcp//qI8AvBWPg=="],
+
+ "@formatjs/intl-localematcher": ["@formatjs/intl-localematcher@0.8.2", "", { "dependencies": { "@formatjs/fast-memoize": "3.1.1" } }, "sha512-q05KMYGJLyqFNFtIb8NhWLF5X3aK/k0wYt7dnRFuy6aLQL+vUwQ1cg5cO4qawEiINybeCPXAWlprY2mSBjSXAQ=="],
+
+ "@fumadocs/tailwind": ["@fumadocs/tailwind@0.0.3", "", { "dependencies": { "postcss-selector-parser": "^7.1.1" }, "peerDependencies": { "tailwindcss": "^4.0.0" }, "optionalPeers": ["tailwindcss"] }, "sha512-/FWcggMz9BhoX+13xBoZLX+XX9mYvJ50dkTqy3IfocJqua65ExcsKfxwKH8hgTO3vA5KnWv4+4jU7LaW2AjAmQ=="],
+
+ "@fumari/json-schema-ts": ["@fumari/json-schema-ts@0.0.2", "", { "dependencies": { "esrap": "^2.2.3" }, "peerDependencies": { "json-schema-typed": "^8.0.2" }, "optionalPeers": ["json-schema-typed"] }, "sha512-A2x8nj45r8Kc3Gqa+HpWRF9uzIMc9dySB6L2R2kiyjLHXWBsZUX99Atj5+Yup/iRQXQ9s8AX+uAPwPze7Xn05A=="],
+
+ "@fumari/stf": ["@fumari/stf@1.0.4", "", { "peerDependencies": { "@types/react": "*", "react": "^19.2.0", "react-dom": "^19.2.0" }, "optionalPeers": ["@types/react"] }, "sha512-ozyRDo4GjOEuE+XZlcMSP/7lwoAMwP4tZI+hdwhVWS1MeCSJqVpHFWIKucocXUUhusX2oqZb3K5ip1J79mR6zw=="],
+
+ "@img/colour": ["@img/colour@1.1.0", "", {}, "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ=="],
+
+ "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w=="],
+
+ "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.2.4" }, "os": "darwin", "cpu": "x64" }, "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw=="],
+
+ "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g=="],
+
+ "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg=="],
+
+ "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A=="],
+
+ "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw=="],
+
+ "@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.2.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA=="],
+
+ "@img/sharp-libvips-linux-riscv64": ["@img/sharp-libvips-linux-riscv64@1.2.4", "", { "os": "linux", "cpu": "none" }, "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA=="],
+
+ "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.2.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ=="],
+
+ "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw=="],
+
+ "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw=="],
+
+ "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg=="],
+
+ "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.2.4" }, "os": "linux", "cpu": "arm" }, "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw=="],
+
+ "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg=="],
+
+ "@img/sharp-linux-ppc64": ["@img/sharp-linux-ppc64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-ppc64": "1.2.4" }, "os": "linux", "cpu": "ppc64" }, "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA=="],
+
+ "@img/sharp-linux-riscv64": ["@img/sharp-linux-riscv64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-riscv64": "1.2.4" }, "os": "linux", "cpu": "none" }, "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw=="],
+
+ "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.2.4" }, "os": "linux", "cpu": "s390x" }, "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg=="],
+
+ "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ=="],
+
+ "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg=="],
+
+ "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q=="],
+
+ "@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.5", "", { "dependencies": { "@emnapi/runtime": "^1.7.0" }, "cpu": "none" }, "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw=="],
+
+ "@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.34.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g=="],
+
+ "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg=="],
+
+ "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="],
+
+ "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="],
+
+ "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="],
+
+ "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
+
+ "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
+
+ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
+
+ "@mdx-js/mdx": ["@mdx-js/mdx@3.1.1", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdx": "^2.0.0", "acorn": "^8.0.0", "collapse-white-space": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-util-scope": "^1.0.0", "estree-walker": "^3.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "markdown-extensions": "^2.0.0", "recma-build-jsx": "^1.0.0", "recma-jsx": "^1.0.0", "recma-stringify": "^1.0.0", "rehype-recma": "^1.0.0", "remark-mdx": "^3.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "source-map": "^0.7.0", "unified": "^11.0.0", "unist-util-position-from-estree": "^2.0.0", "unist-util-stringify-position": "^4.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ=="],
+
+ "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.3", "", { "dependencies": { "@tybys/wasm-util": "^0.10.1" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ=="],
+
+ "@next/env": ["@next/env@15.5.15", "", {}, "sha512-vcmyu5/MyFzN7CdqRHO3uHO44p/QPCZkuTUXroeUmhNP8bL5PHFEhik22JUazt+CDDoD6EpBYRCaS2pISL+/hg=="],
+
+ "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@15.5.15", "", { "os": "darwin", "cpu": "arm64" }, "sha512-6PvFO2Tzt10GFK2Ro9tAVEtacMqRmTarYMFKAnV2vYMdwWc73xzmDQyAV7SwEdMhzmiRoo7+m88DuiXlJlGeaw=="],
+
+ "@next/swc-darwin-x64": ["@next/swc-darwin-x64@15.5.15", "", { "os": "darwin", "cpu": "x64" }, "sha512-G+YNV+z6FDZTp/+IdGyIMFqalBTaQSnvAA+X/hrt+eaTRFSznRMz9K7rTmzvM6tDmKegNtyzgufZW0HwVzEqaQ=="],
+
+ "@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@15.5.15", "", { "os": "linux", "cpu": "arm64" }, "sha512-eVkrMcVIBqGfXB+QUC7jjZ94Z6uX/dNStbQFabewAnk13Uy18Igd1YZ/GtPRzdhtm7QwC0e6o7zOQecul4iC1w=="],
+
+ "@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@15.5.15", "", { "os": "linux", "cpu": "arm64" }, "sha512-RwSHKMQ7InLy5GfkY2/n5PcFycKA08qI1VST78n09nN36nUPqCvGSMiLXlfUmzmpQpF6XeBYP2KRWHi0UW3uNg=="],
+
+ "@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@15.5.15", "", { "os": "linux", "cpu": "x64" }, "sha512-nplqvY86LakS+eeiuWsNWvfmK8pFcOEW7ZtVRt4QH70lL+0x6LG/m1OpJ/tvrbwjmR8HH9/fH2jzW1GlL03TIg=="],
+
+ "@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@15.5.15", "", { "os": "linux", "cpu": "x64" }, "sha512-eAgl9NKQ84/sww0v81DQINl/vL2IBxD7sMybd0cWRw6wqgouVI53brVRBrggqBRP/NWeIAE1dm5cbKYoiMlqDQ=="],
+
+ "@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@15.5.15", "", { "os": "win32", "cpu": "arm64" }, "sha512-GJVZC86lzSquh0MtvZT+L7G8+jMnJcldloOjA8Kf3wXvBrvb6OGe2MzPuALxFshSm/IpwUtD2mIoof39ymf52A=="],
+
+ "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@15.5.15", "", { "os": "win32", "cpu": "x64" }, "sha512-nFucjVdwlFqxh/JG3hWSJ4p8+YJV7Ii8aPDuBQULB6DzUF4UNZETXLfEUk+oI2zEznWWULPt7MeuTE6xtK1HSA=="],
+
+ "@orama/orama": ["@orama/orama@3.1.18", "", {}, "sha512-a61ljmRVVyG5MC/698C8/FfFDw5a8LOIvyOLW5fztgUXqUpc1jOfQzOitSCbge657OgXXThmY3Tk8fpiDb4UcA=="],
+
+ "@oxc-parser/binding-android-arm-eabi": ["@oxc-parser/binding-android-arm-eabi@0.124.0", "", { "os": "android", "cpu": "arm" }, "sha512-+R9zCafSL8ovjokdPtorUp3sXrh8zQ2AC2L0ivXNvlLR0WS+5WdPkNVrnENq5UvzagM4Xgl0NPsJKz3Hv9+y8g=="],
+
+ "@oxc-parser/binding-android-arm64": ["@oxc-parser/binding-android-arm64@0.124.0", "", { "os": "android", "cpu": "arm64" }, "sha512-ULHC/gVZ+nP4pd3kNNQTYaQ/e066BW/KuY5qUsvwkVWwOUQGDg+WpfyVOmQ4xfxoue6cMlkKkJ+ntdzfDXpNlg=="],
+
+ "@oxc-parser/binding-darwin-arm64": ["@oxc-parser/binding-darwin-arm64@0.124.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-fGJ2hw7bnbUYn6UvTjp0m4WJ9zXz3cohgcwcgeo7gUZehpPNpvcVEVeIVHNmHnAuAw/ysf4YJR8DA1E+xCA4Lw=="],
+
+ "@oxc-parser/binding-darwin-x64": ["@oxc-parser/binding-darwin-x64@0.124.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-j0+re9pgps5BH2Tk3fm59Hi3QuLP3C4KhqXi6A+wRHHHJWDFR8mc/KI9mBrfk2JRT+15doGo+zv1eN75/9DuOw=="],
+
+ "@oxc-parser/binding-freebsd-x64": ["@oxc-parser/binding-freebsd-x64@0.124.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-0k5mS0npnrhKy72UfF51lpOZ2ESoPWn6gdFw+RdeRWcokraDW1O2kSx3laQ+yk7cCEavQdJSpWCYS/GvBbUCXQ=="],
+
+ "@oxc-parser/binding-linux-arm-gnueabihf": ["@oxc-parser/binding-linux-arm-gnueabihf@0.124.0", "", { "os": "linux", "cpu": "arm" }, "sha512-P/i4eguRWvAUfGdfhQYg1jpwYkyUV6D3gefIH7HhmRl1Ph6P4IqTIEVcyJr1i/3vr1V5OHU4wonH6/ue/Qzvrw=="],
+
+ "@oxc-parser/binding-linux-arm-musleabihf": ["@oxc-parser/binding-linux-arm-musleabihf@0.124.0", "", { "os": "linux", "cpu": "arm" }, "sha512-/ameqFQH5fFP+66Atr8Ynv/2rYe4utcU7L4MoWS5JtrFLVO78g4qDLavyIlJxa6caSwYOvG/eO3c/DXqY5/6Rw=="],
+
+ "@oxc-parser/binding-linux-arm64-gnu": ["@oxc-parser/binding-linux-arm64-gnu@0.124.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-gNeyEcXTtfrRCbj2EfxWU85Fs0wIX3p44Y3twnvuMfkWlLrb9M1Z25AYNSKjJM+fdAjeeQCjw0on47zFuBYwQw=="],
+
+ "@oxc-parser/binding-linux-arm64-musl": ["@oxc-parser/binding-linux-arm64-musl@0.124.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-uvG7v4Tz9S8/PVqY0SP0DLHxo4hZGe+Pv2tGVnwcsjKCCUPjplbrFVvDzXq+kOaEoUkiCY0Kt1hlZ6FDJ1LKNQ=="],
+
+ "@oxc-parser/binding-linux-ppc64-gnu": ["@oxc-parser/binding-linux-ppc64-gnu@0.124.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-t7KZaaUhfp2au0MRpoENEFqwLKYDdptEry6V7pTAVdPEcFG4P6ii8yeGU9m6p5vb+b8WEKmdpGMNXBEYy7iJdw=="],
+
+ "@oxc-parser/binding-linux-riscv64-gnu": ["@oxc-parser/binding-linux-riscv64-gnu@0.124.0", "", { "os": "linux", "cpu": "none" }, "sha512-eurGGaxHZiIQ+fBSageS8TAkRqZgdOiBeqNrWAqAPup9hXBTmQ0WcBjwsLElf+3jvDL9NhnX0dOgOqPfsjSjdg=="],
+
+ "@oxc-parser/binding-linux-riscv64-musl": ["@oxc-parser/binding-linux-riscv64-musl@0.124.0", "", { "os": "linux", "cpu": "none" }, "sha512-d1V7/ll1i/LhqE/gZy6Wbz6evlk0egh2XKkwMI3epiojtbtUwQSLIER0Y3yDBBocPuWOjJdvmjtEmPTTLXje/w=="],
+
+ "@oxc-parser/binding-linux-s390x-gnu": ["@oxc-parser/binding-linux-s390x-gnu@0.124.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-w1+cBvriUteOpox6ATqCFVkpGL47PFdcfCPGmgUZbd78Fw44U0gQkc+kVGvAOTvGrptMYgwomD1c6OTVvkrpGg=="],
+
+ "@oxc-parser/binding-linux-x64-gnu": ["@oxc-parser/binding-linux-x64-gnu@0.124.0", "", { "os": "linux", "cpu": "x64" }, "sha512-RRB1evQiXRtMCsQQiAh9U0H3HzguLpE0ytfStuhRgmOj7tqUCOVxkHsvM9geZjAax6NqVRj7VXx32qjjkZPsBw=="],
+
+ "@oxc-parser/binding-linux-x64-musl": ["@oxc-parser/binding-linux-x64-musl@0.124.0", "", { "os": "linux", "cpu": "x64" }, "sha512-asVYN0qmSHlCU8H9Q47SmeJ/Z5EG4IWCC+QGxkfFboI5qh15aLlJnHmnrV61MwQRPXGnVC/sC3qKhrUyqGxUqw=="],
+
+ "@oxc-parser/binding-openharmony-arm64": ["@oxc-parser/binding-openharmony-arm64@0.124.0", "", { "os": "none", "cpu": "arm64" }, "sha512-nhwuxm6B8pn9lzAzMUfa571L5hCXYwQo8C8cx5aGOuHWCzruR8gPJnRRXGBci+uGaIIQEZDyU/U6HDgrSp/JlQ=="],
+
+ "@oxc-parser/binding-wasm32-wasi": ["@oxc-parser/binding-wasm32-wasi@0.124.0", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.1.2" }, "cpu": "none" }, "sha512-LWuq4Dl9tff7n+HjJcqoBjDlVCtruc0shgtdtGM+rTUIE9aFxHA/P+wCYR+aWMjN8m9vNaRME/sKXErmhmeKrA=="],
+
+ "@oxc-parser/binding-win32-arm64-msvc": ["@oxc-parser/binding-win32-arm64-msvc@0.124.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-aOh3Lf3AeH0dgzT4yBXcArFZ8VhqNXwZ/xlN0GqBtgVaGoHOOqL2YHlcVIgT+ghsXPVR2PTtYgBiQ1CNK7jp5A=="],
+
+ "@oxc-parser/binding-win32-ia32-msvc": ["@oxc-parser/binding-win32-ia32-msvc@0.124.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-sib5xC0nz/+SCpaETBuHBz4SXS02KuG5HtyOcHsO/SK5ZvLRGhOZx0elDKawjb6adFkD7dQCqpXUS25wY6ELKQ=="],
+
+ "@oxc-parser/binding-win32-x64-msvc": ["@oxc-parser/binding-win32-x64-msvc@0.124.0", "", { "os": "win32", "cpu": "x64" }, "sha512-UgojtjGUgZgAZQYt7SC6VO65OVdxEkRe2q+2vbHJO//18qw3Hrk6UvHGQKldsQKgbVcIBT/YBrt85YberiYIPQ=="],
+
+ "@oxc-project/types": ["@oxc-project/types@0.124.0", "", {}, "sha512-VBFWMTBvHxS11Z5Lvlr3IWgrwhMTXV+Md+EQF0Xf60+wAdsGFTBx7X7K/hP4pi8N7dcm1RvcHwDxZ16Qx8keUg=="],
+
+ "@oxc-resolver/binding-android-arm-eabi": ["@oxc-resolver/binding-android-arm-eabi@11.19.1", "", { "os": "android", "cpu": "arm" }, "sha512-aUs47y+xyXHUKlbhqHUjBABjvycq6YSD7bpxSW7vplUmdzAlJ93yXY6ZR0c1o1x5A/QKbENCvs3+NlY8IpIVzg=="],
+
+ "@oxc-resolver/binding-android-arm64": ["@oxc-resolver/binding-android-arm64@11.19.1", "", { "os": "android", "cpu": "arm64" }, "sha512-oolbkRX+m7Pq2LNjr/kKgYeC7bRDMVTWPgxBGMjSpZi/+UskVo4jsMU3MLheZV55jL6c3rNelPl4oD60ggYmqA=="],
+
+ "@oxc-resolver/binding-darwin-arm64": ["@oxc-resolver/binding-darwin-arm64@11.19.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-nUC6d2i3R5B12sUW4O646qD5cnMXf2oBGPLIIeaRfU9doJRORAbE2SGv4eW6rMqhD+G7nf2Y8TTJTLiiO3Q/dQ=="],
+
+ "@oxc-resolver/binding-darwin-x64": ["@oxc-resolver/binding-darwin-x64@11.19.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-cV50vE5+uAgNcFa3QY1JOeKDSkM/9ReIcc/9wn4TavhW/itkDGrXhw9jaKnkQnGbjJ198Yh5nbX/Gr2mr4Z5jQ=="],
+
+ "@oxc-resolver/binding-freebsd-x64": ["@oxc-resolver/binding-freebsd-x64@11.19.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-xZOQiYGFxtk48PBKff+Zwoym7ScPAIVp4c14lfLxizO2LTTTJe5sx9vQNGrBymrf/vatSPNMD4FgsaaRigPkqw=="],
+
+ "@oxc-resolver/binding-linux-arm-gnueabihf": ["@oxc-resolver/binding-linux-arm-gnueabihf@11.19.1", "", { "os": "linux", "cpu": "arm" }, "sha512-lXZYWAC6kaGe/ky2su94e9jN9t6M0/6c+GrSlCqL//XO1cxi5lpAhnJYdyrKfm0ZEr/c7RNyAx3P7FSBcBd5+A=="],
+
+ "@oxc-resolver/binding-linux-arm-musleabihf": ["@oxc-resolver/binding-linux-arm-musleabihf@11.19.1", "", { "os": "linux", "cpu": "arm" }, "sha512-veG1kKsuK5+t2IsO9q0DErYVSw2azvCVvWHnfTOS73WE0STdLLB7Q1bB9WR+yHPQM76ASkFyRbogWo1GR1+WbQ=="],
+
+ "@oxc-resolver/binding-linux-arm64-gnu": ["@oxc-resolver/binding-linux-arm64-gnu@11.19.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-heV2+jmXyYnUrpUXSPugqWDRpnsQcDm2AX4wzTuvgdlZfoNYO0O3W2AVpJYaDn9AG4JdM6Kxom8+foE7/BcSig=="],
+
+ "@oxc-resolver/binding-linux-arm64-musl": ["@oxc-resolver/binding-linux-arm64-musl@11.19.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-jvo2Pjs1c9KPxMuMPIeQsgu0mOJF9rEb3y3TdpsrqwxRM+AN6/nDDwv45n5ZrUnQMsdBy5gIabioMKnQfWo9ew=="],
+
+ "@oxc-resolver/binding-linux-ppc64-gnu": ["@oxc-resolver/binding-linux-ppc64-gnu@11.19.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-vLmdNxWCdN7Uo5suays6A/+ywBby2PWBBPXctWPg5V0+eVuzsJxgAn6MMB4mPlshskYbppjpN2Zg83ArHze9gQ=="],
+
+ "@oxc-resolver/binding-linux-riscv64-gnu": ["@oxc-resolver/binding-linux-riscv64-gnu@11.19.1", "", { "os": "linux", "cpu": "none" }, "sha512-/b+WgR+VTSBxzgOhDO7TlMXC1ufPIMR6Vj1zN+/x+MnyXGW7prTLzU9eW85Aj7Th7CCEG9ArCbTeqxCzFWdg2w=="],
+
+ "@oxc-resolver/binding-linux-riscv64-musl": ["@oxc-resolver/binding-linux-riscv64-musl@11.19.1", "", { "os": "linux", "cpu": "none" }, "sha512-YlRdeWb9j42p29ROh+h4eg/OQ3dTJlpHSa+84pUM9+p6i3djtPz1q55yLJhgW9XfDch7FN1pQ/Vd6YP+xfRIuw=="],
+
+ "@oxc-resolver/binding-linux-s390x-gnu": ["@oxc-resolver/binding-linux-s390x-gnu@11.19.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-EDpafVOQWF8/MJynsjOGFThcqhRHy417sRyLfQmeiamJ8qVhSKAn2Dn2VVKUGCjVB9C46VGjhNo7nOPUi1x6uA=="],
+
+ "@oxc-resolver/binding-linux-x64-gnu": ["@oxc-resolver/binding-linux-x64-gnu@11.19.1", "", { "os": "linux", "cpu": "x64" }, "sha512-NxjZe+rqWhr+RT8/Ik+5ptA3oz7tUw361Wa5RWQXKnfqwSSHdHyrw6IdcTfYuml9dM856AlKWZIUXDmA9kkiBQ=="],
+
+ "@oxc-resolver/binding-linux-x64-musl": ["@oxc-resolver/binding-linux-x64-musl@11.19.1", "", { "os": "linux", "cpu": "x64" }, "sha512-cM/hQwsO3ReJg5kR+SpI69DMfvNCp+A/eVR4b4YClE5bVZwz8rh2Nh05InhwI5HR/9cArbEkzMjcKgTHS6UaNw=="],
+
+ "@oxc-resolver/binding-openharmony-arm64": ["@oxc-resolver/binding-openharmony-arm64@11.19.1", "", { "os": "none", "cpu": "arm64" }, "sha512-QF080IowFB0+9Rh6RcD19bdgh49BpQHUW5TajG1qvWHvmrQznTZZjYlgE2ltLXyKY+qs4F/v5xuX1XS7Is+3qA=="],
+
+ "@oxc-resolver/binding-wasm32-wasi": ["@oxc-resolver/binding-wasm32-wasi@11.19.1", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.1.1" }, "cpu": "none" }, "sha512-w8UCKhX826cP/ZLokXDS6+milN8y4X7zidsAttEdWlVoamTNf6lhBJldaWr3ukTDiye7s4HRcuPEPOXNC432Vg=="],
+
+ "@oxc-resolver/binding-win32-arm64-msvc": ["@oxc-resolver/binding-win32-arm64-msvc@11.19.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-nJ4AsUVZrVKwnU/QRdzPCCrO0TrabBqgJ8pJhXITdZGYOV28TIYystV1VFLbQ7DtAcaBHpocT5/ZJnF78YJPtQ=="],
+
+ "@oxc-resolver/binding-win32-ia32-msvc": ["@oxc-resolver/binding-win32-ia32-msvc@11.19.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-EW+ND5q2Tl+a3pH81l1QbfgbF3HmqgwLfDfVithRFheac8OTcnbXt/JxqD2GbDkb7xYEqy1zNaVFRr3oeG8npA=="],
+
+ "@oxc-resolver/binding-win32-x64-msvc": ["@oxc-resolver/binding-win32-x64-msvc@11.19.1", "", { "os": "win32", "cpu": "x64" }, "sha512-6hIU3RQu45B+VNTY4Ru8ppFwjVS/S5qwYyGhBotmjxfEKk41I2DlGtRfGJndZ5+6lneE2pwloqunlOyZuX/XAw=="],
+
+ "@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=="],
+
+ "@radix-ui/react-accordion": ["@radix-ui/react-accordion@1.2.12", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collapsible": "1.1.12", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2" }, "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-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA=="],
+
+ "@radix-ui/react-arrow": ["@radix-ui/react-arrow@1.1.7", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.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-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w=="],
+
+ "@radix-ui/react-collapsible": ["@radix-ui/react-collapsible@1.1.12", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "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-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA=="],
+
+ "@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@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-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw=="],
+
+ "@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg=="],
+
+ "@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="],
+
+ "@radix-ui/react-dialog": ["@radix-ui/react-dialog@1.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.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-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw=="],
+
+ "@radix-ui/react-direction": ["@radix-ui/react-direction@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw=="],
+
+ "@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-escape-keydown": "1.1.1" }, "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-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg=="],
+
+ "@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.1.3", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw=="],
+
+ "@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1" }, "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-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw=="],
+
+ "@radix-ui/react-id": ["@radix-ui/react-id@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg=="],
+
+ "@radix-ui/react-navigation-menu": ["@radix-ui/react-navigation-menu@1.2.14", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-visually-hidden": "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-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w=="],
+
+ "@radix-ui/react-popover": ["@radix-ui/react-popover@1.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.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-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA=="],
+
+ "@radix-ui/react-popper": ["@radix-ui/react-popper@1.2.8", "", { "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-rect": "1.1.1", "@radix-ui/react-use-size": "1.1.1", "@radix-ui/rect": "1.1.1" }, "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-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw=="],
+
+ "@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.9", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-layout-effect": "1.1.1" }, "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-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ=="],
+
+ "@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.5", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "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-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ=="],
+
+ "@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=="],
+
+ "@radix-ui/react-roving-focus": ["@radix-ui/react-roving-focus@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2" }, "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-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA=="],
+
+ "@radix-ui/react-scroll-area": ["@radix-ui/react-scroll-area@1.2.10", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1" }, "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-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A=="],
+
+ "@radix-ui/react-select": ["@radix-ui/react-select@2.2.6", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.3", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.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-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ=="],
+
+ "@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.4", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA=="],
+
+ "@radix-ui/react-tabs": ["@radix-ui/react-tabs@1.1.13", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-use-controllable-state": "1.2.2" }, "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-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A=="],
+
+ "@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg=="],
+
+ "@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.2.2", "", { "dependencies": { "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg=="],
+
+ "@radix-ui/react-use-effect-event": ["@radix-ui/react-use-effect-event@0.0.2", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA=="],
+
+ "@radix-ui/react-use-escape-keydown": ["@radix-ui/react-use-escape-keydown@1.1.1", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g=="],
+
+ "@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ=="],
+
+ "@radix-ui/react-use-previous": ["@radix-ui/react-use-previous@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ=="],
+
+ "@radix-ui/react-use-rect": ["@radix-ui/react-use-rect@1.1.1", "", { "dependencies": { "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w=="],
+
+ "@radix-ui/react-use-size": ["@radix-ui/react-use-size@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ=="],
+
+ "@radix-ui/react-visually-hidden": ["@radix-ui/react-visually-hidden@1.2.3", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.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-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug=="],
+
+ "@radix-ui/rect": ["@radix-ui/rect@1.1.1", "", {}, "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw=="],
+
+ "@scalar/helpers": ["@scalar/helpers@0.4.3", "", {}, "sha512-Gv2V7SFreLx3DltzF2lKXdaJSH5cP1LOyt9PxON1cSWGxkrs3sg93c1taEJsW24E9ckfYXkL5hjCAVLfAN3wQw=="],
+
+ "@scalar/json-magic": ["@scalar/json-magic@0.12.5", "", { "dependencies": { "@scalar/helpers": "0.4.3", "pathe": "^2.0.3", "yaml": "^2.8.0" } }, "sha512-MkGOjodEeQ7V7M78W6Oq+t3q1LaUR+SRLZLqFbU6s26Gc+12T+v89JXcHvd+3ug0xFVMg/kdczZ3O6miBhyNsA=="],
+
+ "@scalar/openapi-types": ["@scalar/openapi-types@0.7.0", "", {}, "sha512-kN0PwlJW0de4bwQ4ib+mBHzKJUvBCyR/gwU4zLEq6SCbj+GfgYUh+2a0/yl1WYVUiSkkwFsHjfmQ8KjhR3HK0Q=="],
+
+ "@scalar/openapi-upgrader": ["@scalar/openapi-upgrader@0.2.4", "", { "dependencies": { "@scalar/openapi-types": "0.7.0" } }, "sha512-AcrF7BMxKCTHnT82SHbHun6dJO4XC9tS5gD7EJsr/7YwFkx9JtbtZCryJXtqWJ5c7i1v1KH4PRRjDga/hCULTQ=="],
+
+ "@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=="],
+
+ "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-UpCB9Y2sUKlS9z8juFSKz7ZtysmeXCgnRF0dlhXBkmQnek7lAToPte8DkxmEYGNTMii72zU/lyXiCB6StuZeJg=="],
+
+ "@shikijs/langs": ["@shikijs/langs@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2" } }, "sha512-KaXby5dvoeuZzN0rYQiPMjFoUrz4hgwIE+D6Du9owcHcl6/g16/yT5BQxSW5cGt2MZBz6Hl0YuRqf12omRfUUg=="],
+
+ "@shikijs/primitive": ["@shikijs/primitive@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-M6UMPrSa3fN5ayeJwFVl9qWofl273wtK1VG8ySDZ1mQBfhCpdd8nEx7nPZ/tk7k+TYcpqBZzj/AnwxT9lO+HJw=="],
+
+ "@shikijs/rehype": ["@shikijs/rehype@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2", "@types/hast": "^3.0.4", "hast-util-to-string": "^3.0.1", "shiki": "4.0.2", "unified": "^11.0.5", "unist-util-visit": "^5.1.0" } }, "sha512-cmPlKLD8JeojasNFoY64162ScpEdEdQUMuVodPCrv1nx1z3bjmGwoKWDruQWa/ejSznImlaeB0Ty6Q3zPaVQAA=="],
+
+ "@shikijs/themes": ["@shikijs/themes@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2" } }, "sha512-mjCafwt8lJJaVSsQvNVrJumbnnj1RI8jbUKrPKgE6E3OvQKxnuRoBaYC51H4IGHePsGN/QtALglWBU7DoKDFnA=="],
+
+ "@shikijs/transformers": ["@shikijs/transformers@4.0.2", "", { "dependencies": { "@shikijs/core": "4.0.2", "@shikijs/types": "4.0.2" } }, "sha512-1+L0gf9v+SdDXs08vjaLb3mBFa8U7u37cwcBQIv/HCocLwX69Tt6LpUCjtB+UUTvQxI7BnjZKhN/wMjhHBcJGg=="],
+
+ "@shikijs/types": ["@shikijs/types@4.0.2", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-qzbeRooUTPnLE+sHD/Z8DStmaDgnbbc/pMrU203950aRqjX/6AFHeDYT+j00y2lPdz0ywJKx7o/7qnqTivtlXg=="],
+
+ "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="],
+
+ "@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=="],
+
+ "@tailwindcss/node": ["@tailwindcss/node@4.2.2", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.19.0", "jiti": "^2.6.1", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.2.2" } }, "sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA=="],
+
+ "@tailwindcss/oxide": ["@tailwindcss/oxide@4.2.2", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.2.2", "@tailwindcss/oxide-darwin-arm64": "4.2.2", "@tailwindcss/oxide-darwin-x64": "4.2.2", "@tailwindcss/oxide-freebsd-x64": "4.2.2", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.2", "@tailwindcss/oxide-linux-arm64-gnu": "4.2.2", "@tailwindcss/oxide-linux-arm64-musl": "4.2.2", "@tailwindcss/oxide-linux-x64-gnu": "4.2.2", "@tailwindcss/oxide-linux-x64-musl": "4.2.2", "@tailwindcss/oxide-wasm32-wasi": "4.2.2", "@tailwindcss/oxide-win32-arm64-msvc": "4.2.2", "@tailwindcss/oxide-win32-x64-msvc": "4.2.2" } }, "sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg=="],
+
+ "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.2.2", "", { "os": "android", "cpu": "arm64" }, "sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg=="],
+
+ "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.2.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg=="],
+
+ "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.2.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw=="],
+
+ "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.2.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ=="],
+
+ "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2", "", { "os": "linux", "cpu": "arm" }, "sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ=="],
+
+ "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.2.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw=="],
+
+ "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.2.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag=="],
+
+ "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.2.2", "", { "os": "linux", "cpu": "x64" }, "sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg=="],
+
+ "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.2.2", "", { "os": "linux", "cpu": "x64" }, "sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ=="],
+
+ "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.2.2", "", { "dependencies": { "@emnapi/core": "^1.8.1", "@emnapi/runtime": "^1.8.1", "@emnapi/wasi-threads": "^1.1.0", "@napi-rs/wasm-runtime": "^1.1.1", "@tybys/wasm-util": "^0.10.1", "tslib": "^2.8.1" }, "cpu": "none" }, "sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q=="],
+
+ "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.2.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ=="],
+
+ "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.2.2", "", { "os": "win32", "cpu": "x64" }, "sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA=="],
+
+ "@tailwindcss/postcss": ["@tailwindcss/postcss@4.2.2", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.2.2", "@tailwindcss/oxide": "4.2.2", "postcss": "^8.5.6", "tailwindcss": "4.2.2" } }, "sha512-n4goKQbW8RVXIbNKRB/45LzyUqN451deQK0nzIeauVEqjlI49slUlgKYJM2QyUzap/PcpnS7kzSUmPb1sCRvYQ=="],
+
+ "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="],
+
+ "@types/debug": ["@types/debug@4.1.13", "", { "dependencies": { "@types/ms": "*" } }, "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw=="],
+
+ "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
+
+ "@types/estree-jsx": ["@types/estree-jsx@1.0.5", "", { "dependencies": { "@types/estree": "*" } }, "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg=="],
+
+ "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="],
+
+ "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="],
+
+ "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="],
+
+ "@types/mdx": ["@types/mdx@2.0.13", "", {}, "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw=="],
+
+ "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="],
+
+ "@types/react": ["@types/react@19.2.14", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w=="],
+
+ "@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="],
+
+ "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="],
+
+ "@typescript-eslint/types": ["@typescript-eslint/types@8.58.1", "", {}, "sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw=="],
+
+ "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="],
+
+ "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=="],
+
+ "ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="],
+
+ "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
+
+ "aria-hidden": ["aria-hidden@1.2.6", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="],
+
+ "astring": ["astring@1.9.0", "", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="],
+
+ "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="],
+
+ "caniuse-lite": ["caniuse-lite@1.0.30001787", "", {}, "sha512-mNcrMN9KeI68u7muanUpEejSLghOKlVhRqS/Za2IeyGllJ9I9otGpR9g3nsw7n4W378TE/LyIteA0+/FOZm4Kg=="],
+
+ "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="],
+
+ "character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="],
+
+ "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="],
+
+ "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="],
+
+ "character-reference-invalid": ["character-reference-invalid@2.0.1", "", {}, "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw=="],
+
+ "chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="],
+
+ "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="],
+
+ "client-only": ["client-only@0.0.1", "", {}, "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="],
+
+ "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
+
+ "collapse-white-space": ["collapse-white-space@2.1.0", "", {}, "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw=="],
+
+ "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="],
+
+ "compute-scroll-into-view": ["compute-scroll-into-view@3.1.1", "", {}, "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw=="],
+
+ "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="],
+
+ "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="],
+
+ "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=="],
+
+ "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="],
+
+ "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
+
+ "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="],
+
+ "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="],
+
+ "enhanced-resolve": ["enhanced-resolve@5.20.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.0" } }, "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA=="],
+
+ "entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="],
+
+ "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.7", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.7", "@esbuild/android-arm": "0.27.7", "@esbuild/android-arm64": "0.27.7", "@esbuild/android-x64": "0.27.7", "@esbuild/darwin-arm64": "0.27.7", "@esbuild/darwin-x64": "0.27.7", "@esbuild/freebsd-arm64": "0.27.7", "@esbuild/freebsd-x64": "0.27.7", "@esbuild/linux-arm": "0.27.7", "@esbuild/linux-arm64": "0.27.7", "@esbuild/linux-ia32": "0.27.7", "@esbuild/linux-loong64": "0.27.7", "@esbuild/linux-mips64el": "0.27.7", "@esbuild/linux-ppc64": "0.27.7", "@esbuild/linux-riscv64": "0.27.7", "@esbuild/linux-s390x": "0.27.7", "@esbuild/linux-x64": "0.27.7", "@esbuild/netbsd-arm64": "0.27.7", "@esbuild/netbsd-x64": "0.27.7", "@esbuild/openbsd-arm64": "0.27.7", "@esbuild/openbsd-x64": "0.27.7", "@esbuild/openharmony-arm64": "0.27.7", "@esbuild/sunos-x64": "0.27.7", "@esbuild/win32-arm64": "0.27.7", "@esbuild/win32-ia32": "0.27.7", "@esbuild/win32-x64": "0.27.7" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w=="],
+
+ "escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="],
+
+ "esrap": ["esrap@2.2.4", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15", "@typescript-eslint/types": "^8.2.0" } }, "sha512-suICpxAmZ9A8bzJjEl/+rLJiDKC0X4gYWUxT6URAWBLvlXmtbZd5ySMu/N2ZGEtMCAmflUDPSehrP9BQcsGcSg=="],
+
+ "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=="],
+
+ "estree-util-is-identifier-name": ["estree-util-is-identifier-name@3.0.0", "", {}, "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg=="],
+
+ "estree-util-scope": ["estree-util-scope@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0" } }, "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ=="],
+
+ "estree-util-to-js": ["estree-util-to-js@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "astring": "^1.8.0", "source-map": "^0.7.0" } }, "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg=="],
+
+ "estree-util-value-to-estree": ["estree-util-value-to-estree@3.5.0", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ=="],
+
+ "estree-util-visit": ["estree-util-visit@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/unist": "^3.0.0" } }, "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww=="],
+
+ "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="],
+
+ "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="],
+
+ "fast-content-type-parse": ["fast-content-type-parse@3.0.0", "", {}, "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg=="],
+
+ "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
+
+ "fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="],
+
+ "fast-xml-builder": ["fast-xml-builder@1.1.4", "", { "dependencies": { "path-expression-matcher": "^1.1.3" } }, "sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg=="],
+
+ "fast-xml-parser": ["fast-xml-parser@5.5.11", "", { "dependencies": { "fast-xml-builder": "^1.1.4", "path-expression-matcher": "^1.4.0", "strnum": "^2.2.3" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-QL0eb0YbSTVWF6tTf1+LEMSgtCEjBYPpnAjoLC8SscESlAjXEIRJ7cHtLG0pLeDFaZLa4VKZLArtA/60ZS7vyA=="],
+
+ "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
+
+ "foreach": ["foreach@2.0.6", "", {}, "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg=="],
+
+ "framer-motion": ["framer-motion@12.38.0", "", { "dependencies": { "motion-dom": "^12.38.0", "motion-utils": "^12.36.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-rFYkY/pigbcswl1XQSb7q424kSTQ8q6eAC+YUsSKooHQYuLdzdHjrt6uxUC+PRAO++q5IS7+TamgIw1AphxR+g=="],
+
+ "fuma-cli": ["fuma-cli@0.0.3", "", { "dependencies": { "magic-string": "^0.30.21", "oxc-parser": "^0.124.0", "oxc-resolver": "^11.19.1", "package-manager-detector": "^1.6.0", "picocolors": "^1.1.1", "tinyexec": "^1.0.4", "zod": "^4.3.6" } }, "sha512-DefY1l9+PdairAjOeMfHMCHwkP9kRo7pqqpqb2qFpjb3Vxa8XIpPVVrFGR+9eMfE7Bp6rxsg8NAE3XRPLMWiDA=="],
+
+ "fumadocs-core": ["fumadocs-core@16.7.11", "", { "dependencies": { "@formatjs/intl-localematcher": "^0.8.2", "@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.4.2", "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.16", "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-v09UEizAi7NfqwYEq2hvDimicj6ZX7xBYcOjp3vGwXZr9Vn/S2bI76HM6YWr38DmIcj1ed8zFTf1lWJsJRYN+w=="],
+
+ "fumadocs-mdx": ["fumadocs-mdx@14.2.11", "", { "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-mdx": "^3.0.0", "mdast-util-to-markdown": "^2.1.2", "picocolors": "^1.1.1", "picomatch": "^4.0.3", "tinyexec": "^1.0.4", "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": "*", "next": "^15.3.0 || ^16.0.0", "react": "*", "vite": "6.x.x || 7.x.x || 8.x.x" }, "optionalPeers": ["@fumadocs/mdx-remote", "@types/mdast", "@types/mdx", "@types/react", "mdast-util-directive", "next", "react", "vite"], "bin": { "fumadocs-mdx": "dist/bin.js" } }, "sha512-j0gHKs45c62ARteE8/yBM2Nu2I8AE2Cs37ktPEdc/8EX7TL66XP74un5OpHp6itLyWTu8Jur0imOiiIDq8+rDg=="],
+
+ "fumadocs-openapi": ["fumadocs-openapi@10.6.7", "", { "dependencies": { "@fastify/deepmerge": "^3.2.1", "@fumari/json-schema-ts": "^0.0.2", "@fumari/stf": "1.0.4", "@radix-ui/react-accordion": "^1.2.12", "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-select": "^2.2.6", "@radix-ui/react-slot": "^1.2.4", "@scalar/json-magic": "^0.12.5", "@scalar/openapi-upgrader": "^0.2.4", "ajv": "^8.18.0", "chokidar": "^5.0.0", "class-variance-authority": "^0.7.1", "fast-content-type-parse": "^3.0.0", "github-slugger": "^2.0.0", "hast-util-to-jsx-runtime": "^2.3.6", "js-yaml": "^4.1.1", "lucide-react": "^1.7.0", "next-themes": "^0.4.6", "openapi-sampler": "^1.7.2", "react-hook-form": "^7.72.1", "remark": "^15.0.1", "remark-rehype": "^11.1.2", "tailwind-merge": "^3.5.0", "xml-js": "^1.6.11" }, "peerDependencies": { "@scalar/api-client-react": "*", "@types/react": "*", "fumadocs-core": "^16.7.0", "fumadocs-ui": "^16.7.0", "json-schema-typed": "*", "react": "^19.2.0", "react-dom": "^19.2.0", "shiki": "*" }, "optionalPeers": ["@scalar/api-client-react", "@types/react", "json-schema-typed", "shiki"] }, "sha512-WxjX0U6SG4PFDCSwUkuzA8LQ2X+Ou5vYA2RtE4t4i9oXstQAZKTV4llA4BI2ZbU+QVjzbzDXtG0HIykYIembgg=="],
+
+ "fumadocs-ui": ["fumadocs-ui@16.7.11", "", { "dependencies": { "@fumadocs/tailwind": "0.0.3", "@radix-ui/react-accordion": "^1.2.12", "@radix-ui/react-collapsible": "^1.1.12", "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-direction": "^1.1.1", "@radix-ui/react-navigation-menu": "^1.2.14", "@radix-ui/react-popover": "^1.1.15", "@radix-ui/react-presence": "^1.1.5", "@radix-ui/react-scroll-area": "^1.2.10", "@radix-ui/react-slot": "^1.2.4", "@radix-ui/react-tabs": "^1.1.13", "class-variance-authority": "^0.7.1", "fuma-cli": "^0.0.3", "lucide-react": "^1.7.0", "motion": "^12.38.0", "next-themes": "^0.4.6", "react-medium-image-zoom": "^5.4.3", "react-remove-scroll": "^2.7.2", "rehype-raw": "^7.0.0", "scroll-into-view-if-needed": "^3.1.0", "tailwind-merge": "^3.5.0", "unist-util-visit": "^5.1.0" }, "peerDependencies": { "@takumi-rs/image-response": "*", "@types/mdx": "*", "@types/react": "*", "fumadocs-core": "16.7.11", "next": "16.x.x", "react": "^19.2.0", "react-dom": "^19.2.0", "shiki": "*" }, "optionalPeers": ["@takumi-rs/image-response", "@types/mdx", "@types/react", "next", "shiki"] }, "sha512-vEo4bGuWhhM3BBX/vRYDSpF666WJ+EbPke50LgdAdPlQUstRsvkOjWkta/GA9Vggph+aPKSk0AK8isJiMu4t8Q=="],
+
+ "get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="],
+
+ "github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="],
+
+ "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
+
+ "hast-util-from-parse5": ["hast-util-from-parse5@8.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "hastscript": "^9.0.0", "property-information": "^7.0.0", "vfile": "^6.0.0", "vfile-location": "^5.0.0", "web-namespaces": "^2.0.0" } }, "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg=="],
+
+ "hast-util-parse-selector": ["hast-util-parse-selector@4.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A=="],
+
+ "hast-util-raw": ["hast-util-raw@9.1.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "@ungap/structured-clone": "^1.0.0", "hast-util-from-parse5": "^8.0.0", "hast-util-to-parse5": "^8.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "parse5": "^7.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw=="],
+
+ "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=="],
+
+ "hast-util-to-html": ["hast-util-to-html@9.0.5", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="],
+
+ "hast-util-to-jsx-runtime": ["hast-util-to-jsx-runtime@2.3.6", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.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", "vfile-message": "^4.0.0" } }, "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg=="],
+
+ "hast-util-to-parse5": ["hast-util-to-parse5@8.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA=="],
+
+ "hast-util-to-string": ["hast-util-to-string@3.0.1", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A=="],
+
+ "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="],
+
+ "hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="],
+
+ "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="],
+
+ "image-size": ["image-size@2.0.2", "", { "bin": { "image-size": "bin/image-size.js" } }, "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w=="],
+
+ "inline-style-parser": ["inline-style-parser@0.2.7", "", {}, "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA=="],
+
+ "is-alphabetical": ["is-alphabetical@2.0.1", "", {}, "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ=="],
+
+ "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="],
+
+ "is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="],
+
+ "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=="],
+
+ "jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="],
+
+ "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="],
+
+ "json-pointer": ["json-pointer@0.6.2", "", { "dependencies": { "foreach": "^2.0.4" } }, "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw=="],
+
+ "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
+
+ "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=="],
+
+ "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="],
+
+ "lucide-react": ["lucide-react@1.8.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-WuvlsjngSk7TnTBJ1hsCy3ql9V9VOdcPkd3PKcSmM34vJD8KG6molxz7m7zbYFgICwsanQWmJ13JlYs4Zp7Arw=="],
+
+ "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
+
+ "markdown-extensions": ["markdown-extensions@2.0.0", "", {}, "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q=="],
+
+ "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="],
+
+ "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.3", "", { "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-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q=="],
+
+ "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=="],
+
+ "mdast-util-gfm-footnote": ["mdast-util-gfm-footnote@2.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0" } }, "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ=="],
+
+ "mdast-util-gfm-strikethrough": ["mdast-util-gfm-strikethrough@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg=="],
+
+ "mdast-util-gfm-table": ["mdast-util-gfm-table@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "markdown-table": "^3.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg=="],
+
+ "mdast-util-gfm-task-list-item": ["mdast-util-gfm-task-list-item@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ=="],
+
+ "mdast-util-mdx": ["mdast-util-mdx@3.0.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w=="],
+
+ "mdast-util-mdx-expression": ["mdast-util-mdx-expression@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ=="],
+
+ "mdast-util-mdx-jsx": ["mdast-util-mdx-jsx@3.2.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "devlop": "^1.1.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-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" } }, "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q=="],
+
+ "mdast-util-mdxjs-esm": ["mdast-util-mdxjs-esm@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg=="],
+
+ "mdast-util-phrasing": ["mdast-util-phrasing@4.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" } }, "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w=="],
+
+ "mdast-util-to-hast": ["mdast-util-to-hast@13.2.1", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA=="],
+
+ "mdast-util-to-markdown": ["mdast-util-to-markdown@2.1.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA=="],
+
+ "mdast-util-to-string": ["mdast-util-to-string@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0" } }, "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg=="],
+
+ "micromark": ["micromark@4.0.2", "", { "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA=="],
+
+ "micromark-core-commonmark": ["micromark-core-commonmark@2.0.3", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-destination": "^2.0.0", "micromark-factory-label": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-factory-title": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-html-tag-name": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg=="],
+
+ "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=="],
+
+ "micromark-extension-gfm-footnote": ["micromark-extension-gfm-footnote@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw=="],
+
+ "micromark-extension-gfm-strikethrough": ["micromark-extension-gfm-strikethrough@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw=="],
+
+ "micromark-extension-gfm-table": ["micromark-extension-gfm-table@2.1.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg=="],
+
+ "micromark-extension-gfm-tagfilter": ["micromark-extension-gfm-tagfilter@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg=="],
+
+ "micromark-extension-gfm-task-list-item": ["micromark-extension-gfm-task-list-item@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw=="],
+
+ "micromark-extension-mdx-expression": ["micromark-extension-mdx-expression@3.0.1", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q=="],
+
+ "micromark-extension-mdx-jsx": ["micromark-extension-mdx-jsx@3.0.2", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ=="],
+
+ "micromark-extension-mdx-md": ["micromark-extension-mdx-md@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ=="],
+
+ "micromark-extension-mdxjs": ["micromark-extension-mdxjs@3.0.0", "", { "dependencies": { "acorn": "^8.0.0", "acorn-jsx": "^5.0.0", "micromark-extension-mdx-expression": "^3.0.0", "micromark-extension-mdx-jsx": "^3.0.0", "micromark-extension-mdx-md": "^2.0.0", "micromark-extension-mdxjs-esm": "^3.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ=="],
+
+ "micromark-extension-mdxjs-esm": ["micromark-extension-mdxjs-esm@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A=="],
+
+ "micromark-factory-destination": ["micromark-factory-destination@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA=="],
+
+ "micromark-factory-label": ["micromark-factory-label@2.0.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg=="],
+
+ "micromark-factory-mdx-expression": ["micromark-factory-mdx-expression@2.0.3", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ=="],
+
+ "micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="],
+
+ "micromark-factory-title": ["micromark-factory-title@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw=="],
+
+ "micromark-factory-whitespace": ["micromark-factory-whitespace@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ=="],
+
+ "micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="],
+
+ "micromark-util-chunked": ["micromark-util-chunked@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA=="],
+
+ "micromark-util-classify-character": ["micromark-util-classify-character@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q=="],
+
+ "micromark-util-combine-extensions": ["micromark-util-combine-extensions@2.0.1", "", { "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg=="],
+
+ "micromark-util-decode-numeric-character-reference": ["micromark-util-decode-numeric-character-reference@2.0.2", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw=="],
+
+ "micromark-util-decode-string": ["micromark-util-decode-string@2.0.1", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ=="],
+
+ "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="],
+
+ "micromark-util-events-to-acorn": ["micromark-util-events-to-acorn@2.0.3", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg=="],
+
+ "micromark-util-html-tag-name": ["micromark-util-html-tag-name@2.0.1", "", {}, "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA=="],
+
+ "micromark-util-normalize-identifier": ["micromark-util-normalize-identifier@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q=="],
+
+ "micromark-util-resolve-all": ["micromark-util-resolve-all@2.0.1", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg=="],
+
+ "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="],
+
+ "micromark-util-subtokenize": ["micromark-util-subtokenize@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA=="],
+
+ "micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="],
+
+ "micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="],
+
+ "motion": ["motion@12.38.0", "", { "dependencies": { "framer-motion": "^12.38.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-uYfXzeHlgThchzwz5Te47dlv5JOUC7OB4rjJ/7XTUgtBZD8CchMN8qEJ4ZVsUmTyYA44zjV0fBwsiktRuFnn+w=="],
+
+ "motion-dom": ["motion-dom@12.38.0", "", { "dependencies": { "motion-utils": "^12.36.0" } }, "sha512-pdkHLD8QYRp8VfiNLb8xIBJis1byQ9gPT3Jnh2jqfFtAsWUA3dEepDlsWe/xMpO8McV+VdpKVcp+E+TGJEtOoA=="],
+
+ "motion-utils": ["motion-utils@12.36.0", "", {}, "sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg=="],
+
+ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
+
+ "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
+
+ "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="],
+
+ "next": ["next@15.5.15", "", { "dependencies": { "@next/env": "15.5.15", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "15.5.15", "@next/swc-darwin-x64": "15.5.15", "@next/swc-linux-arm64-gnu": "15.5.15", "@next/swc-linux-arm64-musl": "15.5.15", "@next/swc-linux-x64-gnu": "15.5.15", "@next/swc-linux-x64-musl": "15.5.15", "@next/swc-win32-arm64-msvc": "15.5.15", "@next/swc-win32-x64-msvc": "15.5.15", "sharp": "^0.34.3" }, "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-VSqCrJwtLVGwAVE0Sb/yikrQfkwkZW9p+lL/J4+xe+G3ZA+QnWPqgcfH1tDUEuk9y+pthzzVFp4L/U8JerMfMQ=="],
+
+ "next-themes": ["next-themes@0.4.6", "", { "peerDependencies": { "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA=="],
+
+ "npm-to-yarn": ["npm-to-yarn@3.0.1", "", {}, "sha512-tt6PvKu4WyzPwWUzy/hvPFqn+uwXO0K1ZHka8az3NnrhWJDmSqI8ncWq0fkL0k/lmmi5tAC11FXwXuh0rFbt1A=="],
+
+ "oniguruma-parser": ["oniguruma-parser@0.12.1", "", {}, "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w=="],
+
+ "oniguruma-to-es": ["oniguruma-to-es@4.3.5", "", { "dependencies": { "oniguruma-parser": "^0.12.1", "regex": "^6.1.0", "regex-recursion": "^6.0.2" } }, "sha512-Zjygswjpsewa0NLTsiizVuMQZbp0MDyM6lIt66OxsF21npUDlzpHi1Mgb/qhQdkb+dWFTzJmFbEWdvZgRho8eQ=="],
+
+ "openapi-sampler": ["openapi-sampler@1.7.2", "", { "dependencies": { "@types/json-schema": "^7.0.7", "fast-xml-parser": "^5.5.1", "json-pointer": "0.6.2" } }, "sha512-OKytvqB5XIaTgA9xtw8W8UTar+uymW2xPVpFN0NihMtuHPdPTGxBEhGnfFnJW5g/gOSIvkP+H0Xh3XhVI9/n7g=="],
+
+ "oxc-parser": ["oxc-parser@0.124.0", "", { "dependencies": { "@oxc-project/types": "^0.124.0" }, "optionalDependencies": { "@oxc-parser/binding-android-arm-eabi": "0.124.0", "@oxc-parser/binding-android-arm64": "0.124.0", "@oxc-parser/binding-darwin-arm64": "0.124.0", "@oxc-parser/binding-darwin-x64": "0.124.0", "@oxc-parser/binding-freebsd-x64": "0.124.0", "@oxc-parser/binding-linux-arm-gnueabihf": "0.124.0", "@oxc-parser/binding-linux-arm-musleabihf": "0.124.0", "@oxc-parser/binding-linux-arm64-gnu": "0.124.0", "@oxc-parser/binding-linux-arm64-musl": "0.124.0", "@oxc-parser/binding-linux-ppc64-gnu": "0.124.0", "@oxc-parser/binding-linux-riscv64-gnu": "0.124.0", "@oxc-parser/binding-linux-riscv64-musl": "0.124.0", "@oxc-parser/binding-linux-s390x-gnu": "0.124.0", "@oxc-parser/binding-linux-x64-gnu": "0.124.0", "@oxc-parser/binding-linux-x64-musl": "0.124.0", "@oxc-parser/binding-openharmony-arm64": "0.124.0", "@oxc-parser/binding-wasm32-wasi": "0.124.0", "@oxc-parser/binding-win32-arm64-msvc": "0.124.0", "@oxc-parser/binding-win32-ia32-msvc": "0.124.0", "@oxc-parser/binding-win32-x64-msvc": "0.124.0" } }, "sha512-h07SFj/tp2U3cf3+LFX6MmOguQiM9ahwpGs0ZK5CGhgL8p4kk24etrJKsEzhXAvo7mfvoKTZooZ5MLKAPRmJ1g=="],
+
+ "oxc-resolver": ["oxc-resolver@11.19.1", "", { "optionalDependencies": { "@oxc-resolver/binding-android-arm-eabi": "11.19.1", "@oxc-resolver/binding-android-arm64": "11.19.1", "@oxc-resolver/binding-darwin-arm64": "11.19.1", "@oxc-resolver/binding-darwin-x64": "11.19.1", "@oxc-resolver/binding-freebsd-x64": "11.19.1", "@oxc-resolver/binding-linux-arm-gnueabihf": "11.19.1", "@oxc-resolver/binding-linux-arm-musleabihf": "11.19.1", "@oxc-resolver/binding-linux-arm64-gnu": "11.19.1", "@oxc-resolver/binding-linux-arm64-musl": "11.19.1", "@oxc-resolver/binding-linux-ppc64-gnu": "11.19.1", "@oxc-resolver/binding-linux-riscv64-gnu": "11.19.1", "@oxc-resolver/binding-linux-riscv64-musl": "11.19.1", "@oxc-resolver/binding-linux-s390x-gnu": "11.19.1", "@oxc-resolver/binding-linux-x64-gnu": "11.19.1", "@oxc-resolver/binding-linux-x64-musl": "11.19.1", "@oxc-resolver/binding-openharmony-arm64": "11.19.1", "@oxc-resolver/binding-wasm32-wasi": "11.19.1", "@oxc-resolver/binding-win32-arm64-msvc": "11.19.1", "@oxc-resolver/binding-win32-ia32-msvc": "11.19.1", "@oxc-resolver/binding-win32-x64-msvc": "11.19.1" } }, "sha512-qE/CIg/spwrTBFt5aKmwe3ifeDdLfA2NESN30E42X/lII5ClF8V7Wt6WIJhcGZjp0/Q+nQ+9vgxGk//xZNX2hg=="],
+
+ "package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="],
+
+ "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=="],
+
+ "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="],
+
+ "path-expression-matcher": ["path-expression-matcher@1.5.0", "", {}, "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ=="],
+
+ "path-to-regexp": ["path-to-regexp@8.4.2", "", {}, "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA=="],
+
+ "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="],
+
+ "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
+
+ "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="],
+
+ "postcss": ["postcss@8.5.9", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw=="],
+
+ "postcss-selector-parser": ["postcss-selector-parser@7.1.1", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg=="],
+
+ "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="],
+
+ "react": ["react@19.2.5", "", {}, "sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA=="],
+
+ "react-dom": ["react-dom@19.2.5", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.5" } }, "sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag=="],
+
+ "react-hook-form": ["react-hook-form@7.72.1", "", { "peerDependencies": { "react": "^16.8.0 || ^17 || ^18 || ^19" } }, "sha512-RhwBoy2ygeVZje+C+bwJ8g0NjTdBmDlJvAUHTxRjTmSUKPYsKfMphkS2sgEMotsY03bP358yEYlnUeZy//D9Ig=="],
+
+ "react-medium-image-zoom": ["react-medium-image-zoom@5.4.3", "", { "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-cDIwdn35fRUPsGnnj/cG6Pacll+z+Mfv6EWU2wDO5ngbZjg5uLRb2ZhEnh92ufbXCJDFvXHekb8G3+oKqUcv5g=="],
+
+ "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-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=="],
+
+ "recma-build-jsx": ["recma-build-jsx@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-build-jsx": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew=="],
+
+ "recma-jsx": ["recma-jsx@1.0.1", "", { "dependencies": { "acorn-jsx": "^5.0.0", "estree-util-to-js": "^2.0.0", "recma-parse": "^1.0.0", "recma-stringify": "^1.0.0", "unified": "^11.0.0" }, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w=="],
+
+ "recma-parse": ["recma-parse@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "esast-util-from-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ=="],
+
+ "recma-stringify": ["recma-stringify@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-to-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g=="],
+
+ "regex": ["regex@6.1.0", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg=="],
+
+ "regex-recursion": ["regex-recursion@6.0.2", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg=="],
+
+ "regex-utilities": ["regex-utilities@2.3.0", "", {}, "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng=="],
+
+ "rehype-raw": ["rehype-raw@7.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-raw": "^9.0.0", "vfile": "^6.0.0" } }, "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww=="],
+
+ "rehype-recma": ["rehype-recma@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "hast-util-to-estree": "^3.0.0" } }, "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw=="],
+
+ "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-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-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=="],
+
+ "remark-stringify": ["remark-stringify@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", "unified": "^11.0.0" } }, "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw=="],
+
+ "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="],
+
+ "sax": ["sax@1.6.0", "", {}, "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA=="],
+
+ "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=="],
+
+ "semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
+
+ "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=="],
+
+ "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=="],
+
+ "source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="],
+
+ "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
+
+ "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="],
+
+ "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=="],
+
+ "strnum": ["strnum@2.2.3", "", {}, "sha512-oKx6RUCuHfT3oyVjtnrmn19H1SiCqgJSg+54XqURKp5aCMbrXrhLjRN9TjuwMjiYstZ0MzDrHqkGZ5dFTKd+zg=="],
+
+ "style-to-js": ["style-to-js@1.1.21", "", { "dependencies": { "style-to-object": "1.0.14" } }, "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ=="],
+
+ "style-to-object": ["style-to-object@1.0.14", "", { "dependencies": { "inline-style-parser": "0.2.7" } }, "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw=="],
+
+ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="],
+
+ "tailwind-merge": ["tailwind-merge@3.5.0", "", {}, "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A=="],
+
+ "tailwindcss": ["tailwindcss@4.2.2", "", {}, "sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q=="],
+
+ "tapable": ["tapable@2.3.2", "", {}, "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA=="],
+
+ "tinyexec": ["tinyexec@1.1.1", "", {}, "sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg=="],
+
+ "tinyglobby": ["tinyglobby@0.2.16", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg=="],
+
+ "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="],
+
+ "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="],
+
+ "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
+
+ "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
+
+ "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-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=="],
+
+ "unist-util-remove-position": ["unist-util-remove-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q=="],
+
+ "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="],
+
+ "unist-util-visit": ["unist-util-visit@5.1.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg=="],
+
+ "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=="],
+
+ "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=="],
+
+ "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
+
+ "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="],
+
+ "vfile-location": ["vfile-location@5.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg=="],
+
+ "vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="],
+
+ "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="],
+
+ "xml-js": ["xml-js@1.6.11", "", { "dependencies": { "sax": "^1.2.4" }, "bin": { "xml-js": "./bin/cli.js" } }, "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g=="],
+
+ "yaml": ["yaml@2.8.3", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg=="],
+
+ "zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="],
+
+ "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="],
+
+ "@radix-ui/react-collection/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="],
+
+ "@radix-ui/react-dialog/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="],
+
+ "@radix-ui/react-popover/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="],
+
+ "@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="],
+
+ "@radix-ui/react-select/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="],
+
+ "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.9.2", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" }, "bundled": true }, "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA=="],
+
+ "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.9.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw=="],
+
+ "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="],
+
+ "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.3", "", { "dependencies": { "@tybys/wasm-util": "^0.10.1" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" }, "bundled": true }, "sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ=="],
+
+ "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="],
+
+ "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
+
+ "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=="],
+ }
+}
diff --git a/docs/next.config.mjs b/docs/next.config.mjs
new file mode 100644
index 0000000..fa8526b
--- /dev/null
+++ b/docs/next.config.mjs
@@ -0,0 +1,8 @@
+import { createMDX } from 'fumadocs-mdx/next';
+
+const withMDX = createMDX();
+
+/** @type {import('next').NextConfig} */
+const config = {};
+
+export default withMDX(config);
diff --git a/docs/package.json b/docs/package.json
new file mode 100644
index 0000000..0e90b80
--- /dev/null
+++ b/docs/package.json
@@ -0,0 +1,26 @@
+{
+ "name": "strimulator-docs",
+ "private": true,
+ "scripts": {
+ "dev": "next dev --turbopack",
+ "build": "next build",
+ "start": "next start",
+ "generate": "bun ./scripts/generate-docs.ts"
+ },
+ "dependencies": {
+ "fumadocs-core": "latest",
+ "fumadocs-mdx": "latest",
+ "fumadocs-openapi": "latest",
+ "fumadocs-ui": "latest",
+ "next": "^15",
+ "react": "^19",
+ "react-dom": "^19"
+ },
+ "devDependencies": {
+ "@types/react": "^19",
+ "@types/react-dom": "^19",
+ "typescript": "^5",
+ "@tailwindcss/postcss": "^4",
+ "tailwindcss": "^4"
+ }
+}
diff --git a/docs/postcss.config.mjs b/docs/postcss.config.mjs
new file mode 100644
index 0000000..61e3684
--- /dev/null
+++ b/docs/postcss.config.mjs
@@ -0,0 +1,7 @@
+const config = {
+ plugins: {
+ "@tailwindcss/postcss": {},
+ },
+};
+
+export default config;
diff --git a/docs/source.config.ts b/docs/source.config.ts
new file mode 100644
index 0000000..0b6ee4d
--- /dev/null
+++ b/docs/source.config.ts
@@ -0,0 +1,7 @@
+import { defineDocs, defineConfig } from 'fumadocs-mdx/config';
+
+export const docs = defineDocs({
+ dir: 'content/docs',
+});
+
+export default defineConfig();
diff --git a/docs/tsconfig.json b/docs/tsconfig.json
new file mode 100644
index 0000000..1b5ad52
--- /dev/null
+++ b/docs/tsconfig.json
@@ -0,0 +1,23 @@
+{
+ "compilerOptions": {
+ "target": "ESNext",
+ "lib": ["dom", "dom.iterable", "esnext"],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "strict": true,
+ "noEmit": true,
+ "esModuleInterop": true,
+ "module": "ESNext",
+ "moduleResolution": "bundler",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "jsx": "preserve",
+ "incremental": true,
+ "plugins": [{ "name": "next" }],
+ "paths": {
+ "@/*": ["./*"]
+ }
+ },
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".source/**/*.ts"],
+ "exclude": ["node_modules"]
+}
From 79eb0a4c2729f1be576213127f227399591cdbd5 Mon Sep 17 00:00:00 2001
From: Segfault <5221072+Segfaultd@users.noreply.github.com>
Date: Fri, 10 Apr 2026 10:08:49 +0200
Subject: [PATCH 02/10] Set up Fumadocs UI app directory with layouts and page
renderer
---
docs/app/docs/[[...slug]]/page.tsx | 36 ++++++++++++++++++++++++++++++
docs/app/docs/layout.tsx | 12 ++++++++++
docs/app/global.css | 2 ++
docs/app/layout.tsx | 13 +++++++++++
docs/app/page.tsx | 5 +++++
docs/components/mdx.tsx | 8 +++++++
docs/lib/layout.shared.tsx | 17 ++++++++++++++
docs/lib/source.ts | 8 +++++++
8 files changed, 101 insertions(+)
create mode 100644 docs/app/docs/[[...slug]]/page.tsx
create mode 100644 docs/app/docs/layout.tsx
create mode 100644 docs/app/global.css
create mode 100644 docs/app/layout.tsx
create mode 100644 docs/app/page.tsx
create mode 100644 docs/components/mdx.tsx
create mode 100644 docs/lib/layout.shared.tsx
create mode 100644 docs/lib/source.ts
diff --git a/docs/app/docs/[[...slug]]/page.tsx b/docs/app/docs/[[...slug]]/page.tsx
new file mode 100644
index 0000000..c73781c
--- /dev/null
+++ b/docs/app/docs/[[...slug]]/page.tsx
@@ -0,0 +1,36 @@
+import { source } from '@/lib/source';
+import { notFound } from 'next/navigation';
+import {
+ DocsPage,
+ DocsBody,
+ DocsTitle,
+ DocsDescription,
+} from 'fumadocs-ui/layouts/docs/page';
+import { getMDXComponents } from '@/components/mdx';
+
+export default async function Page({
+ params,
+}: {
+ params: Promise<{ slug?: string[] }>;
+}) {
+ const { slug } = await params;
+ const page = source.getPage(slug);
+
+ if (!page) notFound();
+
+ const Mdx = page.data.body;
+
+ return (
+
+ {page.data.title}
+ {page.data.description}
+
+
+
+
+ );
+}
+
+export function generateStaticParams() {
+ return source.generateParams();
+}
diff --git a/docs/app/docs/layout.tsx b/docs/app/docs/layout.tsx
new file mode 100644
index 0000000..59876d8
--- /dev/null
+++ b/docs/app/docs/layout.tsx
@@ -0,0 +1,12 @@
+import { DocsLayout } from 'fumadocs-ui/layouts/docs';
+import { baseOptions } from '@/lib/layout.shared';
+import { source } from '@/lib/source';
+import type { ReactNode } from 'react';
+
+export default function Layout({ children }: { children: ReactNode }) {
+ return (
+
+ {children}
+
+ );
+}
diff --git a/docs/app/global.css b/docs/app/global.css
new file mode 100644
index 0000000..a729c78
--- /dev/null
+++ b/docs/app/global.css
@@ -0,0 +1,2 @@
+@import "tailwindcss";
+@import "fumadocs-ui/css/ui.css";
diff --git a/docs/app/layout.tsx b/docs/app/layout.tsx
new file mode 100644
index 0000000..6570be0
--- /dev/null
+++ b/docs/app/layout.tsx
@@ -0,0 +1,13 @@
+import { RootProvider } from 'fumadocs-ui/provider/next';
+import type { ReactNode } from 'react';
+import './global.css';
+
+export default function Layout({ children }: { children: ReactNode }) {
+ return (
+
+
+ {children}
+
+
+ );
+}
diff --git a/docs/app/page.tsx b/docs/app/page.tsx
new file mode 100644
index 0000000..88715e3
--- /dev/null
+++ b/docs/app/page.tsx
@@ -0,0 +1,5 @@
+import { redirect } from 'next/navigation';
+
+export default function Home() {
+ redirect('/docs');
+}
diff --git a/docs/components/mdx.tsx b/docs/components/mdx.tsx
new file mode 100644
index 0000000..1381cae
--- /dev/null
+++ b/docs/components/mdx.tsx
@@ -0,0 +1,8 @@
+import defaultMdxComponents from 'fumadocs-ui/mdx';
+import type { MDXComponents } from 'mdx/types';
+
+export function getMDXComponents(): MDXComponents {
+ return {
+ ...defaultMdxComponents,
+ };
+}
diff --git a/docs/lib/layout.shared.tsx b/docs/lib/layout.shared.tsx
new file mode 100644
index 0000000..73e5580
--- /dev/null
+++ b/docs/lib/layout.shared.tsx
@@ -0,0 +1,17 @@
+import type { BaseLayoutProps } from 'fumadocs-ui/layouts/shared';
+
+export function baseOptions(): BaseLayoutProps {
+ return {
+ nav: {
+ title: 'Strimulator',
+ },
+ links: [
+ {
+ text: 'Documentation',
+ url: '/docs',
+ active: 'nested-url',
+ },
+ ],
+ githubUrl: 'https://github.com/codeforge-tech/strimulator',
+ };
+}
diff --git a/docs/lib/source.ts b/docs/lib/source.ts
new file mode 100644
index 0000000..cc1e294
--- /dev/null
+++ b/docs/lib/source.ts
@@ -0,0 +1,8 @@
+import { docs, meta } from '@/.source';
+import { createMDXSource } from 'fumadocs-mdx/runtime/next';
+import { loader } from 'fumadocs-core/source';
+
+export const source = loader({
+ baseUrl: '/docs',
+ source: createMDXSource(docs, meta),
+});
From a57442cb3f08a9241e26fe19d0d794368cdcfe49 Mon Sep 17 00:00:00 2001
From: Segfault <5221072+Segfaultd@users.noreply.github.com>
Date: Fri, 10 Apr 2026 10:10:40 +0200
Subject: [PATCH 03/10] Add Getting Started documentation pages
---
.../docs/getting-started/connecting-sdk.mdx | 71 +++++++++++++++++++
.../docs/getting-started/installation.mdx | 58 +++++++++++++++
docs/content/docs/getting-started/meta.json | 4 ++
.../docs/getting-started/quick-start.mdx | 70 ++++++++++++++++++
docs/content/docs/guides/meta.json | 4 ++
docs/content/docs/index.mdx | 42 +++++++++++
docs/content/docs/meta.json | 13 ++++
7 files changed, 262 insertions(+)
create mode 100644 docs/content/docs/getting-started/connecting-sdk.mdx
create mode 100644 docs/content/docs/getting-started/installation.mdx
create mode 100644 docs/content/docs/getting-started/meta.json
create mode 100644 docs/content/docs/getting-started/quick-start.mdx
create mode 100644 docs/content/docs/guides/meta.json
create mode 100644 docs/content/docs/index.mdx
create mode 100644 docs/content/docs/meta.json
diff --git a/docs/content/docs/getting-started/connecting-sdk.mdx b/docs/content/docs/getting-started/connecting-sdk.mdx
new file mode 100644
index 0000000..636f126
--- /dev/null
+++ b/docs/content/docs/getting-started/connecting-sdk.mdx
@@ -0,0 +1,71 @@
+---
+title: Connecting the Stripe SDK
+description: Use the official Stripe SDK with Strimulator
+---
+
+Point the official Stripe SDK at Strimulator — no code changes needed beyond the configuration.
+
+## Node.js / TypeScript
+
+```typescript
+import Stripe from "stripe";
+
+const stripe = new Stripe("sk_test_strimulator", {
+ host: "localhost",
+ port: 12111,
+ protocol: "http",
+});
+
+// Use exactly like real Stripe
+const customer = await stripe.customers.create({
+ email: "dev@example.com",
+});
+
+const product = await stripe.products.create({
+ name: "Pro Plan",
+});
+
+const price = await stripe.prices.create({
+ product: product.id,
+ unit_amount: 2000,
+ currency: "usd",
+ recurring: { interval: "month" },
+});
+
+const subscription = await stripe.subscriptions.create({
+ customer: customer.id,
+ items: [{ price: price.id }],
+});
+
+console.log(subscription.status); // "active"
+```
+
+## Environment Variable Approach
+
+If your app reads `STRIPE_SECRET_KEY`, you can switch to Strimulator without touching code:
+
+```bash
+STRIPE_SECRET_KEY=sk_test_strimulator \
+STRIPE_API_BASE=http://localhost:12111 \
+ npm run dev
+```
+
+## Docker Compose
+
+When using Docker Compose, point your app at the service name:
+
+```yaml
+services:
+ strimulator:
+ image: ghcr.io/codeforge-tech/strimulator:latest
+ ports:
+ - "12111:12111"
+
+ your-app:
+ build: .
+ environment:
+ STRIPE_SECRET_KEY: sk_test_strimulator
+ STRIPE_API_BASE: http://strimulator:12111
+ depends_on:
+ - strimulator
+```
diff --git a/docs/content/docs/getting-started/installation.mdx b/docs/content/docs/getting-started/installation.mdx
new file mode 100644
index 0000000..4d13f92
--- /dev/null
+++ b/docs/content/docs/getting-started/installation.mdx
@@ -0,0 +1,58 @@
+---
+title: Installation
+description: Install and run Strimulator locally or with Docker
+---
+
+## Prerequisites
+
+- [Bun](https://bun.sh) v1.0+ (for local install)
+- Or [Docker](https://www.docker.com/) (for containerized setup)
+
+## Local Install
+
+```bash
+git clone https://github.com/codeforge-tech/strimulator.git
+cd strimulator
+bun install
+bun run dev
+```
+
+Strimulator is now running:
+
+- **API:** http://localhost:12111/v1/
+- **Dashboard:** http://localhost:12111/dashboard
+
+## Docker
+
+### Docker Compose (recommended)
+
+Add to your project's `docker-compose.yml`:
+
+```yaml
+services:
+ strimulator:
+ image: ghcr.io/codeforge-tech/strimulator:latest
+ ports:
+ - "12111:12111"
+ volumes:
+ - strimulator-data:/data
+
+volumes:
+ strimulator-data:
+```
+
+### Build locally
+
+```bash
+docker build -t strimulator .
+docker run -p 12111:12111 strimulator
+```
+
+## Configuration
+
+| Environment Variable | Default | Description |
+|---------------------|---------|-------------|
+| `STRIMULATOR_PORT` | `12111` | Server port |
+| `STRIMULATOR_DB_PATH` | `:memory:` | SQLite path. Use a file path for persistence across restarts |
+| `STRIMULATOR_LOG_LEVEL` | `info` | Log verbosity |
+| `STRIMULATOR_API_VERSION` | `2024-12-18` | Stripe API version in responses |
diff --git a/docs/content/docs/getting-started/meta.json b/docs/content/docs/getting-started/meta.json
new file mode 100644
index 0000000..cbad77e
--- /dev/null
+++ b/docs/content/docs/getting-started/meta.json
@@ -0,0 +1,4 @@
+{
+ "title": "Getting Started",
+ "pages": ["installation", "quick-start", "connecting-sdk"]
+}
diff --git a/docs/content/docs/getting-started/quick-start.mdx b/docs/content/docs/getting-started/quick-start.mdx
new file mode 100644
index 0000000..db1683d
--- /dev/null
+++ b/docs/content/docs/getting-started/quick-start.mdx
@@ -0,0 +1,70 @@
+---
+title: Quick Start
+description: Make your first API calls to Strimulator
+---
+
+With Strimulator running (`bun run dev`), try these requests:
+
+## Create a Customer
+
+```bash
+curl -X POST http://localhost:12111/v1/customers \
+ -H "Authorization: Bearer sk_test_123" \
+ -d "email=hello@example.com" \
+ -d "name=Jane Doe"
+```
+
+## Create a Product and Price
+
+```bash
+curl -X POST http://localhost:12111/v1/products \
+ -H "Authorization: Bearer sk_test_123" \
+ -d "name=Pro Plan"
+
+# Use the product ID from the response
+curl -X POST http://localhost:12111/v1/prices \
+ -H "Authorization: Bearer sk_test_123" \
+ -d "product=prod_xxxxx" \
+ -d "unit_amount=2000" \
+ -d "currency=usd" \
+ -d "recurring[interval]=month"
+```
+
+## Create a Payment Intent
+
+```bash
+curl -X POST http://localhost:12111/v1/payment_intents \
+ -H "Authorization: Bearer sk_test_123" \
+ -d "amount=2000" \
+ -d "currency=usd" \
+ -d "payment_method=tok_visa" \
+ -d "confirm=true"
+```
+
+## List Resources
+
+```bash
+curl http://localhost:12111/v1/customers \
+ -H "Authorization: Bearer sk_test_123"
+```
+
+## Authentication
+
+All `/v1/` requests require a bearer token starting with `sk_test_`:
+
+```
+Authorization: Bearer sk_test_anything
+```
+
+The actual key value doesn't matter — Strimulator accepts any `sk_test_*` key.
+
+## Request Format
+
+Like real Stripe, requests use `application/x-www-form-urlencoded` (not JSON):
+
+```bash
+curl -X POST http://localhost:12111/v1/customers \
+ -H "Authorization: Bearer sk_test_123" \
+ -d "email=test@example.com" \
+ -d "metadata[plan]=pro"
+```
diff --git a/docs/content/docs/guides/meta.json b/docs/content/docs/guides/meta.json
new file mode 100644
index 0000000..8e4a6d3
--- /dev/null
+++ b/docs/content/docs/guides/meta.json
@@ -0,0 +1,4 @@
+{
+ "title": "Guides",
+ "pages": ["webhooks", "test-clocks", "3ds-simulation", "dashboard", "idempotency"]
+}
diff --git a/docs/content/docs/index.mdx b/docs/content/docs/index.mdx
new file mode 100644
index 0000000..84793a3
--- /dev/null
+++ b/docs/content/docs/index.mdx
@@ -0,0 +1,42 @@
+---
+title: Strimulator
+description: A local Stripe emulator for development and testing
+---
+
+Strimulator is a drop-in local replacement for the Stripe API. It runs as a single process, stores everything in SQLite, and is compatible with the official `stripe` Node SDK. Use it to develop and test payment flows entirely offline — no Stripe account or network access required.
+
+**Think of it as [LocalStack](https://github.com/localstack/localstack), but for Stripe.**
+
+## Why Strimulator?
+
+- **Offline development** — No internet, no Stripe test mode, no rate limits
+- **Fast feedback** — Instant responses, no network latency
+- **Full control** — Trigger payment failures, advance subscriptions, simulate edge cases from the dashboard
+- **SDK-compatible** — Point the official `stripe` package at localhost and it just works
+- **Docker-ready** — Drop it into your docker-compose alongside Postgres, Redis, Firebase emulator, etc.
+
+## Supported Resources
+
+| Resource | Endpoints | State Machine |
+|----------|-----------|:------------:|
+| Customers | CRUD + list + search | |
+| Products | CRUD + list + search | |
+| Prices | create, retrieve, update, list | |
+| Payment Methods | create, retrieve, attach, detach, list | |
+| Payment Intents | create, retrieve, confirm, capture, cancel, list, search | ✓ |
+| Setup Intents | create, retrieve, confirm, cancel, list | ✓ |
+| Charges | retrieve, list | |
+| Refunds | create, retrieve, list | |
+| Subscriptions | create, retrieve, cancel, list, search | ✓ |
+| Invoices | create, retrieve, finalize, pay, void, list, search | ✓ |
+| Events | retrieve, list | |
+| Webhook Endpoints | CRUD + list | |
+| Test Clocks | create, retrieve, advance, delete, list | |
+
+## Additional Features
+
+- **Webhook delivery** with `Stripe-Signature` HMAC-SHA256 headers and retry logic
+- **Search API** with Stripe's query language
+- **expand[]** for one-level and nested expansion
+- **Idempotency-Key** support for POST requests
+- **Magic test tokens** — `tok_visa`, `tok_mastercard`, `tok_amex`, `tok_visa_debit`
diff --git a/docs/content/docs/meta.json b/docs/content/docs/meta.json
new file mode 100644
index 0000000..62f0331
--- /dev/null
+++ b/docs/content/docs/meta.json
@@ -0,0 +1,13 @@
+{
+ "title": "Strimulator",
+ "pages": [
+ "---Getting Started---",
+ "getting-started",
+ "---Guides---",
+ "guides",
+ "---API Reference---",
+ "api",
+ "---Architecture---",
+ "architecture"
+ ]
+}
From cef68b5e027b875d6f83605ce92d38446f4d1ce0 Mon Sep 17 00:00:00 2001
From: Segfault <5221072+Segfaultd@users.noreply.github.com>
Date: Fri, 10 Apr 2026 10:11:23 +0200
Subject: [PATCH 04/10] Add documentation guide pages
---
docs/content/docs/guides/3ds-simulation.mdx | 43 ++++++++++++++
docs/content/docs/guides/dashboard.mdx | 34 +++++++++++
docs/content/docs/guides/idempotency.mdx | 41 ++++++++++++++
docs/content/docs/guides/test-clocks.mdx | 52 +++++++++++++++++
docs/content/docs/guides/webhooks.mdx | 63 +++++++++++++++++++++
5 files changed, 233 insertions(+)
create mode 100644 docs/content/docs/guides/3ds-simulation.mdx
create mode 100644 docs/content/docs/guides/dashboard.mdx
create mode 100644 docs/content/docs/guides/idempotency.mdx
create mode 100644 docs/content/docs/guides/test-clocks.mdx
create mode 100644 docs/content/docs/guides/webhooks.mdx
diff --git a/docs/content/docs/guides/3ds-simulation.mdx b/docs/content/docs/guides/3ds-simulation.mdx
new file mode 100644
index 0000000..f5cc688
--- /dev/null
+++ b/docs/content/docs/guides/3ds-simulation.mdx
@@ -0,0 +1,43 @@
+---
+title: 3D Secure Simulation
+description: Simulate 3DS authentication challenges in payment flows
+---
+
+Strimulator supports simulating 3D Secure (3DS) authentication challenges for testing payment flows that require additional verification.
+
+## Triggering 3DS
+
+Use the magic token `tok_threeDSecureRequired` (a payment method with last4 `3220`) to trigger `requires_action` status on confirm:
+
+```typescript
+const paymentIntent = await stripe.paymentIntents.create({
+ amount: 2000,
+ currency: "usd",
+ payment_method: "tok_threeDSecureRequired",
+ confirm: true,
+});
+
+console.log(paymentIntent.status); // "requires_action"
+console.log(paymentIntent.next_action?.type); // "use_stripe_sdk"
+```
+
+## Completing the 3DS Challenge
+
+Re-confirm the payment intent to simulate the user completing the 3DS challenge:
+
+```typescript
+const completed = await stripe.paymentIntents.confirm(paymentIntent.id);
+console.log(completed.status); // "succeeded"
+```
+
+## Flow Summary
+
+```
+Create PI with tok_threeDSecureRequired + confirm: true
+ → status: "requires_action"
+ → next_action: { type: "use_stripe_sdk" }
+
+Re-confirm the PI
+ → status: "succeeded"
+ → charge created
+```
diff --git a/docs/content/docs/guides/dashboard.mdx b/docs/content/docs/guides/dashboard.mdx
new file mode 100644
index 0000000..bf68cec
--- /dev/null
+++ b/docs/content/docs/guides/dashboard.mdx
@@ -0,0 +1,34 @@
+---
+title: Dashboard
+description: Real-time debug interface for monitoring and testing
+---
+
+Strimulator includes a built-in debug dashboard at http://localhost:12111/dashboard.
+
+## Activity Feed
+
+Live stream of all API requests showing method, path, status code, and timing. Uses Server-Sent Events (SSE) for real-time updates.
+
+## Resource Explorer
+
+Browse all stored objects by type. Click any object to view its full JSON representation.
+
+## Actions Panel
+
+Trigger simulated scenarios without writing code:
+
+| Action | Description |
+|--------|-------------|
+| **Fail Next Payment** | Force the next PaymentIntent confirmation to fail (`card_declined`, `insufficient_funds`, `expired_card`) |
+| **Advance Test Clock** | Move a test clock forward in time, triggering subscription transitions |
+| **Retry Webhook** | Re-deliver an event to a webhook endpoint |
+| **Expire Payment Intent** | Force a PaymentIntent into canceled state |
+| **Cycle Subscription** | Advance a subscription to the next billing period |
+
+## Webhooks Tab
+
+View registered webhook endpoints, delivery history, and retry failed deliveries.
+
+## Access
+
+The dashboard is not auth-protected — it's designed for local development use only.
diff --git a/docs/content/docs/guides/idempotency.mdx b/docs/content/docs/guides/idempotency.mdx
new file mode 100644
index 0000000..ba3bf7e
--- /dev/null
+++ b/docs/content/docs/guides/idempotency.mdx
@@ -0,0 +1,41 @@
+---
+title: Idempotency
+description: How Idempotency-Key works in Strimulator
+---
+
+Strimulator supports the `Idempotency-Key` header on POST requests, matching Stripe's behavior.
+
+## How It Works
+
+Send an `Idempotency-Key` header with any POST request. If the same key is sent again, Strimulator returns the cached response instead of creating a duplicate resource.
+
+```bash
+curl -X POST http://localhost:12111/v1/customers \
+ -H "Authorization: Bearer sk_test_123" \
+ -H "Idempotency-Key: unique-key-123" \
+ -d "email=test@example.com"
+
+# Same key → same response, no duplicate customer
+curl -X POST http://localhost:12111/v1/customers \
+ -H "Authorization: Bearer sk_test_123" \
+ -H "Idempotency-Key: unique-key-123" \
+ -d "email=test@example.com"
+```
+
+## SDK Usage
+
+The Stripe SDK automatically generates idempotency keys for most create operations. You can also specify one explicitly:
+
+```typescript
+const customer = await stripe.customers.create(
+ { email: "test@example.com" },
+ { idempotencyKey: "unique-key-123" },
+);
+```
+
+## Behavior
+
+- Keys are scoped to the API key and endpoint
+- Cached responses are returned with the same status code and body
+- Only POST requests support idempotency keys
+- Keys are stored in-memory (or SQLite depending on `STRIMULATOR_DB_PATH`)
diff --git a/docs/content/docs/guides/test-clocks.mdx b/docs/content/docs/guides/test-clocks.mdx
new file mode 100644
index 0000000..0e49dc9
--- /dev/null
+++ b/docs/content/docs/guides/test-clocks.mdx
@@ -0,0 +1,52 @@
+---
+title: Test Clocks
+description: Simulate time advancement for subscription billing
+---
+
+Test clocks let you simulate the passage of time to test subscription lifecycle events — billing cycles, trial expirations, and period transitions.
+
+## Creating a Test Clock
+
+```typescript
+const clock = await stripe.testHelpers.testClocks.create({
+ frozen_time: Math.floor(Date.now() / 1000),
+ name: "Billing test",
+});
+```
+
+## Linking a Subscription to a Clock
+
+Create a customer with `test_clock`, then create subscriptions on that customer:
+
+```typescript
+const customer = await stripe.customers.create({
+ email: "test@example.com",
+ test_clock: clock.id,
+});
+
+const subscription = await stripe.subscriptions.create({
+ customer: customer.id,
+ items: [{ price: priceId }],
+});
+```
+
+## Advancing Time
+
+Move the clock forward to trigger billing events:
+
+```typescript
+await stripe.testHelpers.testClocks.advance(clock.id, {
+ frozen_time: clock.frozen_time + 30 * 24 * 60 * 60, // +30 days
+});
+```
+
+When advanced, Strimulator processes billing cycles for linked subscriptions:
+
+- Rolls subscription periods forward
+- Creates and finalizes invoices
+- Processes payments (creates charges)
+- Handles trial-to-active transitions
+
+## Dashboard
+
+You can also advance test clocks from the dashboard's **Actions** panel without writing code.
diff --git a/docs/content/docs/guides/webhooks.mdx b/docs/content/docs/guides/webhooks.mdx
new file mode 100644
index 0000000..cdd243e
--- /dev/null
+++ b/docs/content/docs/guides/webhooks.mdx
@@ -0,0 +1,63 @@
+---
+title: Webhooks
+description: Register webhook endpoints and receive event notifications
+---
+
+Strimulator delivers webhook events just like Stripe — with HMAC-SHA256 signatures, retry logic, and the same event shapes.
+
+## Registering a Webhook Endpoint
+
+```bash
+curl -X POST http://localhost:12111/v1/webhook_endpoints \
+ -H "Authorization: Bearer sk_test_123" \
+ -d "url=http://localhost:3000/webhooks/stripe" \
+ -d "enabled_events[]=customer.created" \
+ -d "enabled_events[]=payment_intent.succeeded"
+```
+
+Or using the SDK:
+
+```typescript
+const endpoint = await stripe.webhookEndpoints.create({
+ url: "http://localhost:3000/webhooks/stripe",
+ enabled_events: [
+ "customer.created",
+ "payment_intent.succeeded",
+ ],
+});
+```
+
+Use `enabled_events: ["*"]` to receive all event types.
+
+## Signature Verification
+
+Strimulator signs webhook payloads with HMAC-SHA256, compatible with `stripe.webhooks.constructEvent()`:
+
+```typescript
+import Stripe from "stripe";
+
+const stripe = new Stripe("sk_test_strimulator", {
+ host: "localhost",
+ port: 12111,
+ protocol: "http",
+});
+
+// In your webhook handler
+const event = stripe.webhooks.constructEvent(
+ body,
+ request.headers["stripe-signature"],
+ endpoint.secret, // from the webhook endpoint's `secret` field
+);
+```
+
+## Retry Behavior
+
+When your endpoint returns a non-2xx status, Strimulator retries delivery. Failed deliveries and their status are visible in the dashboard.
+
+## Managing Webhooks from the Dashboard
+
+Open http://localhost:12111/dashboard and go to the **Webhooks** tab to:
+
+- View registered webhook endpoints
+- See delivery history and status
+- Retry failed deliveries
From af542f33bf75d5cb2008c935d6350cc6ed8e2ce1 Mon Sep 17 00:00:00 2001
From: Segfault <5221072+Segfaultd@users.noreply.github.com>
Date: Fri, 10 Apr 2026 10:12:14 +0200
Subject: [PATCH 05/10] Add architecture and contributing documentation
---
.../docs/architecture/contributing.mdx | 45 +++++++++++
docs/content/docs/architecture/meta.json | 4 +
docs/content/docs/architecture/overview.mdx | 41 ++++++++++
.../docs/architecture/request-lifecycle.mdx | 65 ++++++++++++++++
docs/content/docs/architecture/services.mdx | 75 +++++++++++++++++++
5 files changed, 230 insertions(+)
create mode 100644 docs/content/docs/architecture/contributing.mdx
create mode 100644 docs/content/docs/architecture/meta.json
create mode 100644 docs/content/docs/architecture/overview.mdx
create mode 100644 docs/content/docs/architecture/request-lifecycle.mdx
create mode 100644 docs/content/docs/architecture/services.mdx
diff --git a/docs/content/docs/architecture/contributing.mdx b/docs/content/docs/architecture/contributing.mdx
new file mode 100644
index 0000000..e72ae0c
--- /dev/null
+++ b/docs/content/docs/architecture/contributing.mdx
@@ -0,0 +1,45 @@
+---
+title: Contributing
+description: Development setup and guidelines for contributors
+---
+
+## Development Setup
+
+```bash
+git clone https://github.com/codeforge-tech/strimulator.git
+cd strimulator
+bun install
+bun run dev # Start with watch mode
+```
+
+## Running Tests
+
+```bash
+bun test # Run all tests (unit + integration + SDK)
+bun test tests/unit/ # Run unit tests only
+bun test tests/sdk/ # Run SDK tests only
+bun test tests/integration/customers.test.ts # Single file
+bun x tsc --noEmit # Type check
+```
+
+## Adding a New Resource
+
+1. **Schema:** Create `src/db/schema/.ts` with the Drizzle table definition
+2. **Service:** Create `src/services/.ts` with a class that takes `StrimulatorDB`
+3. **Routes:** Create `src/routes/.ts` as an Elysia plugin factory
+4. **Wire up:** Register routes in `src/app.ts`
+5. **Tests:** Add unit tests in `tests/unit/` and SDK tests in `tests/sdk/`
+
+## Conventions
+
+- **IDs:** Generated via `generateId(type)` with crypto.randomBytes. Each type has a prefix (`cus_`, `pi_`, `sub_`, etc.) defined in `src/lib/id-generator.ts`.
+- **Body format:** Always `application/x-www-form-urlencoded` with bracket notation. Use `parseStripeBody()`.
+- **Soft deletes:** Use a `deleted` integer flag (0/1), never hard-delete.
+- **No conventional commits:** Write clear descriptions, don't prefix with `feat:`, `fix:`, etc.
+
+## Database Migrations
+
+```bash
+bun run db:generate # Generate migration from schema changes
+bun run db:migrate # Apply migrations
+```
diff --git a/docs/content/docs/architecture/meta.json b/docs/content/docs/architecture/meta.json
new file mode 100644
index 0000000..d99279a
--- /dev/null
+++ b/docs/content/docs/architecture/meta.json
@@ -0,0 +1,4 @@
+{
+ "title": "Architecture",
+ "pages": ["overview", "request-lifecycle", "services", "contributing"]
+}
diff --git a/docs/content/docs/architecture/overview.mdx b/docs/content/docs/architecture/overview.mdx
new file mode 100644
index 0000000..8efeabe
--- /dev/null
+++ b/docs/content/docs/architecture/overview.mdx
@@ -0,0 +1,41 @@
+---
+title: Architecture Overview
+description: How Strimulator is built
+---
+
+Strimulator emulates Stripe's REST API over HTTP using Elysia (Bun's web framework) + SQLite via Drizzle ORM. It returns real `Stripe.*` types from the official `stripe` npm package.
+
+## Tech Stack
+
+| Component | Technology |
+|-----------|-----------|
+| Runtime | [Bun](https://bun.sh) |
+| Framework | [ElysiaJS](https://elysiajs.com) |
+| Database | SQLite via [Drizzle ORM](https://orm.drizzle.team) + bun:sqlite |
+| Types | Imported from [`stripe`](https://www.npmjs.com/package/stripe) npm package |
+| Dashboard | [Preact](https://preactjs.com) + [HTM](https://github.com/developit/htm) |
+| Testing | bun:test |
+
+## Project Structure
+
+```
+src/
+ routes/ # ElysiaJS route plugins (one per Stripe resource)
+ services/ # Business logic and state machines
+ db/schema/ # Drizzle ORM table definitions
+ middleware/ # Auth, idempotency, form parsing, request logging
+ dashboard/ # Debug dashboard (API + Preact SPA)
+ lib/ # Shared utilities (IDs, pagination, expand, search)
+ errors/ # Stripe-compatible error factory
+tests/
+ unit/ # Service-layer tests
+ integration/ # HTTP request/response tests
+ sdk/ # Tests using the official stripe npm package
+```
+
+## Key Design Decisions
+
+- **Stripe type fidelity:** Services return `Stripe.*` types directly from the official package, ensuring response shapes always match real Stripe.
+- **Synchronous DB:** bun:sqlite is synchronous, so services are synchronous. Routes are async only for body parsing and expansion.
+- **In-memory by default:** Using `:memory:` SQLite for ephemeral storage makes tests fast and isolated. File-backed persistence is opt-in.
+- **Single process:** No external dependencies — one binary, one port, everything included.
diff --git a/docs/content/docs/architecture/request-lifecycle.mdx b/docs/content/docs/architecture/request-lifecycle.mdx
new file mode 100644
index 0000000..936a008
--- /dev/null
+++ b/docs/content/docs/architecture/request-lifecycle.mdx
@@ -0,0 +1,65 @@
+---
+title: Request Lifecycle
+description: How an HTTP request flows through Strimulator
+---
+
+Every API request passes through a middleware chain before reaching the route handler:
+
+```
+HTTP request
+ → apiKeyAuth (validates Bearer sk_test_*)
+ → idempotencyMiddleware (caches POST responses by Idempotency-Key header)
+ → requestLogger (emits to globalBus for dashboard SSE)
+ → route handler
+ → parseStripeBody() (decodes x-www-form-urlencoded with bracket notation)
+ → service method (DB read/write, state validation)
+ → eventService.emit() (triggers webhook delivery)
+ → response
+```
+
+## Middleware
+
+### API Key Auth
+
+Validates the `Authorization: Bearer sk_test_*` header. Any key starting with `sk_test_` is accepted — Strimulator doesn't verify specific keys.
+
+Source: `src/middleware/api-key-auth.ts`
+
+### Idempotency
+
+Caches POST responses keyed by the `Idempotency-Key` header. Replay requests return the cached response without re-executing the handler.
+
+Source: `src/middleware/idempotency.ts`
+
+### Request Logger
+
+Emits every request to the global event bus for the dashboard's live activity feed via SSE.
+
+Source: `src/middleware/request-logger.ts`
+
+### Form Parser
+
+Decodes `application/x-www-form-urlencoded` bodies with Stripe's bracket notation (`metadata[key]=value`, `items[0][price]=...`).
+
+Source: `src/middleware/form-parser.ts`
+
+## Route → Service → Response
+
+Routes are Elysia plugin factories that:
+
+1. Parse the form-encoded body with `parseStripeBody()`
+2. Call the appropriate service method
+3. Emit events via `eventService.emit()` (triggers webhook delivery)
+4. Return the Stripe-typed response
+
+## Expansion
+
+Routes that support `?expand[]=field` use `applyExpand()` with a config mapping field names to resolver functions. Supports nested expansion via dot notation (`expand[]=latest_invoice.payment_intent`).
+
+Source: `src/lib/expand.ts`
+
+## Pagination
+
+All list endpoints use cursor-based pagination via `created` timestamp and `starting_after` parameter. Returns `{ object: "list", data: [...], has_more: boolean }`.
+
+Source: `src/lib/pagination.ts`
diff --git a/docs/content/docs/architecture/services.mdx b/docs/content/docs/architecture/services.mdx
new file mode 100644
index 0000000..defe781
--- /dev/null
+++ b/docs/content/docs/architecture/services.mdx
@@ -0,0 +1,75 @@
+---
+title: Services
+description: Business logic layer and state machines
+---
+
+Services are classes in `src/services/` that encapsulate all business logic. Each service takes `StrimulatorDB` in the constructor and returns `Stripe.*` types.
+
+## Pattern
+
+```typescript
+class CustomerService {
+ constructor(private db: StrimulatorDB) {}
+
+ create(params: CreateParams): Stripe.Customer {
+ // Validate, insert to DB, build shape, return
+ }
+
+ retrieve(id: string): Stripe.Customer {
+ // Query DB, build shape, return (or throw 404)
+ }
+}
+```
+
+Each resource has a `build*Shape()` function that constructs the full Stripe object. The full JSON is stored in a `data` text column; key fields are indexed separately for queries.
+
+## State Machines
+
+Resources with lifecycle states validate transitions with `stateTransitionError()`:
+
+### Payment Intents
+
+```
+requires_payment_method → requires_confirmation → requires_action → succeeded
+ → canceled
+```
+
+### Setup Intents
+
+```
+requires_payment_method → requires_confirmation → succeeded
+ → canceled
+```
+
+### Subscriptions
+
+```
+trialing → active → past_due → canceled
+ → canceled
+```
+
+### Invoices
+
+```
+draft → open → paid
+ → void
+```
+
+## Event Emission
+
+Services with state changes emit events via an optional `EventService` dependency:
+
+```typescript
+this.eventService?.emit("payment_intent.succeeded", paymentIntent);
+```
+
+`EventService.emit()` persists the event to DB and synchronously notifies listeners. `WebhookDeliveryService` is registered as a listener and delivers to matching webhook endpoints with HMAC-SHA256 signatures.
+
+## Search
+
+Search endpoints load all rows and filter in-memory via `parseSearchQuery()` / `matchesCondition()`. Supports Stripe's query language:
+
+- `email:"foo@bar.com"` — exact match
+- `status~"act"` — contains
+- `metadata["key"]:"value"` — metadata search
+- Combine with `AND`
From 4847afa226c415bebdcc85d766c5fdd556125685 Mon Sep 17 00:00:00 2001
From: Segfault <5221072+Segfaultd@users.noreply.github.com>
Date: Fri, 10 Apr 2026 10:20:55 +0200
Subject: [PATCH 06/10] Add OpenAPI 3.1 spec for all Strimulator endpoints
---
docs/openapi.json | 3536 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 3536 insertions(+)
create mode 100644 docs/openapi.json
diff --git a/docs/openapi.json b/docs/openapi.json
new file mode 100644
index 0000000..376f5c5
--- /dev/null
+++ b/docs/openapi.json
@@ -0,0 +1,3536 @@
+{
+ "openapi": "3.1.0",
+ "info": {
+ "title": "Strimulator API",
+ "description": "Local Stripe emulator for development and testing. Strimulator faithfully emulates Stripe's REST API, letting you build and test payment integrations without hitting the real Stripe servers.",
+ "version": "1.0.0",
+ "contact": {
+ "name": "Strimulator",
+ "url": "https://github.com/codeforge-tech/strimulator"
+ },
+ "license": {
+ "name": "MIT"
+ }
+ },
+ "servers": [
+ {
+ "url": "http://localhost:12111",
+ "description": "Local Strimulator server"
+ }
+ ],
+ "security": [
+ {
+ "BearerAuth": []
+ }
+ ],
+ "tags": [
+ { "name": "Customers", "description": "Customer objects allow you to perform recurring charges and track payments. Strimulator emulates Stripe's customer API." },
+ { "name": "Products", "description": "Products describe the items or services you offer to your customers." },
+ { "name": "Prices", "description": "Prices define the unit cost, currency, and billing cycle for both one-time and recurring purchases of products." },
+ { "name": "Payment Methods", "description": "Payment method objects represent a customer's payment instruments, such as credit cards. Strimulator supports the card type with magic test tokens." },
+ { "name": "Payment Intents", "description": "A PaymentIntent guides you through the process of collecting a payment from your customer. Strimulator emulates the full lifecycle including 3DS simulation." },
+ { "name": "Setup Intents", "description": "A SetupIntent guides you through the process of setting up a customer's payment credentials for future payments." },
+ { "name": "Charges", "description": "Charge objects are created automatically when a PaymentIntent succeeds. They represent the movement of money." },
+ { "name": "Refunds", "description": "Refund objects allow you to refund a charge that has been previously created." },
+ { "name": "Subscriptions", "description": "Subscriptions allow you to charge a customer on a recurring basis. Strimulator supports trial periods, plan changes, and cancellation." },
+ { "name": "Invoices", "description": "Invoices are statements of amounts owed by a customer. They are automatically created by subscriptions and can be finalized, paid, or voided." },
+ { "name": "Events", "description": "Events are Strimulator's way of letting you know when something interesting happens. Events are created for every state change in the system." },
+ { "name": "Webhook Endpoints", "description": "Configure webhook endpoints to receive event notifications via HTTP POST. Strimulator delivers webhooks with HMAC-SHA256 signatures." },
+ { "name": "Test Clocks", "description": "Test clocks allow you to simulate the passage of time for testing subscription billing, trial expirations, and other time-sensitive features." }
+ ],
+ "paths": {
+ "/v1/customers": {
+ "post": {
+ "operationId": "createCustomer",
+ "tags": ["Customers"],
+ "summary": "Create a customer",
+ "description": "Creates a new customer object.",
+ "requestBody": {
+ "content": {
+ "application/x-www-form-urlencoded": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "email": {
+ "type": "string",
+ "format": "email",
+ "description": "Customer's email address."
+ },
+ "name": {
+ "type": "string",
+ "description": "The customer's full name or business name."
+ },
+ "description": {
+ "type": "string",
+ "description": "An arbitrary string attached to the object."
+ },
+ "phone": {
+ "type": "string",
+ "description": "The customer's phone number."
+ },
+ "metadata": {
+ "type": "object",
+ "additionalProperties": { "type": "string" },
+ "description": "Set of key-value pairs for storing additional information."
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "The created customer object.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Customer" }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid request.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ },
+ "401": {
+ "description": "Authentication failed.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ },
+ "get": {
+ "operationId": "listCustomers",
+ "tags": ["Customers"],
+ "summary": "List all customers",
+ "description": "Returns a paginated list of customers, sorted by creation date (most recent first).",
+ "parameters": [
+ { "$ref": "#/components/parameters/Limit" },
+ { "$ref": "#/components/parameters/StartingAfter" },
+ { "$ref": "#/components/parameters/EndingBefore" }
+ ],
+ "responses": {
+ "200": {
+ "description": "A paginated list of customer objects.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "allOf": [
+ { "$ref": "#/components/schemas/ListResponse" },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": { "$ref": "#/components/schemas/Customer" }
+ },
+ "url": { "type": "string", "example": "/v1/customers" }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/customers/search": {
+ "get": {
+ "operationId": "searchCustomers",
+ "tags": ["Customers"],
+ "summary": "Search customers",
+ "description": "Search for customers using Stripe's search query language. Supports filtering by `email`, `name`, `metadata`, and other fields.",
+ "parameters": [
+ {
+ "name": "query",
+ "in": "query",
+ "required": true,
+ "description": "The search query string using Stripe search syntax (e.g., `email:\"user@example.com\"`).",
+ "schema": { "type": "string" }
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "description": "Maximum number of results to return (1-100, default 10).",
+ "schema": { "type": "integer", "minimum": 1, "maximum": 100, "default": 10 }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "A search result containing matching customers.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "allOf": [
+ { "$ref": "#/components/schemas/SearchResult" },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": { "$ref": "#/components/schemas/Customer" }
+ },
+ "url": { "type": "string", "example": "/v1/customers/search" }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/customers/{id}": {
+ "get": {
+ "operationId": "retrieveCustomer",
+ "tags": ["Customers"],
+ "summary": "Retrieve a customer",
+ "description": "Retrieves a customer object by its ID.",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "description": "The ID of the customer to retrieve (e.g., `cus_...`).",
+ "schema": { "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The customer object.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Customer" }
+ }
+ }
+ },
+ "404": {
+ "description": "Customer not found.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "operationId": "updateCustomer",
+ "tags": ["Customers"],
+ "summary": "Update a customer",
+ "description": "Updates the specified customer by setting the values of the parameters passed. Any parameters not provided will be left unchanged.",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "description": "The ID of the customer to update.",
+ "schema": { "type": "string" }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/x-www-form-urlencoded": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "email": { "type": "string", "format": "email", "description": "Customer's email address." },
+ "name": { "type": "string", "description": "The customer's full name or business name." },
+ "description": { "type": "string", "description": "An arbitrary string attached to the object." },
+ "phone": { "type": "string", "description": "The customer's phone number." },
+ "metadata": {
+ "type": "object",
+ "additionalProperties": { "type": "string" },
+ "description": "Set of key-value pairs for storing additional information."
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "The updated customer object.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Customer" }
+ }
+ }
+ },
+ "404": {
+ "description": "Customer not found.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ },
+ "delete": {
+ "operationId": "deleteCustomer",
+ "tags": ["Customers"],
+ "summary": "Delete a customer",
+ "description": "Permanently deletes a customer. It cannot be undone.",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "description": "The ID of the customer to delete.",
+ "schema": { "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "A deletion confirmation object.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "id": { "type": "string", "description": "The ID of the deleted customer." },
+ "object": { "type": "string", "enum": ["customer"] },
+ "deleted": { "type": "boolean", "enum": [true] }
+ },
+ "required": ["id", "object", "deleted"]
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Customer not found.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/products": {
+ "post": {
+ "operationId": "createProduct",
+ "tags": ["Products"],
+ "summary": "Create a product",
+ "description": "Creates a new product object.",
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/x-www-form-urlencoded": {
+ "schema": {
+ "type": "object",
+ "required": ["name"],
+ "properties": {
+ "name": { "type": "string", "description": "The product's name, displayed to customers." },
+ "active": { "type": "boolean", "description": "Whether the product is currently available for purchase. Defaults to `true`.", "default": true },
+ "description": { "type": "string", "description": "The product's description." },
+ "metadata": {
+ "type": "object",
+ "additionalProperties": { "type": "string" },
+ "description": "Set of key-value pairs for storing additional information."
+ },
+ "url": { "type": "string", "description": "A URL of the product." },
+ "statement_descriptor": { "type": "string", "description": "Descriptor for the product, shown on customer statements." },
+ "unit_label": { "type": "string", "description": "A label that represents units of this product." },
+ "tax_code": { "type": "string", "description": "A tax code ID." }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "The created product object.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Product" }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid request (e.g., missing required `name` parameter).",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ },
+ "get": {
+ "operationId": "listProducts",
+ "tags": ["Products"],
+ "summary": "List all products",
+ "description": "Returns a paginated list of products.",
+ "parameters": [
+ { "$ref": "#/components/parameters/Limit" },
+ { "$ref": "#/components/parameters/StartingAfter" },
+ { "$ref": "#/components/parameters/EndingBefore" }
+ ],
+ "responses": {
+ "200": {
+ "description": "A paginated list of product objects.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "allOf": [
+ { "$ref": "#/components/schemas/ListResponse" },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": { "$ref": "#/components/schemas/Product" }
+ },
+ "url": { "type": "string", "example": "/v1/products" }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/products/{id}": {
+ "get": {
+ "operationId": "retrieveProduct",
+ "tags": ["Products"],
+ "summary": "Retrieve a product",
+ "description": "Retrieves the details of an existing product.",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "description": "The ID of the product to retrieve (e.g., `prod_...`).",
+ "schema": { "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The product object.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Product" }
+ }
+ }
+ },
+ "404": {
+ "description": "Product not found.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "operationId": "updateProduct",
+ "tags": ["Products"],
+ "summary": "Update a product",
+ "description": "Updates the specified product by setting the values of the parameters passed.",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "description": "The ID of the product to update.",
+ "schema": { "type": "string" }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/x-www-form-urlencoded": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": { "type": "string", "description": "The product's name." },
+ "active": { "type": "boolean", "description": "Whether the product is available for purchase." },
+ "description": { "type": "string", "description": "The product's description." },
+ "metadata": {
+ "type": "object",
+ "additionalProperties": { "type": "string" },
+ "description": "Set of key-value pairs for storing additional information."
+ },
+ "url": { "type": "string", "description": "A URL of the product." },
+ "statement_descriptor": { "type": "string", "description": "Descriptor for the product." },
+ "unit_label": { "type": "string", "description": "A label that represents units of this product." },
+ "tax_code": { "type": "string", "description": "A tax code ID." }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "The updated product object.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Product" }
+ }
+ }
+ },
+ "404": {
+ "description": "Product not found.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ },
+ "delete": {
+ "operationId": "deleteProduct",
+ "tags": ["Products"],
+ "summary": "Delete a product",
+ "description": "Permanently deletes a product.",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "description": "The ID of the product to delete.",
+ "schema": { "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "A deletion confirmation object.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "id": { "type": "string" },
+ "object": { "type": "string", "enum": ["product"] },
+ "deleted": { "type": "boolean", "enum": [true] }
+ },
+ "required": ["id", "object", "deleted"]
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Product not found.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/prices": {
+ "post": {
+ "operationId": "createPrice",
+ "tags": ["Prices"],
+ "summary": "Create a price",
+ "description": "Creates a new price for an existing product. The price can be one-time or recurring.",
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/x-www-form-urlencoded": {
+ "schema": {
+ "type": "object",
+ "required": ["currency", "product"],
+ "properties": {
+ "unit_amount": {
+ "type": "integer",
+ "description": "A positive integer in cents representing how much to charge."
+ },
+ "currency": {
+ "type": "string",
+ "description": "Three-letter ISO currency code, in lowercase (e.g., `usd`)."
+ },
+ "product": {
+ "type": "string",
+ "description": "The ID of the product this price belongs to (e.g., `prod_...`)."
+ },
+ "recurring": {
+ "type": "object",
+ "description": "The recurring components of a price such as `interval` and `interval_count`.",
+ "properties": {
+ "interval": {
+ "type": "string",
+ "enum": ["day", "week", "month", "year"],
+ "description": "The frequency at which a subscription is billed."
+ },
+ "interval_count": {
+ "type": "integer",
+ "minimum": 1,
+ "description": "The number of intervals between subscription billings. Defaults to 1.",
+ "default": 1
+ }
+ },
+ "required": ["interval"]
+ },
+ "active": { "type": "boolean", "description": "Whether the price is currently active. Defaults to `true`.", "default": true },
+ "nickname": { "type": "string", "description": "A brief description of the price, hidden from customers." },
+ "metadata": {
+ "type": "object",
+ "additionalProperties": { "type": "string" },
+ "description": "Set of key-value pairs for storing additional information."
+ },
+ "lookup_key": { "type": "string", "description": "A lookup key used to retrieve prices dynamically." },
+ "tax_behavior": {
+ "type": "string",
+ "enum": ["exclusive", "inclusive", "unspecified"],
+ "description": "Specifies whether the price is inclusive or exclusive of tax."
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "The created price object.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Price" }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid request.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ },
+ "get": {
+ "operationId": "listPrices",
+ "tags": ["Prices"],
+ "summary": "List all prices",
+ "description": "Returns a paginated list of prices. Optionally filter by product.",
+ "parameters": [
+ { "$ref": "#/components/parameters/Limit" },
+ { "$ref": "#/components/parameters/StartingAfter" },
+ { "$ref": "#/components/parameters/EndingBefore" },
+ {
+ "name": "product",
+ "in": "query",
+ "description": "Only return prices belonging to this product ID.",
+ "schema": { "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "A paginated list of price objects.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "allOf": [
+ { "$ref": "#/components/schemas/ListResponse" },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": { "$ref": "#/components/schemas/Price" }
+ },
+ "url": { "type": "string", "example": "/v1/prices" }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/prices/{id}": {
+ "get": {
+ "operationId": "retrievePrice",
+ "tags": ["Prices"],
+ "summary": "Retrieve a price",
+ "description": "Retrieves the details of an existing price.",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "description": "The ID of the price to retrieve (e.g., `price_...`).",
+ "schema": { "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The price object.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Price" }
+ }
+ }
+ },
+ "404": {
+ "description": "Price not found.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "operationId": "updatePrice",
+ "tags": ["Prices"],
+ "summary": "Update a price",
+ "description": "Updates the specified price. Only mutable fields like `active`, `nickname`, and `metadata` can be changed.",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "description": "The ID of the price to update.",
+ "schema": { "type": "string" }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/x-www-form-urlencoded": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "active": { "type": "boolean", "description": "Whether the price is currently active." },
+ "nickname": { "type": "string", "description": "A brief description of the price." },
+ "metadata": {
+ "type": "object",
+ "additionalProperties": { "type": "string" },
+ "description": "Set of key-value pairs for storing additional information."
+ },
+ "lookup_key": { "type": "string", "description": "A lookup key used to retrieve prices dynamically." },
+ "tax_behavior": {
+ "type": "string",
+ "enum": ["exclusive", "inclusive", "unspecified"],
+ "description": "Specifies whether the price is inclusive or exclusive of tax."
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "The updated price object.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Price" }
+ }
+ }
+ },
+ "404": {
+ "description": "Price not found.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/payment_methods": {
+ "post": {
+ "operationId": "createPaymentMethod",
+ "tags": ["Payment Methods"],
+ "summary": "Create a payment method",
+ "description": "Creates a payment method object. Strimulator supports `card` type with magic test tokens like `tok_visa`, `tok_mastercard`, `tok_amex`, `tok_visa_debit`, `tok_threeDSecureRequired`, and `tok_threeDSecureOptional`.",
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/x-www-form-urlencoded": {
+ "schema": {
+ "type": "object",
+ "required": ["type"],
+ "properties": {
+ "type": {
+ "type": "string",
+ "enum": ["card"],
+ "description": "The type of payment method. Only `card` is supported."
+ },
+ "card": {
+ "type": "object",
+ "description": "Card details. Provide a `token` for test cards.",
+ "properties": {
+ "token": {
+ "type": "string",
+ "description": "A magic test token (e.g., `tok_visa`, `tok_mastercard`, `tok_threeDSecureRequired`)."
+ },
+ "number": { "type": "string", "description": "The card number." },
+ "exp_month": { "type": "integer", "description": "Two-digit number representing the card's expiration month." },
+ "exp_year": { "type": "integer", "description": "Four-digit number representing the card's expiration year." },
+ "cvc": { "type": "string", "description": "Card security code." }
+ }
+ },
+ "billing_details": {
+ "type": "object",
+ "description": "Billing information associated with the payment method.",
+ "properties": {
+ "email": { "type": "string" },
+ "name": { "type": "string" },
+ "phone": { "type": "string" },
+ "address": {
+ "type": "object",
+ "properties": {
+ "line1": { "type": "string" },
+ "line2": { "type": "string" },
+ "city": { "type": "string" },
+ "state": { "type": "string" },
+ "postal_code": { "type": "string" },
+ "country": { "type": "string" }
+ }
+ }
+ }
+ },
+ "metadata": {
+ "type": "object",
+ "additionalProperties": { "type": "string" },
+ "description": "Set of key-value pairs for storing additional information."
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "The created payment method object.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/PaymentMethod" }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid request.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ },
+ "get": {
+ "operationId": "listPaymentMethods",
+ "tags": ["Payment Methods"],
+ "summary": "List payment methods",
+ "description": "Returns a list of payment methods for a given customer.",
+ "parameters": [
+ { "$ref": "#/components/parameters/Limit" },
+ { "$ref": "#/components/parameters/StartingAfter" },
+ { "$ref": "#/components/parameters/EndingBefore" },
+ {
+ "name": "customer",
+ "in": "query",
+ "description": "The ID of the customer whose payment methods will be listed.",
+ "schema": { "type": "string" }
+ },
+ {
+ "name": "type",
+ "in": "query",
+ "description": "The type of payment methods to list. Defaults to `card`.",
+ "schema": { "type": "string", "default": "card" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "A paginated list of payment method objects.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "allOf": [
+ { "$ref": "#/components/schemas/ListResponse" },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": { "$ref": "#/components/schemas/PaymentMethod" }
+ },
+ "url": { "type": "string", "example": "/v1/payment_methods" }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/payment_methods/{id}": {
+ "get": {
+ "operationId": "retrievePaymentMethod",
+ "tags": ["Payment Methods"],
+ "summary": "Retrieve a payment method",
+ "description": "Retrieves a payment method object.",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "description": "The ID of the payment method to retrieve (e.g., `pm_...`).",
+ "schema": { "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The payment method object.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/PaymentMethod" }
+ }
+ }
+ },
+ "404": {
+ "description": "Payment method not found.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/payment_methods/{id}/attach": {
+ "post": {
+ "operationId": "attachPaymentMethod",
+ "tags": ["Payment Methods"],
+ "summary": "Attach a payment method to a customer",
+ "description": "Attaches a payment method object to a customer.",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "description": "The ID of the payment method to attach.",
+ "schema": { "type": "string" }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/x-www-form-urlencoded": {
+ "schema": {
+ "type": "object",
+ "required": ["customer"],
+ "properties": {
+ "customer": {
+ "type": "string",
+ "description": "The ID of the customer to attach the payment method to."
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "The attached payment method object.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/PaymentMethod" }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid request.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/payment_methods/{id}/detach": {
+ "post": {
+ "operationId": "detachPaymentMethod",
+ "tags": ["Payment Methods"],
+ "summary": "Detach a payment method from its customer",
+ "description": "Detaches a payment method object from the customer it is attached to. The payment method still exists but can no longer be used for payments.",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "description": "The ID of the payment method to detach.",
+ "schema": { "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The detached payment method object (customer field set to null).",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/PaymentMethod" }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid request.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/payment_intents": {
+ "post": {
+ "operationId": "createPaymentIntent",
+ "tags": ["Payment Intents"],
+ "summary": "Create a payment intent",
+ "description": "Creates a PaymentIntent object. Optionally set `confirm=true` with a `payment_method` to create and confirm in one step.",
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/x-www-form-urlencoded": {
+ "schema": {
+ "type": "object",
+ "required": ["amount", "currency"],
+ "properties": {
+ "amount": {
+ "type": "integer",
+ "description": "Amount intended to be collected, in the smallest currency unit (e.g., cents)."
+ },
+ "currency": {
+ "type": "string",
+ "description": "Three-letter ISO currency code, in lowercase."
+ },
+ "customer": {
+ "type": "string",
+ "description": "ID of the customer this PaymentIntent is for."
+ },
+ "payment_method": {
+ "type": "string",
+ "description": "ID of the payment method to use."
+ },
+ "confirm": {
+ "type": "boolean",
+ "description": "Set to `true` to attempt to confirm this PaymentIntent immediately.",
+ "default": false
+ },
+ "capture_method": {
+ "type": "string",
+ "enum": ["automatic", "manual"],
+ "description": "Controls when charges will be captured. Defaults to `automatic`.",
+ "default": "automatic"
+ },
+ "metadata": {
+ "type": "object",
+ "additionalProperties": { "type": "string" },
+ "description": "Set of key-value pairs for storing additional information."
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "The created PaymentIntent object.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/PaymentIntent" }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid request.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ },
+ "get": {
+ "operationId": "listPaymentIntents",
+ "tags": ["Payment Intents"],
+ "summary": "List payment intents",
+ "description": "Returns a paginated list of PaymentIntents. Optionally filter by customer.",
+ "parameters": [
+ { "$ref": "#/components/parameters/Limit" },
+ { "$ref": "#/components/parameters/StartingAfter" },
+ { "$ref": "#/components/parameters/EndingBefore" },
+ {
+ "name": "customer",
+ "in": "query",
+ "description": "Only return PaymentIntents for this customer ID.",
+ "schema": { "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "A paginated list of PaymentIntent objects.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "allOf": [
+ { "$ref": "#/components/schemas/ListResponse" },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": { "$ref": "#/components/schemas/PaymentIntent" }
+ },
+ "url": { "type": "string", "example": "/v1/payment_intents" }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/payment_intents/search": {
+ "get": {
+ "operationId": "searchPaymentIntents",
+ "tags": ["Payment Intents"],
+ "summary": "Search payment intents",
+ "description": "Search for PaymentIntents using Stripe's search query language.",
+ "parameters": [
+ {
+ "name": "query",
+ "in": "query",
+ "required": true,
+ "description": "The search query string (e.g., `status:\"succeeded\"`).",
+ "schema": { "type": "string" }
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "description": "Maximum number of results to return (1-100, default 10).",
+ "schema": { "type": "integer", "minimum": 1, "maximum": 100, "default": 10 }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "A search result containing matching PaymentIntents.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "allOf": [
+ { "$ref": "#/components/schemas/SearchResult" },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": { "$ref": "#/components/schemas/PaymentIntent" }
+ },
+ "url": { "type": "string", "example": "/v1/payment_intents/search" }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/payment_intents/{id}": {
+ "get": {
+ "operationId": "retrievePaymentIntent",
+ "tags": ["Payment Intents"],
+ "summary": "Retrieve a payment intent",
+ "description": "Retrieves the details of a PaymentIntent. Supports expansion of `customer`, `payment_method`, and `latest_charge`.",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "description": "The ID of the PaymentIntent to retrieve (e.g., `pi_...`).",
+ "schema": { "type": "string" }
+ },
+ { "$ref": "#/components/parameters/Expand" }
+ ],
+ "responses": {
+ "200": {
+ "description": "The PaymentIntent object.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/PaymentIntent" }
+ }
+ }
+ },
+ "404": {
+ "description": "PaymentIntent not found.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "operationId": "updatePaymentIntent",
+ "tags": ["Payment Intents"],
+ "summary": "Update a payment intent",
+ "description": "Updates properties on a PaymentIntent without confirming. Returns the current PaymentIntent.",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "description": "The ID of the PaymentIntent to update.",
+ "schema": { "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The PaymentIntent object.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/PaymentIntent" }
+ }
+ }
+ },
+ "404": {
+ "description": "PaymentIntent not found.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/payment_intents/{id}/confirm": {
+ "post": {
+ "operationId": "confirmPaymentIntent",
+ "tags": ["Payment Intents"],
+ "summary": "Confirm a payment intent",
+ "description": "Confirms a PaymentIntent, transitioning it to `succeeded`, `requires_capture`, or `requires_action` (for 3DS). Payment methods with last4 `3220` (`tok_threeDSecureRequired`) trigger 3DS simulation.",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "description": "The ID of the PaymentIntent to confirm.",
+ "schema": { "type": "string" }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/x-www-form-urlencoded": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "payment_method": {
+ "type": "string",
+ "description": "ID of the payment method to use for this PaymentIntent."
+ },
+ "capture_method": {
+ "type": "string",
+ "enum": ["automatic", "manual"],
+ "description": "Controls when charges will be captured."
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "The confirmed PaymentIntent object.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/PaymentIntent" }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid state transition (e.g., already succeeded).",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/payment_intents/{id}/capture": {
+ "post": {
+ "operationId": "capturePaymentIntent",
+ "tags": ["Payment Intents"],
+ "summary": "Capture a payment intent",
+ "description": "Captures a PaymentIntent that has a status of `requires_capture`. This is used when `capture_method=manual`.",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "description": "The ID of the PaymentIntent to capture.",
+ "schema": { "type": "string" }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/x-www-form-urlencoded": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "amount_to_capture": {
+ "type": "integer",
+ "description": "The amount to capture, which must be less than or equal to the original amount. Defaults to the full amount."
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "The captured PaymentIntent object with `status=succeeded`.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/PaymentIntent" }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid state transition (e.g., not in `requires_capture` status).",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/payment_intents/{id}/cancel": {
+ "post": {
+ "operationId": "cancelPaymentIntent",
+ "tags": ["Payment Intents"],
+ "summary": "Cancel a payment intent",
+ "description": "Cancels a PaymentIntent. You cannot cancel a PaymentIntent with a status of `succeeded`.",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "description": "The ID of the PaymentIntent to cancel.",
+ "schema": { "type": "string" }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/x-www-form-urlencoded": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "cancellation_reason": {
+ "type": "string",
+ "enum": ["duplicate", "fraudulent", "requested_by_customer", "abandoned"],
+ "description": "Reason for canceling the PaymentIntent."
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "The canceled PaymentIntent object with `status=canceled`.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/PaymentIntent" }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid state transition.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/setup_intents": {
+ "post": {
+ "operationId": "createSetupIntent",
+ "tags": ["Setup Intents"],
+ "summary": "Create a setup intent",
+ "description": "Creates a SetupIntent object for setting up a customer's payment method for future payments.",
+ "requestBody": {
+ "content": {
+ "application/x-www-form-urlencoded": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "customer": {
+ "type": "string",
+ "description": "ID of the customer this SetupIntent is for."
+ },
+ "payment_method": {
+ "type": "string",
+ "description": "ID of the payment method to attach."
+ },
+ "confirm": {
+ "type": "boolean",
+ "description": "Set to `true` to attempt to confirm this SetupIntent immediately.",
+ "default": false
+ },
+ "metadata": {
+ "type": "object",
+ "additionalProperties": { "type": "string" },
+ "description": "Set of key-value pairs for storing additional information."
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "The created SetupIntent object.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/SetupIntent" }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid request.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ },
+ "get": {
+ "operationId": "listSetupIntents",
+ "tags": ["Setup Intents"],
+ "summary": "List setup intents",
+ "description": "Returns a paginated list of SetupIntents.",
+ "parameters": [
+ { "$ref": "#/components/parameters/Limit" },
+ { "$ref": "#/components/parameters/StartingAfter" },
+ { "$ref": "#/components/parameters/EndingBefore" }
+ ],
+ "responses": {
+ "200": {
+ "description": "A paginated list of SetupIntent objects.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "allOf": [
+ { "$ref": "#/components/schemas/ListResponse" },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": { "$ref": "#/components/schemas/SetupIntent" }
+ },
+ "url": { "type": "string", "example": "/v1/setup_intents" }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/setup_intents/{id}": {
+ "get": {
+ "operationId": "retrieveSetupIntent",
+ "tags": ["Setup Intents"],
+ "summary": "Retrieve a setup intent",
+ "description": "Retrieves the details of a SetupIntent.",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "description": "The ID of the SetupIntent to retrieve (e.g., `seti_...`).",
+ "schema": { "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The SetupIntent object.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/SetupIntent" }
+ }
+ }
+ },
+ "404": {
+ "description": "SetupIntent not found.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/setup_intents/{id}/confirm": {
+ "post": {
+ "operationId": "confirmSetupIntent",
+ "tags": ["Setup Intents"],
+ "summary": "Confirm a setup intent",
+ "description": "Confirms a SetupIntent, transitioning it to `succeeded`. If a `payment_method` is provided, it attaches the payment method to the customer.",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "description": "The ID of the SetupIntent to confirm.",
+ "schema": { "type": "string" }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/x-www-form-urlencoded": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "payment_method": {
+ "type": "string",
+ "description": "ID of the payment method to use for this SetupIntent."
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "The confirmed SetupIntent object with `status=succeeded`.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/SetupIntent" }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid state transition.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/setup_intents/{id}/cancel": {
+ "post": {
+ "operationId": "cancelSetupIntent",
+ "tags": ["Setup Intents"],
+ "summary": "Cancel a setup intent",
+ "description": "Cancels a SetupIntent. You cannot cancel a SetupIntent that has already succeeded.",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "description": "The ID of the SetupIntent to cancel.",
+ "schema": { "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The canceled SetupIntent object with `status=canceled`.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/SetupIntent" }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid state transition.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/charges": {
+ "get": {
+ "operationId": "listCharges",
+ "tags": ["Charges"],
+ "summary": "List all charges",
+ "description": "Returns a paginated list of charges. Optionally filter by payment intent.",
+ "parameters": [
+ { "$ref": "#/components/parameters/Limit" },
+ { "$ref": "#/components/parameters/StartingAfter" },
+ { "$ref": "#/components/parameters/EndingBefore" },
+ {
+ "name": "payment_intent",
+ "in": "query",
+ "description": "Only return charges for this PaymentIntent ID.",
+ "schema": { "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "A paginated list of charge objects.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "allOf": [
+ { "$ref": "#/components/schemas/ListResponse" },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": { "$ref": "#/components/schemas/Charge" }
+ },
+ "url": { "type": "string", "example": "/v1/charges" }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/charges/{id}": {
+ "get": {
+ "operationId": "retrieveCharge",
+ "tags": ["Charges"],
+ "summary": "Retrieve a charge",
+ "description": "Retrieves the details of a charge. Supports expansion of `customer` and `payment_intent`.",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "description": "The ID of the charge to retrieve (e.g., `ch_...`).",
+ "schema": { "type": "string" }
+ },
+ { "$ref": "#/components/parameters/Expand" }
+ ],
+ "responses": {
+ "200": {
+ "description": "The charge object.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Charge" }
+ }
+ }
+ },
+ "404": {
+ "description": "Charge not found.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/refunds": {
+ "post": {
+ "operationId": "createRefund",
+ "tags": ["Refunds"],
+ "summary": "Create a refund",
+ "description": "Creates a refund for a charge or payment intent. You must provide either `charge` or `payment_intent`.",
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/x-www-form-urlencoded": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "charge": {
+ "type": "string",
+ "description": "The ID of the charge to refund."
+ },
+ "payment_intent": {
+ "type": "string",
+ "description": "The ID of the PaymentIntent to refund."
+ },
+ "amount": {
+ "type": "integer",
+ "description": "A positive integer in cents representing how much to refund. Defaults to the full charge amount."
+ },
+ "reason": {
+ "type": "string",
+ "enum": ["duplicate", "fraudulent", "requested_by_customer"],
+ "description": "The reason for the refund."
+ },
+ "metadata": {
+ "type": "object",
+ "additionalProperties": { "type": "string" },
+ "description": "Set of key-value pairs for storing additional information."
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "The created refund object.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Refund" }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid request (e.g., missing both charge and payment_intent).",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ },
+ "get": {
+ "operationId": "listRefunds",
+ "tags": ["Refunds"],
+ "summary": "List all refunds",
+ "description": "Returns a paginated list of refunds. Optionally filter by charge or payment intent.",
+ "parameters": [
+ { "$ref": "#/components/parameters/Limit" },
+ { "$ref": "#/components/parameters/StartingAfter" },
+ { "$ref": "#/components/parameters/EndingBefore" },
+ {
+ "name": "charge",
+ "in": "query",
+ "description": "Only return refunds for this charge ID.",
+ "schema": { "type": "string" }
+ },
+ {
+ "name": "payment_intent",
+ "in": "query",
+ "description": "Only return refunds for this PaymentIntent ID.",
+ "schema": { "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "A paginated list of refund objects.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "allOf": [
+ { "$ref": "#/components/schemas/ListResponse" },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": { "$ref": "#/components/schemas/Refund" }
+ },
+ "url": { "type": "string", "example": "/v1/refunds" }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/refunds/{id}": {
+ "get": {
+ "operationId": "retrieveRefund",
+ "tags": ["Refunds"],
+ "summary": "Retrieve a refund",
+ "description": "Retrieves the details of a refund.",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "description": "The ID of the refund to retrieve (e.g., `re_...`).",
+ "schema": { "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The refund object.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Refund" }
+ }
+ }
+ },
+ "404": {
+ "description": "Refund not found.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/subscriptions": {
+ "post": {
+ "operationId": "createSubscription",
+ "tags": ["Subscriptions"],
+ "summary": "Create a subscription",
+ "description": "Creates a new subscription on an existing customer. Each subscription must have at least one item with a recurring price.",
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/x-www-form-urlencoded": {
+ "schema": {
+ "type": "object",
+ "required": ["customer", "items"],
+ "properties": {
+ "customer": {
+ "type": "string",
+ "description": "The ID of the customer to subscribe."
+ },
+ "items": {
+ "type": "array",
+ "description": "A list of prices and quantities the customer is subscribed to. Use bracket notation: `items[0][price]=price_...&items[0][quantity]=1`.",
+ "items": {
+ "type": "object",
+ "required": ["price"],
+ "properties": {
+ "price": { "type": "string", "description": "The ID of the price to subscribe to." },
+ "quantity": { "type": "integer", "description": "The quantity of the plan. Defaults to 1.", "default": 1 }
+ }
+ }
+ },
+ "trial_period_days": {
+ "type": "integer",
+ "description": "Number of trial days before charging the customer. Sets the subscription to `trialing` status."
+ },
+ "metadata": {
+ "type": "object",
+ "additionalProperties": { "type": "string" },
+ "description": "Set of key-value pairs for storing additional information."
+ },
+ "test_clock": {
+ "type": "string",
+ "description": "ID of the test clock to associate with this subscription."
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "The created subscription object.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Subscription" }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid request.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ },
+ "get": {
+ "operationId": "listSubscriptions",
+ "tags": ["Subscriptions"],
+ "summary": "List subscriptions",
+ "description": "Returns a paginated list of subscriptions. Optionally filter by customer.",
+ "parameters": [
+ { "$ref": "#/components/parameters/Limit" },
+ { "$ref": "#/components/parameters/StartingAfter" },
+ { "$ref": "#/components/parameters/EndingBefore" },
+ {
+ "name": "customer",
+ "in": "query",
+ "description": "Only return subscriptions for this customer ID.",
+ "schema": { "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "A paginated list of subscription objects.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "allOf": [
+ { "$ref": "#/components/schemas/ListResponse" },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": { "$ref": "#/components/schemas/Subscription" }
+ },
+ "url": { "type": "string", "example": "/v1/subscriptions" }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/subscriptions/search": {
+ "get": {
+ "operationId": "searchSubscriptions",
+ "tags": ["Subscriptions"],
+ "summary": "Search subscriptions",
+ "description": "Search for subscriptions using Stripe's search query language.",
+ "parameters": [
+ {
+ "name": "query",
+ "in": "query",
+ "required": true,
+ "description": "The search query string (e.g., `status:\"active\"`).",
+ "schema": { "type": "string" }
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "description": "Maximum number of results to return (1-100, default 10).",
+ "schema": { "type": "integer", "minimum": 1, "maximum": 100, "default": 10 }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "A search result containing matching subscriptions.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "allOf": [
+ { "$ref": "#/components/schemas/SearchResult" },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": { "$ref": "#/components/schemas/Subscription" }
+ },
+ "url": { "type": "string", "example": "/v1/subscriptions/search" }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/subscriptions/{id}": {
+ "get": {
+ "operationId": "retrieveSubscription",
+ "tags": ["Subscriptions"],
+ "summary": "Retrieve a subscription",
+ "description": "Retrieves the subscription with the given ID. Supports expansion of `customer` and `latest_invoice` (including nested `latest_invoice.payment_intent`).",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "description": "The ID of the subscription to retrieve (e.g., `sub_...`).",
+ "schema": { "type": "string" }
+ },
+ { "$ref": "#/components/parameters/Expand" }
+ ],
+ "responses": {
+ "200": {
+ "description": "The subscription object.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Subscription" }
+ }
+ }
+ },
+ "404": {
+ "description": "Subscription not found.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "operationId": "updateSubscription",
+ "tags": ["Subscriptions"],
+ "summary": "Update a subscription",
+ "description": "Updates an existing subscription. You can change the plan, quantity, trial end, and cancellation settings.",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "description": "The ID of the subscription to update.",
+ "schema": { "type": "string" }
+ }
+ ],
+ "requestBody": {
+ "content": {
+ "application/x-www-form-urlencoded": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "items": {
+ "type": "array",
+ "description": "A list of subscription items, each with a price and optional quantity.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "id": { "type": "string", "description": "The ID of the subscription item to update." },
+ "price": { "type": "string", "description": "The ID of the price to switch to." },
+ "quantity": { "type": "integer", "description": "The quantity of the plan." }
+ }
+ }
+ },
+ "cancel_at_period_end": {
+ "type": "boolean",
+ "description": "If set to `true`, the subscription will be canceled at the end of the current period."
+ },
+ "trial_end": {
+ "type": "string",
+ "description": "Unix timestamp or the string `now`. Sets the trial end date."
+ },
+ "metadata": {
+ "type": "object",
+ "additionalProperties": { "type": "string" },
+ "description": "Set of key-value pairs for storing additional information."
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "The updated subscription object.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Subscription" }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid request.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ },
+ "404": {
+ "description": "Subscription not found.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ },
+ "delete": {
+ "operationId": "cancelSubscription",
+ "tags": ["Subscriptions"],
+ "summary": "Cancel a subscription",
+ "description": "Cancels a customer's subscription immediately. The subscription status transitions to `canceled`.",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "description": "The ID of the subscription to cancel.",
+ "schema": { "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The canceled subscription object.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Subscription" }
+ }
+ }
+ },
+ "404": {
+ "description": "Subscription not found.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/invoices": {
+ "post": {
+ "operationId": "createInvoice",
+ "tags": ["Invoices"],
+ "summary": "Create an invoice",
+ "description": "Creates a new invoice for a customer. Invoices are created as drafts and must be finalized before they can be paid.",
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/x-www-form-urlencoded": {
+ "schema": {
+ "type": "object",
+ "required": ["customer"],
+ "properties": {
+ "customer": {
+ "type": "string",
+ "description": "The ID of the customer to create the invoice for."
+ },
+ "subscription": {
+ "type": "string",
+ "description": "The ID of the subscription to create the invoice for."
+ },
+ "currency": {
+ "type": "string",
+ "description": "Three-letter ISO currency code. Defaults to `usd`."
+ },
+ "amount_due": {
+ "type": "integer",
+ "description": "The amount due on the invoice, in cents."
+ },
+ "metadata": {
+ "type": "object",
+ "additionalProperties": { "type": "string" },
+ "description": "Set of key-value pairs for storing additional information."
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "The created invoice object with `status=draft`.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Invoice" }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid request.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ },
+ "get": {
+ "operationId": "listInvoices",
+ "tags": ["Invoices"],
+ "summary": "List all invoices",
+ "description": "Returns a paginated list of invoices. Optionally filter by customer or subscription.",
+ "parameters": [
+ { "$ref": "#/components/parameters/Limit" },
+ { "$ref": "#/components/parameters/StartingAfter" },
+ { "$ref": "#/components/parameters/EndingBefore" },
+ {
+ "name": "customer",
+ "in": "query",
+ "description": "Only return invoices for this customer ID.",
+ "schema": { "type": "string" }
+ },
+ {
+ "name": "subscription",
+ "in": "query",
+ "description": "Only return invoices for this subscription ID.",
+ "schema": { "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "A paginated list of invoice objects.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "allOf": [
+ { "$ref": "#/components/schemas/ListResponse" },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": { "$ref": "#/components/schemas/Invoice" }
+ },
+ "url": { "type": "string", "example": "/v1/invoices" }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/invoices/search": {
+ "get": {
+ "operationId": "searchInvoices",
+ "tags": ["Invoices"],
+ "summary": "Search invoices",
+ "description": "Search for invoices using Stripe's search query language.",
+ "parameters": [
+ {
+ "name": "query",
+ "in": "query",
+ "required": true,
+ "description": "The search query string (e.g., `customer:\"cus_...\"`).",
+ "schema": { "type": "string" }
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "description": "Maximum number of results to return (1-100, default 10).",
+ "schema": { "type": "integer", "minimum": 1, "maximum": 100, "default": 10 }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "A search result containing matching invoices.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "allOf": [
+ { "$ref": "#/components/schemas/SearchResult" },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": { "$ref": "#/components/schemas/Invoice" }
+ },
+ "url": { "type": "string", "example": "/v1/invoices/search" }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/invoices/{id}": {
+ "get": {
+ "operationId": "retrieveInvoice",
+ "tags": ["Invoices"],
+ "summary": "Retrieve an invoice",
+ "description": "Retrieves the invoice with the given ID. Supports expansion of `customer`, `subscription`, and `payment_intent`.",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "description": "The ID of the invoice to retrieve (e.g., `in_...`).",
+ "schema": { "type": "string" }
+ },
+ { "$ref": "#/components/parameters/Expand" }
+ ],
+ "responses": {
+ "200": {
+ "description": "The invoice object.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Invoice" }
+ }
+ }
+ },
+ "404": {
+ "description": "Invoice not found.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/invoices/{id}/finalize": {
+ "post": {
+ "operationId": "finalizeInvoice",
+ "tags": ["Invoices"],
+ "summary": "Finalize an invoice",
+ "description": "Finalizes a draft invoice, transitioning it to `open` status and assigning an invoice number. Once finalized, the invoice can be paid.",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "description": "The ID of the invoice to finalize.",
+ "schema": { "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The finalized invoice object with `status=open`.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Invoice" }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid state transition (e.g., invoice is not a draft).",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/invoices/{id}/pay": {
+ "post": {
+ "operationId": "payInvoice",
+ "tags": ["Invoices"],
+ "summary": "Pay an invoice",
+ "description": "Pays an open invoice, transitioning it to `paid` status.",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "description": "The ID of the invoice to pay.",
+ "schema": { "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The paid invoice object with `status=paid`.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Invoice" }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid state transition (e.g., invoice is not open).",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/invoices/{id}/void": {
+ "post": {
+ "operationId": "voidInvoice",
+ "tags": ["Invoices"],
+ "summary": "Void an invoice",
+ "description": "Voids an open invoice, transitioning it to `void` status. A voided invoice can no longer be paid.",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "description": "The ID of the invoice to void.",
+ "schema": { "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The voided invoice object with `status=void`.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Invoice" }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid state transition.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/events": {
+ "get": {
+ "operationId": "listEvents",
+ "tags": ["Events"],
+ "summary": "List all events",
+ "description": "Returns a paginated list of events, sorted by creation date (most recent first). Optionally filter by event type.",
+ "parameters": [
+ { "$ref": "#/components/parameters/Limit" },
+ { "$ref": "#/components/parameters/StartingAfter" },
+ { "$ref": "#/components/parameters/EndingBefore" },
+ {
+ "name": "type",
+ "in": "query",
+ "description": "Filter events by type (e.g., `customer.created`, `payment_intent.succeeded`).",
+ "schema": { "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "A paginated list of event objects.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "allOf": [
+ { "$ref": "#/components/schemas/ListResponse" },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": { "$ref": "#/components/schemas/Event" }
+ },
+ "url": { "type": "string", "example": "/v1/events" }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/events/{id}": {
+ "get": {
+ "operationId": "retrieveEvent",
+ "tags": ["Events"],
+ "summary": "Retrieve an event",
+ "description": "Retrieves the details of an event.",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "description": "The ID of the event to retrieve (e.g., `evt_...`).",
+ "schema": { "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The event object.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Event" }
+ }
+ }
+ },
+ "404": {
+ "description": "Event not found.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/webhook_endpoints": {
+ "post": {
+ "operationId": "createWebhookEndpoint",
+ "tags": ["Webhook Endpoints"],
+ "summary": "Create a webhook endpoint",
+ "description": "Creates a webhook endpoint that listens to specific events. Strimulator will POST event payloads to the configured URL with HMAC-SHA256 signatures.",
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/x-www-form-urlencoded": {
+ "schema": {
+ "type": "object",
+ "required": ["url", "enabled_events"],
+ "properties": {
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "description": "The URL of the webhook endpoint."
+ },
+ "enabled_events": {
+ "type": "array",
+ "items": { "type": "string" },
+ "description": "The list of event types to listen for (e.g., `[\"customer.created\", \"payment_intent.succeeded\"]`). Use `[\"*\"]` to listen to all events."
+ },
+ "description": {
+ "type": "string",
+ "description": "An optional description of what the webhook is used for."
+ },
+ "metadata": {
+ "type": "object",
+ "additionalProperties": { "type": "string" },
+ "description": "Set of key-value pairs for storing additional information."
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "The created webhook endpoint object. The response includes the webhook `secret` needed for signature verification.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/WebhookEndpoint" }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid request (e.g., missing url or enabled_events).",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ },
+ "get": {
+ "operationId": "listWebhookEndpoints",
+ "tags": ["Webhook Endpoints"],
+ "summary": "List webhook endpoints",
+ "description": "Returns a paginated list of webhook endpoints.",
+ "parameters": [
+ { "$ref": "#/components/parameters/Limit" },
+ { "$ref": "#/components/parameters/StartingAfter" },
+ { "$ref": "#/components/parameters/EndingBefore" }
+ ],
+ "responses": {
+ "200": {
+ "description": "A paginated list of webhook endpoint objects.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "allOf": [
+ { "$ref": "#/components/schemas/ListResponse" },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": { "$ref": "#/components/schemas/WebhookEndpoint" }
+ },
+ "url": { "type": "string", "example": "/v1/webhook_endpoints" }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/webhook_endpoints/{id}": {
+ "get": {
+ "operationId": "retrieveWebhookEndpoint",
+ "tags": ["Webhook Endpoints"],
+ "summary": "Retrieve a webhook endpoint",
+ "description": "Retrieves the webhook endpoint with the given ID.",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "description": "The ID of the webhook endpoint to retrieve (e.g., `we_...`).",
+ "schema": { "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The webhook endpoint object.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/WebhookEndpoint" }
+ }
+ }
+ },
+ "404": {
+ "description": "Webhook endpoint not found.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ },
+ "delete": {
+ "operationId": "deleteWebhookEndpoint",
+ "tags": ["Webhook Endpoints"],
+ "summary": "Delete a webhook endpoint",
+ "description": "Deletes a webhook endpoint. Strimulator will stop sending events to this URL.",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "description": "The ID of the webhook endpoint to delete.",
+ "schema": { "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "A deletion confirmation object.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "id": { "type": "string" },
+ "object": { "type": "string", "enum": ["webhook_endpoint"] },
+ "deleted": { "type": "boolean", "enum": [true] }
+ },
+ "required": ["id", "object", "deleted"]
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Webhook endpoint not found.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/test_helpers/test_clocks": {
+ "post": {
+ "operationId": "createTestClock",
+ "tags": ["Test Clocks"],
+ "summary": "Create a test clock",
+ "description": "Creates a new test clock with the specified frozen time. Use test clocks to simulate the passage of time for subscription billing and trial expirations.",
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/x-www-form-urlencoded": {
+ "schema": {
+ "type": "object",
+ "required": ["frozen_time"],
+ "properties": {
+ "frozen_time": {
+ "type": "integer",
+ "description": "The initial frozen time as a Unix timestamp."
+ },
+ "name": {
+ "type": "string",
+ "description": "A human-readable name for the test clock."
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "The created test clock object.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/TestClock" }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid request (e.g., missing frozen_time).",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ },
+ "get": {
+ "operationId": "listTestClocks",
+ "tags": ["Test Clocks"],
+ "summary": "List test clocks",
+ "description": "Returns a paginated list of test clocks.",
+ "parameters": [
+ { "$ref": "#/components/parameters/Limit" },
+ { "$ref": "#/components/parameters/StartingAfter" },
+ { "$ref": "#/components/parameters/EndingBefore" }
+ ],
+ "responses": {
+ "200": {
+ "description": "A paginated list of test clock objects.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "allOf": [
+ { "$ref": "#/components/schemas/ListResponse" },
+ {
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": { "$ref": "#/components/schemas/TestClock" }
+ },
+ "url": { "type": "string", "example": "/v1/test_helpers/test_clocks" }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/test_helpers/test_clocks/{id}": {
+ "get": {
+ "operationId": "retrieveTestClock",
+ "tags": ["Test Clocks"],
+ "summary": "Retrieve a test clock",
+ "description": "Retrieves a test clock.",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "description": "The ID of the test clock to retrieve (e.g., `clock_...`).",
+ "schema": { "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The test clock object.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/TestClock" }
+ }
+ }
+ },
+ "404": {
+ "description": "Test clock not found.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ },
+ "delete": {
+ "operationId": "deleteTestClock",
+ "tags": ["Test Clocks"],
+ "summary": "Delete a test clock",
+ "description": "Deletes a test clock and all associated resources.",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "description": "The ID of the test clock to delete.",
+ "schema": { "type": "string" }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "A deletion confirmation object.",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "id": { "type": "string" },
+ "object": { "type": "string", "enum": ["test_helpers.test_clock"] },
+ "deleted": { "type": "boolean", "enum": [true] }
+ },
+ "required": ["id", "object", "deleted"]
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Test clock not found.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/v1/test_helpers/test_clocks/{id}/advance": {
+ "post": {
+ "operationId": "advanceTestClock",
+ "tags": ["Test Clocks"],
+ "summary": "Advance a test clock",
+ "description": "Advances a test clock's frozen time forward. This triggers billing cycle processing for any linked subscriptions, including rolling periods, creating invoices, and processing payments.",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "required": true,
+ "description": "The ID of the test clock to advance.",
+ "schema": { "type": "string" }
+ }
+ ],
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application/x-www-form-urlencoded": {
+ "schema": {
+ "type": "object",
+ "required": ["frozen_time"],
+ "properties": {
+ "frozen_time": {
+ "type": "integer",
+ "description": "The new frozen time as a Unix timestamp. Must be greater than the current frozen time."
+ }
+ }
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "The updated test clock object with the new frozen time.",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/TestClock" }
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid request (e.g., frozen_time is not in the future).",
+ "content": {
+ "application/json": {
+ "schema": { "$ref": "#/components/schemas/Error" }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "components": {
+ "securitySchemes": {
+ "BearerAuth": {
+ "type": "http",
+ "scheme": "bearer",
+ "description": "Authenticate with a test API key. Use any string starting with `sk_test_` (e.g., `sk_test_12345`)."
+ }
+ },
+ "parameters": {
+ "Limit": {
+ "name": "limit",
+ "in": "query",
+ "description": "A limit on the number of objects to be returned, between 1 and 100. Default is 10.",
+ "schema": {
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 100,
+ "default": 10
+ }
+ },
+ "StartingAfter": {
+ "name": "starting_after",
+ "in": "query",
+ "description": "A cursor for pagination. `starting_after` is an object ID that defines your place in the list. Retrieves the next page of results after this object.",
+ "schema": { "type": "string" }
+ },
+ "EndingBefore": {
+ "name": "ending_before",
+ "in": "query",
+ "description": "A cursor for pagination. `ending_before` is an object ID that defines your place in the list. Retrieves the previous page of results before this object.",
+ "schema": { "type": "string" }
+ },
+ "Expand": {
+ "name": "expand[]",
+ "in": "query",
+ "description": "Specifies which fields in the response should be expanded. Supports dot notation for nested expansion (e.g., `latest_invoice.payment_intent`).",
+ "schema": {
+ "type": "array",
+ "items": { "type": "string" }
+ },
+ "explode": true
+ }
+ },
+ "schemas": {
+ "Error": {
+ "type": "object",
+ "description": "An error response from the API.",
+ "required": ["error"],
+ "properties": {
+ "error": {
+ "type": "object",
+ "required": ["type", "message"],
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "The type of error (e.g., `invalid_request_error`, `authentication_error`, `card_error`).",
+ "enum": ["invalid_request_error", "authentication_error", "card_error"]
+ },
+ "message": {
+ "type": "string",
+ "description": "A human-readable message providing more details about the error."
+ },
+ "code": {
+ "type": "string",
+ "nullable": true,
+ "description": "For some errors (e.g., `resource_missing`, `payment_intent_unexpected_state`), a short string indicating the error code."
+ },
+ "param": {
+ "type": "string",
+ "nullable": true,
+ "description": "If the error is parameter-specific, the parameter related to the error."
+ },
+ "decline_code": {
+ "type": "string",
+ "nullable": true,
+ "description": "For card errors, the decline code from the issuer."
+ }
+ }
+ }
+ }
+ },
+ "ListResponse": {
+ "type": "object",
+ "description": "A list of objects with cursor-based pagination.",
+ "required": ["object", "data", "has_more", "url"],
+ "properties": {
+ "object": {
+ "type": "string",
+ "enum": ["list"],
+ "description": "String representing the object's type. Always `list`."
+ },
+ "data": {
+ "type": "array",
+ "items": {},
+ "description": "An array of the requested objects."
+ },
+ "has_more": {
+ "type": "boolean",
+ "description": "Whether there are more results available after this set."
+ },
+ "url": {
+ "type": "string",
+ "description": "The URL where this list can be accessed."
+ }
+ }
+ },
+ "SearchResult": {
+ "type": "object",
+ "description": "A search result containing matching objects.",
+ "required": ["object", "data", "has_more", "total_count", "url", "next_page"],
+ "properties": {
+ "object": {
+ "type": "string",
+ "enum": ["search_result"],
+ "description": "String representing the object's type. Always `search_result`."
+ },
+ "data": {
+ "type": "array",
+ "items": {},
+ "description": "An array of the matching objects."
+ },
+ "has_more": {
+ "type": "boolean",
+ "description": "Whether there are more results available."
+ },
+ "total_count": {
+ "type": "integer",
+ "description": "The total number of objects that match the query."
+ },
+ "url": {
+ "type": "string",
+ "description": "The URL where this search can be accessed."
+ },
+ "next_page": {
+ "type": "string",
+ "nullable": true,
+ "description": "A cursor for the next page of results. Always `null` in Strimulator."
+ }
+ }
+ },
+ "Customer": {
+ "type": "object",
+ "description": "A customer object represents a customer of your business.",
+ "required": ["id", "object", "created", "livemode", "metadata"],
+ "properties": {
+ "id": { "type": "string", "description": "Unique identifier for the object (e.g., `cus_...`).", "example": "cus_abc123def456" },
+ "object": { "type": "string", "enum": ["customer"], "description": "String representing the object's type." },
+ "address": { "type": "object", "nullable": true, "description": "The customer's address." },
+ "balance": { "type": "integer", "description": "Current balance on the customer." },
+ "created": { "type": "integer", "description": "Time at which the object was created (Unix timestamp)." },
+ "currency": { "type": "string", "nullable": true, "description": "The currency the customer can be charged in." },
+ "default_source": { "type": "string", "nullable": true, "description": "ID of the default payment source." },
+ "delinquent": { "type": "boolean", "description": "Whether the customer currently has an unpaid invoice." },
+ "description": { "type": "string", "nullable": true, "description": "An arbitrary string attached to the object." },
+ "discount": { "type": "object", "nullable": true, "description": "Discount object currently applied to the customer." },
+ "email": { "type": "string", "nullable": true, "description": "The customer's email address." },
+ "invoice_prefix": { "type": "string", "description": "The prefix for the customer used to generate unique invoice numbers." },
+ "invoice_settings": {
+ "type": "object",
+ "description": "Default invoice settings for the customer.",
+ "properties": {
+ "custom_fields": { "type": "array", "nullable": true, "items": {} },
+ "default_payment_method": { "type": "string", "nullable": true },
+ "footer": { "type": "string", "nullable": true },
+ "rendering_options": { "type": "object", "nullable": true }
+ }
+ },
+ "livemode": { "type": "boolean", "description": "Always `false` in Strimulator." },
+ "metadata": { "type": "object", "additionalProperties": { "type": "string" }, "description": "Set of key-value pairs attached to the object." },
+ "name": { "type": "string", "nullable": true, "description": "The customer's full name or business name." },
+ "phone": { "type": "string", "nullable": true, "description": "The customer's phone number." },
+ "preferred_locales": { "type": "array", "items": { "type": "string" }, "description": "Customer's preferred locales." },
+ "shipping": { "type": "object", "nullable": true, "description": "Shipping information for the customer." },
+ "tax_exempt": { "type": "string", "enum": ["none", "exempt", "reverse"], "description": "Tax exemption status." },
+ "test_clock": { "type": "string", "nullable": true, "description": "ID of the test clock this customer belongs to." }
+ }
+ },
+ "Product": {
+ "type": "object",
+ "description": "A product represents an item or service you sell.",
+ "required": ["id", "object", "active", "created", "livemode", "metadata", "name"],
+ "properties": {
+ "id": { "type": "string", "description": "Unique identifier for the object (e.g., `prod_...`).", "example": "prod_abc123def456" },
+ "object": { "type": "string", "enum": ["product"], "description": "String representing the object's type." },
+ "active": { "type": "boolean", "description": "Whether the product is currently available for purchase." },
+ "created": { "type": "integer", "description": "Time at which the object was created (Unix timestamp)." },
+ "default_price": { "type": "string", "nullable": true, "description": "The ID of the default price for this product." },
+ "description": { "type": "string", "nullable": true, "description": "The product's description." },
+ "images": { "type": "array", "items": { "type": "string" }, "description": "A list of image URLs for this product." },
+ "livemode": { "type": "boolean", "description": "Always `false` in Strimulator." },
+ "metadata": { "type": "object", "additionalProperties": { "type": "string" }, "description": "Set of key-value pairs attached to the object." },
+ "name": { "type": "string", "description": "The product's name, displayed to customers." },
+ "package_dimensions": { "type": "object", "nullable": true, "description": "Package dimensions for shipping." },
+ "shippable": { "type": "boolean", "nullable": true, "description": "Whether the product is shippable." },
+ "statement_descriptor": { "type": "string", "nullable": true, "description": "Descriptor shown on customer statements." },
+ "tax_code": { "type": "string", "nullable": true, "description": "A tax code ID." },
+ "type": { "type": "string", "enum": ["service", "good"], "description": "The type of the product. Always `service` in Strimulator." },
+ "unit_label": { "type": "string", "nullable": true, "description": "A label that represents units of this product." },
+ "updated": { "type": "integer", "description": "Time at which the object was last updated (Unix timestamp)." },
+ "url": { "type": "string", "nullable": true, "description": "A URL of the product." }
+ }
+ },
+ "Price": {
+ "type": "object",
+ "description": "A price defines the unit cost, currency, and billing cycle for a product.",
+ "required": ["id", "object", "active", "created", "currency", "livemode", "metadata", "product", "type"],
+ "properties": {
+ "id": { "type": "string", "description": "Unique identifier for the object (e.g., `price_...`).", "example": "price_abc123def456" },
+ "object": { "type": "string", "enum": ["price"], "description": "String representing the object's type." },
+ "active": { "type": "boolean", "description": "Whether the price is currently active." },
+ "billing_scheme": { "type": "string", "enum": ["per_unit", "tiered"], "description": "Describes how to compute the price per period." },
+ "created": { "type": "integer", "description": "Time at which the object was created (Unix timestamp)." },
+ "currency": { "type": "string", "description": "Three-letter ISO currency code, in lowercase." },
+ "custom_unit_amount": { "type": "object", "nullable": true, "description": "Custom unit amount settings." },
+ "livemode": { "type": "boolean", "description": "Always `false` in Strimulator." },
+ "lookup_key": { "type": "string", "nullable": true, "description": "A lookup key used to retrieve prices dynamically." },
+ "metadata": { "type": "object", "additionalProperties": { "type": "string" }, "description": "Set of key-value pairs attached to the object." },
+ "nickname": { "type": "string", "nullable": true, "description": "A brief description of the price." },
+ "product": { "type": "string", "description": "The ID of the product this price is for." },
+ "recurring": {
+ "type": "object",
+ "nullable": true,
+ "description": "The recurring components of a price. Only present for recurring prices.",
+ "properties": {
+ "interval": { "type": "string", "enum": ["day", "week", "month", "year"], "description": "The billing interval." },
+ "interval_count": { "type": "integer", "description": "The number of intervals between billings." },
+ "usage_type": { "type": "string", "enum": ["licensed", "metered"], "description": "How the quantity per period is determined." },
+ "aggregate_usage": { "type": "string", "nullable": true },
+ "trial_period_days": { "type": "integer", "nullable": true },
+ "meter": { "type": "string", "nullable": true }
+ }
+ },
+ "tax_behavior": { "type": "string", "nullable": true, "enum": ["exclusive", "inclusive", "unspecified"], "description": "Tax behavior of the price." },
+ "tiers_mode": { "type": "string", "nullable": true, "description": "The tiers mode." },
+ "transform_quantity": { "type": "object", "nullable": true, "description": "Quantity transformation settings." },
+ "type": { "type": "string", "enum": ["one_time", "recurring"], "description": "Whether the price is one-time or recurring." },
+ "unit_amount": { "type": "integer", "nullable": true, "description": "The unit amount in cents." },
+ "unit_amount_decimal": { "type": "string", "nullable": true, "description": "The unit amount in cents as a decimal string." }
+ }
+ },
+ "PaymentMethod": {
+ "type": "object",
+ "description": "A payment method represents a customer's payment instrument (e.g., a credit card).",
+ "required": ["id", "object", "created", "livemode", "type"],
+ "properties": {
+ "id": { "type": "string", "description": "Unique identifier for the object (e.g., `pm_...`).", "example": "pm_abc123def456" },
+ "object": { "type": "string", "enum": ["payment_method"], "description": "String representing the object's type." },
+ "billing_details": {
+ "type": "object",
+ "description": "Billing information associated with the payment method.",
+ "properties": {
+ "address": { "type": "object", "nullable": true },
+ "email": { "type": "string", "nullable": true },
+ "name": { "type": "string", "nullable": true },
+ "phone": { "type": "string", "nullable": true }
+ }
+ },
+ "card": {
+ "type": "object",
+ "description": "Card details (present when type is `card`).",
+ "properties": {
+ "brand": { "type": "string", "description": "Card brand (e.g., `visa`, `mastercard`, `amex`)." },
+ "checks": {
+ "type": "object",
+ "properties": {
+ "address_line1_check": { "type": "string", "nullable": true },
+ "address_postal_code_check": { "type": "string", "nullable": true },
+ "cvc_check": { "type": "string", "nullable": true }
+ }
+ },
+ "country": { "type": "string", "description": "Two-letter ISO code for the card's issuing country." },
+ "display_brand": { "type": "string", "description": "The display brand of the card." },
+ "exp_month": { "type": "integer", "description": "Two-digit number representing the card's expiration month." },
+ "exp_year": { "type": "integer", "description": "Four-digit number representing the card's expiration year." },
+ "fingerprint": { "type": "string", "description": "Uniquely identifies this particular card number." },
+ "funding": { "type": "string", "enum": ["credit", "debit", "prepaid", "unknown"], "description": "Card funding type." },
+ "generated_from": { "type": "object", "nullable": true },
+ "last4": { "type": "string", "description": "The last four digits of the card." },
+ "networks": {
+ "type": "object",
+ "properties": {
+ "available": { "type": "array", "items": { "type": "string" } },
+ "preferred": { "type": "string", "nullable": true }
+ }
+ },
+ "three_d_secure_usage": {
+ "type": "object",
+ "properties": {
+ "supported": { "type": "boolean" }
+ }
+ },
+ "wallet": { "type": "object", "nullable": true }
+ }
+ },
+ "created": { "type": "integer", "description": "Time at which the object was created (Unix timestamp)." },
+ "customer": { "type": "string", "nullable": true, "description": "The ID of the customer to which this payment method is attached, or `null`." },
+ "livemode": { "type": "boolean", "description": "Always `false` in Strimulator." },
+ "metadata": { "type": "object", "additionalProperties": { "type": "string" }, "description": "Set of key-value pairs attached to the object." },
+ "type": { "type": "string", "enum": ["card"], "description": "The type of the payment method. Only `card` is supported." }
+ }
+ },
+ "PaymentIntent": {
+ "type": "object",
+ "description": "A PaymentIntent guides you through the process of collecting a payment from your customer.",
+ "required": ["id", "object", "amount", "currency", "created", "livemode", "metadata", "status"],
+ "properties": {
+ "id": { "type": "string", "description": "Unique identifier for the object (e.g., `pi_...`).", "example": "pi_abc123def456" },
+ "object": { "type": "string", "enum": ["payment_intent"], "description": "String representing the object's type." },
+ "amount": { "type": "integer", "description": "Amount intended to be collected, in cents." },
+ "amount_capturable": { "type": "integer", "description": "Amount that can be captured from this PaymentIntent." },
+ "amount_received": { "type": "integer", "description": "Amount that was collected." },
+ "automatic_payment_methods": { "type": "object", "nullable": true },
+ "canceled_at": { "type": "integer", "nullable": true, "description": "Time at which the PaymentIntent was canceled (Unix timestamp)." },
+ "cancellation_reason": { "type": "string", "nullable": true, "description": "Reason for cancellation." },
+ "capture_method": { "type": "string", "enum": ["automatic", "manual"], "description": "Controls when the funds will be captured." },
+ "client_secret": { "type": "string", "description": "The client secret for this PaymentIntent, used in client-side integrations." },
+ "confirmation_method": { "type": "string", "enum": ["automatic", "manual"], "description": "How the PaymentIntent was confirmed." },
+ "created": { "type": "integer", "description": "Time at which the object was created (Unix timestamp)." },
+ "currency": { "type": "string", "description": "Three-letter ISO currency code, in lowercase." },
+ "customer": { "type": "string", "nullable": true, "description": "ID of the customer this PaymentIntent is for." },
+ "description": { "type": "string", "nullable": true, "description": "An arbitrary string attached to the object." },
+ "last_payment_error": {
+ "type": "object",
+ "nullable": true,
+ "description": "The payment error encountered in the previous payment attempt.",
+ "properties": {
+ "type": { "type": "string" },
+ "message": { "type": "string" },
+ "code": { "type": "string" },
+ "decline_code": { "type": "string" },
+ "charge": { "type": "string" }
+ }
+ },
+ "latest_charge": { "type": "string", "nullable": true, "description": "The ID of the most recent charge created by this PaymentIntent." },
+ "livemode": { "type": "boolean", "description": "Always `false` in Strimulator." },
+ "metadata": { "type": "object", "additionalProperties": { "type": "string" }, "description": "Set of key-value pairs attached to the object." },
+ "next_action": {
+ "type": "object",
+ "nullable": true,
+ "description": "If present, this property tells you what actions you need to take for the customer to continue the payment (e.g., 3DS authentication)."
+ },
+ "on_behalf_of": { "type": "string", "nullable": true },
+ "payment_method": { "type": "string", "nullable": true, "description": "ID of the payment method used in this PaymentIntent." },
+ "payment_method_options": { "type": "object", "description": "Payment method-specific configuration." },
+ "payment_method_types": { "type": "array", "items": { "type": "string" }, "description": "The list of payment method types that this PaymentIntent can use." },
+ "processing": { "type": "object", "nullable": true },
+ "receipt_email": { "type": "string", "nullable": true },
+ "setup_future_usage": { "type": "string", "nullable": true },
+ "shipping": { "type": "object", "nullable": true },
+ "statement_descriptor": { "type": "string", "nullable": true },
+ "statement_descriptor_suffix": { "type": "string", "nullable": true },
+ "status": {
+ "type": "string",
+ "enum": ["requires_payment_method", "requires_confirmation", "requires_action", "processing", "requires_capture", "canceled", "succeeded"],
+ "description": "Status of this PaymentIntent."
+ },
+ "transfer_data": { "type": "object", "nullable": true },
+ "transfer_group": { "type": "string", "nullable": true }
+ }
+ },
+ "SetupIntent": {
+ "type": "object",
+ "description": "A SetupIntent guides you through the process of setting up a customer's payment credentials for future payments.",
+ "required": ["id", "object", "created", "livemode", "metadata", "status"],
+ "properties": {
+ "id": { "type": "string", "description": "Unique identifier for the object (e.g., `seti_...`).", "example": "seti_abc123def456" },
+ "object": { "type": "string", "enum": ["setup_intent"], "description": "String representing the object's type." },
+ "application": { "type": "string", "nullable": true },
+ "automatic_payment_methods": { "type": "object", "nullable": true },
+ "cancellation_reason": { "type": "string", "nullable": true, "description": "Reason for cancellation." },
+ "client_secret": { "type": "string", "description": "The client secret for this SetupIntent." },
+ "created": { "type": "integer", "description": "Time at which the object was created (Unix timestamp)." },
+ "customer": { "type": "string", "nullable": true, "description": "ID of the customer this SetupIntent is for." },
+ "description": { "type": "string", "nullable": true },
+ "last_setup_error": { "type": "object", "nullable": true, "description": "The error encountered in the previous setup attempt." },
+ "latest_attempt": { "type": "string", "nullable": true },
+ "livemode": { "type": "boolean", "description": "Always `false` in Strimulator." },
+ "mandate": { "type": "string", "nullable": true },
+ "metadata": { "type": "object", "additionalProperties": { "type": "string" }, "description": "Set of key-value pairs attached to the object." },
+ "next_action": { "type": "object", "nullable": true },
+ "on_behalf_of": { "type": "string", "nullable": true },
+ "payment_method": { "type": "string", "nullable": true, "description": "ID of the payment method attached to this SetupIntent." },
+ "payment_method_options": { "type": "object", "description": "Payment method-specific configuration." },
+ "payment_method_types": { "type": "array", "items": { "type": "string" }, "description": "The list of payment method types supported." },
+ "single_use_mandate": { "type": "string", "nullable": true },
+ "status": {
+ "type": "string",
+ "enum": ["requires_payment_method", "requires_confirmation", "requires_action", "canceled", "succeeded"],
+ "description": "Status of this SetupIntent."
+ },
+ "usage": { "type": "string", "enum": ["off_session", "on_session"], "description": "Indicates the future usage of this SetupIntent's payment method." }
+ }
+ },
+ "Charge": {
+ "type": "object",
+ "description": "A charge represents a payment of money. Charges are created automatically when a PaymentIntent succeeds.",
+ "required": ["id", "object", "amount", "created", "currency", "livemode", "metadata", "status"],
+ "properties": {
+ "id": { "type": "string", "description": "Unique identifier for the object (e.g., `ch_...`).", "example": "ch_abc123def456" },
+ "object": { "type": "string", "enum": ["charge"], "description": "String representing the object's type." },
+ "amount": { "type": "integer", "description": "Amount charged in cents." },
+ "amount_captured": { "type": "integer", "description": "Amount captured in cents." },
+ "amount_refunded": { "type": "integer", "description": "Amount refunded in cents." },
+ "balance_transaction": { "type": "string", "nullable": true },
+ "billing_details": {
+ "type": "object",
+ "description": "Billing information associated with the payment method.",
+ "properties": {
+ "address": { "type": "object", "nullable": true },
+ "email": { "type": "string", "nullable": true },
+ "name": { "type": "string", "nullable": true },
+ "phone": { "type": "string", "nullable": true }
+ }
+ },
+ "calculated_statement_descriptor": { "type": "string", "description": "The full statement descriptor." },
+ "captured": { "type": "boolean", "description": "Whether the charge has been captured." },
+ "created": { "type": "integer", "description": "Time at which the object was created (Unix timestamp)." },
+ "currency": { "type": "string", "description": "Three-letter ISO currency code." },
+ "customer": { "type": "string", "nullable": true, "description": "ID of the customer this charge is for." },
+ "description": { "type": "string", "nullable": true },
+ "disputed": { "type": "boolean", "description": "Whether the charge has been disputed." },
+ "failure_code": { "type": "string", "nullable": true, "description": "Error code explaining reason for charge failure." },
+ "failure_message": { "type": "string", "nullable": true, "description": "Message explaining charge failure." },
+ "invoice": { "type": "string", "nullable": true, "description": "ID of the invoice this charge is for." },
+ "livemode": { "type": "boolean", "description": "Always `false` in Strimulator." },
+ "metadata": { "type": "object", "additionalProperties": { "type": "string" }, "description": "Set of key-value pairs attached to the object." },
+ "outcome": {
+ "type": "object",
+ "description": "Details about the charge outcome.",
+ "properties": {
+ "network_status": { "type": "string", "enum": ["approved_by_network", "declined_by_network"] },
+ "reason": { "type": "string", "nullable": true },
+ "risk_level": { "type": "string" },
+ "risk_score": { "type": "integer" },
+ "seller_message": { "type": "string" },
+ "type": { "type": "string", "enum": ["authorized", "issuer_declined"] }
+ }
+ },
+ "paid": { "type": "boolean", "description": "Whether the charge succeeded." },
+ "payment_intent": { "type": "string", "nullable": true, "description": "ID of the PaymentIntent that created this charge." },
+ "payment_method": { "type": "string", "nullable": true, "description": "ID of the payment method used." },
+ "refunded": { "type": "boolean", "description": "Whether the charge has been fully refunded." },
+ "refunds": {
+ "type": "object",
+ "description": "A list of refunds that have been applied to the charge.",
+ "properties": {
+ "object": { "type": "string", "enum": ["list"] },
+ "data": { "type": "array", "items": { "$ref": "#/components/schemas/Refund" } },
+ "has_more": { "type": "boolean" },
+ "url": { "type": "string" }
+ }
+ },
+ "status": { "type": "string", "enum": ["succeeded", "pending", "failed"], "description": "The status of the charge." }
+ }
+ },
+ "Refund": {
+ "type": "object",
+ "description": "A refund represents the return of funds to a customer.",
+ "required": ["id", "object", "amount", "created", "currency", "metadata", "status"],
+ "properties": {
+ "id": { "type": "string", "description": "Unique identifier for the object (e.g., `re_...`).", "example": "re_abc123def456" },
+ "object": { "type": "string", "enum": ["refund"], "description": "String representing the object's type." },
+ "amount": { "type": "integer", "description": "Amount refunded in cents." },
+ "balance_transaction": { "type": "string", "nullable": true },
+ "charge": { "type": "string", "description": "ID of the charge that was refunded." },
+ "created": { "type": "integer", "description": "Time at which the object was created (Unix timestamp)." },
+ "currency": { "type": "string", "description": "Three-letter ISO currency code." },
+ "metadata": { "type": "object", "additionalProperties": { "type": "string" }, "description": "Set of key-value pairs attached to the object." },
+ "payment_intent": { "type": "string", "nullable": true, "description": "ID of the PaymentIntent that was refunded." },
+ "reason": { "type": "string", "nullable": true, "enum": ["duplicate", "fraudulent", "requested_by_customer", null], "description": "Reason for the refund." },
+ "receipt_number": { "type": "string", "nullable": true },
+ "source_transfer_reversal": { "type": "string", "nullable": true },
+ "status": { "type": "string", "enum": ["succeeded", "pending", "failed", "canceled"], "description": "Status of the refund." },
+ "transfer_reversal": { "type": "string", "nullable": true }
+ }
+ },
+ "Subscription": {
+ "type": "object",
+ "description": "A subscription allows you to charge a customer on a recurring basis.",
+ "required": ["id", "object", "created", "currency", "customer", "livemode", "metadata", "status"],
+ "properties": {
+ "id": { "type": "string", "description": "Unique identifier for the object (e.g., `sub_...`).", "example": "sub_abc123def456" },
+ "object": { "type": "string", "enum": ["subscription"], "description": "String representing the object's type." },
+ "billing_cycle_anchor": { "type": "integer", "description": "Determines the date of the first full invoice." },
+ "cancel_at": { "type": "integer", "nullable": true, "description": "Time at which the subscription will be automatically canceled (Unix timestamp)." },
+ "cancel_at_period_end": { "type": "boolean", "description": "Whether the subscription will be canceled at the end of the current period." },
+ "canceled_at": { "type": "integer", "nullable": true, "description": "Time at which the subscription was canceled (Unix timestamp)." },
+ "collection_method": { "type": "string", "enum": ["charge_automatically", "send_invoice"], "description": "How the subscription is collected." },
+ "created": { "type": "integer", "description": "Time at which the object was created (Unix timestamp)." },
+ "currency": { "type": "string", "description": "Three-letter ISO currency code." },
+ "current_period_end": { "type": "integer", "description": "End of the current period (Unix timestamp)." },
+ "current_period_start": { "type": "integer", "description": "Start of the current period (Unix timestamp)." },
+ "customer": { "type": "string", "description": "ID of the customer who owns the subscription." },
+ "default_payment_method": { "type": "string", "nullable": true, "description": "ID of the default payment method." },
+ "ended_at": { "type": "integer", "nullable": true, "description": "Time at which the subscription ended (Unix timestamp)." },
+ "items": {
+ "type": "object",
+ "description": "List of subscription items, each with an assigned price.",
+ "properties": {
+ "object": { "type": "string", "enum": ["list"] },
+ "data": {
+ "type": "array",
+ "items": { "$ref": "#/components/schemas/SubscriptionItem" }
+ },
+ "has_more": { "type": "boolean" },
+ "url": { "type": "string" }
+ }
+ },
+ "latest_invoice": { "type": "string", "nullable": true, "description": "The most recent invoice this subscription has generated." },
+ "livemode": { "type": "boolean", "description": "Always `false` in Strimulator." },
+ "metadata": { "type": "object", "additionalProperties": { "type": "string" }, "description": "Set of key-value pairs attached to the object." },
+ "status": {
+ "type": "string",
+ "enum": ["active", "past_due", "unpaid", "canceled", "incomplete", "incomplete_expired", "trialing", "paused"],
+ "description": "The status of the subscription."
+ },
+ "test_clock": { "type": "string", "nullable": true, "description": "ID of the test clock this subscription is associated with." },
+ "trial_end": { "type": "integer", "nullable": true, "description": "End of the trial period (Unix timestamp)." },
+ "trial_start": { "type": "integer", "nullable": true, "description": "Start of the trial period (Unix timestamp)." }
+ }
+ },
+ "SubscriptionItem": {
+ "type": "object",
+ "description": "A subscription item represents a single line item in a subscription.",
+ "required": ["id", "object", "created", "metadata", "price", "quantity", "subscription"],
+ "properties": {
+ "id": { "type": "string", "description": "Unique identifier for the object (e.g., `si_...`)." },
+ "object": { "type": "string", "enum": ["subscription_item"], "description": "String representing the object's type." },
+ "created": { "type": "integer", "description": "Time at which the object was created (Unix timestamp)." },
+ "metadata": { "type": "object", "additionalProperties": { "type": "string" } },
+ "price": { "$ref": "#/components/schemas/Price" },
+ "quantity": { "type": "integer", "description": "The quantity of the plan to which the customer is subscribed." },
+ "subscription": { "type": "string", "description": "The ID of the subscription this item belongs to." }
+ }
+ },
+ "Invoice": {
+ "type": "object",
+ "description": "An invoice is a statement of amounts owed by a customer.",
+ "required": ["id", "object", "amount_due", "amount_paid", "created", "currency", "customer", "livemode", "metadata", "status"],
+ "properties": {
+ "id": { "type": "string", "description": "Unique identifier for the object (e.g., `in_...`).", "example": "in_abc123def456" },
+ "object": { "type": "string", "enum": ["invoice"], "description": "String representing the object's type." },
+ "amount_due": { "type": "integer", "description": "Final amount due at this time for the invoice, in cents." },
+ "amount_paid": { "type": "integer", "description": "The amount that has been paid, in cents." },
+ "amount_remaining": { "type": "integer", "description": "The amount remaining to be paid, in cents." },
+ "attempt_count": { "type": "integer", "description": "Number of payment attempts made for this invoice." },
+ "attempted": { "type": "boolean", "description": "Whether an attempt has been made to pay the invoice." },
+ "auto_advance": { "type": "boolean", "description": "Controls whether Stripe performs automatic collection." },
+ "billing_reason": { "type": "string", "nullable": true, "description": "Indicates the reason why the invoice was created.", "enum": ["subscription_create", "subscription_cycle", "subscription_update", "manual", null] },
+ "collection_method": { "type": "string", "enum": ["charge_automatically", "send_invoice"], "description": "How the invoice is collected." },
+ "created": { "type": "integer", "description": "Time at which the object was created (Unix timestamp)." },
+ "currency": { "type": "string", "description": "Three-letter ISO currency code." },
+ "customer": { "type": "string", "description": "The ID of the customer who will be billed." },
+ "default_payment_method": { "type": "string", "nullable": true },
+ "description": { "type": "string", "nullable": true },
+ "effective_at": { "type": "integer", "nullable": true, "description": "Time at which the invoice was finalized (Unix timestamp)." },
+ "hosted_invoice_url": { "type": "string", "nullable": true },
+ "lines": {
+ "type": "object",
+ "description": "The individual line items that make up the invoice.",
+ "properties": {
+ "object": { "type": "string", "enum": ["list"] },
+ "data": { "type": "array", "items": {} },
+ "has_more": { "type": "boolean" },
+ "url": { "type": "string" }
+ }
+ },
+ "livemode": { "type": "boolean", "description": "Always `false` in Strimulator." },
+ "metadata": { "type": "object", "additionalProperties": { "type": "string" }, "description": "Set of key-value pairs attached to the object." },
+ "number": { "type": "string", "nullable": true, "description": "The invoice number (assigned upon finalization)." },
+ "paid": { "type": "boolean", "description": "Whether the invoice has been paid." },
+ "payment_intent": { "type": "string", "nullable": true, "description": "The PaymentIntent associated with this invoice." },
+ "period_end": { "type": "integer", "description": "End of the usage period the invoice covers (Unix timestamp)." },
+ "period_start": { "type": "integer", "description": "Start of the usage period the invoice covers (Unix timestamp)." },
+ "status": {
+ "type": "string",
+ "enum": ["draft", "open", "paid", "uncollectible", "void"],
+ "description": "The status of the invoice."
+ },
+ "subscription": { "type": "string", "nullable": true, "description": "The subscription that this invoice was prepared for." },
+ "subtotal": { "type": "integer", "description": "Total of all subscriptions, invoice items, and prorations before discount or tax." },
+ "total": { "type": "integer", "description": "Total after discounts and taxes." }
+ }
+ },
+ "Event": {
+ "type": "object",
+ "description": "Events are Strimulator's way of letting you know when something interesting happens in your account.",
+ "required": ["id", "object", "api_version", "created", "data", "livemode", "pending_webhooks", "request", "type"],
+ "properties": {
+ "id": { "type": "string", "description": "Unique identifier for the object (e.g., `evt_...`).", "example": "evt_abc123def456" },
+ "object": { "type": "string", "enum": ["event"], "description": "String representing the object's type." },
+ "api_version": { "type": "string", "description": "The Stripe API version used to render `data`.", "example": "2024-12-18" },
+ "created": { "type": "integer", "description": "Time at which the object was created (Unix timestamp)." },
+ "data": {
+ "type": "object",
+ "description": "Data associated with the event.",
+ "required": ["object"],
+ "properties": {
+ "object": {
+ "type": "object",
+ "description": "The object that triggered the event."
+ },
+ "previous_attributes": {
+ "type": "object",
+ "description": "The values of attributes that have changed (only included for `*.updated` events)."
+ }
+ }
+ },
+ "livemode": { "type": "boolean", "description": "Always `false` in Strimulator." },
+ "pending_webhooks": { "type": "integer", "description": "Number of webhooks that have yet to be successfully delivered." },
+ "request": {
+ "type": "object",
+ "description": "Information on the API request that triggered the event.",
+ "properties": {
+ "id": { "type": "string", "nullable": true },
+ "idempotency_key": { "type": "string", "nullable": true }
+ }
+ },
+ "type": { "type": "string", "description": "Description of the event (e.g., `customer.created`, `payment_intent.succeeded`)." }
+ }
+ },
+ "WebhookEndpoint": {
+ "type": "object",
+ "description": "A webhook endpoint receives event notifications via HTTP POST.",
+ "required": ["id", "object", "created", "enabled_events", "livemode", "metadata", "status", "url"],
+ "properties": {
+ "id": { "type": "string", "description": "Unique identifier for the object (e.g., `we_...`).", "example": "we_abc123def456" },
+ "object": { "type": "string", "enum": ["webhook_endpoint"], "description": "String representing the object's type." },
+ "api_version": { "type": "string", "nullable": true, "description": "The API version events are rendered as." },
+ "application": { "type": "string", "nullable": true },
+ "created": { "type": "integer", "description": "Time at which the object was created (Unix timestamp)." },
+ "description": { "type": "string", "nullable": true, "description": "An optional description." },
+ "enabled_events": {
+ "type": "array",
+ "items": { "type": "string" },
+ "description": "The list of events to enable for this endpoint. Use `[\"*\"]` for all events."
+ },
+ "livemode": { "type": "boolean", "description": "Always `false` in Strimulator." },
+ "metadata": { "type": "object", "additionalProperties": { "type": "string" }, "description": "Set of key-value pairs attached to the object." },
+ "secret": { "type": "string", "description": "The endpoint's secret, used to generate webhook signatures. Only returned on creation." },
+ "status": { "type": "string", "enum": ["enabled", "disabled"], "description": "The status of the webhook endpoint." },
+ "url": { "type": "string", "description": "The URL of the webhook endpoint." }
+ }
+ },
+ "TestClock": {
+ "type": "object",
+ "description": "A test clock enables deterministic control over objects in testmode by simulating the passage of time.",
+ "required": ["id", "object", "created", "frozen_time", "livemode", "status"],
+ "properties": {
+ "id": { "type": "string", "description": "Unique identifier for the object (e.g., `clock_...`).", "example": "clock_abc123def456" },
+ "object": { "type": "string", "enum": ["test_helpers.test_clock"], "description": "String representing the object's type." },
+ "created": { "type": "integer", "description": "Time at which the object was created (Unix timestamp)." },
+ "deletes_after": { "type": "integer", "description": "Time at which this test clock will be automatically deleted (Unix timestamp)." },
+ "frozen_time": { "type": "integer", "description": "The frozen time for this test clock (Unix timestamp)." },
+ "livemode": { "type": "boolean", "description": "Always `false` in Strimulator." },
+ "name": { "type": "string", "nullable": true, "description": "A human-readable name for the test clock." },
+ "status": { "type": "string", "enum": ["ready", "advancing", "internal_failure"], "description": "The status of the test clock." }
+ }
+ }
+ }
+ }
+}
From e8d0ce4e84abd70f1430dd02085fe56ab53d7485 Mon Sep 17 00:00:00 2001
From: Segfault <5221072+Segfaultd@users.noreply.github.com>
Date: Fri, 10 Apr 2026 10:22:33 +0200
Subject: [PATCH 07/10] Add OpenAPI integration and auto-generated API
reference
---
docs/components/api-page.client.tsx | 4 ++++
docs/components/api-page.tsx | 7 +++++++
docs/components/mdx.tsx | 2 ++
docs/content/docs/api/advanceTestClock.mdx | 20 ++++++++++++++++++
docs/content/docs/api/attachPaymentMethod.mdx | 17 +++++++++++++++
docs/content/docs/api/cancelPaymentIntent.mdx | 19 +++++++++++++++++
docs/content/docs/api/cancelSetupIntent.mdx | 19 +++++++++++++++++
docs/content/docs/api/cancelSubscription.mdx | 19 +++++++++++++++++
.../content/docs/api/capturePaymentIntent.mdx | 19 +++++++++++++++++
.../content/docs/api/confirmPaymentIntent.mdx | 20 ++++++++++++++++++
docs/content/docs/api/confirmSetupIntent.mdx | 20 ++++++++++++++++++
docs/content/docs/api/createCustomer.mdx | 17 +++++++++++++++
docs/content/docs/api/createInvoice.mdx | 19 +++++++++++++++++
docs/content/docs/api/createPaymentIntent.mdx | 19 +++++++++++++++++
docs/content/docs/api/createPaymentMethod.mdx | 21 +++++++++++++++++++
docs/content/docs/api/createPrice.mdx | 19 +++++++++++++++++
docs/content/docs/api/createProduct.mdx | 17 +++++++++++++++
docs/content/docs/api/createRefund.mdx | 19 +++++++++++++++++
docs/content/docs/api/createSetupIntent.mdx | 19 +++++++++++++++++
docs/content/docs/api/createSubscription.mdx | 19 +++++++++++++++++
docs/content/docs/api/createTestClock.mdx | 20 ++++++++++++++++++
.../docs/api/createWebhookEndpoint.mdx | 20 ++++++++++++++++++
docs/content/docs/api/deleteCustomer.mdx | 17 +++++++++++++++
docs/content/docs/api/deleteProduct.mdx | 17 +++++++++++++++
docs/content/docs/api/deleteTestClock.mdx | 17 +++++++++++++++
.../docs/api/deleteWebhookEndpoint.mdx | 19 +++++++++++++++++
docs/content/docs/api/detachPaymentMethod.mdx | 20 ++++++++++++++++++
docs/content/docs/api/finalizeInvoice.mdx | 19 +++++++++++++++++
docs/content/docs/api/listCharges.mdx | 19 +++++++++++++++++
docs/content/docs/api/listCustomers.mdx | 19 +++++++++++++++++
docs/content/docs/api/listEvents.mdx | 19 +++++++++++++++++
docs/content/docs/api/listInvoices.mdx | 19 +++++++++++++++++
docs/content/docs/api/listPaymentIntents.mdx | 19 +++++++++++++++++
docs/content/docs/api/listPaymentMethods.mdx | 17 +++++++++++++++
docs/content/docs/api/listPrices.mdx | 17 +++++++++++++++
docs/content/docs/api/listProducts.mdx | 17 +++++++++++++++
docs/content/docs/api/listRefunds.mdx | 19 +++++++++++++++++
docs/content/docs/api/listSetupIntents.mdx | 17 +++++++++++++++
docs/content/docs/api/listSubscriptions.mdx | 19 +++++++++++++++++
docs/content/docs/api/listTestClocks.mdx | 17 +++++++++++++++
.../content/docs/api/listWebhookEndpoints.mdx | 17 +++++++++++++++
docs/content/docs/api/meta.json | 3 +++
docs/content/docs/api/payInvoice.mdx | 17 +++++++++++++++
docs/content/docs/api/retrieveCharge.mdx | 19 +++++++++++++++++
docs/content/docs/api/retrieveCustomer.mdx | 17 +++++++++++++++
docs/content/docs/api/retrieveEvent.mdx | 17 +++++++++++++++
docs/content/docs/api/retrieveInvoice.mdx | 19 +++++++++++++++++
.../docs/api/retrievePaymentIntent.mdx | 19 +++++++++++++++++
.../docs/api/retrievePaymentMethod.mdx | 17 +++++++++++++++
docs/content/docs/api/retrievePrice.mdx | 17 +++++++++++++++
docs/content/docs/api/retrieveProduct.mdx | 17 +++++++++++++++
docs/content/docs/api/retrieveRefund.mdx | 17 +++++++++++++++
docs/content/docs/api/retrieveSetupIntent.mdx | 17 +++++++++++++++
.../content/docs/api/retrieveSubscription.mdx | 20 ++++++++++++++++++
docs/content/docs/api/retrieveTestClock.mdx | 17 +++++++++++++++
.../docs/api/retrieveWebhookEndpoint.mdx | 17 +++++++++++++++
docs/content/docs/api/searchCustomers.mdx | 19 +++++++++++++++++
docs/content/docs/api/searchInvoices.mdx | 17 +++++++++++++++
.../content/docs/api/searchPaymentIntents.mdx | 17 +++++++++++++++
docs/content/docs/api/searchSubscriptions.mdx | 17 +++++++++++++++
docs/content/docs/api/updateCustomer.mdx | 19 +++++++++++++++++
docs/content/docs/api/updatePaymentIntent.mdx | 19 +++++++++++++++++
docs/content/docs/api/updatePrice.mdx | 19 +++++++++++++++++
docs/content/docs/api/updateProduct.mdx | 19 +++++++++++++++++
docs/content/docs/api/updateSubscription.mdx | 19 +++++++++++++++++
docs/content/docs/api/voidInvoice.mdx | 19 +++++++++++++++++
docs/lib/openapi.ts | 5 +++++
docs/scripts/generate-docs.ts | 8 +++++++
68 files changed, 1166 insertions(+)
create mode 100644 docs/components/api-page.client.tsx
create mode 100644 docs/components/api-page.tsx
create mode 100644 docs/content/docs/api/advanceTestClock.mdx
create mode 100644 docs/content/docs/api/attachPaymentMethod.mdx
create mode 100644 docs/content/docs/api/cancelPaymentIntent.mdx
create mode 100644 docs/content/docs/api/cancelSetupIntent.mdx
create mode 100644 docs/content/docs/api/cancelSubscription.mdx
create mode 100644 docs/content/docs/api/capturePaymentIntent.mdx
create mode 100644 docs/content/docs/api/confirmPaymentIntent.mdx
create mode 100644 docs/content/docs/api/confirmSetupIntent.mdx
create mode 100644 docs/content/docs/api/createCustomer.mdx
create mode 100644 docs/content/docs/api/createInvoice.mdx
create mode 100644 docs/content/docs/api/createPaymentIntent.mdx
create mode 100644 docs/content/docs/api/createPaymentMethod.mdx
create mode 100644 docs/content/docs/api/createPrice.mdx
create mode 100644 docs/content/docs/api/createProduct.mdx
create mode 100644 docs/content/docs/api/createRefund.mdx
create mode 100644 docs/content/docs/api/createSetupIntent.mdx
create mode 100644 docs/content/docs/api/createSubscription.mdx
create mode 100644 docs/content/docs/api/createTestClock.mdx
create mode 100644 docs/content/docs/api/createWebhookEndpoint.mdx
create mode 100644 docs/content/docs/api/deleteCustomer.mdx
create mode 100644 docs/content/docs/api/deleteProduct.mdx
create mode 100644 docs/content/docs/api/deleteTestClock.mdx
create mode 100644 docs/content/docs/api/deleteWebhookEndpoint.mdx
create mode 100644 docs/content/docs/api/detachPaymentMethod.mdx
create mode 100644 docs/content/docs/api/finalizeInvoice.mdx
create mode 100644 docs/content/docs/api/listCharges.mdx
create mode 100644 docs/content/docs/api/listCustomers.mdx
create mode 100644 docs/content/docs/api/listEvents.mdx
create mode 100644 docs/content/docs/api/listInvoices.mdx
create mode 100644 docs/content/docs/api/listPaymentIntents.mdx
create mode 100644 docs/content/docs/api/listPaymentMethods.mdx
create mode 100644 docs/content/docs/api/listPrices.mdx
create mode 100644 docs/content/docs/api/listProducts.mdx
create mode 100644 docs/content/docs/api/listRefunds.mdx
create mode 100644 docs/content/docs/api/listSetupIntents.mdx
create mode 100644 docs/content/docs/api/listSubscriptions.mdx
create mode 100644 docs/content/docs/api/listTestClocks.mdx
create mode 100644 docs/content/docs/api/listWebhookEndpoints.mdx
create mode 100644 docs/content/docs/api/meta.json
create mode 100644 docs/content/docs/api/payInvoice.mdx
create mode 100644 docs/content/docs/api/retrieveCharge.mdx
create mode 100644 docs/content/docs/api/retrieveCustomer.mdx
create mode 100644 docs/content/docs/api/retrieveEvent.mdx
create mode 100644 docs/content/docs/api/retrieveInvoice.mdx
create mode 100644 docs/content/docs/api/retrievePaymentIntent.mdx
create mode 100644 docs/content/docs/api/retrievePaymentMethod.mdx
create mode 100644 docs/content/docs/api/retrievePrice.mdx
create mode 100644 docs/content/docs/api/retrieveProduct.mdx
create mode 100644 docs/content/docs/api/retrieveRefund.mdx
create mode 100644 docs/content/docs/api/retrieveSetupIntent.mdx
create mode 100644 docs/content/docs/api/retrieveSubscription.mdx
create mode 100644 docs/content/docs/api/retrieveTestClock.mdx
create mode 100644 docs/content/docs/api/retrieveWebhookEndpoint.mdx
create mode 100644 docs/content/docs/api/searchCustomers.mdx
create mode 100644 docs/content/docs/api/searchInvoices.mdx
create mode 100644 docs/content/docs/api/searchPaymentIntents.mdx
create mode 100644 docs/content/docs/api/searchSubscriptions.mdx
create mode 100644 docs/content/docs/api/updateCustomer.mdx
create mode 100644 docs/content/docs/api/updatePaymentIntent.mdx
create mode 100644 docs/content/docs/api/updatePrice.mdx
create mode 100644 docs/content/docs/api/updateProduct.mdx
create mode 100644 docs/content/docs/api/updateSubscription.mdx
create mode 100644 docs/content/docs/api/voidInvoice.mdx
create mode 100644 docs/lib/openapi.ts
create mode 100644 docs/scripts/generate-docs.ts
diff --git a/docs/components/api-page.client.tsx b/docs/components/api-page.client.tsx
new file mode 100644
index 0000000..de03e68
--- /dev/null
+++ b/docs/components/api-page.client.tsx
@@ -0,0 +1,4 @@
+'use client';
+import { defineClientConfig } from 'fumadocs-openapi/ui/client';
+
+export default defineClientConfig({});
diff --git a/docs/components/api-page.tsx b/docs/components/api-page.tsx
new file mode 100644
index 0000000..e52c79f
--- /dev/null
+++ b/docs/components/api-page.tsx
@@ -0,0 +1,7 @@
+import { openapi } from '@/lib/openapi';
+import { createAPIPage } from 'fumadocs-openapi/ui';
+import client from './api-page.client';
+
+export const APIPage = createAPIPage(openapi, {
+ client,
+});
diff --git a/docs/components/mdx.tsx b/docs/components/mdx.tsx
index 1381cae..b3ef2fb 100644
--- a/docs/components/mdx.tsx
+++ b/docs/components/mdx.tsx
@@ -1,8 +1,10 @@
import defaultMdxComponents from 'fumadocs-ui/mdx';
+import { APIPage } from '@/components/api-page';
import type { MDXComponents } from 'mdx/types';
export function getMDXComponents(): MDXComponents {
return {
...defaultMdxComponents,
+ APIPage,
};
}
diff --git a/docs/content/docs/api/advanceTestClock.mdx b/docs/content/docs/api/advanceTestClock.mdx
new file mode 100644
index 0000000..3836882
--- /dev/null
+++ b/docs/content/docs/api/advanceTestClock.mdx
@@ -0,0 +1,20 @@
+---
+title: Advance a test clock
+full: true
+_openapi:
+ method: POST
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Advances a test clock's frozen time forward. This triggers billing
+ cycle processing for any linked subscriptions, including rolling
+ periods, creating invoices, and processing payments.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Advances a test clock's frozen time forward. This triggers billing cycle processing for any linked subscriptions, including rolling periods, creating invoices, and processing payments.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/attachPaymentMethod.mdx b/docs/content/docs/api/attachPaymentMethod.mdx
new file mode 100644
index 0000000..13dde91
--- /dev/null
+++ b/docs/content/docs/api/attachPaymentMethod.mdx
@@ -0,0 +1,17 @@
+---
+title: Attach a payment method to a customer
+full: true
+_openapi:
+ method: POST
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: Attaches a payment method object to a customer.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Attaches a payment method object to a customer.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/cancelPaymentIntent.mdx b/docs/content/docs/api/cancelPaymentIntent.mdx
new file mode 100644
index 0000000..6d2970a
--- /dev/null
+++ b/docs/content/docs/api/cancelPaymentIntent.mdx
@@ -0,0 +1,19 @@
+---
+title: Cancel a payment intent
+full: true
+_openapi:
+ method: POST
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Cancels a PaymentIntent. You cannot cancel a PaymentIntent with a
+ status of `succeeded`.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Cancels a PaymentIntent. You cannot cancel a PaymentIntent with a status of `succeeded`.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/cancelSetupIntent.mdx b/docs/content/docs/api/cancelSetupIntent.mdx
new file mode 100644
index 0000000..77a6a4b
--- /dev/null
+++ b/docs/content/docs/api/cancelSetupIntent.mdx
@@ -0,0 +1,19 @@
+---
+title: Cancel a setup intent
+full: true
+_openapi:
+ method: POST
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Cancels a SetupIntent. You cannot cancel a SetupIntent that has
+ already succeeded.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Cancels a SetupIntent. You cannot cancel a SetupIntent that has already succeeded.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/cancelSubscription.mdx b/docs/content/docs/api/cancelSubscription.mdx
new file mode 100644
index 0000000..61b2128
--- /dev/null
+++ b/docs/content/docs/api/cancelSubscription.mdx
@@ -0,0 +1,19 @@
+---
+title: Cancel a subscription
+full: true
+_openapi:
+ method: DELETE
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Cancels a customer's subscription immediately. The subscription status
+ transitions to `canceled`.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Cancels a customer's subscription immediately. The subscription status transitions to `canceled`.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/capturePaymentIntent.mdx b/docs/content/docs/api/capturePaymentIntent.mdx
new file mode 100644
index 0000000..9a4ee7a
--- /dev/null
+++ b/docs/content/docs/api/capturePaymentIntent.mdx
@@ -0,0 +1,19 @@
+---
+title: Capture a payment intent
+full: true
+_openapi:
+ method: POST
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Captures a PaymentIntent that has a status of `requires_capture`. This
+ is used when `capture_method=manual`.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Captures a PaymentIntent that has a status of `requires_capture`. This is used when `capture_method=manual`.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/confirmPaymentIntent.mdx b/docs/content/docs/api/confirmPaymentIntent.mdx
new file mode 100644
index 0000000..56cf0da
--- /dev/null
+++ b/docs/content/docs/api/confirmPaymentIntent.mdx
@@ -0,0 +1,20 @@
+---
+title: Confirm a payment intent
+full: true
+_openapi:
+ method: POST
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Confirms a PaymentIntent, transitioning it to `succeeded`,
+ `requires_capture`, or `requires_action` (for 3DS). Payment methods
+ with last4 `3220` (`tok_threeDSecureRequired`) trigger 3DS simulation.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Confirms a PaymentIntent, transitioning it to `succeeded`, `requires_capture`, or `requires_action` (for 3DS). Payment methods with last4 `3220` (`tok_threeDSecureRequired`) trigger 3DS simulation.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/confirmSetupIntent.mdx b/docs/content/docs/api/confirmSetupIntent.mdx
new file mode 100644
index 0000000..d030482
--- /dev/null
+++ b/docs/content/docs/api/confirmSetupIntent.mdx
@@ -0,0 +1,20 @@
+---
+title: Confirm a setup intent
+full: true
+_openapi:
+ method: POST
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Confirms a SetupIntent, transitioning it to `succeeded`. If a
+ `payment_method` is provided, it attaches the payment method to the
+ customer.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Confirms a SetupIntent, transitioning it to `succeeded`. If a `payment_method` is provided, it attaches the payment method to the customer.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/createCustomer.mdx b/docs/content/docs/api/createCustomer.mdx
new file mode 100644
index 0000000..ce01f1e
--- /dev/null
+++ b/docs/content/docs/api/createCustomer.mdx
@@ -0,0 +1,17 @@
+---
+title: Create a customer
+full: true
+_openapi:
+ method: POST
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: Creates a new customer object.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Creates a new customer object.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/createInvoice.mdx b/docs/content/docs/api/createInvoice.mdx
new file mode 100644
index 0000000..74cc96a
--- /dev/null
+++ b/docs/content/docs/api/createInvoice.mdx
@@ -0,0 +1,19 @@
+---
+title: Create an invoice
+full: true
+_openapi:
+ method: POST
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Creates a new invoice for a customer. Invoices are created as drafts
+ and must be finalized before they can be paid.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Creates a new invoice for a customer. Invoices are created as drafts and must be finalized before they can be paid.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/createPaymentIntent.mdx b/docs/content/docs/api/createPaymentIntent.mdx
new file mode 100644
index 0000000..41d9201
--- /dev/null
+++ b/docs/content/docs/api/createPaymentIntent.mdx
@@ -0,0 +1,19 @@
+---
+title: Create a payment intent
+full: true
+_openapi:
+ method: POST
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Creates a PaymentIntent object. Optionally set `confirm=true` with a
+ `payment_method` to create and confirm in one step.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Creates a PaymentIntent object. Optionally set `confirm=true` with a `payment_method` to create and confirm in one step.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/createPaymentMethod.mdx b/docs/content/docs/api/createPaymentMethod.mdx
new file mode 100644
index 0000000..dc36ac3
--- /dev/null
+++ b/docs/content/docs/api/createPaymentMethod.mdx
@@ -0,0 +1,21 @@
+---
+title: Create a payment method
+full: true
+_openapi:
+ method: POST
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Creates a payment method object. Strimulator supports `card` type with
+ magic test tokens like `tok_visa`, `tok_mastercard`, `tok_amex`,
+ `tok_visa_debit`, `tok_threeDSecureRequired`, and
+ `tok_threeDSecureOptional`.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Creates a payment method object. Strimulator supports `card` type with magic test tokens like `tok_visa`, `tok_mastercard`, `tok_amex`, `tok_visa_debit`, `tok_threeDSecureRequired`, and `tok_threeDSecureOptional`.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/createPrice.mdx b/docs/content/docs/api/createPrice.mdx
new file mode 100644
index 0000000..dcf589b
--- /dev/null
+++ b/docs/content/docs/api/createPrice.mdx
@@ -0,0 +1,19 @@
+---
+title: Create a price
+full: true
+_openapi:
+ method: POST
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Creates a new price for an existing product. The price can be one-time
+ or recurring.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Creates a new price for an existing product. The price can be one-time or recurring.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/createProduct.mdx b/docs/content/docs/api/createProduct.mdx
new file mode 100644
index 0000000..1d48cbe
--- /dev/null
+++ b/docs/content/docs/api/createProduct.mdx
@@ -0,0 +1,17 @@
+---
+title: Create a product
+full: true
+_openapi:
+ method: POST
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: Creates a new product object.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Creates a new product object.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/createRefund.mdx b/docs/content/docs/api/createRefund.mdx
new file mode 100644
index 0000000..0b6ffe2
--- /dev/null
+++ b/docs/content/docs/api/createRefund.mdx
@@ -0,0 +1,19 @@
+---
+title: Create a refund
+full: true
+_openapi:
+ method: POST
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Creates a refund for a charge or payment intent. You must provide
+ either `charge` or `payment_intent`.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Creates a refund for a charge or payment intent. You must provide either `charge` or `payment_intent`.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/createSetupIntent.mdx b/docs/content/docs/api/createSetupIntent.mdx
new file mode 100644
index 0000000..72f2c1e
--- /dev/null
+++ b/docs/content/docs/api/createSetupIntent.mdx
@@ -0,0 +1,19 @@
+---
+title: Create a setup intent
+full: true
+_openapi:
+ method: POST
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Creates a SetupIntent object for setting up a customer's payment
+ method for future payments.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Creates a SetupIntent object for setting up a customer's payment method for future payments.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/createSubscription.mdx b/docs/content/docs/api/createSubscription.mdx
new file mode 100644
index 0000000..f8cac79
--- /dev/null
+++ b/docs/content/docs/api/createSubscription.mdx
@@ -0,0 +1,19 @@
+---
+title: Create a subscription
+full: true
+_openapi:
+ method: POST
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Creates a new subscription on an existing customer. Each subscription
+ must have at least one item with a recurring price.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Creates a new subscription on an existing customer. Each subscription must have at least one item with a recurring price.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/createTestClock.mdx b/docs/content/docs/api/createTestClock.mdx
new file mode 100644
index 0000000..a73678a
--- /dev/null
+++ b/docs/content/docs/api/createTestClock.mdx
@@ -0,0 +1,20 @@
+---
+title: Create a test clock
+full: true
+_openapi:
+ method: POST
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Creates a new test clock with the specified frozen time. Use test
+ clocks to simulate the passage of time for subscription billing and
+ trial expirations.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Creates a new test clock with the specified frozen time. Use test clocks to simulate the passage of time for subscription billing and trial expirations.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/createWebhookEndpoint.mdx b/docs/content/docs/api/createWebhookEndpoint.mdx
new file mode 100644
index 0000000..483b388
--- /dev/null
+++ b/docs/content/docs/api/createWebhookEndpoint.mdx
@@ -0,0 +1,20 @@
+---
+title: Create a webhook endpoint
+full: true
+_openapi:
+ method: POST
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Creates a webhook endpoint that listens to specific events.
+ Strimulator will POST event payloads to the configured URL with
+ HMAC-SHA256 signatures.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Creates a webhook endpoint that listens to specific events. Strimulator will POST event payloads to the configured URL with HMAC-SHA256 signatures.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/deleteCustomer.mdx b/docs/content/docs/api/deleteCustomer.mdx
new file mode 100644
index 0000000..e60a12b
--- /dev/null
+++ b/docs/content/docs/api/deleteCustomer.mdx
@@ -0,0 +1,17 @@
+---
+title: Delete a customer
+full: true
+_openapi:
+ method: DELETE
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: Permanently deletes a customer. It cannot be undone.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Permanently deletes a customer. It cannot be undone.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/deleteProduct.mdx b/docs/content/docs/api/deleteProduct.mdx
new file mode 100644
index 0000000..2de6a31
--- /dev/null
+++ b/docs/content/docs/api/deleteProduct.mdx
@@ -0,0 +1,17 @@
+---
+title: Delete a product
+full: true
+_openapi:
+ method: DELETE
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: Permanently deletes a product.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Permanently deletes a product.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/deleteTestClock.mdx b/docs/content/docs/api/deleteTestClock.mdx
new file mode 100644
index 0000000..62a1d70
--- /dev/null
+++ b/docs/content/docs/api/deleteTestClock.mdx
@@ -0,0 +1,17 @@
+---
+title: Delete a test clock
+full: true
+_openapi:
+ method: DELETE
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: Deletes a test clock and all associated resources.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Deletes a test clock and all associated resources.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/deleteWebhookEndpoint.mdx b/docs/content/docs/api/deleteWebhookEndpoint.mdx
new file mode 100644
index 0000000..d449216
--- /dev/null
+++ b/docs/content/docs/api/deleteWebhookEndpoint.mdx
@@ -0,0 +1,19 @@
+---
+title: Delete a webhook endpoint
+full: true
+_openapi:
+ method: DELETE
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Deletes a webhook endpoint. Strimulator will stop sending events to
+ this URL.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Deletes a webhook endpoint. Strimulator will stop sending events to this URL.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/detachPaymentMethod.mdx b/docs/content/docs/api/detachPaymentMethod.mdx
new file mode 100644
index 0000000..f85d97e
--- /dev/null
+++ b/docs/content/docs/api/detachPaymentMethod.mdx
@@ -0,0 +1,20 @@
+---
+title: Detach a payment method from its customer
+full: true
+_openapi:
+ method: POST
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Detaches a payment method object from the customer it is attached to.
+ The payment method still exists but can no longer be used for
+ payments.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Detaches a payment method object from the customer it is attached to. The payment method still exists but can no longer be used for payments.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/finalizeInvoice.mdx b/docs/content/docs/api/finalizeInvoice.mdx
new file mode 100644
index 0000000..a7853a4
--- /dev/null
+++ b/docs/content/docs/api/finalizeInvoice.mdx
@@ -0,0 +1,19 @@
+---
+title: Finalize an invoice
+full: true
+_openapi:
+ method: POST
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Finalizes a draft invoice, transitioning it to `open` status and
+ assigning an invoice number. Once finalized, the invoice can be paid.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Finalizes a draft invoice, transitioning it to `open` status and assigning an invoice number. Once finalized, the invoice can be paid.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/listCharges.mdx b/docs/content/docs/api/listCharges.mdx
new file mode 100644
index 0000000..a2fbd60
--- /dev/null
+++ b/docs/content/docs/api/listCharges.mdx
@@ -0,0 +1,19 @@
+---
+title: List all charges
+full: true
+_openapi:
+ method: GET
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Returns a paginated list of charges. Optionally filter by payment
+ intent.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Returns a paginated list of charges. Optionally filter by payment intent.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/listCustomers.mdx b/docs/content/docs/api/listCustomers.mdx
new file mode 100644
index 0000000..5790e02
--- /dev/null
+++ b/docs/content/docs/api/listCustomers.mdx
@@ -0,0 +1,19 @@
+---
+title: List all customers
+full: true
+_openapi:
+ method: GET
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Returns a paginated list of customers, sorted by creation date (most
+ recent first).
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Returns a paginated list of customers, sorted by creation date (most recent first).
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/listEvents.mdx b/docs/content/docs/api/listEvents.mdx
new file mode 100644
index 0000000..77273d7
--- /dev/null
+++ b/docs/content/docs/api/listEvents.mdx
@@ -0,0 +1,19 @@
+---
+title: List all events
+full: true
+_openapi:
+ method: GET
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Returns a paginated list of events, sorted by creation date (most
+ recent first). Optionally filter by event type.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Returns a paginated list of events, sorted by creation date (most recent first). Optionally filter by event type.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/listInvoices.mdx b/docs/content/docs/api/listInvoices.mdx
new file mode 100644
index 0000000..69c3d8a
--- /dev/null
+++ b/docs/content/docs/api/listInvoices.mdx
@@ -0,0 +1,19 @@
+---
+title: List all invoices
+full: true
+_openapi:
+ method: GET
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Returns a paginated list of invoices. Optionally filter by customer or
+ subscription.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Returns a paginated list of invoices. Optionally filter by customer or subscription.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/listPaymentIntents.mdx b/docs/content/docs/api/listPaymentIntents.mdx
new file mode 100644
index 0000000..535270f
--- /dev/null
+++ b/docs/content/docs/api/listPaymentIntents.mdx
@@ -0,0 +1,19 @@
+---
+title: List payment intents
+full: true
+_openapi:
+ method: GET
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Returns a paginated list of PaymentIntents. Optionally filter by
+ customer.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Returns a paginated list of PaymentIntents. Optionally filter by customer.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/listPaymentMethods.mdx b/docs/content/docs/api/listPaymentMethods.mdx
new file mode 100644
index 0000000..627359c
--- /dev/null
+++ b/docs/content/docs/api/listPaymentMethods.mdx
@@ -0,0 +1,17 @@
+---
+title: List payment methods
+full: true
+_openapi:
+ method: GET
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: Returns a list of payment methods for a given customer.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Returns a list of payment methods for a given customer.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/listPrices.mdx b/docs/content/docs/api/listPrices.mdx
new file mode 100644
index 0000000..52c07d6
--- /dev/null
+++ b/docs/content/docs/api/listPrices.mdx
@@ -0,0 +1,17 @@
+---
+title: List all prices
+full: true
+_openapi:
+ method: GET
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: Returns a paginated list of prices. Optionally filter by product.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Returns a paginated list of prices. Optionally filter by product.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/listProducts.mdx b/docs/content/docs/api/listProducts.mdx
new file mode 100644
index 0000000..375d090
--- /dev/null
+++ b/docs/content/docs/api/listProducts.mdx
@@ -0,0 +1,17 @@
+---
+title: List all products
+full: true
+_openapi:
+ method: GET
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: Returns a paginated list of products.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Returns a paginated list of products.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/listRefunds.mdx b/docs/content/docs/api/listRefunds.mdx
new file mode 100644
index 0000000..103c93e
--- /dev/null
+++ b/docs/content/docs/api/listRefunds.mdx
@@ -0,0 +1,19 @@
+---
+title: List all refunds
+full: true
+_openapi:
+ method: GET
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Returns a paginated list of refunds. Optionally filter by charge or
+ payment intent.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Returns a paginated list of refunds. Optionally filter by charge or payment intent.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/listSetupIntents.mdx b/docs/content/docs/api/listSetupIntents.mdx
new file mode 100644
index 0000000..2b95a17
--- /dev/null
+++ b/docs/content/docs/api/listSetupIntents.mdx
@@ -0,0 +1,17 @@
+---
+title: List setup intents
+full: true
+_openapi:
+ method: GET
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: Returns a paginated list of SetupIntents.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Returns a paginated list of SetupIntents.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/listSubscriptions.mdx b/docs/content/docs/api/listSubscriptions.mdx
new file mode 100644
index 0000000..966b408
--- /dev/null
+++ b/docs/content/docs/api/listSubscriptions.mdx
@@ -0,0 +1,19 @@
+---
+title: List subscriptions
+full: true
+_openapi:
+ method: GET
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Returns a paginated list of subscriptions. Optionally filter by
+ customer.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Returns a paginated list of subscriptions. Optionally filter by customer.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/listTestClocks.mdx b/docs/content/docs/api/listTestClocks.mdx
new file mode 100644
index 0000000..4046fb9
--- /dev/null
+++ b/docs/content/docs/api/listTestClocks.mdx
@@ -0,0 +1,17 @@
+---
+title: List test clocks
+full: true
+_openapi:
+ method: GET
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: Returns a paginated list of test clocks.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Returns a paginated list of test clocks.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/listWebhookEndpoints.mdx b/docs/content/docs/api/listWebhookEndpoints.mdx
new file mode 100644
index 0000000..c5ed8ef
--- /dev/null
+++ b/docs/content/docs/api/listWebhookEndpoints.mdx
@@ -0,0 +1,17 @@
+---
+title: List webhook endpoints
+full: true
+_openapi:
+ method: GET
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: Returns a paginated list of webhook endpoints.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Returns a paginated list of webhook endpoints.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/meta.json b/docs/content/docs/api/meta.json
new file mode 100644
index 0000000..7db4fe4
--- /dev/null
+++ b/docs/content/docs/api/meta.json
@@ -0,0 +1,3 @@
+{
+ "title": "API Reference"
+}
diff --git a/docs/content/docs/api/payInvoice.mdx b/docs/content/docs/api/payInvoice.mdx
new file mode 100644
index 0000000..37c3746
--- /dev/null
+++ b/docs/content/docs/api/payInvoice.mdx
@@ -0,0 +1,17 @@
+---
+title: Pay an invoice
+full: true
+_openapi:
+ method: POST
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: Pays an open invoice, transitioning it to `paid` status.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Pays an open invoice, transitioning it to `paid` status.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/retrieveCharge.mdx b/docs/content/docs/api/retrieveCharge.mdx
new file mode 100644
index 0000000..9c30a90
--- /dev/null
+++ b/docs/content/docs/api/retrieveCharge.mdx
@@ -0,0 +1,19 @@
+---
+title: Retrieve a charge
+full: true
+_openapi:
+ method: GET
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Retrieves the details of a charge. Supports expansion of `customer`
+ and `payment_intent`.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Retrieves the details of a charge. Supports expansion of `customer` and `payment_intent`.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/retrieveCustomer.mdx b/docs/content/docs/api/retrieveCustomer.mdx
new file mode 100644
index 0000000..d1135bc
--- /dev/null
+++ b/docs/content/docs/api/retrieveCustomer.mdx
@@ -0,0 +1,17 @@
+---
+title: Retrieve a customer
+full: true
+_openapi:
+ method: GET
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: Retrieves a customer object by its ID.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Retrieves a customer object by its ID.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/retrieveEvent.mdx b/docs/content/docs/api/retrieveEvent.mdx
new file mode 100644
index 0000000..cdb0638
--- /dev/null
+++ b/docs/content/docs/api/retrieveEvent.mdx
@@ -0,0 +1,17 @@
+---
+title: Retrieve an event
+full: true
+_openapi:
+ method: GET
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: Retrieves the details of an event.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Retrieves the details of an event.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/retrieveInvoice.mdx b/docs/content/docs/api/retrieveInvoice.mdx
new file mode 100644
index 0000000..a648bc5
--- /dev/null
+++ b/docs/content/docs/api/retrieveInvoice.mdx
@@ -0,0 +1,19 @@
+---
+title: Retrieve an invoice
+full: true
+_openapi:
+ method: GET
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Retrieves the invoice with the given ID. Supports expansion of
+ `customer`, `subscription`, and `payment_intent`.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Retrieves the invoice with the given ID. Supports expansion of `customer`, `subscription`, and `payment_intent`.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/retrievePaymentIntent.mdx b/docs/content/docs/api/retrievePaymentIntent.mdx
new file mode 100644
index 0000000..779b7e2
--- /dev/null
+++ b/docs/content/docs/api/retrievePaymentIntent.mdx
@@ -0,0 +1,19 @@
+---
+title: Retrieve a payment intent
+full: true
+_openapi:
+ method: GET
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Retrieves the details of a PaymentIntent. Supports expansion of
+ `customer`, `payment_method`, and `latest_charge`.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Retrieves the details of a PaymentIntent. Supports expansion of `customer`, `payment_method`, and `latest_charge`.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/retrievePaymentMethod.mdx b/docs/content/docs/api/retrievePaymentMethod.mdx
new file mode 100644
index 0000000..f61ae46
--- /dev/null
+++ b/docs/content/docs/api/retrievePaymentMethod.mdx
@@ -0,0 +1,17 @@
+---
+title: Retrieve a payment method
+full: true
+_openapi:
+ method: GET
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: Retrieves a payment method object.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Retrieves a payment method object.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/retrievePrice.mdx b/docs/content/docs/api/retrievePrice.mdx
new file mode 100644
index 0000000..5aa4884
--- /dev/null
+++ b/docs/content/docs/api/retrievePrice.mdx
@@ -0,0 +1,17 @@
+---
+title: Retrieve a price
+full: true
+_openapi:
+ method: GET
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: Retrieves the details of an existing price.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Retrieves the details of an existing price.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/retrieveProduct.mdx b/docs/content/docs/api/retrieveProduct.mdx
new file mode 100644
index 0000000..0f9d646
--- /dev/null
+++ b/docs/content/docs/api/retrieveProduct.mdx
@@ -0,0 +1,17 @@
+---
+title: Retrieve a product
+full: true
+_openapi:
+ method: GET
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: Retrieves the details of an existing product.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Retrieves the details of an existing product.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/retrieveRefund.mdx b/docs/content/docs/api/retrieveRefund.mdx
new file mode 100644
index 0000000..b968011
--- /dev/null
+++ b/docs/content/docs/api/retrieveRefund.mdx
@@ -0,0 +1,17 @@
+---
+title: Retrieve a refund
+full: true
+_openapi:
+ method: GET
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: Retrieves the details of a refund.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Retrieves the details of a refund.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/retrieveSetupIntent.mdx b/docs/content/docs/api/retrieveSetupIntent.mdx
new file mode 100644
index 0000000..44d40fa
--- /dev/null
+++ b/docs/content/docs/api/retrieveSetupIntent.mdx
@@ -0,0 +1,17 @@
+---
+title: Retrieve a setup intent
+full: true
+_openapi:
+ method: GET
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: Retrieves the details of a SetupIntent.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Retrieves the details of a SetupIntent.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/retrieveSubscription.mdx b/docs/content/docs/api/retrieveSubscription.mdx
new file mode 100644
index 0000000..9aef405
--- /dev/null
+++ b/docs/content/docs/api/retrieveSubscription.mdx
@@ -0,0 +1,20 @@
+---
+title: Retrieve a subscription
+full: true
+_openapi:
+ method: GET
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Retrieves the subscription with the given ID. Supports expansion of
+ `customer` and `latest_invoice` (including nested
+ `latest_invoice.payment_intent`).
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Retrieves the subscription with the given ID. Supports expansion of `customer` and `latest_invoice` (including nested `latest_invoice.payment_intent`).
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/retrieveTestClock.mdx b/docs/content/docs/api/retrieveTestClock.mdx
new file mode 100644
index 0000000..bc38e18
--- /dev/null
+++ b/docs/content/docs/api/retrieveTestClock.mdx
@@ -0,0 +1,17 @@
+---
+title: Retrieve a test clock
+full: true
+_openapi:
+ method: GET
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: Retrieves a test clock.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Retrieves a test clock.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/retrieveWebhookEndpoint.mdx b/docs/content/docs/api/retrieveWebhookEndpoint.mdx
new file mode 100644
index 0000000..fa6442b
--- /dev/null
+++ b/docs/content/docs/api/retrieveWebhookEndpoint.mdx
@@ -0,0 +1,17 @@
+---
+title: Retrieve a webhook endpoint
+full: true
+_openapi:
+ method: GET
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: Retrieves the webhook endpoint with the given ID.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Retrieves the webhook endpoint with the given ID.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/searchCustomers.mdx b/docs/content/docs/api/searchCustomers.mdx
new file mode 100644
index 0000000..79e873c
--- /dev/null
+++ b/docs/content/docs/api/searchCustomers.mdx
@@ -0,0 +1,19 @@
+---
+title: Search customers
+full: true
+_openapi:
+ method: GET
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Search for customers using Stripe's search query language. Supports
+ filtering by `email`, `name`, `metadata`, and other fields.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Search for customers using Stripe's search query language. Supports filtering by `email`, `name`, `metadata`, and other fields.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/searchInvoices.mdx b/docs/content/docs/api/searchInvoices.mdx
new file mode 100644
index 0000000..0e0b207
--- /dev/null
+++ b/docs/content/docs/api/searchInvoices.mdx
@@ -0,0 +1,17 @@
+---
+title: Search invoices
+full: true
+_openapi:
+ method: GET
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: Search for invoices using Stripe's search query language.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Search for invoices using Stripe's search query language.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/searchPaymentIntents.mdx b/docs/content/docs/api/searchPaymentIntents.mdx
new file mode 100644
index 0000000..c41c79f
--- /dev/null
+++ b/docs/content/docs/api/searchPaymentIntents.mdx
@@ -0,0 +1,17 @@
+---
+title: Search payment intents
+full: true
+_openapi:
+ method: GET
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: Search for PaymentIntents using Stripe's search query language.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Search for PaymentIntents using Stripe's search query language.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/searchSubscriptions.mdx b/docs/content/docs/api/searchSubscriptions.mdx
new file mode 100644
index 0000000..1838054
--- /dev/null
+++ b/docs/content/docs/api/searchSubscriptions.mdx
@@ -0,0 +1,17 @@
+---
+title: Search subscriptions
+full: true
+_openapi:
+ method: GET
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: Search for subscriptions using Stripe's search query language.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Search for subscriptions using Stripe's search query language.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/updateCustomer.mdx b/docs/content/docs/api/updateCustomer.mdx
new file mode 100644
index 0000000..5fe5588
--- /dev/null
+++ b/docs/content/docs/api/updateCustomer.mdx
@@ -0,0 +1,19 @@
+---
+title: Update a customer
+full: true
+_openapi:
+ method: POST
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Updates the specified customer by setting the values of the parameters
+ passed. Any parameters not provided will be left unchanged.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Updates the specified customer by setting the values of the parameters passed. Any parameters not provided will be left unchanged.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/updatePaymentIntent.mdx b/docs/content/docs/api/updatePaymentIntent.mdx
new file mode 100644
index 0000000..a12917b
--- /dev/null
+++ b/docs/content/docs/api/updatePaymentIntent.mdx
@@ -0,0 +1,19 @@
+---
+title: Update a payment intent
+full: true
+_openapi:
+ method: POST
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Updates properties on a PaymentIntent without confirming. Returns the
+ current PaymentIntent.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Updates properties on a PaymentIntent without confirming. Returns the current PaymentIntent.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/updatePrice.mdx b/docs/content/docs/api/updatePrice.mdx
new file mode 100644
index 0000000..e3dd859
--- /dev/null
+++ b/docs/content/docs/api/updatePrice.mdx
@@ -0,0 +1,19 @@
+---
+title: Update a price
+full: true
+_openapi:
+ method: POST
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Updates the specified price. Only mutable fields like `active`,
+ `nickname`, and `metadata` can be changed.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Updates the specified price. Only mutable fields like `active`, `nickname`, and `metadata` can be changed.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/updateProduct.mdx b/docs/content/docs/api/updateProduct.mdx
new file mode 100644
index 0000000..ba9149b
--- /dev/null
+++ b/docs/content/docs/api/updateProduct.mdx
@@ -0,0 +1,19 @@
+---
+title: Update a product
+full: true
+_openapi:
+ method: POST
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Updates the specified product by setting the values of the parameters
+ passed.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Updates the specified product by setting the values of the parameters passed.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/updateSubscription.mdx b/docs/content/docs/api/updateSubscription.mdx
new file mode 100644
index 0000000..2835d81
--- /dev/null
+++ b/docs/content/docs/api/updateSubscription.mdx
@@ -0,0 +1,19 @@
+---
+title: Update a subscription
+full: true
+_openapi:
+ method: POST
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Updates an existing subscription. You can change the plan, quantity,
+ trial end, and cancellation settings.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Updates an existing subscription. You can change the plan, quantity, trial end, and cancellation settings.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/voidInvoice.mdx b/docs/content/docs/api/voidInvoice.mdx
new file mode 100644
index 0000000..2a811d5
--- /dev/null
+++ b/docs/content/docs/api/voidInvoice.mdx
@@ -0,0 +1,19 @@
+---
+title: Void an invoice
+full: true
+_openapi:
+ method: POST
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: >-
+ Voids an open invoice, transitioning it to `void` status. A voided
+ invoice can no longer be paid.
+---
+
+{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Voids an open invoice, transitioning it to `void` status. A voided invoice can no longer be paid.
+
+
\ No newline at end of file
diff --git a/docs/lib/openapi.ts b/docs/lib/openapi.ts
new file mode 100644
index 0000000..f6ddf3b
--- /dev/null
+++ b/docs/lib/openapi.ts
@@ -0,0 +1,5 @@
+import { createOpenAPI } from 'fumadocs-openapi/server';
+
+export const openapi = createOpenAPI({
+ input: ['./openapi.json'],
+});
diff --git a/docs/scripts/generate-docs.ts b/docs/scripts/generate-docs.ts
new file mode 100644
index 0000000..ae3fc5c
--- /dev/null
+++ b/docs/scripts/generate-docs.ts
@@ -0,0 +1,8 @@
+import { generateFiles } from 'fumadocs-openapi';
+import { openapi } from '../lib/openapi';
+
+void generateFiles({
+ input: openapi,
+ output: './content/docs/api',
+ includeDescription: true,
+});
From b42adb3d6662a53f596cfaa2c7f1a4d1e2059b4c Mon Sep 17 00:00:00 2001
From: Segfault <5221072+Segfaultd@users.noreply.github.com>
Date: Fri, 10 Apr 2026 10:34:21 +0200
Subject: [PATCH 08/10] Fix Fumadocs setup for v15 compatibility and build
success
- Pin fumadocs packages to v15-compatible versions (fumadocs-ui@15.8.5,
fumadocs-core@15.8.5, fumadocs-mdx@12.0.3, fumadocs-openapi@6.3.0)
- Fix CSS imports to use neutral.css + preset.css with @source directives
- Fix source.ts to use toFumadocsSource() API
- Fix page component imports from fumadocs-ui/page
- Fix OpenAPI integration for v6 API (createOpenAPI, generateFiles)
- Use application/json in OpenAPI spec for docs rendering compatibility
- Use turbopack for build
- Add .gitignore for docs
- Add Documentation link to README
---
README.md | 1 +
docs/.gitignore | 3 +
docs/app/docs/[[...slug]]/page.tsx | 16 +-
docs/app/global.css | 8 +-
docs/bun.lock | 302 ++--
docs/components/api-page.client.tsx | 4 +-
docs/components/api-page.tsx | 6 +-
...ceTestClock.mdx => advance-test-clock.mdx} | 10 +-
...ntMethod.mdx => attach-payment-method.mdx} | 7 +-
...ntIntent.mdx => cancel-payment-intent.mdx} | 9 +-
...etupIntent.mdx => cancel-setup-intent.mdx} | 9 +-
...bscription.mdx => cancel-subscription.mdx} | 9 +-
...tIntent.mdx => capture-payment-intent.mdx} | 9 +-
...tIntent.mdx => confirm-payment-intent.mdx} | 10 +-
...tupIntent.mdx => confirm-setup-intent.mdx} | 9 +-
...createCustomer.mdx => create-customer.mdx} | 7 +-
.../{createInvoice.mdx => create-invoice.mdx} | 9 +-
...ntIntent.mdx => create-payment-intent.mdx} | 9 +-
...ntMethod.mdx => create-payment-method.mdx} | 10 +-
.../api/{createPrice.mdx => create-price.mdx} | 9 +-
.../{createProduct.mdx => create-product.mdx} | 7 +-
.../{createRefund.mdx => create-refund.mdx} | 9 +-
...etupIntent.mdx => create-setup-intent.mdx} | 9 +-
...bscription.mdx => create-subscription.mdx} | 9 +-
...ateTestClock.mdx => create-test-clock.mdx} | 9 +-
...dpoint.mdx => create-webhook-endpoint.mdx} | 9 +-
...deleteCustomer.mdx => delete-customer.mdx} | 7 +-
docs/content/docs/api/delete-product.mdx | 20 +
docs/content/docs/api/delete-test-clock.mdx | 20 +
...dpoint.mdx => delete-webhook-endpoint.mdx} | 7 +-
docs/content/docs/api/deleteProduct.mdx | 17 -
docs/content/docs/api/deleteTestClock.mdx | 17 -
...ntMethod.mdx => detach-payment-method.mdx} | 9 +-
...nalizeInvoice.mdx => finalize-invoice.mdx} | 9 +-
.../api/{listCharges.mdx => list-charges.mdx} | 7 +-
.../{listCustomers.mdx => list-customers.mdx} | 9 +-
.../api/{listEvents.mdx => list-events.mdx} | 9 +-
.../{listInvoices.mdx => list-invoices.mdx} | 9 +-
...ntIntents.mdx => list-payment-intents.mdx} | 7 +-
...ntMethods.mdx => list-payment-methods.mdx} | 7 +-
.../api/{listPrices.mdx => list-prices.mdx} | 7 +-
.../{listProducts.mdx => list-products.mdx} | 7 +-
.../api/{listRefunds.mdx => list-refunds.mdx} | 9 +-
...etupIntents.mdx => list-setup-intents.mdx} | 7 +-
...bscriptions.mdx => list-subscriptions.mdx} | 7 +-
docs/content/docs/api/list-test-clocks.mdx | 20 +
...dpoints.mdx => list-webhook-endpoints.mdx} | 7 +-
docs/content/docs/api/listTestClocks.mdx | 17 -
.../api/{payInvoice.mdx => pay-invoice.mdx} | 7 +-
...retrieveCharge.mdx => retrieve-charge.mdx} | 9 +-
...ieveCustomer.mdx => retrieve-customer.mdx} | 7 +-
.../{retrieveEvent.mdx => retrieve-event.mdx} | 7 +-
...trieveInvoice.mdx => retrieve-invoice.mdx} | 9 +-
...Intent.mdx => retrieve-payment-intent.mdx} | 9 +-
.../docs/api/retrieve-payment-method.mdx | 20 +
.../{retrievePrice.mdx => retrieve-price.mdx} | 7 +-
...trieveProduct.mdx => retrieve-product.mdx} | 7 +-
docs/content/docs/api/retrieve-refund.mdx | 20 +
.../docs/api/retrieve-setup-intent.mdx | 20 +
...cription.mdx => retrieve-subscription.mdx} | 9 +-
docs/content/docs/api/retrieve-test-clock.mdx | 20 +
...oint.mdx => retrieve-webhook-endpoint.mdx} | 7 +-
.../docs/api/retrievePaymentMethod.mdx | 17 -
docs/content/docs/api/retrieveRefund.mdx | 17 -
docs/content/docs/api/retrieveSetupIntent.mdx | 17 -
docs/content/docs/api/retrieveTestClock.mdx | 17 -
...archCustomers.mdx => search-customers.mdx} | 9 +-
...searchInvoices.mdx => search-invoices.mdx} | 7 +-
...Intents.mdx => search-payment-intents.mdx} | 7 +-
...criptions.mdx => search-subscriptions.mdx} | 7 +-
...updateCustomer.mdx => update-customer.mdx} | 9 +-
...ntIntent.mdx => update-payment-intent.mdx} | 9 +-
.../api/{updatePrice.mdx => update-price.mdx} | 9 +-
.../{updateProduct.mdx => update-product.mdx} | 7 +-
...bscription.mdx => update-subscription.mdx} | 9 +-
.../api/{voidInvoice.mdx => void-invoice.mdx} | 9 +-
docs/lib/openapi.ts | 4 +-
docs/lib/source.ts | 5 +-
docs/next-env.d.ts | 6 +
docs/openapi.json | 42 +-
docs/package.json | 10 +-
docs/scripts/generate-docs.ts | 3 +-
.../2026-04-10-fumadocs-documentation.md | 1360 +++++++++++++++++
...026-04-10-fumadocs-documentation-design.md | 142 ++
docs/tsconfig.json | 28 +-
85 files changed, 2170 insertions(+), 481 deletions(-)
create mode 100644 docs/.gitignore
rename docs/content/docs/api/{advanceTestClock.mdx => advance-test-clock.mdx} (55%)
rename docs/content/docs/api/{attachPaymentMethod.mdx => attach-payment-method.mdx} (50%)
rename docs/content/docs/api/{cancelPaymentIntent.mdx => cancel-payment-intent.mdx} (52%)
rename docs/content/docs/api/{cancelSetupIntent.mdx => cancel-setup-intent.mdx} (52%)
rename docs/content/docs/api/{cancelSubscription.mdx => cancel-subscription.mdx} (54%)
rename docs/content/docs/api/{capturePaymentIntent.mdx => capture-payment-intent.mdx} (53%)
rename docs/content/docs/api/{confirmPaymentIntent.mdx => confirm-payment-intent.mdx} (57%)
rename docs/content/docs/api/{confirmSetupIntent.mdx => confirm-setup-intent.mdx} (55%)
rename docs/content/docs/api/{createCustomer.mdx => create-customer.mdx} (50%)
rename docs/content/docs/api/{createInvoice.mdx => create-invoice.mdx} (56%)
rename docs/content/docs/api/{createPaymentIntent.mdx => create-payment-intent.mdx} (55%)
rename docs/content/docs/api/{createPaymentMethod.mdx => create-payment-method.mdx} (59%)
rename docs/content/docs/api/{createPrice.mdx => create-price.mdx} (55%)
rename docs/content/docs/api/{createProduct.mdx => create-product.mdx} (50%)
rename docs/content/docs/api/{createRefund.mdx => create-refund.mdx} (55%)
rename docs/content/docs/api/{createSetupIntent.mdx => create-setup-intent.mdx} (54%)
rename docs/content/docs/api/{createSubscription.mdx => create-subscription.mdx} (56%)
rename docs/content/docs/api/{createTestClock.mdx => create-test-clock.mdx} (56%)
rename docs/content/docs/api/{createWebhookEndpoint.mdx => create-webhook-endpoint.mdx} (57%)
rename docs/content/docs/api/{deleteCustomer.mdx => delete-customer.mdx} (51%)
create mode 100644 docs/content/docs/api/delete-product.mdx
create mode 100644 docs/content/docs/api/delete-test-clock.mdx
rename docs/content/docs/api/{deleteWebhookEndpoint.mdx => delete-webhook-endpoint.mdx} (53%)
delete mode 100644 docs/content/docs/api/deleteProduct.mdx
delete mode 100644 docs/content/docs/api/deleteTestClock.mdx
rename docs/content/docs/api/{detachPaymentMethod.mdx => detach-payment-method.mdx} (56%)
rename docs/content/docs/api/{finalizeInvoice.mdx => finalize-invoice.mdx} (55%)
rename docs/content/docs/api/{listCharges.mdx => list-charges.mdx} (55%)
rename docs/content/docs/api/{listCustomers.mdx => list-customers.mdx} (54%)
rename docs/content/docs/api/{listEvents.mdx => list-events.mdx} (56%)
rename docs/content/docs/api/{listInvoices.mdx => list-invoices.mdx} (54%)
rename docs/content/docs/api/{listPaymentIntents.mdx => list-payment-intents.mdx} (54%)
rename docs/content/docs/api/{listPaymentMethods.mdx => list-payment-methods.mdx} (51%)
rename docs/content/docs/api/{listPrices.mdx => list-prices.mdx} (53%)
rename docs/content/docs/api/{listProducts.mdx => list-products.mdx} (50%)
rename docs/content/docs/api/{listRefunds.mdx => list-refunds.mdx} (55%)
rename docs/content/docs/api/{listSetupIntents.mdx => list-setup-intents.mdx} (50%)
rename docs/content/docs/api/{listSubscriptions.mdx => list-subscriptions.mdx} (54%)
create mode 100644 docs/content/docs/api/list-test-clocks.mdx
rename docs/content/docs/api/{listWebhookEndpoints.mdx => list-webhook-endpoints.mdx} (50%)
delete mode 100644 docs/content/docs/api/listTestClocks.mdx
rename docs/content/docs/api/{payInvoice.mdx => pay-invoice.mdx} (50%)
rename docs/content/docs/api/{retrieveCharge.mdx => retrieve-charge.mdx} (54%)
rename docs/content/docs/api/{retrieveCustomer.mdx => retrieve-customer.mdx} (50%)
rename docs/content/docs/api/{retrieveEvent.mdx => retrieve-event.mdx} (50%)
rename docs/content/docs/api/{retrieveInvoice.mdx => retrieve-invoice.mdx} (55%)
rename docs/content/docs/api/{retrievePaymentIntent.mdx => retrieve-payment-intent.mdx} (55%)
create mode 100644 docs/content/docs/api/retrieve-payment-method.mdx
rename docs/content/docs/api/{retrievePrice.mdx => retrieve-price.mdx} (50%)
rename docs/content/docs/api/{retrieveProduct.mdx => retrieve-product.mdx} (50%)
create mode 100644 docs/content/docs/api/retrieve-refund.mdx
create mode 100644 docs/content/docs/api/retrieve-setup-intent.mdx
rename docs/content/docs/api/{retrieveSubscription.mdx => retrieve-subscription.mdx} (56%)
create mode 100644 docs/content/docs/api/retrieve-test-clock.mdx
rename docs/content/docs/api/{retrieveWebhookEndpoint.mdx => retrieve-webhook-endpoint.mdx} (50%)
delete mode 100644 docs/content/docs/api/retrievePaymentMethod.mdx
delete mode 100644 docs/content/docs/api/retrieveRefund.mdx
delete mode 100644 docs/content/docs/api/retrieveSetupIntent.mdx
delete mode 100644 docs/content/docs/api/retrieveTestClock.mdx
rename docs/content/docs/api/{searchCustomers.mdx => search-customers.mdx} (55%)
rename docs/content/docs/api/{searchInvoices.mdx => search-invoices.mdx} (51%)
rename docs/content/docs/api/{searchPaymentIntents.mdx => search-payment-intents.mdx} (50%)
rename docs/content/docs/api/{searchSubscriptions.mdx => search-subscriptions.mdx} (51%)
rename docs/content/docs/api/{updateCustomer.mdx => update-customer.mdx} (56%)
rename docs/content/docs/api/{updatePaymentIntent.mdx => update-payment-intent.mdx} (53%)
rename docs/content/docs/api/{updatePrice.mdx => update-price.mdx} (55%)
rename docs/content/docs/api/{updateProduct.mdx => update-product.mdx} (54%)
rename docs/content/docs/api/{updateSubscription.mdx => update-subscription.mdx} (54%)
rename docs/content/docs/api/{voidInvoice.mdx => void-invoice.mdx} (54%)
create mode 100644 docs/next-env.d.ts
create mode 100644 docs/superpowers/plans/2026-04-10-fumadocs-documentation.md
create mode 100644 docs/superpowers/specs/2026-04-10-fumadocs-documentation-design.md
diff --git a/README.md b/README.md
index de1a2bd..2a72c29 100644
--- a/README.md
+++ b/README.md
@@ -4,6 +4,7 @@
+ Documentation •
Getting Started •
Resources •
SDK Usage •
diff --git a/docs/.gitignore b/docs/.gitignore
new file mode 100644
index 0000000..92a014f
--- /dev/null
+++ b/docs/.gitignore
@@ -0,0 +1,3 @@
+.next/
+node_modules/
+.source/
diff --git a/docs/app/docs/[[...slug]]/page.tsx b/docs/app/docs/[[...slug]]/page.tsx
index c73781c..2dc950b 100644
--- a/docs/app/docs/[[...slug]]/page.tsx
+++ b/docs/app/docs/[[...slug]]/page.tsx
@@ -5,8 +5,9 @@ import {
DocsBody,
DocsTitle,
DocsDescription,
-} from 'fumadocs-ui/layouts/docs/page';
+} from 'fumadocs-ui/page';
import { getMDXComponents } from '@/components/mdx';
+import type { ComponentType } from 'react';
export default async function Page({
params,
@@ -18,12 +19,17 @@ export default async function Page({
if (!page) notFound();
- const Mdx = page.data.body;
+ const data = page.data as typeof page.data & {
+ body: ComponentType<{ components?: Record }>;
+ toc: { depth: number; url: string; title: string }[];
+ };
+
+ const Mdx = data.body;
return (
-
- {page.data.title}
- {page.data.description}
+
+ {data.title}
+ {data.description}
diff --git a/docs/app/global.css b/docs/app/global.css
index a729c78..1f53f61 100644
--- a/docs/app/global.css
+++ b/docs/app/global.css
@@ -1,2 +1,6 @@
-@import "tailwindcss";
-@import "fumadocs-ui/css/ui.css";
+@import 'tailwindcss';
+@import 'fumadocs-ui/css/neutral.css';
+@import 'fumadocs-ui/css/preset.css';
+
+@source '../node_modules/fumadocs-ui/dist/**/*.js';
+@source '../node_modules/fumadocs-openapi/dist/**/*.js';
diff --git a/docs/bun.lock b/docs/bun.lock
index c2fd9bd..9494600 100644
--- a/docs/bun.lock
+++ b/docs/bun.lock
@@ -5,10 +5,10 @@
"": {
"name": "strimulator-docs",
"dependencies": {
- "fumadocs-core": "latest",
- "fumadocs-mdx": "latest",
- "fumadocs-openapi": "latest",
- "fumadocs-ui": "latest",
+ "fumadocs-core": "^15.8.5",
+ "fumadocs-mdx": "^12.0.3",
+ "fumadocs-openapi": "^6.3.0",
+ "fumadocs-ui": "^15.8.5",
"next": "^15",
"react": "^19",
"react-dom": "^19",
@@ -25,65 +25,61 @@
"packages": {
"@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="],
- "@emnapi/core": ["@emnapi/core@1.9.2", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA=="],
+ "@apidevtools/json-schema-ref-parser": ["@apidevtools/json-schema-ref-parser@11.9.3", "", { "dependencies": { "@jsdevtools/ono": "^7.1.3", "@types/json-schema": "^7.0.15", "js-yaml": "^4.1.0" } }, "sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ=="],
"@emnapi/runtime": ["@emnapi/runtime@1.9.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw=="],
- "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="],
+ "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="],
- "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.7", "", { "os": "aix", "cpu": "ppc64" }, "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg=="],
+ "@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="],
- "@esbuild/android-arm": ["@esbuild/android-arm@0.27.7", "", { "os": "android", "cpu": "arm" }, "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ=="],
+ "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="],
- "@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.7", "", { "os": "android", "cpu": "arm64" }, "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ=="],
+ "@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="],
- "@esbuild/android-x64": ["@esbuild/android-x64@0.27.7", "", { "os": "android", "cpu": "x64" }, "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg=="],
+ "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="],
- "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw=="],
+ "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="],
- "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ=="],
+ "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="],
- "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.7", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w=="],
+ "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="],
- "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.7", "", { "os": "freebsd", "cpu": "x64" }, "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ=="],
+ "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="],
- "@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.7", "", { "os": "linux", "cpu": "arm" }, "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA=="],
+ "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="],
- "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A=="],
+ "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="],
- "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.7", "", { "os": "linux", "cpu": "ia32" }, "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg=="],
+ "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="],
- "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q=="],
+ "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="],
- "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw=="],
+ "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="],
- "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.7", "", { "os": "linux", "cpu": "ppc64" }, "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ=="],
+ "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="],
- "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ=="],
+ "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="],
- "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.7", "", { "os": "linux", "cpu": "s390x" }, "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw=="],
+ "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="],
- "@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.7", "", { "os": "linux", "cpu": "x64" }, "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA=="],
+ "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="],
- "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w=="],
+ "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="],
- "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.7", "", { "os": "none", "cpu": "x64" }, "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw=="],
+ "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="],
- "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.7", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A=="],
+ "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="],
- "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.7", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg=="],
+ "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="],
- "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw=="],
+ "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="],
- "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.7", "", { "os": "sunos", "cpu": "x64" }, "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA=="],
+ "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="],
- "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA=="],
+ "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="],
- "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.7", "", { "os": "win32", "cpu": "ia32" }, "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw=="],
-
- "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.7", "", { "os": "win32", "cpu": "x64" }, "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg=="],
-
- "@fastify/deepmerge": ["@fastify/deepmerge@3.2.1", "", {}, "sha512-N5Oqvltoa2r9z1tbx4xjky0oRR60v+T47Ic4J1ukoVQcptLOrIdRnCSdTGmOmajZuHVKlTnfcmrjyqsGEW1ztA=="],
+ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="],
"@floating-ui/core": ["@floating-ui/core@1.7.5", "", { "dependencies": { "@floating-ui/utils": "^0.2.11" } }, "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ=="],
@@ -93,15 +89,9 @@
"@floating-ui/utils": ["@floating-ui/utils@0.2.11", "", {}, "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg=="],
- "@formatjs/fast-memoize": ["@formatjs/fast-memoize@3.1.1", "", {}, "sha512-CbNbf+tlJn1baRnPkNePnBqTLxGliG6DDgNa/UtV66abwIjwsliPMOt0172tzxABYzSuxZBZfcp//qI8AvBWPg=="],
-
- "@formatjs/intl-localematcher": ["@formatjs/intl-localematcher@0.8.2", "", { "dependencies": { "@formatjs/fast-memoize": "3.1.1" } }, "sha512-q05KMYGJLyqFNFtIb8NhWLF5X3aK/k0wYt7dnRFuy6aLQL+vUwQ1cg5cO4qawEiINybeCPXAWlprY2mSBjSXAQ=="],
-
- "@fumadocs/tailwind": ["@fumadocs/tailwind@0.0.3", "", { "dependencies": { "postcss-selector-parser": "^7.1.1" }, "peerDependencies": { "tailwindcss": "^4.0.0" }, "optionalPeers": ["tailwindcss"] }, "sha512-/FWcggMz9BhoX+13xBoZLX+XX9mYvJ50dkTqy3IfocJqua65ExcsKfxwKH8hgTO3vA5KnWv4+4jU7LaW2AjAmQ=="],
+ "@formatjs/intl-localematcher": ["@formatjs/intl-localematcher@0.6.2", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA=="],
- "@fumari/json-schema-ts": ["@fumari/json-schema-ts@0.0.2", "", { "dependencies": { "esrap": "^2.2.3" }, "peerDependencies": { "json-schema-typed": "^8.0.2" }, "optionalPeers": ["json-schema-typed"] }, "sha512-A2x8nj45r8Kc3Gqa+HpWRF9uzIMc9dySB6L2R2kiyjLHXWBsZUX99Atj5+Yup/iRQXQ9s8AX+uAPwPze7Xn05A=="],
-
- "@fumari/stf": ["@fumari/stf@1.0.4", "", { "peerDependencies": { "@types/react": "*", "react": "^19.2.0", "react-dom": "^19.2.0" }, "optionalPeers": ["@types/react"] }, "sha512-ozyRDo4GjOEuE+XZlcMSP/7lwoAMwP4tZI+hdwhVWS1MeCSJqVpHFWIKucocXUUhusX2oqZb3K5ip1J79mR6zw=="],
+ "@fumari/json-schema-to-typescript": ["@fumari/json-schema-to-typescript@1.1.3", "", { "dependencies": { "@apidevtools/json-schema-ref-parser": "^11.9.3", "js-yaml": "^4.1.0", "prettier": "^3.5.3" } }, "sha512-KnaZAo5W769nOaxhPqEMTdjHdngugxmPpNS+Yr2U90iVxgmNAWwhSr8Nx3l+CUehJKNFzJi2C7clQXOfuPJegA=="],
"@img/colour": ["@img/colour@1.1.0", "", {}, "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ=="],
@@ -163,9 +153,9 @@
"@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
- "@mdx-js/mdx": ["@mdx-js/mdx@3.1.1", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdx": "^2.0.0", "acorn": "^8.0.0", "collapse-white-space": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-util-scope": "^1.0.0", "estree-walker": "^3.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "markdown-extensions": "^2.0.0", "recma-build-jsx": "^1.0.0", "recma-jsx": "^1.0.0", "recma-stringify": "^1.0.0", "rehype-recma": "^1.0.0", "remark-mdx": "^3.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "source-map": "^0.7.0", "unified": "^11.0.0", "unist-util-position-from-estree": "^2.0.0", "unist-util-stringify-position": "^4.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ=="],
+ "@jsdevtools/ono": ["@jsdevtools/ono@7.1.3", "", {}, "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg=="],
- "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.3", "", { "dependencies": { "@tybys/wasm-util": "^0.10.1" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ=="],
+ "@mdx-js/mdx": ["@mdx-js/mdx@3.1.1", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdx": "^2.0.0", "acorn": "^8.0.0", "collapse-white-space": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-util-scope": "^1.0.0", "estree-walker": "^3.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "markdown-extensions": "^2.0.0", "recma-build-jsx": "^1.0.0", "recma-jsx": "^1.0.0", "recma-stringify": "^1.0.0", "rehype-recma": "^1.0.0", "remark-mdx": "^3.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "source-map": "^0.7.0", "unified": "^11.0.0", "unist-util-position-from-estree": "^2.0.0", "unist-util-stringify-position": "^4.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ=="],
"@next/env": ["@next/env@15.5.15", "", {}, "sha512-vcmyu5/MyFzN7CdqRHO3uHO44p/QPCZkuTUXroeUmhNP8bL5PHFEhik22JUazt+CDDoD6EpBYRCaS2pISL+/hg=="],
@@ -185,89 +175,13 @@
"@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@15.5.15", "", { "os": "win32", "cpu": "x64" }, "sha512-nFucjVdwlFqxh/JG3hWSJ4p8+YJV7Ii8aPDuBQULB6DzUF4UNZETXLfEUk+oI2zEznWWULPt7MeuTE6xtK1HSA=="],
- "@orama/orama": ["@orama/orama@3.1.18", "", {}, "sha512-a61ljmRVVyG5MC/698C8/FfFDw5a8LOIvyOLW5fztgUXqUpc1jOfQzOitSCbge657OgXXThmY3Tk8fpiDb4UcA=="],
-
- "@oxc-parser/binding-android-arm-eabi": ["@oxc-parser/binding-android-arm-eabi@0.124.0", "", { "os": "android", "cpu": "arm" }, "sha512-+R9zCafSL8ovjokdPtorUp3sXrh8zQ2AC2L0ivXNvlLR0WS+5WdPkNVrnENq5UvzagM4Xgl0NPsJKz3Hv9+y8g=="],
-
- "@oxc-parser/binding-android-arm64": ["@oxc-parser/binding-android-arm64@0.124.0", "", { "os": "android", "cpu": "arm64" }, "sha512-ULHC/gVZ+nP4pd3kNNQTYaQ/e066BW/KuY5qUsvwkVWwOUQGDg+WpfyVOmQ4xfxoue6cMlkKkJ+ntdzfDXpNlg=="],
-
- "@oxc-parser/binding-darwin-arm64": ["@oxc-parser/binding-darwin-arm64@0.124.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-fGJ2hw7bnbUYn6UvTjp0m4WJ9zXz3cohgcwcgeo7gUZehpPNpvcVEVeIVHNmHnAuAw/ysf4YJR8DA1E+xCA4Lw=="],
-
- "@oxc-parser/binding-darwin-x64": ["@oxc-parser/binding-darwin-x64@0.124.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-j0+re9pgps5BH2Tk3fm59Hi3QuLP3C4KhqXi6A+wRHHHJWDFR8mc/KI9mBrfk2JRT+15doGo+zv1eN75/9DuOw=="],
-
- "@oxc-parser/binding-freebsd-x64": ["@oxc-parser/binding-freebsd-x64@0.124.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-0k5mS0npnrhKy72UfF51lpOZ2ESoPWn6gdFw+RdeRWcokraDW1O2kSx3laQ+yk7cCEavQdJSpWCYS/GvBbUCXQ=="],
-
- "@oxc-parser/binding-linux-arm-gnueabihf": ["@oxc-parser/binding-linux-arm-gnueabihf@0.124.0", "", { "os": "linux", "cpu": "arm" }, "sha512-P/i4eguRWvAUfGdfhQYg1jpwYkyUV6D3gefIH7HhmRl1Ph6P4IqTIEVcyJr1i/3vr1V5OHU4wonH6/ue/Qzvrw=="],
-
- "@oxc-parser/binding-linux-arm-musleabihf": ["@oxc-parser/binding-linux-arm-musleabihf@0.124.0", "", { "os": "linux", "cpu": "arm" }, "sha512-/ameqFQH5fFP+66Atr8Ynv/2rYe4utcU7L4MoWS5JtrFLVO78g4qDLavyIlJxa6caSwYOvG/eO3c/DXqY5/6Rw=="],
-
- "@oxc-parser/binding-linux-arm64-gnu": ["@oxc-parser/binding-linux-arm64-gnu@0.124.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-gNeyEcXTtfrRCbj2EfxWU85Fs0wIX3p44Y3twnvuMfkWlLrb9M1Z25AYNSKjJM+fdAjeeQCjw0on47zFuBYwQw=="],
-
- "@oxc-parser/binding-linux-arm64-musl": ["@oxc-parser/binding-linux-arm64-musl@0.124.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-uvG7v4Tz9S8/PVqY0SP0DLHxo4hZGe+Pv2tGVnwcsjKCCUPjplbrFVvDzXq+kOaEoUkiCY0Kt1hlZ6FDJ1LKNQ=="],
-
- "@oxc-parser/binding-linux-ppc64-gnu": ["@oxc-parser/binding-linux-ppc64-gnu@0.124.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-t7KZaaUhfp2au0MRpoENEFqwLKYDdptEry6V7pTAVdPEcFG4P6ii8yeGU9m6p5vb+b8WEKmdpGMNXBEYy7iJdw=="],
-
- "@oxc-parser/binding-linux-riscv64-gnu": ["@oxc-parser/binding-linux-riscv64-gnu@0.124.0", "", { "os": "linux", "cpu": "none" }, "sha512-eurGGaxHZiIQ+fBSageS8TAkRqZgdOiBeqNrWAqAPup9hXBTmQ0WcBjwsLElf+3jvDL9NhnX0dOgOqPfsjSjdg=="],
-
- "@oxc-parser/binding-linux-riscv64-musl": ["@oxc-parser/binding-linux-riscv64-musl@0.124.0", "", { "os": "linux", "cpu": "none" }, "sha512-d1V7/ll1i/LhqE/gZy6Wbz6evlk0egh2XKkwMI3epiojtbtUwQSLIER0Y3yDBBocPuWOjJdvmjtEmPTTLXje/w=="],
-
- "@oxc-parser/binding-linux-s390x-gnu": ["@oxc-parser/binding-linux-s390x-gnu@0.124.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-w1+cBvriUteOpox6ATqCFVkpGL47PFdcfCPGmgUZbd78Fw44U0gQkc+kVGvAOTvGrptMYgwomD1c6OTVvkrpGg=="],
-
- "@oxc-parser/binding-linux-x64-gnu": ["@oxc-parser/binding-linux-x64-gnu@0.124.0", "", { "os": "linux", "cpu": "x64" }, "sha512-RRB1evQiXRtMCsQQiAh9U0H3HzguLpE0ytfStuhRgmOj7tqUCOVxkHsvM9geZjAax6NqVRj7VXx32qjjkZPsBw=="],
-
- "@oxc-parser/binding-linux-x64-musl": ["@oxc-parser/binding-linux-x64-musl@0.124.0", "", { "os": "linux", "cpu": "x64" }, "sha512-asVYN0qmSHlCU8H9Q47SmeJ/Z5EG4IWCC+QGxkfFboI5qh15aLlJnHmnrV61MwQRPXGnVC/sC3qKhrUyqGxUqw=="],
-
- "@oxc-parser/binding-openharmony-arm64": ["@oxc-parser/binding-openharmony-arm64@0.124.0", "", { "os": "none", "cpu": "arm64" }, "sha512-nhwuxm6B8pn9lzAzMUfa571L5hCXYwQo8C8cx5aGOuHWCzruR8gPJnRRXGBci+uGaIIQEZDyU/U6HDgrSp/JlQ=="],
-
- "@oxc-parser/binding-wasm32-wasi": ["@oxc-parser/binding-wasm32-wasi@0.124.0", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.1.2" }, "cpu": "none" }, "sha512-LWuq4Dl9tff7n+HjJcqoBjDlVCtruc0shgtdtGM+rTUIE9aFxHA/P+wCYR+aWMjN8m9vNaRME/sKXErmhmeKrA=="],
+ "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="],
- "@oxc-parser/binding-win32-arm64-msvc": ["@oxc-parser/binding-win32-arm64-msvc@0.124.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-aOh3Lf3AeH0dgzT4yBXcArFZ8VhqNXwZ/xlN0GqBtgVaGoHOOqL2YHlcVIgT+ghsXPVR2PTtYgBiQ1CNK7jp5A=="],
+ "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="],
- "@oxc-parser/binding-win32-ia32-msvc": ["@oxc-parser/binding-win32-ia32-msvc@0.124.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-sib5xC0nz/+SCpaETBuHBz4SXS02KuG5HtyOcHsO/SK5ZvLRGhOZx0elDKawjb6adFkD7dQCqpXUS25wY6ELKQ=="],
+ "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="],
- "@oxc-parser/binding-win32-x64-msvc": ["@oxc-parser/binding-win32-x64-msvc@0.124.0", "", { "os": "win32", "cpu": "x64" }, "sha512-UgojtjGUgZgAZQYt7SC6VO65OVdxEkRe2q+2vbHJO//18qw3Hrk6UvHGQKldsQKgbVcIBT/YBrt85YberiYIPQ=="],
-
- "@oxc-project/types": ["@oxc-project/types@0.124.0", "", {}, "sha512-VBFWMTBvHxS11Z5Lvlr3IWgrwhMTXV+Md+EQF0Xf60+wAdsGFTBx7X7K/hP4pi8N7dcm1RvcHwDxZ16Qx8keUg=="],
-
- "@oxc-resolver/binding-android-arm-eabi": ["@oxc-resolver/binding-android-arm-eabi@11.19.1", "", { "os": "android", "cpu": "arm" }, "sha512-aUs47y+xyXHUKlbhqHUjBABjvycq6YSD7bpxSW7vplUmdzAlJ93yXY6ZR0c1o1x5A/QKbENCvs3+NlY8IpIVzg=="],
-
- "@oxc-resolver/binding-android-arm64": ["@oxc-resolver/binding-android-arm64@11.19.1", "", { "os": "android", "cpu": "arm64" }, "sha512-oolbkRX+m7Pq2LNjr/kKgYeC7bRDMVTWPgxBGMjSpZi/+UskVo4jsMU3MLheZV55jL6c3rNelPl4oD60ggYmqA=="],
-
- "@oxc-resolver/binding-darwin-arm64": ["@oxc-resolver/binding-darwin-arm64@11.19.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-nUC6d2i3R5B12sUW4O646qD5cnMXf2oBGPLIIeaRfU9doJRORAbE2SGv4eW6rMqhD+G7nf2Y8TTJTLiiO3Q/dQ=="],
-
- "@oxc-resolver/binding-darwin-x64": ["@oxc-resolver/binding-darwin-x64@11.19.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-cV50vE5+uAgNcFa3QY1JOeKDSkM/9ReIcc/9wn4TavhW/itkDGrXhw9jaKnkQnGbjJ198Yh5nbX/Gr2mr4Z5jQ=="],
-
- "@oxc-resolver/binding-freebsd-x64": ["@oxc-resolver/binding-freebsd-x64@11.19.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-xZOQiYGFxtk48PBKff+Zwoym7ScPAIVp4c14lfLxizO2LTTTJe5sx9vQNGrBymrf/vatSPNMD4FgsaaRigPkqw=="],
-
- "@oxc-resolver/binding-linux-arm-gnueabihf": ["@oxc-resolver/binding-linux-arm-gnueabihf@11.19.1", "", { "os": "linux", "cpu": "arm" }, "sha512-lXZYWAC6kaGe/ky2su94e9jN9t6M0/6c+GrSlCqL//XO1cxi5lpAhnJYdyrKfm0ZEr/c7RNyAx3P7FSBcBd5+A=="],
-
- "@oxc-resolver/binding-linux-arm-musleabihf": ["@oxc-resolver/binding-linux-arm-musleabihf@11.19.1", "", { "os": "linux", "cpu": "arm" }, "sha512-veG1kKsuK5+t2IsO9q0DErYVSw2azvCVvWHnfTOS73WE0STdLLB7Q1bB9WR+yHPQM76ASkFyRbogWo1GR1+WbQ=="],
-
- "@oxc-resolver/binding-linux-arm64-gnu": ["@oxc-resolver/binding-linux-arm64-gnu@11.19.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-heV2+jmXyYnUrpUXSPugqWDRpnsQcDm2AX4wzTuvgdlZfoNYO0O3W2AVpJYaDn9AG4JdM6Kxom8+foE7/BcSig=="],
-
- "@oxc-resolver/binding-linux-arm64-musl": ["@oxc-resolver/binding-linux-arm64-musl@11.19.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-jvo2Pjs1c9KPxMuMPIeQsgu0mOJF9rEb3y3TdpsrqwxRM+AN6/nDDwv45n5ZrUnQMsdBy5gIabioMKnQfWo9ew=="],
-
- "@oxc-resolver/binding-linux-ppc64-gnu": ["@oxc-resolver/binding-linux-ppc64-gnu@11.19.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-vLmdNxWCdN7Uo5suays6A/+ywBby2PWBBPXctWPg5V0+eVuzsJxgAn6MMB4mPlshskYbppjpN2Zg83ArHze9gQ=="],
-
- "@oxc-resolver/binding-linux-riscv64-gnu": ["@oxc-resolver/binding-linux-riscv64-gnu@11.19.1", "", { "os": "linux", "cpu": "none" }, "sha512-/b+WgR+VTSBxzgOhDO7TlMXC1ufPIMR6Vj1zN+/x+MnyXGW7prTLzU9eW85Aj7Th7CCEG9ArCbTeqxCzFWdg2w=="],
-
- "@oxc-resolver/binding-linux-riscv64-musl": ["@oxc-resolver/binding-linux-riscv64-musl@11.19.1", "", { "os": "linux", "cpu": "none" }, "sha512-YlRdeWb9j42p29ROh+h4eg/OQ3dTJlpHSa+84pUM9+p6i3djtPz1q55yLJhgW9XfDch7FN1pQ/Vd6YP+xfRIuw=="],
-
- "@oxc-resolver/binding-linux-s390x-gnu": ["@oxc-resolver/binding-linux-s390x-gnu@11.19.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-EDpafVOQWF8/MJynsjOGFThcqhRHy417sRyLfQmeiamJ8qVhSKAn2Dn2VVKUGCjVB9C46VGjhNo7nOPUi1x6uA=="],
-
- "@oxc-resolver/binding-linux-x64-gnu": ["@oxc-resolver/binding-linux-x64-gnu@11.19.1", "", { "os": "linux", "cpu": "x64" }, "sha512-NxjZe+rqWhr+RT8/Ik+5ptA3oz7tUw361Wa5RWQXKnfqwSSHdHyrw6IdcTfYuml9dM856AlKWZIUXDmA9kkiBQ=="],
-
- "@oxc-resolver/binding-linux-x64-musl": ["@oxc-resolver/binding-linux-x64-musl@11.19.1", "", { "os": "linux", "cpu": "x64" }, "sha512-cM/hQwsO3ReJg5kR+SpI69DMfvNCp+A/eVR4b4YClE5bVZwz8rh2Nh05InhwI5HR/9cArbEkzMjcKgTHS6UaNw=="],
-
- "@oxc-resolver/binding-openharmony-arm64": ["@oxc-resolver/binding-openharmony-arm64@11.19.1", "", { "os": "none", "cpu": "arm64" }, "sha512-QF080IowFB0+9Rh6RcD19bdgh49BpQHUW5TajG1qvWHvmrQznTZZjYlgE2ltLXyKY+qs4F/v5xuX1XS7Is+3qA=="],
-
- "@oxc-resolver/binding-wasm32-wasi": ["@oxc-resolver/binding-wasm32-wasi@11.19.1", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.1.1" }, "cpu": "none" }, "sha512-w8UCKhX826cP/ZLokXDS6+milN8y4X7zidsAttEdWlVoamTNf6lhBJldaWr3ukTDiye7s4HRcuPEPOXNC432Vg=="],
-
- "@oxc-resolver/binding-win32-arm64-msvc": ["@oxc-resolver/binding-win32-arm64-msvc@11.19.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-nJ4AsUVZrVKwnU/QRdzPCCrO0TrabBqgJ8pJhXITdZGYOV28TIYystV1VFLbQ7DtAcaBHpocT5/ZJnF78YJPtQ=="],
-
- "@oxc-resolver/binding-win32-ia32-msvc": ["@oxc-resolver/binding-win32-ia32-msvc@11.19.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-EW+ND5q2Tl+a3pH81l1QbfgbF3HmqgwLfDfVithRFheac8OTcnbXt/JxqD2GbDkb7xYEqy1zNaVFRr3oeG8npA=="],
-
- "@oxc-resolver/binding-win32-x64-msvc": ["@oxc-resolver/binding-win32-x64-msvc@11.19.1", "", { "os": "win32", "cpu": "x64" }, "sha512-6hIU3RQu45B+VNTY4Ru8ppFwjVS/S5qwYyGhBotmjxfEKk41I2DlGtRfGJndZ5+6lneE2pwloqunlOyZuX/XAw=="],
+ "@orama/orama": ["@orama/orama@3.1.18", "", {}, "sha512-a61ljmRVVyG5MC/698C8/FfFDw5a8LOIvyOLW5fztgUXqUpc1jOfQzOitSCbge657OgXXThmY3Tk8fpiDb4UcA=="],
"@radix-ui/number": ["@radix-ui/number@1.1.1", "", {}, "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g=="],
@@ -339,31 +253,23 @@
"@radix-ui/rect": ["@radix-ui/rect@1.1.1", "", {}, "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw=="],
- "@scalar/helpers": ["@scalar/helpers@0.4.3", "", {}, "sha512-Gv2V7SFreLx3DltzF2lKXdaJSH5cP1LOyt9PxON1cSWGxkrs3sg93c1taEJsW24E9ckfYXkL5hjCAVLfAN3wQw=="],
-
- "@scalar/json-magic": ["@scalar/json-magic@0.12.5", "", { "dependencies": { "@scalar/helpers": "0.4.3", "pathe": "^2.0.3", "yaml": "^2.8.0" } }, "sha512-MkGOjodEeQ7V7M78W6Oq+t3q1LaUR+SRLZLqFbU6s26Gc+12T+v89JXcHvd+3ug0xFVMg/kdczZ3O6miBhyNsA=="],
-
- "@scalar/openapi-types": ["@scalar/openapi-types@0.7.0", "", {}, "sha512-kN0PwlJW0de4bwQ4ib+mBHzKJUvBCyR/gwU4zLEq6SCbj+GfgYUh+2a0/yl1WYVUiSkkwFsHjfmQ8KjhR3HK0Q=="],
+ "@scalar/openapi-parser": ["@scalar/openapi-parser@0.10.9", "", { "dependencies": { "ajv": "^8.17.1", "ajv-draft-04": "^1.0.0", "ajv-formats": "^3.0.1", "jsonpointer": "^5.0.1", "leven": "^4.0.0", "yaml": "^2.4.5" } }, "sha512-wsKZtL4B3Fmbv24B1zzeWdsEr6F60fLmToOFLA1b9QGQ6TAtIvLgKQWQ65eh5Vfx93nQb/iekamfErqHRHtEhA=="],
- "@scalar/openapi-upgrader": ["@scalar/openapi-upgrader@0.2.4", "", { "dependencies": { "@scalar/openapi-types": "0.7.0" } }, "sha512-AcrF7BMxKCTHnT82SHbHun6dJO4XC9tS5gD7EJsr/7YwFkx9JtbtZCryJXtqWJ5c7i1v1KH4PRRjDga/hCULTQ=="],
+ "@shikijs/core": ["@shikijs/core@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA=="],
- "@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@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.4" } }, "sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA=="],
- "@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=="],
+ "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g=="],
- "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-UpCB9Y2sUKlS9z8juFSKz7ZtysmeXCgnRF0dlhXBkmQnek7lAToPte8DkxmEYGNTMii72zU/lyXiCB6StuZeJg=="],
+ "@shikijs/langs": ["@shikijs/langs@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0" } }, "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg=="],
- "@shikijs/langs": ["@shikijs/langs@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2" } }, "sha512-KaXby5dvoeuZzN0rYQiPMjFoUrz4hgwIE+D6Du9owcHcl6/g16/yT5BQxSW5cGt2MZBz6Hl0YuRqf12omRfUUg=="],
+ "@shikijs/rehype": ["@shikijs/rehype@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0", "@types/hast": "^3.0.4", "hast-util-to-string": "^3.0.1", "shiki": "3.23.0", "unified": "^11.0.5", "unist-util-visit": "^5.1.0" } }, "sha512-GepKJxXHbXFfAkiZZZ+4V7x71Lw3s0ALYmydUxJRdvpKjSx9FOMSaunv6WRLFBXR6qjYerUq1YZQno+2gLEPwA=="],
- "@shikijs/primitive": ["@shikijs/primitive@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-M6UMPrSa3fN5ayeJwFVl9qWofl273wtK1VG8ySDZ1mQBfhCpdd8nEx7nPZ/tk7k+TYcpqBZzj/AnwxT9lO+HJw=="],
+ "@shikijs/themes": ["@shikijs/themes@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0" } }, "sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA=="],
- "@shikijs/rehype": ["@shikijs/rehype@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2", "@types/hast": "^3.0.4", "hast-util-to-string": "^3.0.1", "shiki": "4.0.2", "unified": "^11.0.5", "unist-util-visit": "^5.1.0" } }, "sha512-cmPlKLD8JeojasNFoY64162ScpEdEdQUMuVodPCrv1nx1z3bjmGwoKWDruQWa/ejSznImlaeB0Ty6Q3zPaVQAA=="],
+ "@shikijs/transformers": ["@shikijs/transformers@3.23.0", "", { "dependencies": { "@shikijs/core": "3.23.0", "@shikijs/types": "3.23.0" } }, "sha512-F9msZVxdF+krQNSdQ4V+Ja5QemeAoTQ2jxt7nJCwhDsdF1JWS3KxIQXA3lQbyKwS3J61oHRUSv4jYWv3CkaKTQ=="],
- "@shikijs/themes": ["@shikijs/themes@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2" } }, "sha512-mjCafwt8lJJaVSsQvNVrJumbnnj1RI8jbUKrPKgE6E3OvQKxnuRoBaYC51H4IGHePsGN/QtALglWBU7DoKDFnA=="],
-
- "@shikijs/transformers": ["@shikijs/transformers@4.0.2", "", { "dependencies": { "@shikijs/core": "4.0.2", "@shikijs/types": "4.0.2" } }, "sha512-1+L0gf9v+SdDXs08vjaLb3mBFa8U7u37cwcBQIv/HCocLwX69Tt6LpUCjtB+UUTvQxI7BnjZKhN/wMjhHBcJGg=="],
-
- "@shikijs/types": ["@shikijs/types@4.0.2", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-qzbeRooUTPnLE+sHD/Z8DStmaDgnbbc/pMrU203950aRqjX/6AFHeDYT+j00y2lPdz0ywJKx7o/7qnqTivtlXg=="],
+ "@shikijs/types": ["@shikijs/types@3.23.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ=="],
"@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="],
@@ -401,8 +307,6 @@
"@tailwindcss/postcss": ["@tailwindcss/postcss@4.2.2", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.2.2", "@tailwindcss/oxide": "4.2.2", "postcss": "^8.5.6", "tailwindcss": "4.2.2" } }, "sha512-n4goKQbW8RVXIbNKRB/45LzyUqN451deQK0nzIeauVEqjlI49slUlgKYJM2QyUzap/PcpnS7kzSUmPb1sCRvYQ=="],
- "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="],
-
"@types/debug": ["@types/debug@4.1.13", "", { "dependencies": { "@types/ms": "*" } }, "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw=="],
"@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
@@ -425,8 +329,6 @@
"@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="],
- "@typescript-eslint/types": ["@typescript-eslint/types@8.58.1", "", {}, "sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw=="],
-
"@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="],
"acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="],
@@ -435,6 +337,10 @@
"ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="],
+ "ajv-draft-04": ["ajv-draft-04@1.0.0", "", { "peerDependencies": { "ajv": "^8.5.0" }, "optionalPeers": ["ajv"] }, "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw=="],
+
+ "ajv-formats": ["ajv-formats@3.0.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="],
+
"argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
"aria-hidden": ["aria-hidden@1.2.6", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="],
@@ -443,6 +349,8 @@
"bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="],
+ "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
+
"caniuse-lite": ["caniuse-lite@1.0.30001787", "", {}, "sha512-mNcrMN9KeI68u7muanUpEejSLghOKlVhRqS/Za2IeyGllJ9I9otGpR9g3nsw7n4W378TE/LyIteA0+/FOZm4Kg=="],
"ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="],
@@ -455,7 +363,7 @@
"character-reference-invalid": ["character-reference-invalid@2.0.1", "", {}, "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw=="],
- "chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="],
+ "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],
"class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="],
@@ -487,18 +395,14 @@
"enhanced-resolve": ["enhanced-resolve@5.20.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.0" } }, "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA=="],
- "entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="],
-
"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.7", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.7", "@esbuild/android-arm": "0.27.7", "@esbuild/android-arm64": "0.27.7", "@esbuild/android-x64": "0.27.7", "@esbuild/darwin-arm64": "0.27.7", "@esbuild/darwin-x64": "0.27.7", "@esbuild/freebsd-arm64": "0.27.7", "@esbuild/freebsd-x64": "0.27.7", "@esbuild/linux-arm": "0.27.7", "@esbuild/linux-arm64": "0.27.7", "@esbuild/linux-ia32": "0.27.7", "@esbuild/linux-loong64": "0.27.7", "@esbuild/linux-mips64el": "0.27.7", "@esbuild/linux-ppc64": "0.27.7", "@esbuild/linux-riscv64": "0.27.7", "@esbuild/linux-s390x": "0.27.7", "@esbuild/linux-x64": "0.27.7", "@esbuild/netbsd-arm64": "0.27.7", "@esbuild/netbsd-x64": "0.27.7", "@esbuild/openbsd-arm64": "0.27.7", "@esbuild/openbsd-x64": "0.27.7", "@esbuild/openharmony-arm64": "0.27.7", "@esbuild/sunos-x64": "0.27.7", "@esbuild/win32-arm64": "0.27.7", "@esbuild/win32-ia32": "0.27.7", "@esbuild/win32-x64": "0.27.7" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w=="],
+ "esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="],
"escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="],
- "esrap": ["esrap@2.2.4", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15", "@typescript-eslint/types": "^8.2.0" } }, "sha512-suICpxAmZ9A8bzJjEl/+rLJiDKC0X4gYWUxT6URAWBLvlXmtbZd5ySMu/N2ZGEtMCAmflUDPSehrP9BQcsGcSg=="],
-
"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=="],
@@ -517,43 +421,39 @@
"extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="],
- "fast-content-type-parse": ["fast-content-type-parse@3.0.0", "", {}, "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg=="],
-
"fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
+ "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="],
+
"fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="],
"fast-xml-builder": ["fast-xml-builder@1.1.4", "", { "dependencies": { "path-expression-matcher": "^1.1.3" } }, "sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg=="],
"fast-xml-parser": ["fast-xml-parser@5.5.11", "", { "dependencies": { "fast-xml-builder": "^1.1.4", "path-expression-matcher": "^1.4.0", "strnum": "^2.2.3" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-QL0eb0YbSTVWF6tTf1+LEMSgtCEjBYPpnAjoLC8SscESlAjXEIRJ7cHtLG0pLeDFaZLa4VKZLArtA/60ZS7vyA=="],
- "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
+ "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="],
- "foreach": ["foreach@2.0.6", "", {}, "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg=="],
+ "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
- "framer-motion": ["framer-motion@12.38.0", "", { "dependencies": { "motion-dom": "^12.38.0", "motion-utils": "^12.36.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-rFYkY/pigbcswl1XQSb7q424kSTQ8q6eAC+YUsSKooHQYuLdzdHjrt6uxUC+PRAO++q5IS7+TamgIw1AphxR+g=="],
+ "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
- "fuma-cli": ["fuma-cli@0.0.3", "", { "dependencies": { "magic-string": "^0.30.21", "oxc-parser": "^0.124.0", "oxc-resolver": "^11.19.1", "package-manager-detector": "^1.6.0", "picocolors": "^1.1.1", "tinyexec": "^1.0.4", "zod": "^4.3.6" } }, "sha512-DefY1l9+PdairAjOeMfHMCHwkP9kRo7pqqpqb2qFpjb3Vxa8XIpPVVrFGR+9eMfE7Bp6rxsg8NAE3XRPLMWiDA=="],
+ "foreach": ["foreach@2.0.6", "", {}, "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg=="],
- "fumadocs-core": ["fumadocs-core@16.7.11", "", { "dependencies": { "@formatjs/intl-localematcher": "^0.8.2", "@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.4.2", "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.16", "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-v09UEizAi7NfqwYEq2hvDimicj6ZX7xBYcOjp3vGwXZr9Vn/S2bI76HM6YWr38DmIcj1ed8zFTf1lWJsJRYN+w=="],
+ "fumadocs-core": ["fumadocs-core@15.8.5", "", { "dependencies": { "@formatjs/intl-localematcher": "^0.6.2", "@orama/orama": "^3.1.14", "@shikijs/rehype": "^3.13.0", "@shikijs/transformers": "^3.13.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", "negotiator": "^1.0.0", "npm-to-yarn": "^3.0.1", "path-to-regexp": "^8.3.0", "react-remove-scroll": "^2.7.1", "remark": "^15.0.1", "remark-gfm": "^4.0.1", "remark-rehype": "^11.1.2", "scroll-into-view-if-needed": "^3.1.0", "shiki": "^3.13.0", "unist-util-visit": "^5.0.0" }, "peerDependencies": { "@mixedbread/sdk": "^0.19.0", "@oramacloud/client": "1.x.x || 2.x.x", "@tanstack/react-router": "1.x.x", "@types/react": "*", "algoliasearch": "5.x.x", "lucide-react": "*", "next": "14.x.x || 15.x.x", "react": "18.x.x || 19.x.x", "react-dom": "18.x.x || 19.x.x", "react-router": "7.x.x", "waku": "^0.26.0" }, "optionalPeers": ["@mixedbread/sdk", "@oramacloud/client", "@tanstack/react-router", "@types/react", "algoliasearch", "lucide-react", "next", "react", "react-dom", "react-router", "waku"] }, "sha512-hyJtKGuB2J/5y7tDfI1EnGMKlNbSXM5N5cpwvgCY0DcBJwFMDG/GpSpaVRzh3aWy67pAYDZFIwdtbKXBa/q5bg=="],
- "fumadocs-mdx": ["fumadocs-mdx@14.2.11", "", { "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-mdx": "^3.0.0", "mdast-util-to-markdown": "^2.1.2", "picocolors": "^1.1.1", "picomatch": "^4.0.3", "tinyexec": "^1.0.4", "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": "*", "next": "^15.3.0 || ^16.0.0", "react": "*", "vite": "6.x.x || 7.x.x || 8.x.x" }, "optionalPeers": ["@fumadocs/mdx-remote", "@types/mdast", "@types/mdx", "@types/react", "mdast-util-directive", "next", "react", "vite"], "bin": { "fumadocs-mdx": "dist/bin.js" } }, "sha512-j0gHKs45c62ARteE8/yBM2Nu2I8AE2Cs37ktPEdc/8EX7TL66XP74un5OpHp6itLyWTu8Jur0imOiiIDq8+rDg=="],
+ "fumadocs-mdx": ["fumadocs-mdx@12.0.3", "", { "dependencies": { "@mdx-js/mdx": "^3.1.1", "@standard-schema/spec": "^1.0.0", "chokidar": "^4.0.3", "esbuild": "^0.25.10", "estree-util-value-to-estree": "^3.4.0", "js-yaml": "^4.1.0", "lru-cache": "^11.2.2", "mdast-util-to-markdown": "^2.1.2", "picocolors": "^1.1.1", "remark-mdx": "^3.1.1", "remark-parse": "^11.0.0", "tinyexec": "^1.0.1", "tinyglobby": "^0.2.15", "unified": "^11.0.5", "unist-util-visit": "^5.0.0", "zod": "^4.1.11" }, "peerDependencies": { "@fumadocs/mdx-remote": "^1.4.0", "fumadocs-core": "^14.0.0 || ^15.0.0", "next": "^15.3.0", "react": "*", "vite": "6.x.x || 7.x.x" }, "optionalPeers": ["@fumadocs/mdx-remote", "next", "react", "vite"], "bin": { "fumadocs-mdx": "dist/bin.js" } }, "sha512-OYqbHSmzkejG+iUMlZJJOitaVbCgBdo/REc/9Sq1WaZ1vq6bH9PCFU0cKJlRdHbQSGRfVg5EJJy5uKy5+iNFGQ=="],
- "fumadocs-openapi": ["fumadocs-openapi@10.6.7", "", { "dependencies": { "@fastify/deepmerge": "^3.2.1", "@fumari/json-schema-ts": "^0.0.2", "@fumari/stf": "1.0.4", "@radix-ui/react-accordion": "^1.2.12", "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-select": "^2.2.6", "@radix-ui/react-slot": "^1.2.4", "@scalar/json-magic": "^0.12.5", "@scalar/openapi-upgrader": "^0.2.4", "ajv": "^8.18.0", "chokidar": "^5.0.0", "class-variance-authority": "^0.7.1", "fast-content-type-parse": "^3.0.0", "github-slugger": "^2.0.0", "hast-util-to-jsx-runtime": "^2.3.6", "js-yaml": "^4.1.1", "lucide-react": "^1.7.0", "next-themes": "^0.4.6", "openapi-sampler": "^1.7.2", "react-hook-form": "^7.72.1", "remark": "^15.0.1", "remark-rehype": "^11.1.2", "tailwind-merge": "^3.5.0", "xml-js": "^1.6.11" }, "peerDependencies": { "@scalar/api-client-react": "*", "@types/react": "*", "fumadocs-core": "^16.7.0", "fumadocs-ui": "^16.7.0", "json-schema-typed": "*", "react": "^19.2.0", "react-dom": "^19.2.0", "shiki": "*" }, "optionalPeers": ["@scalar/api-client-react", "@types/react", "json-schema-typed", "shiki"] }, "sha512-WxjX0U6SG4PFDCSwUkuzA8LQ2X+Ou5vYA2RtE4t4i9oXstQAZKTV4llA4BI2ZbU+QVjzbzDXtG0HIykYIembgg=="],
+ "fumadocs-openapi": ["fumadocs-openapi@6.3.0", "", { "dependencies": { "@fumari/json-schema-to-typescript": "^1.1.2", "@radix-ui/react-dialog": "^1.1.6", "@radix-ui/react-select": "^2.1.6", "@radix-ui/react-slot": "^1.1.2", "@scalar/openapi-parser": "0.10.9", "ajv-draft-04": "^1.0.0", "class-variance-authority": "^0.7.1", "fast-glob": "^3.3.3", "fumadocs-core": "15.0.15", "fumadocs-ui": "15.0.15", "github-slugger": "^2.0.0", "hast-util-to-jsx-runtime": "^2.3.5", "js-yaml": "^4.1.0", "lucide-react": "^0.477.0", "next-themes": "^0.4.4", "openapi-sampler": "^1.6.1", "react-hook-form": "^7.54.2", "remark": "^15.0.1", "remark-rehype": "^11.1.1", "shiki": "^3.1.0", "xml-js": "^1.6.11" }, "peerDependencies": { "@scalar/api-client-react": "*", "next": "14.x.x || 15.x.x", "react": "18.x.x || 19.x.x", "react-dom": "18.x.x || 19.x.x" }, "optionalPeers": ["@scalar/api-client-react"] }, "sha512-PEE8txaKkBDjacedRCRD4ekkmfOYx5mWjIc+g+Ys84/zkm5ALaRxAernTMsbAck8GjOOZmA/5MFG/nL/hRvchA=="],
- "fumadocs-ui": ["fumadocs-ui@16.7.11", "", { "dependencies": { "@fumadocs/tailwind": "0.0.3", "@radix-ui/react-accordion": "^1.2.12", "@radix-ui/react-collapsible": "^1.1.12", "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-direction": "^1.1.1", "@radix-ui/react-navigation-menu": "^1.2.14", "@radix-ui/react-popover": "^1.1.15", "@radix-ui/react-presence": "^1.1.5", "@radix-ui/react-scroll-area": "^1.2.10", "@radix-ui/react-slot": "^1.2.4", "@radix-ui/react-tabs": "^1.1.13", "class-variance-authority": "^0.7.1", "fuma-cli": "^0.0.3", "lucide-react": "^1.7.0", "motion": "^12.38.0", "next-themes": "^0.4.6", "react-medium-image-zoom": "^5.4.3", "react-remove-scroll": "^2.7.2", "rehype-raw": "^7.0.0", "scroll-into-view-if-needed": "^3.1.0", "tailwind-merge": "^3.5.0", "unist-util-visit": "^5.1.0" }, "peerDependencies": { "@takumi-rs/image-response": "*", "@types/mdx": "*", "@types/react": "*", "fumadocs-core": "16.7.11", "next": "16.x.x", "react": "^19.2.0", "react-dom": "^19.2.0", "shiki": "*" }, "optionalPeers": ["@takumi-rs/image-response", "@types/mdx", "@types/react", "next", "shiki"] }, "sha512-vEo4bGuWhhM3BBX/vRYDSpF666WJ+EbPke50LgdAdPlQUstRsvkOjWkta/GA9Vggph+aPKSk0AK8isJiMu4t8Q=="],
+ "fumadocs-ui": ["fumadocs-ui@15.8.5", "", { "dependencies": { "@radix-ui/react-accordion": "^1.2.12", "@radix-ui/react-collapsible": "^1.1.12", "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-direction": "^1.1.1", "@radix-ui/react-navigation-menu": "^1.2.14", "@radix-ui/react-popover": "^1.1.15", "@radix-ui/react-presence": "^1.1.5", "@radix-ui/react-scroll-area": "^1.2.10", "@radix-ui/react-slot": "^1.2.3", "@radix-ui/react-tabs": "^1.1.13", "class-variance-authority": "^0.7.1", "fumadocs-core": "15.8.5", "lodash.merge": "^4.6.2", "next-themes": "^0.4.6", "postcss-selector-parser": "^7.1.0", "react-medium-image-zoom": "^5.4.0", "scroll-into-view-if-needed": "^3.1.0", "tailwind-merge": "^3.3.1" }, "peerDependencies": { "@types/react": "*", "next": "14.x.x || 15.x.x", "react": "18.x.x || 19.x.x", "react-dom": "18.x.x || 19.x.x", "tailwindcss": "^3.4.14 || ^4.0.0" }, "optionalPeers": ["@types/react", "next", "tailwindcss"] }, "sha512-9pyB+9rOOsrFnmmZ9xREp/OgVhyaSq2ocEpqTNbeQ7tlJ6JWbdFWfW0C9lRXprQEB6DJWUDtDxqKS5QXLH0EGA=="],
"get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="],
"github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="],
- "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
-
- "hast-util-from-parse5": ["hast-util-from-parse5@8.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "hastscript": "^9.0.0", "property-information": "^7.0.0", "vfile": "^6.0.0", "vfile-location": "^5.0.0", "web-namespaces": "^2.0.0" } }, "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg=="],
-
- "hast-util-parse-selector": ["hast-util-parse-selector@4.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A=="],
+ "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
- "hast-util-raw": ["hast-util-raw@9.1.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "@ungap/structured-clone": "^1.0.0", "hast-util-from-parse5": "^8.0.0", "hast-util-to-parse5": "^8.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "parse5": "^7.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw=="],
+ "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
"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=="],
@@ -561,14 +461,10 @@
"hast-util-to-jsx-runtime": ["hast-util-to-jsx-runtime@2.3.6", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.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", "vfile-message": "^4.0.0" } }, "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg=="],
- "hast-util-to-parse5": ["hast-util-to-parse5@8.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA=="],
-
"hast-util-to-string": ["hast-util-to-string@3.0.1", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A=="],
"hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="],
- "hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="],
-
"html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="],
"image-size": ["image-size@2.0.2", "", { "bin": { "image-size": "bin/image-size.js" } }, "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w=="],
@@ -581,8 +477,14 @@
"is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="],
+ "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
+
+ "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
+
"is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="],
+ "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
+
"is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="],
"jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="],
@@ -593,6 +495,10 @@
"json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
+ "jsonpointer": ["jsonpointer@5.0.1", "", {}, "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ=="],
+
+ "leven": ["leven@4.1.0", "", {}, "sha512-KZ9W9nWDT7rF7Dazg8xyLHGLrmpgq2nVNFUckhqdW3szVP6YhCpp/RAnpmVExA9JvrMynjwSLVrEj3AepHR6ew=="],
+
"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=="],
@@ -617,9 +523,13 @@
"lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="],
+ "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="],
+
"longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="],
- "lucide-react": ["lucide-react@1.8.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-WuvlsjngSk7TnTBJ1hsCy3ql9V9VOdcPkd3PKcSmM34vJD8KG6molxz7m7zbYFgICwsanQWmJ13JlYs4Zp7Arw=="],
+ "lru-cache": ["lru-cache@11.3.3", "", {}, "sha512-JvNw9Y81y33E+BEYPr0U7omo+U9AySnsMsEiXgwT6yqd31VQWTLNQqmT4ou5eqPFUrTfIDFta2wKhB1hyohtAQ=="],
+
+ "lucide-react": ["lucide-react@0.477.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-yCf7aYxerFZAbd8jHJxjwe1j7jEMPptjnaOqdYeirFnEy85cNR3/L+o0I875CYFYya+eEVzZSbNuRk8BZPDpVw=="],
"magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
@@ -659,6 +569,8 @@
"mdast-util-to-string": ["mdast-util-to-string@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0" } }, "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg=="],
+ "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="],
+
"micromark": ["micromark@4.0.2", "", { "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA=="],
"micromark-core-commonmark": ["micromark-core-commonmark@2.0.3", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-destination": "^2.0.0", "micromark-factory-label": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-factory-title": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-html-tag-name": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg=="],
@@ -729,11 +641,7 @@
"micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="],
- "motion": ["motion@12.38.0", "", { "dependencies": { "framer-motion": "^12.38.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-uYfXzeHlgThchzwz5Te47dlv5JOUC7OB4rjJ/7XTUgtBZD8CchMN8qEJ4ZVsUmTyYA44zjV0fBwsiktRuFnn+w=="],
-
- "motion-dom": ["motion-dom@12.38.0", "", { "dependencies": { "motion-utils": "^12.36.0" } }, "sha512-pdkHLD8QYRp8VfiNLb8xIBJis1byQ9gPT3Jnh2jqfFtAsWUA3dEepDlsWe/xMpO8McV+VdpKVcp+E+TGJEtOoA=="],
-
- "motion-utils": ["motion-utils@12.36.0", "", {}, "sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg=="],
+ "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
@@ -753,22 +661,12 @@
"openapi-sampler": ["openapi-sampler@1.7.2", "", { "dependencies": { "@types/json-schema": "^7.0.7", "fast-xml-parser": "^5.5.1", "json-pointer": "0.6.2" } }, "sha512-OKytvqB5XIaTgA9xtw8W8UTar+uymW2xPVpFN0NihMtuHPdPTGxBEhGnfFnJW5g/gOSIvkP+H0Xh3XhVI9/n7g=="],
- "oxc-parser": ["oxc-parser@0.124.0", "", { "dependencies": { "@oxc-project/types": "^0.124.0" }, "optionalDependencies": { "@oxc-parser/binding-android-arm-eabi": "0.124.0", "@oxc-parser/binding-android-arm64": "0.124.0", "@oxc-parser/binding-darwin-arm64": "0.124.0", "@oxc-parser/binding-darwin-x64": "0.124.0", "@oxc-parser/binding-freebsd-x64": "0.124.0", "@oxc-parser/binding-linux-arm-gnueabihf": "0.124.0", "@oxc-parser/binding-linux-arm-musleabihf": "0.124.0", "@oxc-parser/binding-linux-arm64-gnu": "0.124.0", "@oxc-parser/binding-linux-arm64-musl": "0.124.0", "@oxc-parser/binding-linux-ppc64-gnu": "0.124.0", "@oxc-parser/binding-linux-riscv64-gnu": "0.124.0", "@oxc-parser/binding-linux-riscv64-musl": "0.124.0", "@oxc-parser/binding-linux-s390x-gnu": "0.124.0", "@oxc-parser/binding-linux-x64-gnu": "0.124.0", "@oxc-parser/binding-linux-x64-musl": "0.124.0", "@oxc-parser/binding-openharmony-arm64": "0.124.0", "@oxc-parser/binding-wasm32-wasi": "0.124.0", "@oxc-parser/binding-win32-arm64-msvc": "0.124.0", "@oxc-parser/binding-win32-ia32-msvc": "0.124.0", "@oxc-parser/binding-win32-x64-msvc": "0.124.0" } }, "sha512-h07SFj/tp2U3cf3+LFX6MmOguQiM9ahwpGs0ZK5CGhgL8p4kk24etrJKsEzhXAvo7mfvoKTZooZ5MLKAPRmJ1g=="],
-
- "oxc-resolver": ["oxc-resolver@11.19.1", "", { "optionalDependencies": { "@oxc-resolver/binding-android-arm-eabi": "11.19.1", "@oxc-resolver/binding-android-arm64": "11.19.1", "@oxc-resolver/binding-darwin-arm64": "11.19.1", "@oxc-resolver/binding-darwin-x64": "11.19.1", "@oxc-resolver/binding-freebsd-x64": "11.19.1", "@oxc-resolver/binding-linux-arm-gnueabihf": "11.19.1", "@oxc-resolver/binding-linux-arm-musleabihf": "11.19.1", "@oxc-resolver/binding-linux-arm64-gnu": "11.19.1", "@oxc-resolver/binding-linux-arm64-musl": "11.19.1", "@oxc-resolver/binding-linux-ppc64-gnu": "11.19.1", "@oxc-resolver/binding-linux-riscv64-gnu": "11.19.1", "@oxc-resolver/binding-linux-riscv64-musl": "11.19.1", "@oxc-resolver/binding-linux-s390x-gnu": "11.19.1", "@oxc-resolver/binding-linux-x64-gnu": "11.19.1", "@oxc-resolver/binding-linux-x64-musl": "11.19.1", "@oxc-resolver/binding-openharmony-arm64": "11.19.1", "@oxc-resolver/binding-wasm32-wasi": "11.19.1", "@oxc-resolver/binding-win32-arm64-msvc": "11.19.1", "@oxc-resolver/binding-win32-ia32-msvc": "11.19.1", "@oxc-resolver/binding-win32-x64-msvc": "11.19.1" } }, "sha512-qE/CIg/spwrTBFt5aKmwe3ifeDdLfA2NESN30E42X/lII5ClF8V7Wt6WIJhcGZjp0/Q+nQ+9vgxGk//xZNX2hg=="],
-
- "package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="],
-
"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=="],
- "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="],
-
"path-expression-matcher": ["path-expression-matcher@1.5.0", "", {}, "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ=="],
"path-to-regexp": ["path-to-regexp@8.4.2", "", {}, "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA=="],
- "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="],
-
"picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
"picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="],
@@ -777,8 +675,12 @@
"postcss-selector-parser": ["postcss-selector-parser@7.1.1", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg=="],
+ "prettier": ["prettier@3.8.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-8c3mgTe0ASwWAJK+78dpviD+A8EqhndQPUBpNUIPt6+xWlIigCwfN01lWr9MAede4uqXGTEKeQWTvzb3vjia0Q=="],
+
"property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="],
+ "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
+
"react": ["react@19.2.5", "", {}, "sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA=="],
"react-dom": ["react-dom@19.2.5", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.5" } }, "sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag=="],
@@ -793,7 +695,7 @@
"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=="],
+ "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="],
"recma-build-jsx": ["recma-build-jsx@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-build-jsx": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew=="],
@@ -809,8 +711,6 @@
"regex-utilities": ["regex-utilities@2.3.0", "", {}, "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng=="],
- "rehype-raw": ["rehype-raw@7.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-raw": "^9.0.0", "vfile": "^6.0.0" } }, "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww=="],
-
"rehype-recma": ["rehype-recma@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "hast-util-to-estree": "^3.0.0" } }, "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw=="],
"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=="],
@@ -827,6 +727,10 @@
"require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="],
+ "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="],
+
+ "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
+
"sax": ["sax@1.6.0", "", {}, "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA=="],
"scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="],
@@ -837,7 +741,7 @@
"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=="],
- "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=="],
+ "shiki": ["shiki@3.23.0", "", { "dependencies": { "@shikijs/core": "3.23.0", "@shikijs/engine-javascript": "3.23.0", "@shikijs/engine-oniguruma": "3.23.0", "@shikijs/langs": "3.23.0", "@shikijs/themes": "3.23.0", "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA=="],
"source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="],
@@ -865,6 +769,8 @@
"tinyglobby": ["tinyglobby@0.2.16", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg=="],
+ "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
+
"trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="],
"trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="],
@@ -881,8 +787,6 @@
"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=="],
- "unist-util-remove-position": ["unist-util-remove-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q=="],
-
"unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="],
"unist-util-visit": ["unist-util-visit@5.1.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg=="],
@@ -897,12 +801,8 @@
"vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="],
- "vfile-location": ["vfile-location@5.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg=="],
-
"vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="],
- "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="],
-
"xml-js": ["xml-js@1.6.11", "", { "dependencies": { "sax": "^1.2.4" }, "bin": { "xml-js": "./bin/cli.js" } }, "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g=="],
"yaml": ["yaml@2.8.3", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg=="],
@@ -933,6 +833,12 @@
"@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
+ "fumadocs-openapi/fumadocs-core": ["fumadocs-core@15.0.15", "", { "dependencies": { "@formatjs/intl-localematcher": "^0.6.0", "@orama/orama": "^3.1.1", "@shikijs/rehype": "^3.1.0", "@shikijs/transformers": "^3.1.0", "github-slugger": "^2.0.0", "hast-util-to-estree": "^3.1.2", "hast-util-to-jsx-runtime": "^2.3.5", "image-size": "^2.0.0", "negotiator": "^1.0.0", "react-remove-scroll": "^2.6.3", "remark": "^15.0.0", "remark-gfm": "^4.0.1", "scroll-into-view-if-needed": "^3.1.0", "shiki": "^3.1.0", "unist-util-visit": "^5.0.0" }, "peerDependencies": { "@oramacloud/client": "1.x.x || 2.x.x", "algoliasearch": "4.24.0", "next": "14.x.x || 15.x.x", "react": "18.x.x || 19.x.x", "react-dom": "18.x.x || 19.x.x" }, "optionalPeers": ["@oramacloud/client", "algoliasearch", "next", "react", "react-dom"] }, "sha512-roWAf6voyhpLpbdWalCBW4x4h2LVEJZ/J1sGG+3cR27QLn/5Vv/AEjPB0mFRcoH/fkEVU1wilxvgfDOpRXWDcA=="],
+
+ "fumadocs-openapi/fumadocs-ui": ["fumadocs-ui@15.0.15", "", { "dependencies": { "@radix-ui/react-accordion": "^1.2.3", "@radix-ui/react-collapsible": "^1.1.3", "@radix-ui/react-dialog": "^1.1.6", "@radix-ui/react-direction": "^1.1.0", "@radix-ui/react-navigation-menu": "^1.2.5", "@radix-ui/react-popover": "^1.1.6", "@radix-ui/react-scroll-area": "^1.2.3", "@radix-ui/react-slot": "^1.1.2", "@radix-ui/react-tabs": "^1.1.3", "class-variance-authority": "^0.7.1", "lodash.merge": "^4.6.2", "lucide-react": "^0.477.0", "next-themes": "^0.4.4", "postcss-selector-parser": "^7.1.0", "react-medium-image-zoom": "^5.2.14", "tailwind-merge": "^3.0.2" }, "peerDependencies": { "fumadocs-core": "15.0.15", "next": "14.x.x || 15.x.x", "react": "18.x.x || 19.x.x", "react-dom": "18.x.x || 19.x.x", "tailwindcss": "^3.4.14 || ^4.0.0" }, "optionalPeers": ["tailwindcss"] }, "sha512-D9x+GJlTgFe+te6h22Xp3OHDYGzEp/iWm86HiQkJQLhT5jwZ5/2htF/ehzBwOm+bizGvH6WIe3ZYfJ3dfer0/A=="],
+
+ "micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="],
+
"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=="],
diff --git a/docs/components/api-page.client.tsx b/docs/components/api-page.client.tsx
index de03e68..5df1b8d 100644
--- a/docs/components/api-page.client.tsx
+++ b/docs/components/api-page.client.tsx
@@ -1,4 +1,2 @@
'use client';
-import { defineClientConfig } from 'fumadocs-openapi/ui/client';
-
-export default defineClientConfig({});
+export { Samples, Sample } from 'fumadocs-openapi/ui/client';
diff --git a/docs/components/api-page.tsx b/docs/components/api-page.tsx
index e52c79f..d3d7cd4 100644
--- a/docs/components/api-page.tsx
+++ b/docs/components/api-page.tsx
@@ -1,7 +1,3 @@
import { openapi } from '@/lib/openapi';
-import { createAPIPage } from 'fumadocs-openapi/ui';
-import client from './api-page.client';
-export const APIPage = createAPIPage(openapi, {
- client,
-});
+export const { APIPage } = openapi;
diff --git a/docs/content/docs/api/advanceTestClock.mdx b/docs/content/docs/api/advance-test-clock.mdx
similarity index 55%
rename from docs/content/docs/api/advanceTestClock.mdx
rename to docs/content/docs/api/advance-test-clock.mdx
index 3836882..62f008c 100644
--- a/docs/content/docs/api/advanceTestClock.mdx
+++ b/docs/content/docs/api/advance-test-clock.mdx
@@ -1,8 +1,13 @@
---
title: Advance a test clock
+description: >-
+ Advances a test clock's frozen time forward. This triggers billing cycle
+ processing for any linked subscriptions, including rolling periods, creating
+ invoices, and processing payments.
full: true
_openapi:
method: POST
+ route: /v1/test_helpers/test_clocks/{id}/advance
toc: []
structuredData:
headings: []
@@ -13,8 +18,9 @@ _openapi:
periods, creating invoices, and processing payments.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Advances a test clock's frozen time forward. This triggers billing cycle processing for any linked subscriptions, including rolling periods, creating invoices, and processing payments.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/attachPaymentMethod.mdx b/docs/content/docs/api/attach-payment-method.mdx
similarity index 50%
rename from docs/content/docs/api/attachPaymentMethod.mdx
rename to docs/content/docs/api/attach-payment-method.mdx
index 13dde91..b4375df 100644
--- a/docs/content/docs/api/attachPaymentMethod.mdx
+++ b/docs/content/docs/api/attach-payment-method.mdx
@@ -1,8 +1,10 @@
---
title: Attach a payment method to a customer
+description: Attaches a payment method object to a customer.
full: true
_openapi:
method: POST
+ route: /v1/payment_methods/{id}/attach
toc: []
structuredData:
headings: []
@@ -10,8 +12,9 @@ _openapi:
- content: Attaches a payment method object to a customer.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Attaches a payment method object to a customer.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/cancelPaymentIntent.mdx b/docs/content/docs/api/cancel-payment-intent.mdx
similarity index 52%
rename from docs/content/docs/api/cancelPaymentIntent.mdx
rename to docs/content/docs/api/cancel-payment-intent.mdx
index 6d2970a..18a09ad 100644
--- a/docs/content/docs/api/cancelPaymentIntent.mdx
+++ b/docs/content/docs/api/cancel-payment-intent.mdx
@@ -1,8 +1,12 @@
---
title: Cancel a payment intent
+description: >-
+ Cancels a PaymentIntent. You cannot cancel a PaymentIntent with a status of
+ `succeeded`.
full: true
_openapi:
method: POST
+ route: /v1/payment_intents/{id}/cancel
toc: []
structuredData:
headings: []
@@ -12,8 +16,9 @@ _openapi:
status of `succeeded`.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Cancels a PaymentIntent. You cannot cancel a PaymentIntent with a status of `succeeded`.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/cancelSetupIntent.mdx b/docs/content/docs/api/cancel-setup-intent.mdx
similarity index 52%
rename from docs/content/docs/api/cancelSetupIntent.mdx
rename to docs/content/docs/api/cancel-setup-intent.mdx
index 77a6a4b..20e4469 100644
--- a/docs/content/docs/api/cancelSetupIntent.mdx
+++ b/docs/content/docs/api/cancel-setup-intent.mdx
@@ -1,8 +1,12 @@
---
title: Cancel a setup intent
+description: >-
+ Cancels a SetupIntent. You cannot cancel a SetupIntent that has already
+ succeeded.
full: true
_openapi:
method: POST
+ route: /v1/setup_intents/{id}/cancel
toc: []
structuredData:
headings: []
@@ -12,8 +16,9 @@ _openapi:
already succeeded.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Cancels a SetupIntent. You cannot cancel a SetupIntent that has already succeeded.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/cancelSubscription.mdx b/docs/content/docs/api/cancel-subscription.mdx
similarity index 54%
rename from docs/content/docs/api/cancelSubscription.mdx
rename to docs/content/docs/api/cancel-subscription.mdx
index 61b2128..73fb373 100644
--- a/docs/content/docs/api/cancelSubscription.mdx
+++ b/docs/content/docs/api/cancel-subscription.mdx
@@ -1,8 +1,12 @@
---
title: Cancel a subscription
+description: >-
+ Cancels a customer's subscription immediately. The subscription status
+ transitions to `canceled`.
full: true
_openapi:
method: DELETE
+ route: /v1/subscriptions/{id}
toc: []
structuredData:
headings: []
@@ -12,8 +16,9 @@ _openapi:
transitions to `canceled`.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Cancels a customer's subscription immediately. The subscription status transitions to `canceled`.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/capturePaymentIntent.mdx b/docs/content/docs/api/capture-payment-intent.mdx
similarity index 53%
rename from docs/content/docs/api/capturePaymentIntent.mdx
rename to docs/content/docs/api/capture-payment-intent.mdx
index 9a4ee7a..75d5ed4 100644
--- a/docs/content/docs/api/capturePaymentIntent.mdx
+++ b/docs/content/docs/api/capture-payment-intent.mdx
@@ -1,8 +1,12 @@
---
title: Capture a payment intent
+description: >-
+ Captures a PaymentIntent that has a status of `requires_capture`. This is used
+ when `capture_method=manual`.
full: true
_openapi:
method: POST
+ route: /v1/payment_intents/{id}/capture
toc: []
structuredData:
headings: []
@@ -12,8 +16,9 @@ _openapi:
is used when `capture_method=manual`.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Captures a PaymentIntent that has a status of `requires_capture`. This is used when `capture_method=manual`.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/confirmPaymentIntent.mdx b/docs/content/docs/api/confirm-payment-intent.mdx
similarity index 57%
rename from docs/content/docs/api/confirmPaymentIntent.mdx
rename to docs/content/docs/api/confirm-payment-intent.mdx
index 56cf0da..5b420b4 100644
--- a/docs/content/docs/api/confirmPaymentIntent.mdx
+++ b/docs/content/docs/api/confirm-payment-intent.mdx
@@ -1,8 +1,13 @@
---
title: Confirm a payment intent
+description: >-
+ Confirms a PaymentIntent, transitioning it to `succeeded`, `requires_capture`,
+ or `requires_action` (for 3DS). Payment methods with last4 `3220`
+ (`tok_threeDSecureRequired`) trigger 3DS simulation.
full: true
_openapi:
method: POST
+ route: /v1/payment_intents/{id}/confirm
toc: []
structuredData:
headings: []
@@ -13,8 +18,9 @@ _openapi:
with last4 `3220` (`tok_threeDSecureRequired`) trigger 3DS simulation.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Confirms a PaymentIntent, transitioning it to `succeeded`, `requires_capture`, or `requires_action` (for 3DS). Payment methods with last4 `3220` (`tok_threeDSecureRequired`) trigger 3DS simulation.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/confirmSetupIntent.mdx b/docs/content/docs/api/confirm-setup-intent.mdx
similarity index 55%
rename from docs/content/docs/api/confirmSetupIntent.mdx
rename to docs/content/docs/api/confirm-setup-intent.mdx
index d030482..339ef5c 100644
--- a/docs/content/docs/api/confirmSetupIntent.mdx
+++ b/docs/content/docs/api/confirm-setup-intent.mdx
@@ -1,8 +1,12 @@
---
title: Confirm a setup intent
+description: >-
+ Confirms a SetupIntent, transitioning it to `succeeded`. If a `payment_method`
+ is provided, it attaches the payment method to the customer.
full: true
_openapi:
method: POST
+ route: /v1/setup_intents/{id}/confirm
toc: []
structuredData:
headings: []
@@ -13,8 +17,9 @@ _openapi:
customer.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Confirms a SetupIntent, transitioning it to `succeeded`. If a `payment_method` is provided, it attaches the payment method to the customer.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/createCustomer.mdx b/docs/content/docs/api/create-customer.mdx
similarity index 50%
rename from docs/content/docs/api/createCustomer.mdx
rename to docs/content/docs/api/create-customer.mdx
index ce01f1e..c347ce6 100644
--- a/docs/content/docs/api/createCustomer.mdx
+++ b/docs/content/docs/api/create-customer.mdx
@@ -1,8 +1,10 @@
---
title: Create a customer
+description: Creates a new customer object.
full: true
_openapi:
method: POST
+ route: /v1/customers
toc: []
structuredData:
headings: []
@@ -10,8 +12,9 @@ _openapi:
- content: Creates a new customer object.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Creates a new customer object.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/createInvoice.mdx b/docs/content/docs/api/create-invoice.mdx
similarity index 56%
rename from docs/content/docs/api/createInvoice.mdx
rename to docs/content/docs/api/create-invoice.mdx
index 74cc96a..de64f00 100644
--- a/docs/content/docs/api/createInvoice.mdx
+++ b/docs/content/docs/api/create-invoice.mdx
@@ -1,8 +1,12 @@
---
title: Create an invoice
+description: >-
+ Creates a new invoice for a customer. Invoices are created as drafts and must
+ be finalized before they can be paid.
full: true
_openapi:
method: POST
+ route: /v1/invoices
toc: []
structuredData:
headings: []
@@ -12,8 +16,9 @@ _openapi:
and must be finalized before they can be paid.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Creates a new invoice for a customer. Invoices are created as drafts and must be finalized before they can be paid.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/createPaymentIntent.mdx b/docs/content/docs/api/create-payment-intent.mdx
similarity index 55%
rename from docs/content/docs/api/createPaymentIntent.mdx
rename to docs/content/docs/api/create-payment-intent.mdx
index 41d9201..b023ad8 100644
--- a/docs/content/docs/api/createPaymentIntent.mdx
+++ b/docs/content/docs/api/create-payment-intent.mdx
@@ -1,8 +1,12 @@
---
title: Create a payment intent
+description: >-
+ Creates a PaymentIntent object. Optionally set `confirm=true` with a
+ `payment_method` to create and confirm in one step.
full: true
_openapi:
method: POST
+ route: /v1/payment_intents
toc: []
structuredData:
headings: []
@@ -12,8 +16,9 @@ _openapi:
`payment_method` to create and confirm in one step.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Creates a PaymentIntent object. Optionally set `confirm=true` with a `payment_method` to create and confirm in one step.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/createPaymentMethod.mdx b/docs/content/docs/api/create-payment-method.mdx
similarity index 59%
rename from docs/content/docs/api/createPaymentMethod.mdx
rename to docs/content/docs/api/create-payment-method.mdx
index dc36ac3..2962751 100644
--- a/docs/content/docs/api/createPaymentMethod.mdx
+++ b/docs/content/docs/api/create-payment-method.mdx
@@ -1,8 +1,13 @@
---
title: Create a payment method
+description: >-
+ Creates a payment method object. Strimulator supports `card` type with magic
+ test tokens like `tok_visa`, `tok_mastercard`, `tok_amex`, `tok_visa_debit`,
+ `tok_threeDSecureRequired`, and `tok_threeDSecureOptional`.
full: true
_openapi:
method: POST
+ route: /v1/payment_methods
toc: []
structuredData:
headings: []
@@ -14,8 +19,9 @@ _openapi:
`tok_threeDSecureOptional`.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Creates a payment method object. Strimulator supports `card` type with magic test tokens like `tok_visa`, `tok_mastercard`, `tok_amex`, `tok_visa_debit`, `tok_threeDSecureRequired`, and `tok_threeDSecureOptional`.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/createPrice.mdx b/docs/content/docs/api/create-price.mdx
similarity index 55%
rename from docs/content/docs/api/createPrice.mdx
rename to docs/content/docs/api/create-price.mdx
index dcf589b..6beb6b1 100644
--- a/docs/content/docs/api/createPrice.mdx
+++ b/docs/content/docs/api/create-price.mdx
@@ -1,8 +1,12 @@
---
title: Create a price
+description: >-
+ Creates a new price for an existing product. The price can be one-time or
+ recurring.
full: true
_openapi:
method: POST
+ route: /v1/prices
toc: []
structuredData:
headings: []
@@ -12,8 +16,9 @@ _openapi:
or recurring.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Creates a new price for an existing product. The price can be one-time or recurring.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/createProduct.mdx b/docs/content/docs/api/create-product.mdx
similarity index 50%
rename from docs/content/docs/api/createProduct.mdx
rename to docs/content/docs/api/create-product.mdx
index 1d48cbe..96defc7 100644
--- a/docs/content/docs/api/createProduct.mdx
+++ b/docs/content/docs/api/create-product.mdx
@@ -1,8 +1,10 @@
---
title: Create a product
+description: Creates a new product object.
full: true
_openapi:
method: POST
+ route: /v1/products
toc: []
structuredData:
headings: []
@@ -10,8 +12,9 @@ _openapi:
- content: Creates a new product object.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Creates a new product object.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/createRefund.mdx b/docs/content/docs/api/create-refund.mdx
similarity index 55%
rename from docs/content/docs/api/createRefund.mdx
rename to docs/content/docs/api/create-refund.mdx
index 0b6ffe2..79bd34b 100644
--- a/docs/content/docs/api/createRefund.mdx
+++ b/docs/content/docs/api/create-refund.mdx
@@ -1,8 +1,12 @@
---
title: Create a refund
+description: >-
+ Creates a refund for a charge or payment intent. You must provide either
+ `charge` or `payment_intent`.
full: true
_openapi:
method: POST
+ route: /v1/refunds
toc: []
structuredData:
headings: []
@@ -12,8 +16,9 @@ _openapi:
either `charge` or `payment_intent`.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Creates a refund for a charge or payment intent. You must provide either `charge` or `payment_intent`.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/createSetupIntent.mdx b/docs/content/docs/api/create-setup-intent.mdx
similarity index 54%
rename from docs/content/docs/api/createSetupIntent.mdx
rename to docs/content/docs/api/create-setup-intent.mdx
index 72f2c1e..fde21f2 100644
--- a/docs/content/docs/api/createSetupIntent.mdx
+++ b/docs/content/docs/api/create-setup-intent.mdx
@@ -1,8 +1,12 @@
---
title: Create a setup intent
+description: >-
+ Creates a SetupIntent object for setting up a customer's payment method for
+ future payments.
full: true
_openapi:
method: POST
+ route: /v1/setup_intents
toc: []
structuredData:
headings: []
@@ -12,8 +16,9 @@ _openapi:
method for future payments.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Creates a SetupIntent object for setting up a customer's payment method for future payments.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/createSubscription.mdx b/docs/content/docs/api/create-subscription.mdx
similarity index 56%
rename from docs/content/docs/api/createSubscription.mdx
rename to docs/content/docs/api/create-subscription.mdx
index f8cac79..6d62e1b 100644
--- a/docs/content/docs/api/createSubscription.mdx
+++ b/docs/content/docs/api/create-subscription.mdx
@@ -1,8 +1,12 @@
---
title: Create a subscription
+description: >-
+ Creates a new subscription on an existing customer. Each subscription must
+ have at least one item with a recurring price.
full: true
_openapi:
method: POST
+ route: /v1/subscriptions
toc: []
structuredData:
headings: []
@@ -12,8 +16,9 @@ _openapi:
must have at least one item with a recurring price.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Creates a new subscription on an existing customer. Each subscription must have at least one item with a recurring price.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/createTestClock.mdx b/docs/content/docs/api/create-test-clock.mdx
similarity index 56%
rename from docs/content/docs/api/createTestClock.mdx
rename to docs/content/docs/api/create-test-clock.mdx
index a73678a..8dfe842 100644
--- a/docs/content/docs/api/createTestClock.mdx
+++ b/docs/content/docs/api/create-test-clock.mdx
@@ -1,8 +1,12 @@
---
title: Create a test clock
+description: >-
+ Creates a new test clock with the specified frozen time. Use test clocks to
+ simulate the passage of time for subscription billing and trial expirations.
full: true
_openapi:
method: POST
+ route: /v1/test_helpers/test_clocks
toc: []
structuredData:
headings: []
@@ -13,8 +17,9 @@ _openapi:
trial expirations.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Creates a new test clock with the specified frozen time. Use test clocks to simulate the passage of time for subscription billing and trial expirations.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/createWebhookEndpoint.mdx b/docs/content/docs/api/create-webhook-endpoint.mdx
similarity index 57%
rename from docs/content/docs/api/createWebhookEndpoint.mdx
rename to docs/content/docs/api/create-webhook-endpoint.mdx
index 483b388..ec50a52 100644
--- a/docs/content/docs/api/createWebhookEndpoint.mdx
+++ b/docs/content/docs/api/create-webhook-endpoint.mdx
@@ -1,8 +1,12 @@
---
title: Create a webhook endpoint
+description: >-
+ Creates a webhook endpoint that listens to specific events. Strimulator will
+ POST event payloads to the configured URL with HMAC-SHA256 signatures.
full: true
_openapi:
method: POST
+ route: /v1/webhook_endpoints
toc: []
structuredData:
headings: []
@@ -13,8 +17,9 @@ _openapi:
HMAC-SHA256 signatures.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Creates a webhook endpoint that listens to specific events. Strimulator will POST event payloads to the configured URL with HMAC-SHA256 signatures.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/deleteCustomer.mdx b/docs/content/docs/api/delete-customer.mdx
similarity index 51%
rename from docs/content/docs/api/deleteCustomer.mdx
rename to docs/content/docs/api/delete-customer.mdx
index e60a12b..5bcfc73 100644
--- a/docs/content/docs/api/deleteCustomer.mdx
+++ b/docs/content/docs/api/delete-customer.mdx
@@ -1,8 +1,10 @@
---
title: Delete a customer
+description: Permanently deletes a customer. It cannot be undone.
full: true
_openapi:
method: DELETE
+ route: /v1/customers/{id}
toc: []
structuredData:
headings: []
@@ -10,8 +12,9 @@ _openapi:
- content: Permanently deletes a customer. It cannot be undone.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Permanently deletes a customer. It cannot be undone.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/delete-product.mdx b/docs/content/docs/api/delete-product.mdx
new file mode 100644
index 0000000..00ff698
--- /dev/null
+++ b/docs/content/docs/api/delete-product.mdx
@@ -0,0 +1,20 @@
+---
+title: Delete a product
+description: Permanently deletes a product.
+full: true
+_openapi:
+ method: DELETE
+ route: /v1/products/{id}
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: Permanently deletes a product.
+---
+
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Permanently deletes a product.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/delete-test-clock.mdx b/docs/content/docs/api/delete-test-clock.mdx
new file mode 100644
index 0000000..90f9741
--- /dev/null
+++ b/docs/content/docs/api/delete-test-clock.mdx
@@ -0,0 +1,20 @@
+---
+title: Delete a test clock
+description: Deletes a test clock and all associated resources.
+full: true
+_openapi:
+ method: DELETE
+ route: /v1/test_helpers/test_clocks/{id}
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: Deletes a test clock and all associated resources.
+---
+
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Deletes a test clock and all associated resources.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/deleteWebhookEndpoint.mdx b/docs/content/docs/api/delete-webhook-endpoint.mdx
similarity index 53%
rename from docs/content/docs/api/deleteWebhookEndpoint.mdx
rename to docs/content/docs/api/delete-webhook-endpoint.mdx
index d449216..a05a84d 100644
--- a/docs/content/docs/api/deleteWebhookEndpoint.mdx
+++ b/docs/content/docs/api/delete-webhook-endpoint.mdx
@@ -1,8 +1,10 @@
---
title: Delete a webhook endpoint
+description: Deletes a webhook endpoint. Strimulator will stop sending events to this URL.
full: true
_openapi:
method: DELETE
+ route: /v1/webhook_endpoints/{id}
toc: []
structuredData:
headings: []
@@ -12,8 +14,9 @@ _openapi:
this URL.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Deletes a webhook endpoint. Strimulator will stop sending events to this URL.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/deleteProduct.mdx b/docs/content/docs/api/deleteProduct.mdx
deleted file mode 100644
index 2de6a31..0000000
--- a/docs/content/docs/api/deleteProduct.mdx
+++ /dev/null
@@ -1,17 +0,0 @@
----
-title: Delete a product
-full: true
-_openapi:
- method: DELETE
- toc: []
- structuredData:
- headings: []
- contents:
- - content: Permanently deletes a product.
----
-
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
-
-Permanently deletes a product.
-
-
\ No newline at end of file
diff --git a/docs/content/docs/api/deleteTestClock.mdx b/docs/content/docs/api/deleteTestClock.mdx
deleted file mode 100644
index 62a1d70..0000000
--- a/docs/content/docs/api/deleteTestClock.mdx
+++ /dev/null
@@ -1,17 +0,0 @@
----
-title: Delete a test clock
-full: true
-_openapi:
- method: DELETE
- toc: []
- structuredData:
- headings: []
- contents:
- - content: Deletes a test clock and all associated resources.
----
-
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
-
-Deletes a test clock and all associated resources.
-
-
\ No newline at end of file
diff --git a/docs/content/docs/api/detachPaymentMethod.mdx b/docs/content/docs/api/detach-payment-method.mdx
similarity index 56%
rename from docs/content/docs/api/detachPaymentMethod.mdx
rename to docs/content/docs/api/detach-payment-method.mdx
index f85d97e..e635983 100644
--- a/docs/content/docs/api/detachPaymentMethod.mdx
+++ b/docs/content/docs/api/detach-payment-method.mdx
@@ -1,8 +1,12 @@
---
title: Detach a payment method from its customer
+description: >-
+ Detaches a payment method object from the customer it is attached to. The
+ payment method still exists but can no longer be used for payments.
full: true
_openapi:
method: POST
+ route: /v1/payment_methods/{id}/detach
toc: []
structuredData:
headings: []
@@ -13,8 +17,9 @@ _openapi:
payments.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Detaches a payment method object from the customer it is attached to. The payment method still exists but can no longer be used for payments.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/finalizeInvoice.mdx b/docs/content/docs/api/finalize-invoice.mdx
similarity index 55%
rename from docs/content/docs/api/finalizeInvoice.mdx
rename to docs/content/docs/api/finalize-invoice.mdx
index a7853a4..3c1750e 100644
--- a/docs/content/docs/api/finalizeInvoice.mdx
+++ b/docs/content/docs/api/finalize-invoice.mdx
@@ -1,8 +1,12 @@
---
title: Finalize an invoice
+description: >-
+ Finalizes a draft invoice, transitioning it to `open` status and assigning an
+ invoice number. Once finalized, the invoice can be paid.
full: true
_openapi:
method: POST
+ route: /v1/invoices/{id}/finalize
toc: []
structuredData:
headings: []
@@ -12,8 +16,9 @@ _openapi:
assigning an invoice number. Once finalized, the invoice can be paid.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Finalizes a draft invoice, transitioning it to `open` status and assigning an invoice number. Once finalized, the invoice can be paid.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/listCharges.mdx b/docs/content/docs/api/list-charges.mdx
similarity index 55%
rename from docs/content/docs/api/listCharges.mdx
rename to docs/content/docs/api/list-charges.mdx
index a2fbd60..b52a3f7 100644
--- a/docs/content/docs/api/listCharges.mdx
+++ b/docs/content/docs/api/list-charges.mdx
@@ -1,8 +1,10 @@
---
title: List all charges
+description: Returns a paginated list of charges. Optionally filter by payment intent.
full: true
_openapi:
method: GET
+ route: /v1/charges
toc: []
structuredData:
headings: []
@@ -12,8 +14,9 @@ _openapi:
intent.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Returns a paginated list of charges. Optionally filter by payment intent.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/listCustomers.mdx b/docs/content/docs/api/list-customers.mdx
similarity index 54%
rename from docs/content/docs/api/listCustomers.mdx
rename to docs/content/docs/api/list-customers.mdx
index 5790e02..5ec9c2c 100644
--- a/docs/content/docs/api/listCustomers.mdx
+++ b/docs/content/docs/api/list-customers.mdx
@@ -1,8 +1,12 @@
---
title: List all customers
+description: >-
+ Returns a paginated list of customers, sorted by creation date (most recent
+ first).
full: true
_openapi:
method: GET
+ route: /v1/customers
toc: []
structuredData:
headings: []
@@ -12,8 +16,9 @@ _openapi:
recent first).
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Returns a paginated list of customers, sorted by creation date (most recent first).
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/listEvents.mdx b/docs/content/docs/api/list-events.mdx
similarity index 56%
rename from docs/content/docs/api/listEvents.mdx
rename to docs/content/docs/api/list-events.mdx
index 77273d7..2194e8d 100644
--- a/docs/content/docs/api/listEvents.mdx
+++ b/docs/content/docs/api/list-events.mdx
@@ -1,8 +1,12 @@
---
title: List all events
+description: >-
+ Returns a paginated list of events, sorted by creation date (most recent
+ first). Optionally filter by event type.
full: true
_openapi:
method: GET
+ route: /v1/events
toc: []
structuredData:
headings: []
@@ -12,8 +16,9 @@ _openapi:
recent first). Optionally filter by event type.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Returns a paginated list of events, sorted by creation date (most recent first). Optionally filter by event type.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/listInvoices.mdx b/docs/content/docs/api/list-invoices.mdx
similarity index 54%
rename from docs/content/docs/api/listInvoices.mdx
rename to docs/content/docs/api/list-invoices.mdx
index 69c3d8a..774fed7 100644
--- a/docs/content/docs/api/listInvoices.mdx
+++ b/docs/content/docs/api/list-invoices.mdx
@@ -1,8 +1,12 @@
---
title: List all invoices
+description: >-
+ Returns a paginated list of invoices. Optionally filter by customer or
+ subscription.
full: true
_openapi:
method: GET
+ route: /v1/invoices
toc: []
structuredData:
headings: []
@@ -12,8 +16,9 @@ _openapi:
subscription.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Returns a paginated list of invoices. Optionally filter by customer or subscription.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/listPaymentIntents.mdx b/docs/content/docs/api/list-payment-intents.mdx
similarity index 54%
rename from docs/content/docs/api/listPaymentIntents.mdx
rename to docs/content/docs/api/list-payment-intents.mdx
index 535270f..b63ebb3 100644
--- a/docs/content/docs/api/listPaymentIntents.mdx
+++ b/docs/content/docs/api/list-payment-intents.mdx
@@ -1,8 +1,10 @@
---
title: List payment intents
+description: Returns a paginated list of PaymentIntents. Optionally filter by customer.
full: true
_openapi:
method: GET
+ route: /v1/payment_intents
toc: []
structuredData:
headings: []
@@ -12,8 +14,9 @@ _openapi:
customer.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Returns a paginated list of PaymentIntents. Optionally filter by customer.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/listPaymentMethods.mdx b/docs/content/docs/api/list-payment-methods.mdx
similarity index 51%
rename from docs/content/docs/api/listPaymentMethods.mdx
rename to docs/content/docs/api/list-payment-methods.mdx
index 627359c..0e8df93 100644
--- a/docs/content/docs/api/listPaymentMethods.mdx
+++ b/docs/content/docs/api/list-payment-methods.mdx
@@ -1,8 +1,10 @@
---
title: List payment methods
+description: Returns a list of payment methods for a given customer.
full: true
_openapi:
method: GET
+ route: /v1/payment_methods
toc: []
structuredData:
headings: []
@@ -10,8 +12,9 @@ _openapi:
- content: Returns a list of payment methods for a given customer.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Returns a list of payment methods for a given customer.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/listPrices.mdx b/docs/content/docs/api/list-prices.mdx
similarity index 53%
rename from docs/content/docs/api/listPrices.mdx
rename to docs/content/docs/api/list-prices.mdx
index 52c07d6..ecdb42b 100644
--- a/docs/content/docs/api/listPrices.mdx
+++ b/docs/content/docs/api/list-prices.mdx
@@ -1,8 +1,10 @@
---
title: List all prices
+description: Returns a paginated list of prices. Optionally filter by product.
full: true
_openapi:
method: GET
+ route: /v1/prices
toc: []
structuredData:
headings: []
@@ -10,8 +12,9 @@ _openapi:
- content: Returns a paginated list of prices. Optionally filter by product.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Returns a paginated list of prices. Optionally filter by product.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/listProducts.mdx b/docs/content/docs/api/list-products.mdx
similarity index 50%
rename from docs/content/docs/api/listProducts.mdx
rename to docs/content/docs/api/list-products.mdx
index 375d090..66cc044 100644
--- a/docs/content/docs/api/listProducts.mdx
+++ b/docs/content/docs/api/list-products.mdx
@@ -1,8 +1,10 @@
---
title: List all products
+description: Returns a paginated list of products.
full: true
_openapi:
method: GET
+ route: /v1/products
toc: []
structuredData:
headings: []
@@ -10,8 +12,9 @@ _openapi:
- content: Returns a paginated list of products.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Returns a paginated list of products.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/listRefunds.mdx b/docs/content/docs/api/list-refunds.mdx
similarity index 55%
rename from docs/content/docs/api/listRefunds.mdx
rename to docs/content/docs/api/list-refunds.mdx
index 103c93e..b88199d 100644
--- a/docs/content/docs/api/listRefunds.mdx
+++ b/docs/content/docs/api/list-refunds.mdx
@@ -1,8 +1,12 @@
---
title: List all refunds
+description: >-
+ Returns a paginated list of refunds. Optionally filter by charge or payment
+ intent.
full: true
_openapi:
method: GET
+ route: /v1/refunds
toc: []
structuredData:
headings: []
@@ -12,8 +16,9 @@ _openapi:
payment intent.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Returns a paginated list of refunds. Optionally filter by charge or payment intent.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/listSetupIntents.mdx b/docs/content/docs/api/list-setup-intents.mdx
similarity index 50%
rename from docs/content/docs/api/listSetupIntents.mdx
rename to docs/content/docs/api/list-setup-intents.mdx
index 2b95a17..41cf2c6 100644
--- a/docs/content/docs/api/listSetupIntents.mdx
+++ b/docs/content/docs/api/list-setup-intents.mdx
@@ -1,8 +1,10 @@
---
title: List setup intents
+description: Returns a paginated list of SetupIntents.
full: true
_openapi:
method: GET
+ route: /v1/setup_intents
toc: []
structuredData:
headings: []
@@ -10,8 +12,9 @@ _openapi:
- content: Returns a paginated list of SetupIntents.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Returns a paginated list of SetupIntents.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/listSubscriptions.mdx b/docs/content/docs/api/list-subscriptions.mdx
similarity index 54%
rename from docs/content/docs/api/listSubscriptions.mdx
rename to docs/content/docs/api/list-subscriptions.mdx
index 966b408..9d955a5 100644
--- a/docs/content/docs/api/listSubscriptions.mdx
+++ b/docs/content/docs/api/list-subscriptions.mdx
@@ -1,8 +1,10 @@
---
title: List subscriptions
+description: Returns a paginated list of subscriptions. Optionally filter by customer.
full: true
_openapi:
method: GET
+ route: /v1/subscriptions
toc: []
structuredData:
headings: []
@@ -12,8 +14,9 @@ _openapi:
customer.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Returns a paginated list of subscriptions. Optionally filter by customer.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/list-test-clocks.mdx b/docs/content/docs/api/list-test-clocks.mdx
new file mode 100644
index 0000000..b65497a
--- /dev/null
+++ b/docs/content/docs/api/list-test-clocks.mdx
@@ -0,0 +1,20 @@
+---
+title: List test clocks
+description: Returns a paginated list of test clocks.
+full: true
+_openapi:
+ method: GET
+ route: /v1/test_helpers/test_clocks
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: Returns a paginated list of test clocks.
+---
+
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Returns a paginated list of test clocks.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/listWebhookEndpoints.mdx b/docs/content/docs/api/list-webhook-endpoints.mdx
similarity index 50%
rename from docs/content/docs/api/listWebhookEndpoints.mdx
rename to docs/content/docs/api/list-webhook-endpoints.mdx
index c5ed8ef..bfabd3e 100644
--- a/docs/content/docs/api/listWebhookEndpoints.mdx
+++ b/docs/content/docs/api/list-webhook-endpoints.mdx
@@ -1,8 +1,10 @@
---
title: List webhook endpoints
+description: Returns a paginated list of webhook endpoints.
full: true
_openapi:
method: GET
+ route: /v1/webhook_endpoints
toc: []
structuredData:
headings: []
@@ -10,8 +12,9 @@ _openapi:
- content: Returns a paginated list of webhook endpoints.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Returns a paginated list of webhook endpoints.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/listTestClocks.mdx b/docs/content/docs/api/listTestClocks.mdx
deleted file mode 100644
index 4046fb9..0000000
--- a/docs/content/docs/api/listTestClocks.mdx
+++ /dev/null
@@ -1,17 +0,0 @@
----
-title: List test clocks
-full: true
-_openapi:
- method: GET
- toc: []
- structuredData:
- headings: []
- contents:
- - content: Returns a paginated list of test clocks.
----
-
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
-
-Returns a paginated list of test clocks.
-
-
\ No newline at end of file
diff --git a/docs/content/docs/api/payInvoice.mdx b/docs/content/docs/api/pay-invoice.mdx
similarity index 50%
rename from docs/content/docs/api/payInvoice.mdx
rename to docs/content/docs/api/pay-invoice.mdx
index 37c3746..2cc9903 100644
--- a/docs/content/docs/api/payInvoice.mdx
+++ b/docs/content/docs/api/pay-invoice.mdx
@@ -1,8 +1,10 @@
---
title: Pay an invoice
+description: Pays an open invoice, transitioning it to `paid` status.
full: true
_openapi:
method: POST
+ route: /v1/invoices/{id}/pay
toc: []
structuredData:
headings: []
@@ -10,8 +12,9 @@ _openapi:
- content: Pays an open invoice, transitioning it to `paid` status.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Pays an open invoice, transitioning it to `paid` status.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/retrieveCharge.mdx b/docs/content/docs/api/retrieve-charge.mdx
similarity index 54%
rename from docs/content/docs/api/retrieveCharge.mdx
rename to docs/content/docs/api/retrieve-charge.mdx
index 9c30a90..3da8cbd 100644
--- a/docs/content/docs/api/retrieveCharge.mdx
+++ b/docs/content/docs/api/retrieve-charge.mdx
@@ -1,8 +1,12 @@
---
title: Retrieve a charge
+description: >-
+ Retrieves the details of a charge. Supports expansion of `customer` and
+ `payment_intent`.
full: true
_openapi:
method: GET
+ route: /v1/charges/{id}
toc: []
structuredData:
headings: []
@@ -12,8 +16,9 @@ _openapi:
and `payment_intent`.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Retrieves the details of a charge. Supports expansion of `customer` and `payment_intent`.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/retrieveCustomer.mdx b/docs/content/docs/api/retrieve-customer.mdx
similarity index 50%
rename from docs/content/docs/api/retrieveCustomer.mdx
rename to docs/content/docs/api/retrieve-customer.mdx
index d1135bc..3b295a5 100644
--- a/docs/content/docs/api/retrieveCustomer.mdx
+++ b/docs/content/docs/api/retrieve-customer.mdx
@@ -1,8 +1,10 @@
---
title: Retrieve a customer
+description: Retrieves a customer object by its ID.
full: true
_openapi:
method: GET
+ route: /v1/customers/{id}
toc: []
structuredData:
headings: []
@@ -10,8 +12,9 @@ _openapi:
- content: Retrieves a customer object by its ID.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Retrieves a customer object by its ID.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/retrieveEvent.mdx b/docs/content/docs/api/retrieve-event.mdx
similarity index 50%
rename from docs/content/docs/api/retrieveEvent.mdx
rename to docs/content/docs/api/retrieve-event.mdx
index cdb0638..9defa8c 100644
--- a/docs/content/docs/api/retrieveEvent.mdx
+++ b/docs/content/docs/api/retrieve-event.mdx
@@ -1,8 +1,10 @@
---
title: Retrieve an event
+description: Retrieves the details of an event.
full: true
_openapi:
method: GET
+ route: /v1/events/{id}
toc: []
structuredData:
headings: []
@@ -10,8 +12,9 @@ _openapi:
- content: Retrieves the details of an event.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Retrieves the details of an event.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/retrieveInvoice.mdx b/docs/content/docs/api/retrieve-invoice.mdx
similarity index 55%
rename from docs/content/docs/api/retrieveInvoice.mdx
rename to docs/content/docs/api/retrieve-invoice.mdx
index a648bc5..6047178 100644
--- a/docs/content/docs/api/retrieveInvoice.mdx
+++ b/docs/content/docs/api/retrieve-invoice.mdx
@@ -1,8 +1,12 @@
---
title: Retrieve an invoice
+description: >-
+ Retrieves the invoice with the given ID. Supports expansion of `customer`,
+ `subscription`, and `payment_intent`.
full: true
_openapi:
method: GET
+ route: /v1/invoices/{id}
toc: []
structuredData:
headings: []
@@ -12,8 +16,9 @@ _openapi:
`customer`, `subscription`, and `payment_intent`.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Retrieves the invoice with the given ID. Supports expansion of `customer`, `subscription`, and `payment_intent`.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/retrievePaymentIntent.mdx b/docs/content/docs/api/retrieve-payment-intent.mdx
similarity index 55%
rename from docs/content/docs/api/retrievePaymentIntent.mdx
rename to docs/content/docs/api/retrieve-payment-intent.mdx
index 779b7e2..fba4f2d 100644
--- a/docs/content/docs/api/retrievePaymentIntent.mdx
+++ b/docs/content/docs/api/retrieve-payment-intent.mdx
@@ -1,8 +1,12 @@
---
title: Retrieve a payment intent
+description: >-
+ Retrieves the details of a PaymentIntent. Supports expansion of `customer`,
+ `payment_method`, and `latest_charge`.
full: true
_openapi:
method: GET
+ route: /v1/payment_intents/{id}
toc: []
structuredData:
headings: []
@@ -12,8 +16,9 @@ _openapi:
`customer`, `payment_method`, and `latest_charge`.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Retrieves the details of a PaymentIntent. Supports expansion of `customer`, `payment_method`, and `latest_charge`.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/retrieve-payment-method.mdx b/docs/content/docs/api/retrieve-payment-method.mdx
new file mode 100644
index 0000000..a5d36d9
--- /dev/null
+++ b/docs/content/docs/api/retrieve-payment-method.mdx
@@ -0,0 +1,20 @@
+---
+title: Retrieve a payment method
+description: Retrieves a payment method object.
+full: true
+_openapi:
+ method: GET
+ route: /v1/payment_methods/{id}
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: Retrieves a payment method object.
+---
+
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Retrieves a payment method object.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/retrievePrice.mdx b/docs/content/docs/api/retrieve-price.mdx
similarity index 50%
rename from docs/content/docs/api/retrievePrice.mdx
rename to docs/content/docs/api/retrieve-price.mdx
index 5aa4884..2ba418f 100644
--- a/docs/content/docs/api/retrievePrice.mdx
+++ b/docs/content/docs/api/retrieve-price.mdx
@@ -1,8 +1,10 @@
---
title: Retrieve a price
+description: Retrieves the details of an existing price.
full: true
_openapi:
method: GET
+ route: /v1/prices/{id}
toc: []
structuredData:
headings: []
@@ -10,8 +12,9 @@ _openapi:
- content: Retrieves the details of an existing price.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Retrieves the details of an existing price.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/retrieveProduct.mdx b/docs/content/docs/api/retrieve-product.mdx
similarity index 50%
rename from docs/content/docs/api/retrieveProduct.mdx
rename to docs/content/docs/api/retrieve-product.mdx
index 0f9d646..116f506 100644
--- a/docs/content/docs/api/retrieveProduct.mdx
+++ b/docs/content/docs/api/retrieve-product.mdx
@@ -1,8 +1,10 @@
---
title: Retrieve a product
+description: Retrieves the details of an existing product.
full: true
_openapi:
method: GET
+ route: /v1/products/{id}
toc: []
structuredData:
headings: []
@@ -10,8 +12,9 @@ _openapi:
- content: Retrieves the details of an existing product.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Retrieves the details of an existing product.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/retrieve-refund.mdx b/docs/content/docs/api/retrieve-refund.mdx
new file mode 100644
index 0000000..ea88c47
--- /dev/null
+++ b/docs/content/docs/api/retrieve-refund.mdx
@@ -0,0 +1,20 @@
+---
+title: Retrieve a refund
+description: Retrieves the details of a refund.
+full: true
+_openapi:
+ method: GET
+ route: /v1/refunds/{id}
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: Retrieves the details of a refund.
+---
+
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Retrieves the details of a refund.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/retrieve-setup-intent.mdx b/docs/content/docs/api/retrieve-setup-intent.mdx
new file mode 100644
index 0000000..2c41131
--- /dev/null
+++ b/docs/content/docs/api/retrieve-setup-intent.mdx
@@ -0,0 +1,20 @@
+---
+title: Retrieve a setup intent
+description: Retrieves the details of a SetupIntent.
+full: true
+_openapi:
+ method: GET
+ route: /v1/setup_intents/{id}
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: Retrieves the details of a SetupIntent.
+---
+
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Retrieves the details of a SetupIntent.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/retrieveSubscription.mdx b/docs/content/docs/api/retrieve-subscription.mdx
similarity index 56%
rename from docs/content/docs/api/retrieveSubscription.mdx
rename to docs/content/docs/api/retrieve-subscription.mdx
index 9aef405..c8ba1f6 100644
--- a/docs/content/docs/api/retrieveSubscription.mdx
+++ b/docs/content/docs/api/retrieve-subscription.mdx
@@ -1,8 +1,12 @@
---
title: Retrieve a subscription
+description: >-
+ Retrieves the subscription with the given ID. Supports expansion of `customer`
+ and `latest_invoice` (including nested `latest_invoice.payment_intent`).
full: true
_openapi:
method: GET
+ route: /v1/subscriptions/{id}
toc: []
structuredData:
headings: []
@@ -13,8 +17,9 @@ _openapi:
`latest_invoice.payment_intent`).
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Retrieves the subscription with the given ID. Supports expansion of `customer` and `latest_invoice` (including nested `latest_invoice.payment_intent`).
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/retrieve-test-clock.mdx b/docs/content/docs/api/retrieve-test-clock.mdx
new file mode 100644
index 0000000..902793a
--- /dev/null
+++ b/docs/content/docs/api/retrieve-test-clock.mdx
@@ -0,0 +1,20 @@
+---
+title: Retrieve a test clock
+description: Retrieves a test clock.
+full: true
+_openapi:
+ method: GET
+ route: /v1/test_helpers/test_clocks/{id}
+ toc: []
+ structuredData:
+ headings: []
+ contents:
+ - content: Retrieves a test clock.
+---
+
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
+
+Retrieves a test clock.
+
+
\ No newline at end of file
diff --git a/docs/content/docs/api/retrieveWebhookEndpoint.mdx b/docs/content/docs/api/retrieve-webhook-endpoint.mdx
similarity index 50%
rename from docs/content/docs/api/retrieveWebhookEndpoint.mdx
rename to docs/content/docs/api/retrieve-webhook-endpoint.mdx
index fa6442b..cec6596 100644
--- a/docs/content/docs/api/retrieveWebhookEndpoint.mdx
+++ b/docs/content/docs/api/retrieve-webhook-endpoint.mdx
@@ -1,8 +1,10 @@
---
title: Retrieve a webhook endpoint
+description: Retrieves the webhook endpoint with the given ID.
full: true
_openapi:
method: GET
+ route: /v1/webhook_endpoints/{id}
toc: []
structuredData:
headings: []
@@ -10,8 +12,9 @@ _openapi:
- content: Retrieves the webhook endpoint with the given ID.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Retrieves the webhook endpoint with the given ID.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/retrievePaymentMethod.mdx b/docs/content/docs/api/retrievePaymentMethod.mdx
deleted file mode 100644
index f61ae46..0000000
--- a/docs/content/docs/api/retrievePaymentMethod.mdx
+++ /dev/null
@@ -1,17 +0,0 @@
----
-title: Retrieve a payment method
-full: true
-_openapi:
- method: GET
- toc: []
- structuredData:
- headings: []
- contents:
- - content: Retrieves a payment method object.
----
-
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
-
-Retrieves a payment method object.
-
-
\ No newline at end of file
diff --git a/docs/content/docs/api/retrieveRefund.mdx b/docs/content/docs/api/retrieveRefund.mdx
deleted file mode 100644
index b968011..0000000
--- a/docs/content/docs/api/retrieveRefund.mdx
+++ /dev/null
@@ -1,17 +0,0 @@
----
-title: Retrieve a refund
-full: true
-_openapi:
- method: GET
- toc: []
- structuredData:
- headings: []
- contents:
- - content: Retrieves the details of a refund.
----
-
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
-
-Retrieves the details of a refund.
-
-
\ No newline at end of file
diff --git a/docs/content/docs/api/retrieveSetupIntent.mdx b/docs/content/docs/api/retrieveSetupIntent.mdx
deleted file mode 100644
index 44d40fa..0000000
--- a/docs/content/docs/api/retrieveSetupIntent.mdx
+++ /dev/null
@@ -1,17 +0,0 @@
----
-title: Retrieve a setup intent
-full: true
-_openapi:
- method: GET
- toc: []
- structuredData:
- headings: []
- contents:
- - content: Retrieves the details of a SetupIntent.
----
-
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
-
-Retrieves the details of a SetupIntent.
-
-
\ No newline at end of file
diff --git a/docs/content/docs/api/retrieveTestClock.mdx b/docs/content/docs/api/retrieveTestClock.mdx
deleted file mode 100644
index bc38e18..0000000
--- a/docs/content/docs/api/retrieveTestClock.mdx
+++ /dev/null
@@ -1,17 +0,0 @@
----
-title: Retrieve a test clock
-full: true
-_openapi:
- method: GET
- toc: []
- structuredData:
- headings: []
- contents:
- - content: Retrieves a test clock.
----
-
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
-
-Retrieves a test clock.
-
-
\ No newline at end of file
diff --git a/docs/content/docs/api/searchCustomers.mdx b/docs/content/docs/api/search-customers.mdx
similarity index 55%
rename from docs/content/docs/api/searchCustomers.mdx
rename to docs/content/docs/api/search-customers.mdx
index 79e873c..01b0b96 100644
--- a/docs/content/docs/api/searchCustomers.mdx
+++ b/docs/content/docs/api/search-customers.mdx
@@ -1,8 +1,12 @@
---
title: Search customers
+description: >-
+ Search for customers using Stripe's search query language. Supports filtering
+ by `email`, `name`, `metadata`, and other fields.
full: true
_openapi:
method: GET
+ route: /v1/customers/search
toc: []
structuredData:
headings: []
@@ -12,8 +16,9 @@ _openapi:
filtering by `email`, `name`, `metadata`, and other fields.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Search for customers using Stripe's search query language. Supports filtering by `email`, `name`, `metadata`, and other fields.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/searchInvoices.mdx b/docs/content/docs/api/search-invoices.mdx
similarity index 51%
rename from docs/content/docs/api/searchInvoices.mdx
rename to docs/content/docs/api/search-invoices.mdx
index 0e0b207..d1d84c5 100644
--- a/docs/content/docs/api/searchInvoices.mdx
+++ b/docs/content/docs/api/search-invoices.mdx
@@ -1,8 +1,10 @@
---
title: Search invoices
+description: Search for invoices using Stripe's search query language.
full: true
_openapi:
method: GET
+ route: /v1/invoices/search
toc: []
structuredData:
headings: []
@@ -10,8 +12,9 @@ _openapi:
- content: Search for invoices using Stripe's search query language.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Search for invoices using Stripe's search query language.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/searchPaymentIntents.mdx b/docs/content/docs/api/search-payment-intents.mdx
similarity index 50%
rename from docs/content/docs/api/searchPaymentIntents.mdx
rename to docs/content/docs/api/search-payment-intents.mdx
index c41c79f..5609341 100644
--- a/docs/content/docs/api/searchPaymentIntents.mdx
+++ b/docs/content/docs/api/search-payment-intents.mdx
@@ -1,8 +1,10 @@
---
title: Search payment intents
+description: Search for PaymentIntents using Stripe's search query language.
full: true
_openapi:
method: GET
+ route: /v1/payment_intents/search
toc: []
structuredData:
headings: []
@@ -10,8 +12,9 @@ _openapi:
- content: Search for PaymentIntents using Stripe's search query language.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Search for PaymentIntents using Stripe's search query language.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/searchSubscriptions.mdx b/docs/content/docs/api/search-subscriptions.mdx
similarity index 51%
rename from docs/content/docs/api/searchSubscriptions.mdx
rename to docs/content/docs/api/search-subscriptions.mdx
index 1838054..79e5cba 100644
--- a/docs/content/docs/api/searchSubscriptions.mdx
+++ b/docs/content/docs/api/search-subscriptions.mdx
@@ -1,8 +1,10 @@
---
title: Search subscriptions
+description: Search for subscriptions using Stripe's search query language.
full: true
_openapi:
method: GET
+ route: /v1/subscriptions/search
toc: []
structuredData:
headings: []
@@ -10,8 +12,9 @@ _openapi:
- content: Search for subscriptions using Stripe's search query language.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Search for subscriptions using Stripe's search query language.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/updateCustomer.mdx b/docs/content/docs/api/update-customer.mdx
similarity index 56%
rename from docs/content/docs/api/updateCustomer.mdx
rename to docs/content/docs/api/update-customer.mdx
index 5fe5588..8583b0c 100644
--- a/docs/content/docs/api/updateCustomer.mdx
+++ b/docs/content/docs/api/update-customer.mdx
@@ -1,8 +1,12 @@
---
title: Update a customer
+description: >-
+ Updates the specified customer by setting the values of the parameters passed.
+ Any parameters not provided will be left unchanged.
full: true
_openapi:
method: POST
+ route: /v1/customers/{id}
toc: []
structuredData:
headings: []
@@ -12,8 +16,9 @@ _openapi:
passed. Any parameters not provided will be left unchanged.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Updates the specified customer by setting the values of the parameters passed. Any parameters not provided will be left unchanged.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/updatePaymentIntent.mdx b/docs/content/docs/api/update-payment-intent.mdx
similarity index 53%
rename from docs/content/docs/api/updatePaymentIntent.mdx
rename to docs/content/docs/api/update-payment-intent.mdx
index a12917b..3d9b315 100644
--- a/docs/content/docs/api/updatePaymentIntent.mdx
+++ b/docs/content/docs/api/update-payment-intent.mdx
@@ -1,8 +1,12 @@
---
title: Update a payment intent
+description: >-
+ Updates properties on a PaymentIntent without confirming. Returns the current
+ PaymentIntent.
full: true
_openapi:
method: POST
+ route: /v1/payment_intents/{id}
toc: []
structuredData:
headings: []
@@ -12,8 +16,9 @@ _openapi:
current PaymentIntent.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Updates properties on a PaymentIntent without confirming. Returns the current PaymentIntent.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/updatePrice.mdx b/docs/content/docs/api/update-price.mdx
similarity index 55%
rename from docs/content/docs/api/updatePrice.mdx
rename to docs/content/docs/api/update-price.mdx
index e3dd859..32fba9d 100644
--- a/docs/content/docs/api/updatePrice.mdx
+++ b/docs/content/docs/api/update-price.mdx
@@ -1,8 +1,12 @@
---
title: Update a price
+description: >-
+ Updates the specified price. Only mutable fields like `active`, `nickname`,
+ and `metadata` can be changed.
full: true
_openapi:
method: POST
+ route: /v1/prices/{id}
toc: []
structuredData:
headings: []
@@ -12,8 +16,9 @@ _openapi:
`nickname`, and `metadata` can be changed.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Updates the specified price. Only mutable fields like `active`, `nickname`, and `metadata` can be changed.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/updateProduct.mdx b/docs/content/docs/api/update-product.mdx
similarity index 54%
rename from docs/content/docs/api/updateProduct.mdx
rename to docs/content/docs/api/update-product.mdx
index ba9149b..b6e2d63 100644
--- a/docs/content/docs/api/updateProduct.mdx
+++ b/docs/content/docs/api/update-product.mdx
@@ -1,8 +1,10 @@
---
title: Update a product
+description: Updates the specified product by setting the values of the parameters passed.
full: true
_openapi:
method: POST
+ route: /v1/products/{id}
toc: []
structuredData:
headings: []
@@ -12,8 +14,9 @@ _openapi:
passed.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Updates the specified product by setting the values of the parameters passed.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/updateSubscription.mdx b/docs/content/docs/api/update-subscription.mdx
similarity index 54%
rename from docs/content/docs/api/updateSubscription.mdx
rename to docs/content/docs/api/update-subscription.mdx
index 2835d81..3bf810c 100644
--- a/docs/content/docs/api/updateSubscription.mdx
+++ b/docs/content/docs/api/update-subscription.mdx
@@ -1,8 +1,12 @@
---
title: Update a subscription
+description: >-
+ Updates an existing subscription. You can change the plan, quantity, trial
+ end, and cancellation settings.
full: true
_openapi:
method: POST
+ route: /v1/subscriptions/{id}
toc: []
structuredData:
headings: []
@@ -12,8 +16,9 @@ _openapi:
trial end, and cancellation settings.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Updates an existing subscription. You can change the plan, quantity, trial end, and cancellation settings.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/content/docs/api/voidInvoice.mdx b/docs/content/docs/api/void-invoice.mdx
similarity index 54%
rename from docs/content/docs/api/voidInvoice.mdx
rename to docs/content/docs/api/void-invoice.mdx
index 2a811d5..406cb0c 100644
--- a/docs/content/docs/api/voidInvoice.mdx
+++ b/docs/content/docs/api/void-invoice.mdx
@@ -1,8 +1,12 @@
---
title: Void an invoice
+description: >-
+ Voids an open invoice, transitioning it to `void` status. A voided invoice can
+ no longer be paid.
full: true
_openapi:
method: POST
+ route: /v1/invoices/{id}/void
toc: []
structuredData:
headings: []
@@ -12,8 +16,9 @@ _openapi:
invoice can no longer be paid.
---
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
+{/* This file was generated by Fumadocs.
+Do not edit this file directly. Any changes should be made by running the generation command again. */}
Voids an open invoice, transitioning it to `void` status. A voided invoice can no longer be paid.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/lib/openapi.ts b/docs/lib/openapi.ts
index f6ddf3b..6e0c8ef 100644
--- a/docs/lib/openapi.ts
+++ b/docs/lib/openapi.ts
@@ -1,5 +1,3 @@
import { createOpenAPI } from 'fumadocs-openapi/server';
-export const openapi = createOpenAPI({
- input: ['./openapi.json'],
-});
+export const openapi = createOpenAPI();
diff --git a/docs/lib/source.ts b/docs/lib/source.ts
index cc1e294..0edc758 100644
--- a/docs/lib/source.ts
+++ b/docs/lib/source.ts
@@ -1,8 +1,7 @@
-import { docs, meta } from '@/.source';
-import { createMDXSource } from 'fumadocs-mdx/runtime/next';
+import { docs } from '@/.source';
import { loader } from 'fumadocs-core/source';
export const source = loader({
baseUrl: '/docs',
- source: createMDXSource(docs, meta),
+ source: docs.toFumadocsSource(),
});
diff --git a/docs/next-env.d.ts b/docs/next-env.d.ts
new file mode 100644
index 0000000..830fb59
--- /dev/null
+++ b/docs/next-env.d.ts
@@ -0,0 +1,6 @@
+///
+///
+///
+
+// NOTE: This file should not be edited
+// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
diff --git a/docs/openapi.json b/docs/openapi.json
index 376f5c5..d868995 100644
--- a/docs/openapi.json
+++ b/docs/openapi.json
@@ -47,7 +47,7 @@
"description": "Creates a new customer object.",
"requestBody": {
"content": {
- "application/x-www-form-urlencoded": {
+ "application/json": {
"schema": {
"type": "object",
"properties": {
@@ -238,7 +238,7 @@
],
"requestBody": {
"content": {
- "application/x-www-form-urlencoded": {
+ "application/json": {
"schema": {
"type": "object",
"properties": {
@@ -326,7 +326,7 @@
"requestBody": {
"required": true,
"content": {
- "application/x-www-form-urlencoded": {
+ "application/json": {
"schema": {
"type": "object",
"required": ["name"],
@@ -453,7 +453,7 @@
],
"requestBody": {
"content": {
- "application/x-www-form-urlencoded": {
+ "application/json": {
"schema": {
"type": "object",
"properties": {
@@ -544,7 +544,7 @@
"requestBody": {
"required": true,
"content": {
- "application/x-www-form-urlencoded": {
+ "application/json": {
"schema": {
"type": "object",
"required": ["currency", "product"],
@@ -708,7 +708,7 @@
],
"requestBody": {
"content": {
- "application/x-www-form-urlencoded": {
+ "application/json": {
"schema": {
"type": "object",
"properties": {
@@ -759,7 +759,7 @@
"requestBody": {
"required": true,
"content": {
- "application/x-www-form-urlencoded": {
+ "application/json": {
"schema": {
"type": "object",
"required": ["type"],
@@ -933,7 +933,7 @@
"requestBody": {
"required": true,
"content": {
- "application/x-www-form-urlencoded": {
+ "application/json": {
"schema": {
"type": "object",
"required": ["customer"],
@@ -1011,7 +1011,7 @@
"requestBody": {
"required": true,
"content": {
- "application/x-www-form-urlencoded": {
+ "application/json": {
"schema": {
"type": "object",
"required": ["amount", "currency"],
@@ -1247,7 +1247,7 @@
],
"requestBody": {
"content": {
- "application/x-www-form-urlencoded": {
+ "application/json": {
"schema": {
"type": "object",
"properties": {
@@ -1302,7 +1302,7 @@
],
"requestBody": {
"content": {
- "application/x-www-form-urlencoded": {
+ "application/json": {
"schema": {
"type": "object",
"properties": {
@@ -1352,7 +1352,7 @@
],
"requestBody": {
"content": {
- "application/x-www-form-urlencoded": {
+ "application/json": {
"schema": {
"type": "object",
"properties": {
@@ -1394,7 +1394,7 @@
"description": "Creates a SetupIntent object for setting up a customer's payment method for future payments.",
"requestBody": {
"content": {
- "application/x-www-form-urlencoded": {
+ "application/json": {
"schema": {
"type": "object",
"properties": {
@@ -1528,7 +1528,7 @@
],
"requestBody": {
"content": {
- "application/x-www-form-urlencoded": {
+ "application/json": {
"schema": {
"type": "object",
"properties": {
@@ -1684,7 +1684,7 @@
"requestBody": {
"required": true,
"content": {
- "application/x-www-form-urlencoded": {
+ "application/json": {
"schema": {
"type": "object",
"properties": {
@@ -1826,7 +1826,7 @@
"requestBody": {
"required": true,
"content": {
- "application/x-www-form-urlencoded": {
+ "application/json": {
"schema": {
"type": "object",
"required": ["customer", "items"],
@@ -2024,7 +2024,7 @@
],
"requestBody": {
"content": {
- "application/x-www-form-urlencoded": {
+ "application/json": {
"schema": {
"type": "object",
"properties": {
@@ -2128,7 +2128,7 @@
"requestBody": {
"required": true,
"content": {
- "application/x-www-form-urlencoded": {
+ "application/json": {
"schema": {
"type": "object",
"required": ["customer"],
@@ -2501,7 +2501,7 @@
"requestBody": {
"required": true,
"content": {
- "application/x-www-form-urlencoded": {
+ "application/json": {
"schema": {
"type": "object",
"required": ["url", "enabled_events"],
@@ -2670,7 +2670,7 @@
"requestBody": {
"required": true,
"content": {
- "application/x-www-form-urlencoded": {
+ "application/json": {
"schema": {
"type": "object",
"required": ["frozen_time"],
@@ -2837,7 +2837,7 @@
"requestBody": {
"required": true,
"content": {
- "application/x-www-form-urlencoded": {
+ "application/json": {
"schema": {
"type": "object",
"required": ["frozen_time"],
diff --git a/docs/package.json b/docs/package.json
index 0e90b80..0485fdd 100644
--- a/docs/package.json
+++ b/docs/package.json
@@ -3,15 +3,15 @@
"private": true,
"scripts": {
"dev": "next dev --turbopack",
- "build": "next build",
+ "build": "next build --turbopack",
"start": "next start",
"generate": "bun ./scripts/generate-docs.ts"
},
"dependencies": {
- "fumadocs-core": "latest",
- "fumadocs-mdx": "latest",
- "fumadocs-openapi": "latest",
- "fumadocs-ui": "latest",
+ "fumadocs-core": "^15.8.5",
+ "fumadocs-mdx": "^12.0.3",
+ "fumadocs-openapi": "^6.3.0",
+ "fumadocs-ui": "^15.8.5",
"next": "^15",
"react": "^19",
"react-dom": "^19"
diff --git a/docs/scripts/generate-docs.ts b/docs/scripts/generate-docs.ts
index ae3fc5c..0b638d8 100644
--- a/docs/scripts/generate-docs.ts
+++ b/docs/scripts/generate-docs.ts
@@ -1,8 +1,7 @@
import { generateFiles } from 'fumadocs-openapi';
-import { openapi } from '../lib/openapi';
void generateFiles({
- input: openapi,
+ input: ['./openapi.json'],
output: './content/docs/api',
includeDescription: true,
});
diff --git a/docs/superpowers/plans/2026-04-10-fumadocs-documentation.md b/docs/superpowers/plans/2026-04-10-fumadocs-documentation.md
new file mode 100644
index 0000000..ad60785
--- /dev/null
+++ b/docs/superpowers/plans/2026-04-10-fumadocs-documentation.md
@@ -0,0 +1,1360 @@
+# Fumadocs Documentation Implementation Plan
+
+> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
+
+**Goal:** Add a beautiful, auto-generated documentation site to Strimulator using Fumadocs with OpenAPI-powered API reference.
+
+**Architecture:** A Next.js app in `docs/` using Fumadocs UI for the documentation framework. An OpenAPI 3.1 spec is hand-maintained in `docs/openapi.json`, and `fumadocs-openapi` generates interactive API reference MDX pages from it. Hand-written MDX pages cover Getting Started, Guides, and Architecture sections.
+
+**Tech Stack:** Next.js, Fumadocs (fumadocs-ui, fumadocs-core, fumadocs-mdx, fumadocs-openapi), Tailwind CSS, Bun
+
+---
+
+### Task 1: Scaffold Fumadocs Next.js app
+
+**Files:**
+- Create: `docs/package.json`
+- Create: `docs/next.config.mjs`
+- Create: `docs/source.config.ts`
+- Create: `docs/tsconfig.json`
+- Create: `docs/postcss.config.mjs`
+- Create: `docs/tailwind.config.ts` (if needed by fumadocs-ui)
+
+- [ ] **Step 1: Create `docs/package.json`**
+
+```json
+{
+ "name": "strimulator-docs",
+ "private": true,
+ "scripts": {
+ "dev": "next dev --turbopack",
+ "build": "next build",
+ "start": "next start",
+ "generate": "bun ./scripts/generate-docs.ts"
+ },
+ "dependencies": {
+ "fumadocs-core": "latest",
+ "fumadocs-mdx": "latest",
+ "fumadocs-openapi": "latest",
+ "fumadocs-ui": "latest",
+ "next": "^15",
+ "react": "^19",
+ "react-dom": "^19"
+ },
+ "devDependencies": {
+ "@types/react": "^19",
+ "@types/react-dom": "^19",
+ "typescript": "^5",
+ "@tailwindcss/postcss": "^4",
+ "tailwindcss": "^4"
+ }
+}
+```
+
+- [ ] **Step 2: Create `docs/next.config.mjs`**
+
+```js
+import { createMDX } from 'fumadocs-mdx/next';
+
+const withMDX = createMDX();
+
+/** @type {import('next').NextConfig} */
+const config = {};
+
+export default withMDX(config);
+```
+
+- [ ] **Step 3: Create `docs/source.config.ts`**
+
+```ts
+import { defineDocs, defineConfig } from 'fumadocs-mdx/config';
+
+export const docs = defineDocs({
+ dir: 'content/docs',
+});
+
+export default defineConfig();
+```
+
+- [ ] **Step 4: Create `docs/tsconfig.json`**
+
+```json
+{
+ "compilerOptions": {
+ "target": "ESNext",
+ "lib": ["dom", "dom.iterable", "esnext"],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "strict": true,
+ "noEmit": true,
+ "esModuleInterop": true,
+ "module": "ESNext",
+ "moduleResolution": "bundler",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "jsx": "preserve",
+ "incremental": true,
+ "plugins": [{ "name": "next" }],
+ "paths": {
+ "@/*": ["./*"]
+ }
+ },
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".source/**/*.ts"],
+ "exclude": ["node_modules"]
+}
+```
+
+- [ ] **Step 5: Create `docs/postcss.config.mjs`**
+
+```js
+const config = {
+ plugins: {
+ "@tailwindcss/postcss": {},
+ },
+};
+
+export default config;
+```
+
+- [ ] **Step 6: Install dependencies**
+
+Run: `cd docs && bun install`
+Expected: `node_modules/` created, lock file generated
+
+- [ ] **Step 7: Commit**
+
+```bash
+git add docs/package.json docs/next.config.mjs docs/source.config.ts docs/tsconfig.json docs/postcss.config.mjs docs/bun.lock
+git commit -m "Scaffold Fumadocs Next.js app in docs/"
+```
+
+---
+
+### Task 2: Set up Next.js app directory with Fumadocs UI
+
+**Files:**
+- Create: `docs/app/layout.tsx`
+- Create: `docs/app/global.css`
+- Create: `docs/app/docs/layout.tsx`
+- Create: `docs/app/docs/[[...slug]]/page.tsx`
+- Create: `docs/lib/source.ts`
+- Create: `docs/lib/layout.shared.tsx`
+- Create: `docs/components/mdx.tsx`
+
+- [ ] **Step 1: Create `docs/app/global.css`**
+
+```css
+@import "tailwindcss";
+@import "fumadocs-ui/css/ui.css";
+```
+
+- [ ] **Step 2: Create `docs/lib/source.ts`**
+
+```ts
+import { docs, meta } from '@/.source';
+import { createMDXSource } from 'fumadocs-mdx/runtime/next';
+import { loader } from 'fumadocs-core/source';
+
+export const source = loader({
+ baseUrl: '/docs',
+ source: createMDXSource(docs, meta),
+});
+```
+
+- [ ] **Step 3: Create `docs/lib/layout.shared.tsx`**
+
+```tsx
+import type { BaseLayoutProps } from 'fumadocs-ui/layouts/shared';
+
+export function baseOptions(): BaseLayoutProps {
+ return {
+ nav: {
+ title: 'Strimulator',
+ },
+ links: [
+ {
+ text: 'Documentation',
+ url: '/docs',
+ active: 'nested-url',
+ },
+ ],
+ githubUrl: 'https://github.com/codeforge-tech/strimulator',
+ };
+}
+```
+
+- [ ] **Step 4: Create `docs/app/layout.tsx`**
+
+```tsx
+import { RootProvider } from 'fumadocs-ui/provider/next';
+import type { ReactNode } from 'react';
+import './global.css';
+
+export default function Layout({ children }: { children: ReactNode }) {
+ return (
+
+
+ {children}
+
+
+ );
+}
+```
+
+- [ ] **Step 5: Create `docs/app/docs/layout.tsx`**
+
+```tsx
+import { DocsLayout } from 'fumadocs-ui/layouts/docs';
+import { baseOptions } from '@/lib/layout.shared';
+import { source } from '@/lib/source';
+import type { ReactNode } from 'react';
+
+export default function Layout({ children }: { children: ReactNode }) {
+ return (
+
+ {children}
+
+ );
+}
+```
+
+- [ ] **Step 6: Create `docs/components/mdx.tsx`**
+
+```tsx
+import defaultMdxComponents from 'fumadocs-ui/mdx';
+import type { MDXComponents } from 'mdx/types';
+
+export function getMDXComponents(): MDXComponents {
+ return {
+ ...defaultMdxComponents,
+ };
+}
+```
+
+- [ ] **Step 7: Create `docs/app/docs/[[...slug]]/page.tsx`**
+
+```tsx
+import { source } from '@/lib/source';
+import { notFound } from 'next/navigation';
+import {
+ DocsPage,
+ DocsBody,
+ DocsTitle,
+ DocsDescription,
+} from 'fumadocs-ui/layouts/docs/page';
+import { getMDXComponents } from '@/components/mdx';
+
+export default async function Page({
+ params,
+}: {
+ params: Promise<{ slug?: string[] }>;
+}) {
+ const { slug } = await params;
+ const page = source.getPage(slug);
+
+ if (!page) notFound();
+
+ const Mdx = page.data.body;
+
+ return (
+
+ {page.data.title}
+ {page.data.description}
+
+
+
+
+ );
+}
+
+export function generateStaticParams() {
+ return source.generateParams();
+}
+```
+
+- [ ] **Step 8: Create `docs/app/page.tsx`** (root redirect to /docs)
+
+```tsx
+import { redirect } from 'next/navigation';
+
+export default function Home() {
+ redirect('/docs');
+}
+```
+
+- [ ] **Step 9: Commit**
+
+```bash
+git add docs/app/ docs/lib/ docs/components/
+git commit -m "Set up Fumadocs UI app directory with layouts and page renderer"
+```
+
+---
+
+### Task 3: Create initial content pages — Getting Started
+
+**Files:**
+- Create: `docs/content/docs/index.mdx`
+- Create: `docs/content/docs/meta.json`
+- Create: `docs/content/docs/getting-started/meta.json`
+- Create: `docs/content/docs/getting-started/installation.mdx`
+- Create: `docs/content/docs/getting-started/quick-start.mdx`
+- Create: `docs/content/docs/getting-started/connecting-sdk.mdx`
+
+- [ ] **Step 1: Create `docs/content/docs/meta.json`**
+
+This controls the top-level sidebar navigation order.
+
+```json
+{
+ "title": "Strimulator",
+ "pages": [
+ "---Getting Started---",
+ "getting-started",
+ "---Guides---",
+ "guides",
+ "---API Reference---",
+ "api",
+ "---Architecture---",
+ "architecture"
+ ]
+}
+```
+
+- [ ] **Step 2: Create `docs/content/docs/index.mdx`**
+
+```mdx
+---
+title: Strimulator
+description: A local Stripe emulator for development and testing
+---
+
+Strimulator is a drop-in local replacement for the Stripe API. It runs as a single process, stores everything in SQLite, and is compatible with the official `stripe` Node SDK. Use it to develop and test payment flows entirely offline — no Stripe account or network access required.
+
+**Think of it as [LocalStack](https://github.com/localstack/localstack), but for Stripe.**
+
+## Why Strimulator?
+
+- **Offline development** — No internet, no Stripe test mode, no rate limits
+- **Fast feedback** — Instant responses, no network latency
+- **Full control** — Trigger payment failures, advance subscriptions, simulate edge cases from the dashboard
+- **SDK-compatible** — Point the official `stripe` package at localhost and it just works
+- **Docker-ready** — Drop it into your docker-compose alongside Postgres, Redis, Firebase emulator, etc.
+
+## Supported Resources
+
+| Resource | Endpoints | State Machine |
+|----------|-----------|:------------:|
+| Customers | CRUD + list + search | |
+| Products | CRUD + list + search | |
+| Prices | create, retrieve, update, list | |
+| Payment Methods | create, retrieve, attach, detach, list | |
+| Payment Intents | create, retrieve, confirm, capture, cancel, list, search | ✓ |
+| Setup Intents | create, retrieve, confirm, cancel, list | ✓ |
+| Charges | retrieve, list | |
+| Refunds | create, retrieve, list | |
+| Subscriptions | create, retrieve, cancel, list, search | ✓ |
+| Invoices | create, retrieve, finalize, pay, void, list, search | ✓ |
+| Events | retrieve, list | |
+| Webhook Endpoints | CRUD + list | |
+| Test Clocks | create, retrieve, advance, delete, list | |
+
+## Additional Features
+
+- **Webhook delivery** with `Stripe-Signature` HMAC-SHA256 headers and retry logic
+- **Search API** with Stripe's query language
+- **expand[]** for one-level and nested expansion
+- **Idempotency-Key** support for POST requests
+- **Magic test tokens** — `tok_visa`, `tok_mastercard`, `tok_amex`, `tok_visa_debit`
+```
+
+- [ ] **Step 3: Create `docs/content/docs/getting-started/meta.json`**
+
+```json
+{
+ "title": "Getting Started",
+ "pages": ["installation", "quick-start", "connecting-sdk"]
+}
+```
+
+- [ ] **Step 4: Create `docs/content/docs/getting-started/installation.mdx`**
+
+```mdx
+---
+title: Installation
+description: Install and run Strimulator locally or with Docker
+---
+
+## Prerequisites
+
+- [Bun](https://bun.sh) v1.0+ (for local install)
+- Or [Docker](https://www.docker.com/) (for containerized setup)
+
+## Local Install
+
+```bash
+git clone https://github.com/codeforge-tech/strimulator.git
+cd strimulator
+bun install
+bun run dev
+```
+
+Strimulator is now running:
+
+- **API:** http://localhost:12111/v1/
+- **Dashboard:** http://localhost:12111/dashboard
+
+## Docker
+
+### Docker Compose (recommended)
+
+Add to your project's `docker-compose.yml`:
+
+```yaml
+services:
+ strimulator:
+ image: ghcr.io/codeforge-tech/strimulator:latest
+ ports:
+ - "12111:12111"
+ volumes:
+ - strimulator-data:/data
+
+volumes:
+ strimulator-data:
+```
+
+### Build locally
+
+```bash
+docker build -t strimulator .
+docker run -p 12111:12111 strimulator
+```
+
+## Configuration
+
+| Environment Variable | Default | Description |
+|---------------------|---------|-------------|
+| `STRIMULATOR_PORT` | `12111` | Server port |
+| `STRIMULATOR_DB_PATH` | `:memory:` | SQLite path. Use a file path for persistence across restarts |
+| `STRIMULATOR_LOG_LEVEL` | `info` | Log verbosity |
+| `STRIMULATOR_API_VERSION` | `2024-12-18` | Stripe API version in responses |
+```
+
+- [ ] **Step 5: Create `docs/content/docs/getting-started/quick-start.mdx`**
+
+```mdx
+---
+title: Quick Start
+description: Make your first API calls to Strimulator
+---
+
+With Strimulator running (`bun run dev`), try these requests:
+
+## Create a Customer
+
+```bash
+curl -X POST http://localhost:12111/v1/customers \
+ -H "Authorization: Bearer sk_test_123" \
+ -d "email=hello@example.com" \
+ -d "name=Jane Doe"
+```
+
+## Create a Product and Price
+
+```bash
+curl -X POST http://localhost:12111/v1/products \
+ -H "Authorization: Bearer sk_test_123" \
+ -d "name=Pro Plan"
+
+# Use the product ID from the response
+curl -X POST http://localhost:12111/v1/prices \
+ -H "Authorization: Bearer sk_test_123" \
+ -d "product=prod_xxxxx" \
+ -d "unit_amount=2000" \
+ -d "currency=usd" \
+ -d "recurring[interval]=month"
+```
+
+## Create a Payment Intent
+
+```bash
+curl -X POST http://localhost:12111/v1/payment_intents \
+ -H "Authorization: Bearer sk_test_123" \
+ -d "amount=2000" \
+ -d "currency=usd" \
+ -d "payment_method=tok_visa" \
+ -d "confirm=true"
+```
+
+## List Resources
+
+```bash
+curl http://localhost:12111/v1/customers \
+ -H "Authorization: Bearer sk_test_123"
+```
+
+## Authentication
+
+All `/v1/` requests require a bearer token starting with `sk_test_`:
+
+```
+Authorization: Bearer sk_test_anything
+```
+
+The actual key value doesn't matter — Strimulator accepts any `sk_test_*` key.
+
+## Request Format
+
+Like real Stripe, requests use `application/x-www-form-urlencoded` (not JSON):
+
+```bash
+curl -X POST http://localhost:12111/v1/customers \
+ -H "Authorization: Bearer sk_test_123" \
+ -d "email=test@example.com" \
+ -d "metadata[plan]=pro"
+```
+```
+
+- [ ] **Step 6: Create `docs/content/docs/getting-started/connecting-sdk.mdx`**
+
+```mdx
+---
+title: Connecting the Stripe SDK
+description: Use the official Stripe SDK with Strimulator
+---
+
+Point the official Stripe SDK at Strimulator — no code changes needed beyond the configuration.
+
+## Node.js / TypeScript
+
+```typescript
+import Stripe from "stripe";
+
+const stripe = new Stripe("sk_test_strimulator", {
+ host: "localhost",
+ port: 12111,
+ protocol: "http",
+});
+
+// Use exactly like real Stripe
+const customer = await stripe.customers.create({
+ email: "dev@example.com",
+});
+
+const product = await stripe.products.create({
+ name: "Pro Plan",
+});
+
+const price = await stripe.prices.create({
+ product: product.id,
+ unit_amount: 2000,
+ currency: "usd",
+ recurring: { interval: "month" },
+});
+
+const subscription = await stripe.subscriptions.create({
+ customer: customer.id,
+ items: [{ price: price.id }],
+});
+
+console.log(subscription.status); // "active"
+```
+
+## Environment Variable Approach
+
+If your app reads `STRIPE_SECRET_KEY`, you can switch to Strimulator without touching code:
+
+```bash
+STRIPE_SECRET_KEY=sk_test_strimulator \
+STRIPE_API_BASE=http://localhost:12111 \
+ npm run dev
+```
+
+## Docker Compose
+
+When using Docker Compose, point your app at the service name:
+
+```yaml
+services:
+ strimulator:
+ image: ghcr.io/codeforge-tech/strimulator:latest
+ ports:
+ - "12111:12111"
+
+ your-app:
+ build: .
+ environment:
+ STRIPE_SECRET_KEY: sk_test_strimulator
+ STRIPE_API_BASE: http://strimulator:12111
+ depends_on:
+ - strimulator
+```
+```
+
+- [ ] **Step 7: Verify the docs build**
+
+Run: `cd docs && bun run build`
+Expected: Build succeeds with the index page and three getting-started pages
+
+- [ ] **Step 8: Commit**
+
+```bash
+git add docs/content/docs/
+git commit -m "Add Getting Started documentation pages"
+```
+
+---
+
+### Task 4: Create Guide pages
+
+**Files:**
+- Create: `docs/content/docs/guides/meta.json`
+- Create: `docs/content/docs/guides/webhooks.mdx`
+- Create: `docs/content/docs/guides/test-clocks.mdx`
+- Create: `docs/content/docs/guides/3ds-simulation.mdx`
+- Create: `docs/content/docs/guides/dashboard.mdx`
+- Create: `docs/content/docs/guides/idempotency.mdx`
+
+- [ ] **Step 1: Create `docs/content/docs/guides/meta.json`**
+
+```json
+{
+ "title": "Guides",
+ "pages": ["webhooks", "test-clocks", "3ds-simulation", "dashboard", "idempotency"]
+}
+```
+
+- [ ] **Step 2: Create `docs/content/docs/guides/webhooks.mdx`**
+
+```mdx
+---
+title: Webhooks
+description: Register webhook endpoints and receive event notifications
+---
+
+Strimulator delivers webhook events just like Stripe — with HMAC-SHA256 signatures, retry logic, and the same event shapes.
+
+## Registering a Webhook Endpoint
+
+```bash
+curl -X POST http://localhost:12111/v1/webhook_endpoints \
+ -H "Authorization: Bearer sk_test_123" \
+ -d "url=http://localhost:3000/webhooks/stripe" \
+ -d "enabled_events[]=customer.created" \
+ -d "enabled_events[]=payment_intent.succeeded"
+```
+
+Or using the SDK:
+
+```typescript
+const endpoint = await stripe.webhookEndpoints.create({
+ url: "http://localhost:3000/webhooks/stripe",
+ enabled_events: [
+ "customer.created",
+ "payment_intent.succeeded",
+ ],
+});
+```
+
+Use `enabled_events: ["*"]` to receive all event types.
+
+## Signature Verification
+
+Strimulator signs webhook payloads with HMAC-SHA256, compatible with `stripe.webhooks.constructEvent()`:
+
+```typescript
+import Stripe from "stripe";
+
+const stripe = new Stripe("sk_test_strimulator", {
+ host: "localhost",
+ port: 12111,
+ protocol: "http",
+});
+
+// In your webhook handler
+const event = stripe.webhooks.constructEvent(
+ body,
+ request.headers["stripe-signature"],
+ endpoint.secret, // from the webhook endpoint's `secret` field
+);
+```
+
+## Retry Behavior
+
+When your endpoint returns a non-2xx status, Strimulator retries delivery. Failed deliveries and their status are visible in the dashboard.
+
+## Managing Webhooks from the Dashboard
+
+Open http://localhost:12111/dashboard and go to the **Webhooks** tab to:
+
+- View registered webhook endpoints
+- See delivery history and status
+- Retry failed deliveries
+```
+
+- [ ] **Step 3: Create `docs/content/docs/guides/test-clocks.mdx`**
+
+```mdx
+---
+title: Test Clocks
+description: Simulate time advancement for subscription billing
+---
+
+Test clocks let you simulate the passage of time to test subscription lifecycle events — billing cycles, trial expirations, and period transitions.
+
+## Creating a Test Clock
+
+```typescript
+const clock = await stripe.testHelpers.testClocks.create({
+ frozen_time: Math.floor(Date.now() / 1000),
+ name: "Billing test",
+});
+```
+
+## Linking a Subscription to a Clock
+
+Create a customer with `test_clock`, then create subscriptions on that customer:
+
+```typescript
+const customer = await stripe.customers.create({
+ email: "test@example.com",
+ test_clock: clock.id,
+});
+
+const subscription = await stripe.subscriptions.create({
+ customer: customer.id,
+ items: [{ price: priceId }],
+});
+```
+
+## Advancing Time
+
+Move the clock forward to trigger billing events:
+
+```typescript
+await stripe.testHelpers.testClocks.advance(clock.id, {
+ frozen_time: clock.frozen_time + 30 * 24 * 60 * 60, // +30 days
+});
+```
+
+When advanced, Strimulator processes billing cycles for linked subscriptions:
+
+- Rolls subscription periods forward
+- Creates and finalizes invoices
+- Processes payments (creates charges)
+- Handles trial-to-active transitions
+
+## Dashboard
+
+You can also advance test clocks from the dashboard's **Actions** panel without writing code.
+```
+
+- [ ] **Step 4: Create `docs/content/docs/guides/3ds-simulation.mdx`**
+
+```mdx
+---
+title: 3D Secure Simulation
+description: Simulate 3DS authentication challenges in payment flows
+---
+
+Strimulator supports simulating 3D Secure (3DS) authentication challenges for testing payment flows that require additional verification.
+
+## Triggering 3DS
+
+Use the magic token `tok_threeDSecureRequired` (a payment method with last4 `3220`) to trigger `requires_action` status on confirm:
+
+```typescript
+const paymentIntent = await stripe.paymentIntents.create({
+ amount: 2000,
+ currency: "usd",
+ payment_method: "tok_threeDSecureRequired",
+ confirm: true,
+});
+
+console.log(paymentIntent.status); // "requires_action"
+console.log(paymentIntent.next_action?.type); // "use_stripe_sdk"
+```
+
+## Completing the 3DS Challenge
+
+Re-confirm the payment intent to simulate the user completing the 3DS challenge:
+
+```typescript
+const completed = await stripe.paymentIntents.confirm(paymentIntent.id);
+console.log(completed.status); // "succeeded"
+```
+
+## Flow Summary
+
+```
+Create PI with tok_threeDSecureRequired + confirm: true
+ → status: "requires_action"
+ → next_action: { type: "use_stripe_sdk" }
+
+Re-confirm the PI
+ → status: "succeeded"
+ → charge created
+```
+```
+
+- [ ] **Step 5: Create `docs/content/docs/guides/dashboard.mdx`**
+
+```mdx
+---
+title: Dashboard
+description: Real-time debug interface for monitoring and testing
+---
+
+Strimulator includes a built-in debug dashboard at http://localhost:12111/dashboard.
+
+## Activity Feed
+
+Live stream of all API requests showing method, path, status code, and timing. Uses Server-Sent Events (SSE) for real-time updates.
+
+## Resource Explorer
+
+Browse all stored objects by type. Click any object to view its full JSON representation.
+
+## Actions Panel
+
+Trigger simulated scenarios without writing code:
+
+| Action | Description |
+|--------|-------------|
+| **Fail Next Payment** | Force the next PaymentIntent confirmation to fail (`card_declined`, `insufficient_funds`, `expired_card`) |
+| **Advance Test Clock** | Move a test clock forward in time, triggering subscription transitions |
+| **Retry Webhook** | Re-deliver an event to a webhook endpoint |
+| **Expire Payment Intent** | Force a PaymentIntent into canceled state |
+| **Cycle Subscription** | Advance a subscription to the next billing period |
+
+## Webhooks Tab
+
+View registered webhook endpoints, delivery history, and retry failed deliveries.
+
+## Access
+
+The dashboard is not auth-protected — it's designed for local development use only.
+```
+
+- [ ] **Step 6: Create `docs/content/docs/guides/idempotency.mdx`**
+
+```mdx
+---
+title: Idempotency
+description: How Idempotency-Key works in Strimulator
+---
+
+Strimulator supports the `Idempotency-Key` header on POST requests, matching Stripe's behavior.
+
+## How It Works
+
+Send an `Idempotency-Key` header with any POST request. If the same key is sent again, Strimulator returns the cached response instead of creating a duplicate resource.
+
+```bash
+curl -X POST http://localhost:12111/v1/customers \
+ -H "Authorization: Bearer sk_test_123" \
+ -H "Idempotency-Key: unique-key-123" \
+ -d "email=test@example.com"
+
+# Same key → same response, no duplicate customer
+curl -X POST http://localhost:12111/v1/customers \
+ -H "Authorization: Bearer sk_test_123" \
+ -H "Idempotency-Key: unique-key-123" \
+ -d "email=test@example.com"
+```
+
+## SDK Usage
+
+The Stripe SDK automatically generates idempotency keys for most create operations. You can also specify one explicitly:
+
+```typescript
+const customer = await stripe.customers.create(
+ { email: "test@example.com" },
+ { idempotencyKey: "unique-key-123" },
+);
+```
+
+## Behavior
+
+- Keys are scoped to the API key and endpoint
+- Cached responses are returned with the same status code and body
+- Only POST requests support idempotency keys
+- Keys are stored in-memory (or SQLite depending on `STRIMULATOR_DB_PATH`)
+```
+
+- [ ] **Step 7: Verify the docs build**
+
+Run: `cd docs && bun run build`
+Expected: Build succeeds with all guide pages in the sidebar
+
+- [ ] **Step 8: Commit**
+
+```bash
+git add docs/content/docs/guides/
+git commit -m "Add documentation guide pages"
+```
+
+---
+
+### Task 5: Create Architecture / Contributing pages
+
+**Files:**
+- Create: `docs/content/docs/architecture/meta.json`
+- Create: `docs/content/docs/architecture/overview.mdx`
+- Create: `docs/content/docs/architecture/request-lifecycle.mdx`
+- Create: `docs/content/docs/architecture/services.mdx`
+- Create: `docs/content/docs/architecture/contributing.mdx`
+
+- [ ] **Step 1: Create `docs/content/docs/architecture/meta.json`**
+
+```json
+{
+ "title": "Architecture",
+ "pages": ["overview", "request-lifecycle", "services", "contributing"]
+}
+```
+
+- [ ] **Step 2: Create `docs/content/docs/architecture/overview.mdx`**
+
+```mdx
+---
+title: Architecture Overview
+description: How Strimulator is built
+---
+
+Strimulator emulates Stripe's REST API over HTTP using Elysia (Bun's web framework) + SQLite via Drizzle ORM. It returns real `Stripe.*` types from the official `stripe` npm package.
+
+## Tech Stack
+
+| Component | Technology |
+|-----------|-----------|
+| Runtime | [Bun](https://bun.sh) |
+| Framework | [ElysiaJS](https://elysiajs.com) |
+| Database | SQLite via [Drizzle ORM](https://orm.drizzle.team) + bun:sqlite |
+| Types | Imported from [`stripe`](https://www.npmjs.com/package/stripe) npm package |
+| Dashboard | [Preact](https://preactjs.com) + [HTM](https://github.com/developit/htm) |
+| Testing | bun:test |
+
+## Project Structure
+
+```
+src/
+ routes/ # ElysiaJS route plugins (one per Stripe resource)
+ services/ # Business logic and state machines
+ db/schema/ # Drizzle ORM table definitions
+ middleware/ # Auth, idempotency, form parsing, request logging
+ dashboard/ # Debug dashboard (API + Preact SPA)
+ lib/ # Shared utilities (IDs, pagination, expand, search)
+ errors/ # Stripe-compatible error factory
+tests/
+ unit/ # Service-layer tests
+ integration/ # HTTP request/response tests
+ sdk/ # Tests using the official stripe npm package
+```
+
+## Key Design Decisions
+
+- **Stripe type fidelity:** Services return `Stripe.*` types directly from the official package, ensuring response shapes always match real Stripe.
+- **Synchronous DB:** bun:sqlite is synchronous, so services are synchronous. Routes are async only for body parsing and expansion.
+- **In-memory by default:** Using `:memory:` SQLite for ephemeral storage makes tests fast and isolated. File-backed persistence is opt-in.
+- **Single process:** No external dependencies — one binary, one port, everything included.
+```
+
+- [ ] **Step 3: Create `docs/content/docs/architecture/request-lifecycle.mdx`**
+
+```mdx
+---
+title: Request Lifecycle
+description: How an HTTP request flows through Strimulator
+---
+
+Every API request passes through a middleware chain before reaching the route handler:
+
+```
+HTTP request
+ → apiKeyAuth (validates Bearer sk_test_*)
+ → idempotencyMiddleware (caches POST responses by Idempotency-Key header)
+ → requestLogger (emits to globalBus for dashboard SSE)
+ → route handler
+ → parseStripeBody() (decodes x-www-form-urlencoded with bracket notation)
+ → service method (DB read/write, state validation)
+ → eventService.emit() (triggers webhook delivery)
+ → response
+```
+
+## Middleware
+
+### API Key Auth
+
+Validates the `Authorization: Bearer sk_test_*` header. Any key starting with `sk_test_` is accepted — Strimulator doesn't verify specific keys.
+
+Source: `src/middleware/api-key-auth.ts`
+
+### Idempotency
+
+Caches POST responses keyed by the `Idempotency-Key` header. Replay requests return the cached response without re-executing the handler.
+
+Source: `src/middleware/idempotency.ts`
+
+### Request Logger
+
+Emits every request to the global event bus for the dashboard's live activity feed via SSE.
+
+Source: `src/middleware/request-logger.ts`
+
+### Form Parser
+
+Decodes `application/x-www-form-urlencoded` bodies with Stripe's bracket notation (`metadata[key]=value`, `items[0][price]=...`).
+
+Source: `src/middleware/form-parser.ts`
+
+## Route → Service → Response
+
+Routes are Elysia plugin factories that:
+
+1. Parse the form-encoded body with `parseStripeBody()`
+2. Call the appropriate service method
+3. Emit events via `eventService.emit()` (triggers webhook delivery)
+4. Return the Stripe-typed response
+
+## Expansion
+
+Routes that support `?expand[]=field` use `applyExpand()` with a config mapping field names to resolver functions. Supports nested expansion via dot notation (`expand[]=latest_invoice.payment_intent`).
+
+Source: `src/lib/expand.ts`
+
+## Pagination
+
+All list endpoints use cursor-based pagination via `created` timestamp and `starting_after` parameter. Returns `{ object: "list", data: [...], has_more: boolean }`.
+
+Source: `src/lib/pagination.ts`
+```
+
+- [ ] **Step 4: Create `docs/content/docs/architecture/services.mdx`**
+
+```mdx
+---
+title: Services
+description: Business logic layer and state machines
+---
+
+Services are classes in `src/services/` that encapsulate all business logic. Each service takes `StrimulatorDB` in the constructor and returns `Stripe.*` types.
+
+## Pattern
+
+```typescript
+class CustomerService {
+ constructor(private db: StrimulatorDB) {}
+
+ create(params: CreateParams): Stripe.Customer {
+ // Validate, insert to DB, build shape, return
+ }
+
+ retrieve(id: string): Stripe.Customer {
+ // Query DB, build shape, return (or throw 404)
+ }
+}
+```
+
+Each resource has a `build*Shape()` function that constructs the full Stripe object. The full JSON is stored in a `data` text column; key fields are indexed separately for queries.
+
+## State Machines
+
+Resources with lifecycle states validate transitions with `stateTransitionError()`:
+
+### Payment Intents
+
+```
+requires_payment_method → requires_confirmation → requires_action → succeeded
+ → canceled
+```
+
+### Setup Intents
+
+```
+requires_payment_method → requires_confirmation → succeeded
+ → canceled
+```
+
+### Subscriptions
+
+```
+trialing → active → past_due → canceled
+ → canceled
+```
+
+### Invoices
+
+```
+draft → open → paid
+ → void
+```
+
+## Event Emission
+
+Services with state changes emit events via an optional `EventService` dependency:
+
+```typescript
+this.eventService?.emit("payment_intent.succeeded", paymentIntent);
+```
+
+`EventService.emit()` persists the event to DB and synchronously notifies listeners. `WebhookDeliveryService` is registered as a listener and delivers to matching webhook endpoints with HMAC-SHA256 signatures.
+
+## Search
+
+Search endpoints load all rows and filter in-memory via `parseSearchQuery()` / `matchesCondition()`. Supports Stripe's query language:
+
+- `email:"foo@bar.com"` — exact match
+- `status~"act"` — contains
+- `metadata["key"]:"value"` — metadata search
+- Combine with `AND`
+```
+
+- [ ] **Step 5: Create `docs/content/docs/architecture/contributing.mdx`**
+
+```mdx
+---
+title: Contributing
+description: Development setup and guidelines for contributors
+---
+
+## Development Setup
+
+```bash
+git clone https://github.com/codeforge-tech/strimulator.git
+cd strimulator
+bun install
+bun run dev # Start with watch mode
+```
+
+## Running Tests
+
+```bash
+bun test # Run all tests (unit + integration + SDK)
+bun test tests/unit/ # Run unit tests only
+bun test tests/sdk/ # Run SDK tests only
+bun test tests/integration/customers.test.ts # Single file
+bun x tsc --noEmit # Type check
+```
+
+## Adding a New Resource
+
+1. **Schema:** Create `src/db/schema/.ts` with the Drizzle table definition
+2. **Service:** Create `src/services/.ts` with a class that takes `StrimulatorDB`
+3. **Routes:** Create `src/routes/.ts` as an Elysia plugin factory
+4. **Wire up:** Register routes in `src/app.ts`
+5. **Tests:** Add unit tests in `tests/unit/` and SDK tests in `tests/sdk/`
+
+## Conventions
+
+- **IDs:** Generated via `generateId(type)` with crypto.randomBytes. Each type has a prefix (`cus_`, `pi_`, `sub_`, etc.) defined in `src/lib/id-generator.ts`.
+- **Body format:** Always `application/x-www-form-urlencoded` with bracket notation. Use `parseStripeBody()`.
+- **Soft deletes:** Use a `deleted` integer flag (0/1), never hard-delete.
+- **No conventional commits:** Write clear descriptions, don't prefix with `feat:`, `fix:`, etc.
+
+## Database Migrations
+
+```bash
+bun run db:generate # Generate migration from schema changes
+bun run db:migrate # Apply migrations
+```
+```
+
+- [ ] **Step 6: Verify the docs build**
+
+Run: `cd docs && bun run build`
+Expected: Build succeeds with all architecture pages in the sidebar
+
+- [ ] **Step 7: Commit**
+
+```bash
+git add docs/content/docs/architecture/
+git commit -m "Add architecture and contributing documentation"
+```
+
+---
+
+### Task 6: Create OpenAPI spec
+
+**Files:**
+- Create: `docs/openapi.json`
+
+- [ ] **Step 1: Create `docs/openapi.json`**
+
+Write a complete OpenAPI 3.1 spec covering all 13 resources with their endpoints. The spec must include:
+
+- `info` with title "Strimulator API", version "1.0.0"
+- `servers` pointing to `http://localhost:12111`
+- `security` with bearer auth (`sk_test_*`)
+- All paths from the route analysis:
+ - **Customers:** POST/GET/DELETE `/v1/customers`, GET `/v1/customers/search`, GET/POST/DELETE `/v1/customers/{id}`
+ - **Products:** POST/GET `/v1/products`, GET/POST/DELETE `/v1/products/{id}`
+ - **Prices:** POST/GET `/v1/prices`, GET/POST `/v1/prices/{id}`
+ - **Payment Methods:** POST/GET `/v1/payment_methods`, GET `/v1/payment_methods/{id}`, POST attach/detach
+ - **Payment Intents:** POST/GET `/v1/payment_intents`, GET search, GET/POST `/{id}`, POST confirm/capture/cancel
+ - **Setup Intents:** POST/GET `/v1/setup_intents`, GET `/{id}`, POST confirm/cancel
+ - **Charges:** GET `/v1/charges`, GET `/{id}`
+ - **Refunds:** POST/GET `/v1/refunds`, GET `/{id}`
+ - **Subscriptions:** POST/GET `/v1/subscriptions`, GET search, GET/POST `/{id}`, DELETE `/{id}`
+ - **Invoices:** POST/GET `/v1/invoices`, GET search, GET `/{id}`, POST finalize/pay/void
+ - **Events:** GET `/v1/events`, GET `/{id}`
+ - **Webhook Endpoints:** POST/GET `/v1/webhook_endpoints`, GET/DELETE `/{id}`
+ - **Test Clocks:** POST/GET `/v1/test_helpers/test_clocks`, GET/DELETE `/{id}`, POST advance
+- Request bodies using `application/x-www-form-urlencoded`
+- Response schemas matching Stripe object shapes
+- Pagination query parameters (`limit`, `starting_after`, `ending_before`)
+- Search query parameters (`query`, `limit`)
+- Expand query parameter (`expand[]`)
+- Error response schema
+- Tags grouping endpoints by resource
+
+The spec file will be large (~2000+ lines). Write the complete spec with all endpoints, parameters, and schemas. Each path operation needs: summary, tags, parameters, requestBody (for POST), responses (200 with schema, 400/401/404 error shapes).
+
+Use `$ref` for shared components: pagination params, list response wrapper, search response wrapper, error response, and common Stripe object schemas.
+
+- [ ] **Step 2: Validate the spec**
+
+Run: `cd docs && bunx @redocly/cli lint openapi.json`
+Expected: No errors (warnings are acceptable)
+
+- [ ] **Step 3: Commit**
+
+```bash
+git add docs/openapi.json
+git commit -m "Add OpenAPI 3.1 spec for all Strimulator endpoints"
+```
+
+---
+
+### Task 7: Set up Fumadocs OpenAPI integration and generate API docs
+
+**Files:**
+- Create: `docs/lib/openapi.ts`
+- Create: `docs/components/api-page.tsx`
+- Create: `docs/components/api-page.client.tsx`
+- Create: `docs/scripts/generate-docs.ts`
+- Create: `docs/content/docs/api/meta.json`
+- Modify: `docs/components/mdx.tsx` (add APIPage component)
+
+- [ ] **Step 1: Create `docs/lib/openapi.ts`**
+
+```ts
+import { createOpenAPI } from 'fumadocs-openapi/server';
+
+export const openapi = createOpenAPI({
+ input: ['./openapi.json'],
+});
+```
+
+- [ ] **Step 2: Create `docs/components/api-page.tsx`**
+
+```tsx
+import { openapi } from '@/lib/openapi';
+import { createAPIPage } from 'fumadocs-openapi/ui';
+import client from './api-page.client';
+
+export const APIPage = createAPIPage(openapi, {
+ client,
+});
+```
+
+- [ ] **Step 3: Create `docs/components/api-page.client.tsx`**
+
+```tsx
+'use client';
+import { defineClientConfig } from 'fumadocs-openapi/ui/client';
+
+export default defineClientConfig({});
+```
+
+- [ ] **Step 4: Modify `docs/components/mdx.tsx` to include APIPage**
+
+```tsx
+import defaultMdxComponents from 'fumadocs-ui/mdx';
+import { APIPage } from '@/components/api-page';
+import type { MDXComponents } from 'mdx/types';
+
+export function getMDXComponents(): MDXComponents {
+ return {
+ ...defaultMdxComponents,
+ APIPage,
+ };
+}
+```
+
+- [ ] **Step 5: Create `docs/content/docs/api/meta.json`**
+
+```json
+{
+ "title": "API Reference"
+}
+```
+
+- [ ] **Step 6: Create `docs/scripts/generate-docs.ts`**
+
+```ts
+import { generateFiles } from 'fumadocs-openapi';
+import { openapi } from '@/lib/openapi';
+
+void generateFiles({
+ input: openapi,
+ output: './content/docs/api',
+ includeDescription: true,
+});
+```
+
+- [ ] **Step 7: Generate the API docs**
+
+Run: `cd docs && bun run generate`
+Expected: MDX files created in `docs/content/docs/api/` for each resource group
+
+- [ ] **Step 8: Verify the full docs build**
+
+Run: `cd docs && bun run build`
+Expected: Build succeeds with all pages — getting started, guides, API reference, architecture
+
+- [ ] **Step 9: Commit**
+
+```bash
+git add docs/lib/openapi.ts docs/components/ docs/scripts/ docs/content/docs/api/
+git commit -m "Add OpenAPI integration and auto-generated API reference"
+```
+
+---
+
+### Task 8: Final verification and dev experience
+
+**Files:**
+- Modify: root `README.md` (add link to docs)
+
+- [ ] **Step 1: Start the docs dev server and verify**
+
+Run: `cd docs && bun run dev`
+Expected: Dev server starts, visit http://localhost:3000 — verify:
+- Landing page renders
+- Sidebar shows all sections (Getting Started, Guides, API Reference, Architecture)
+- Navigation works between pages
+- API reference pages render with interactive parameter tables
+- Dark mode toggle works
+- Search works
+
+- [ ] **Step 2: Add docs link to root README.md**
+
+Add a "Documentation" link to the header section of the root README.md pointing to the docs.
+
+- [ ] **Step 3: Add `.gitignore` for docs**
+
+Create `docs/.gitignore`:
+
+```
+.next/
+node_modules/
+.source/
+```
+
+- [ ] **Step 4: Final commit**
+
+```bash
+git add docs/.gitignore README.md
+git commit -m "Add docs gitignore and link documentation from README"
+```
diff --git a/docs/superpowers/specs/2026-04-10-fumadocs-documentation-design.md b/docs/superpowers/specs/2026-04-10-fumadocs-documentation-design.md
new file mode 100644
index 0000000..59cf4dd
--- /dev/null
+++ b/docs/superpowers/specs/2026-04-10-fumadocs-documentation-design.md
@@ -0,0 +1,142 @@
+# Fumadocs Documentation — Design Spec
+
+## Overview
+
+Add a beautiful, auto-generated documentation site to Strimulator using Fumadocs (Next.js). The docs live in `docs/` as a monorepo setup. API reference pages are auto-generated from an OpenAPI spec extracted from the codebase.
+
+## Content Areas
+
+### 1. Getting Started
+- **Installation** — bun/npm/docker install, environment variables
+- **Quick Start** — spin up Strimulator, make first API call
+- **Connecting the Stripe SDK** — configure official `stripe` npm package to point at Strimulator
+
+### 2. API Reference (auto-generated)
+All 13 resources with endpoints, parameters, response shapes, and code examples:
+- Customers, Products, Prices
+- Payment Intents, Payment Methods, Charges, Refunds
+- Setup Intents, Subscriptions, Invoices
+- Events, Webhook Endpoints, Test Clocks
+
+Generated from an OpenAPI spec via `fumadocs-openapi`.
+
+### 3. Guides
+- **Webhooks** — registering endpoints, HMAC verification, retry behavior
+- **Test Clocks** — creating clocks, advancing time, billing cycle simulation
+- **3DS Simulation** — triggering `requires_action`, completing 3DS challenges
+- **Dashboard** — activity feed, resource explorer, actions panel
+- **Idempotency** — how idempotency keys work in Strimulator
+
+### 4. Architecture / Contributing
+- **Overview** — tech stack, project structure
+- **Request Lifecycle** — middleware chain, body parsing, expansion, events
+- **Services** — service pattern, state machines, DB conventions
+- **Contributing** — dev setup, running tests, adding new resources
+
+## Directory Structure
+
+```
+docs/
+ package.json # Next.js + Fumadocs deps
+ next.config.mjs
+ source.config.ts # Fumadocs content source
+ tsconfig.json
+ content/docs/
+ index.mdx # Docs landing page
+ meta.json # Root navigation order
+ getting-started/
+ meta.json
+ installation.mdx
+ quick-start.mdx
+ connecting-sdk.mdx
+ guides/
+ meta.json
+ webhooks.mdx
+ test-clocks.mdx
+ 3ds-simulation.mdx
+ dashboard.mdx
+ idempotency.mdx
+ api/
+ meta.json
+ (auto-generated MDX files from OpenAPI spec)
+ architecture/
+ meta.json
+ overview.mdx
+ request-lifecycle.mdx
+ services.mdx
+ contributing.mdx
+ app/
+ layout.tsx # Root layout with Fumadocs provider
+ (docs)/
+ [[...slug]]/
+ page.tsx # Docs page renderer
+ api/
+ (auto-generated API page components)
+ openapi.json # Generated OpenAPI spec
+ scripts/
+ generate-openapi.ts # Builds openapi.json from route/service analysis
+ generate-docs.ts # Runs fumadocs-openapi to produce MDX from spec
+```
+
+## Technical Approach
+
+### OpenAPI Spec Generation
+
+A TypeScript script (`docs/scripts/generate-openapi.ts`) constructs an OpenAPI 3.1 spec by:
+- Defining each of the 13 resources and their endpoints
+- Documenting request parameters (path params, query params, form-encoded body fields)
+- Documenting response schemas matching Stripe object shapes
+- Including authentication requirements (Bearer `sk_test_*`)
+- Documenting error response shapes
+
+This is a hand-maintained script that mirrors the route definitions — not runtime introspection. When routes change, the script is updated and re-run.
+
+### Fumadocs OpenAPI Integration
+
+Uses `fumadocs-openapi` package:
+1. `createOpenAPI()` loads the spec in server components
+2. `generateFiles()` script produces MDX files in `content/docs/api/`
+3. API pages render with interactive parameter tables, request/response examples, and code snippets
+
+### Fumadocs UI
+
+- Default Fumadocs UI theme (`fumadocs-ui`)
+- Project branding: title "Strimulator", description, optional logo
+- Built-in full-text search
+- Dark mode support
+- Responsive layout
+- Syntax-highlighted code blocks
+
+### Package Manager
+
+Bun — consistent with the main project.
+
+### Dev Workflow
+
+```bash
+cd docs
+bun install
+bun run dev # Start Fumadocs dev server
+bun run build # Production build
+bun run generate # Regenerate API docs from OpenAPI spec
+```
+
+## Key Decisions
+
+| Decision | Choice | Rationale |
+|----------|--------|-----------|
+| Framework | Fumadocs (Next.js) | Best UI, OpenAPI integration, TypeScript-native |
+| Location | `docs/` monorepo | Docs stay in sync with code |
+| API docs | Auto-generated from OpenAPI spec | 13 resources with many endpoints — manual is unsustainable |
+| OpenAPI generation | Hand-maintained script | More control than runtime introspection, simpler than decorators |
+| Package manager | Bun | Consistent with main project |
+| i18n | None | English only |
+| Search | Built-in Fumadocs search | No external service needed |
+
+## Out of Scope
+
+- Custom domain / deployment (can be added later)
+- Internationalization
+- Blog section
+- Versioned docs (single version for now)
+- Interactive API playground with live Strimulator instance
diff --git a/docs/tsconfig.json b/docs/tsconfig.json
index 1b5ad52..e2a2cc1 100644
--- a/docs/tsconfig.json
+++ b/docs/tsconfig.json
@@ -1,7 +1,11 @@
{
"compilerOptions": {
"target": "ESNext",
- "lib": ["dom", "dom.iterable", "esnext"],
+ "lib": [
+ "dom",
+ "dom.iterable",
+ "esnext"
+ ],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
@@ -13,11 +17,25 @@
"isolatedModules": true,
"jsx": "preserve",
"incremental": true,
- "plugins": [{ "name": "next" }],
+ "plugins": [
+ {
+ "name": "next"
+ }
+ ],
"paths": {
- "@/*": ["./*"]
+ "@/*": [
+ "./*"
+ ]
}
},
- "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".source/**/*.ts"],
- "exclude": ["node_modules"]
+ "include": [
+ "**/*.ts",
+ "**/*.tsx",
+ ".source/**/*.ts",
+ "next-env.d.ts",
+ ".next/types/**/*.ts"
+ ],
+ "exclude": [
+ "node_modules"
+ ]
}
From 9d6cf19735d3838e390eab254a13589d1a658177 Mon Sep 17 00:00:00 2001
From: Segfault <5221072+Segfaultd@users.noreply.github.com>
Date: Fri, 10 Apr 2026 10:46:04 +0200
Subject: [PATCH 09/10] Update README: fix test count (496), add docs section
and tech stack entry
---
README.md | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 2a72c29..b20b76a 100644
--- a/README.md
+++ b/README.md
@@ -26,7 +26,7 @@ Strimulator is a drop-in local replacement for the Stripe API. It runs as a sing
- **Full control** — Trigger payment failures, advance subscriptions, simulate edge cases from the dashboard
- **SDK-compatible** — Point the official `stripe` package at localhost and it just works
- **Docker-ready** — Drop it into your docker-compose alongside Postgres, Redis, Firebase emulator, etc.
-- **464 tests** — Strict fidelity to Stripe's API shapes, state machines, and error formats
+- **496 tests** — Strict fidelity to Stripe's API shapes, state machines, and error formats
## Getting Started
@@ -276,8 +276,21 @@ tests/
unit/ # Service-layer tests
integration/ # HTTP request/response tests
sdk/ # Tests using the official stripe npm package
+docs/ # Fumadocs documentation site (Next.js)
```
+## Documentation
+
+Full documentation is available in the `docs/` directory. To run it locally:
+
+```bash
+cd docs
+bun install
+bun run dev
+```
+
+Then open http://localhost:3000 for the docs site with Getting Started guides, API reference, and architecture documentation.
+
## Tech Stack
- **Runtime:** [Bun](https://bun.sh)
@@ -285,7 +298,8 @@ tests/
- **Database:** SQLite via [Drizzle ORM](https://orm.drizzle.team) + bun:sqlite
- **Types:** Imported from the [`stripe`](https://www.npmjs.com/package/stripe) npm package
- **Dashboard:** [Preact](https://preactjs.com) + [HTM](https://github.com/developit/htm) (loaded from CDN)
-- **Testing:** bun:test (464 tests)
+- **Testing:** bun:test (496 tests)
+- **Documentation:** [Fumadocs](https://fumadocs.dev) + OpenAPI
## License
From 20595cc3af33f58e7e6bef73142ad85404571701 Mon Sep 17 00:00:00 2001
From: Segfault <5221072+Segfaultd@users.noreply.github.com>
Date: Fri, 10 Apr 2026 10:54:29 +0200
Subject: [PATCH 10/10] Add GitHub Pages deployment with static export
- Configure Next.js static export (output: 'export')
- Add docs.yml workflow: builds on push to main (docs/** paths), deploys to GitHub Pages
- Add out/ to docs .gitignore
---
.github/workflows/docs.yml | 49 ++++++++++++++++++++++++++++++++++++++
docs/.gitignore | 1 +
docs/next.config.mjs | 4 +++-
3 files changed, 53 insertions(+), 1 deletion(-)
create mode 100644 .github/workflows/docs.yml
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
new file mode 100644
index 0000000..90409b8
--- /dev/null
+++ b/.github/workflows/docs.yml
@@ -0,0 +1,49 @@
+name: Deploy Docs
+
+on:
+ push:
+ branches: [main]
+ paths:
+ - 'docs/**'
+ workflow_dispatch:
+
+permissions:
+ contents: read
+ pages: write
+ id-token: write
+
+concurrency:
+ group: pages
+ cancel-in-progress: false
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+
+ - uses: oven-sh/setup-bun@v2
+ with:
+ bun-version: latest
+
+ - name: Install dependencies
+ run: cd docs && bun install --frozen-lockfile
+
+ - name: Build static site
+ run: cd docs && bun run build
+
+ - name: Upload artifact
+ uses: actions/upload-pages-artifact@v3
+ with:
+ path: docs/out
+
+ deploy:
+ needs: build
+ runs-on: ubuntu-latest
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ steps:
+ - name: Deploy to GitHub Pages
+ id: deployment
+ uses: actions/deploy-pages@v4
diff --git a/docs/.gitignore b/docs/.gitignore
index 92a014f..0bae005 100644
--- a/docs/.gitignore
+++ b/docs/.gitignore
@@ -1,3 +1,4 @@
.next/
node_modules/
.source/
+out/
diff --git a/docs/next.config.mjs b/docs/next.config.mjs
index fa8526b..4d126f1 100644
--- a/docs/next.config.mjs
+++ b/docs/next.config.mjs
@@ -3,6 +3,8 @@ import { createMDX } from 'fumadocs-mdx/next';
const withMDX = createMDX();
/** @type {import('next').NextConfig} */
-const config = {};
+const config = {
+ output: 'export',
+};
export default withMDX(config);