@stacksjs/defaults 0.70.207 → 0.70.208

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (408) hide show
  1. package/TODO.md +21 -0
  2. package/ai/AGENTS.md +79 -0
  3. package/ai/README.md +45 -0
  4. package/ai/claude/launch.json +12 -0
  5. package/ai/skills/stacks-actions/SKILL.md +128 -0
  6. package/ai/skills/stacks-ai/SKILL.md +276 -0
  7. package/ai/skills/stacks-alias/SKILL.md +94 -0
  8. package/ai/skills/stacks-analytics/SKILL.md +91 -0
  9. package/ai/skills/stacks-api/SKILL.md +738 -0
  10. package/ai/skills/stacks-arrays/SKILL.md +277 -0
  11. package/ai/skills/stacks-auth/SKILL.md +422 -0
  12. package/ai/skills/stacks-auto-imports/SKILL.md +138 -0
  13. package/ai/skills/stacks-brandkit/SKILL.md +811 -0
  14. package/ai/skills/stacks-browse/SKILL.md +127 -0
  15. package/ai/skills/stacks-browse/scripts/browse.ts +492 -0
  16. package/ai/skills/stacks-browser/SKILL.md +145 -0
  17. package/ai/skills/stacks-buddy/SKILL.md +676 -0
  18. package/ai/skills/stacks-build/SKILL.md +163 -0
  19. package/ai/skills/stacks-cache/SKILL.md +125 -0
  20. package/ai/skills/stacks-calendar/SKILL.md +113 -0
  21. package/ai/skills/stacks-chat/SKILL.md +371 -0
  22. package/ai/skills/stacks-cli/SKILL.md +112 -0
  23. package/ai/skills/stacks-cloud/SKILL.md +192 -0
  24. package/ai/skills/stacks-cms/SKILL.md +217 -0
  25. package/ai/skills/stacks-collections/SKILL.md +82 -0
  26. package/ai/skills/stacks-commerce/SKILL.md +114 -0
  27. package/ai/skills/stacks-composables/SKILL.md +161 -0
  28. package/ai/skills/stacks-config/SKILL.md +144 -0
  29. package/ai/skills/stacks-configuration/SKILL.md +154 -0
  30. package/ai/skills/stacks-cron/SKILL.md +123 -0
  31. package/ai/skills/stacks-crosswind/SKILL.md +190 -0
  32. package/ai/skills/stacks-dashboard/SKILL.md +173 -0
  33. package/ai/skills/stacks-database/SKILL.md +286 -0
  34. package/ai/skills/stacks-datetime/SKILL.md +269 -0
  35. package/ai/skills/stacks-dependencies/SKILL.md +111 -0
  36. package/ai/skills/stacks-deploy/SKILL.md +102 -0
  37. package/ai/skills/stacks-design-brutalist/SKILL.md +110 -0
  38. package/ai/skills/stacks-design-minimalist/SKILL.md +115 -0
  39. package/ai/skills/stacks-design-output/SKILL.md +55 -0
  40. package/ai/skills/stacks-design-soft/SKILL.md +156 -0
  41. package/ai/skills/stacks-design-taste/SKILL.md +1012 -0
  42. package/ai/skills/stacks-design-taste-codex/SKILL.md +294 -0
  43. package/ai/skills/stacks-desktop/SKILL.md +78 -0
  44. package/ai/skills/stacks-development/SKILL.md +298 -0
  45. package/ai/skills/stacks-dns/SKILL.md +149 -0
  46. package/ai/skills/stacks-docs/SKILL.md +109 -0
  47. package/ai/skills/stacks-email/SKILL.md +236 -0
  48. package/ai/skills/stacks-enums/SKILL.md +100 -0
  49. package/ai/skills/stacks-env/SKILL.md +181 -0
  50. package/ai/skills/stacks-error-handling/SKILL.md +137 -0
  51. package/ai/skills/stacks-events/SKILL.md +228 -0
  52. package/ai/skills/stacks-faker/SKILL.md +158 -0
  53. package/ai/skills/stacks-git/SKILL.md +158 -0
  54. package/ai/skills/stacks-guard/SKILL.md +98 -0
  55. package/ai/skills/stacks-health/SKILL.md +75 -0
  56. package/ai/skills/stacks-http/SKILL.md +316 -0
  57. package/ai/skills/stacks-i18n/SKILL.md +198 -0
  58. package/ai/skills/stacks-image-to-code/SKILL.md +629 -0
  59. package/ai/skills/stacks-imagegen-mobile/SKILL.md +1474 -0
  60. package/ai/skills/stacks-imagegen-web/SKILL.md +998 -0
  61. package/ai/skills/stacks-investigate/SKILL.md +119 -0
  62. package/ai/skills/stacks-jobs/SKILL.md +136 -0
  63. package/ai/skills/stacks-lint/SKILL.md +184 -0
  64. package/ai/skills/stacks-listeners/SKILL.md +99 -0
  65. package/ai/skills/stacks-logging/SKILL.md +78 -0
  66. package/ai/skills/stacks-mail/SKILL.md +120 -0
  67. package/ai/skills/stacks-middleware/SKILL.md +249 -0
  68. package/ai/skills/stacks-migrations/SKILL.md +105 -0
  69. package/ai/skills/stacks-models/SKILL.md +267 -0
  70. package/ai/skills/stacks-new-feature/SKILL.md +206 -0
  71. package/ai/skills/stacks-notifications/SKILL.md +210 -0
  72. package/ai/skills/stacks-objects/SKILL.md +205 -0
  73. package/ai/skills/stacks-office-hours/SKILL.md +134 -0
  74. package/ai/skills/stacks-orm/SKILL.md +342 -0
  75. package/ai/skills/stacks-path/SKILL.md +118 -0
  76. package/ai/skills/stacks-payments/SKILL.md +373 -0
  77. package/ai/skills/stacks-plan-review/SKILL.md +152 -0
  78. package/ai/skills/stacks-plugins/SKILL.md +149 -0
  79. package/ai/skills/stacks-push/SKILL.md +376 -0
  80. package/ai/skills/stacks-query-builder/SKILL.md +128 -0
  81. package/ai/skills/stacks-queue/SKILL.md +559 -0
  82. package/ai/skills/stacks-realtime/SKILL.md +442 -0
  83. package/ai/skills/stacks-redesign/SKILL.md +182 -0
  84. package/ai/skills/stacks-registry/SKILL.md +58 -0
  85. package/ai/skills/stacks-repl/SKILL.md +80 -0
  86. package/ai/skills/stacks-retro/SKILL.md +122 -0
  87. package/ai/skills/stacks-review/SKILL.md +135 -0
  88. package/ai/skills/stacks-router/SKILL.md +231 -0
  89. package/ai/skills/stacks-routes/SKILL.md +105 -0
  90. package/ai/skills/stacks-scaffolding/SKILL.md +162 -0
  91. package/ai/skills/stacks-scheduler/SKILL.md +363 -0
  92. package/ai/skills/stacks-search-engine/SKILL.md +112 -0
  93. package/ai/skills/stacks-security/SKILL.md +129 -0
  94. package/ai/skills/stacks-security-audit/SKILL.md +128 -0
  95. package/ai/skills/stacks-server/SKILL.md +458 -0
  96. package/ai/skills/stacks-shell/SKILL.md +62 -0
  97. package/ai/skills/stacks-slug/SKILL.md +87 -0
  98. package/ai/skills/stacks-sms/SKILL.md +385 -0
  99. package/ai/skills/stacks-socials/SKILL.md +303 -0
  100. package/ai/skills/stacks-storage/SKILL.md +576 -0
  101. package/ai/skills/stacks-strings/SKILL.md +416 -0
  102. package/ai/skills/stacks-stx/SKILL.md +176 -0
  103. package/ai/skills/stacks-technical-diagrams/LICENSE +22 -0
  104. package/ai/skills/stacks-technical-diagrams/SKILL.md +290 -0
  105. package/ai/skills/stacks-technical-diagrams/agents/openai.yaml +4 -0
  106. package/ai/skills/stacks-technical-diagrams/assets/template.html +1252 -0
  107. package/ai/skills/stacks-technical-diagrams/bin/technical-diagrams.mjs +289 -0
  108. package/ai/skills/stacks-technical-diagrams/bunfig.toml +1 -0
  109. package/ai/skills/stacks-technical-diagrams/examples/agent-run.lifecycle.json +64 -0
  110. package/ai/skills/stacks-technical-diagrams/examples/agent-tool-call.workflow.json +88 -0
  111. package/ai/skills/stacks-technical-diagrams/examples/cache-miss-request.sequence.json +75 -0
  112. package/ai/skills/stacks-technical-diagrams/examples/product-analytics.dataflow.json +70 -0
  113. package/ai/skills/stacks-technical-diagrams/examples/web-app.architecture.json +41 -0
  114. package/ai/skills/stacks-technical-diagrams/renderers/architecture/grid.mjs +62 -0
  115. package/ai/skills/stacks-technical-diagrams/renderers/architecture/render-architecture.mjs +371 -0
  116. package/ai/skills/stacks-technical-diagrams/renderers/dataflow/README.md +82 -0
  117. package/ai/skills/stacks-technical-diagrams/renderers/dataflow/render-dataflow.mjs +295 -0
  118. package/ai/skills/stacks-technical-diagrams/renderers/lifecycle/README.md +91 -0
  119. package/ai/skills/stacks-technical-diagrams/renderers/lifecycle/render-lifecycle.mjs +384 -0
  120. package/ai/skills/stacks-technical-diagrams/renderers/sequence/README.md +84 -0
  121. package/ai/skills/stacks-technical-diagrams/renderers/sequence/render-sequence.mjs +257 -0
  122. package/ai/skills/stacks-technical-diagrams/renderers/shared/cli.mjs +42 -0
  123. package/ai/skills/stacks-technical-diagrams/renderers/shared/generated-validators.mjs +13 -0
  124. package/ai/skills/stacks-technical-diagrams/renderers/shared/geometry.mjs +230 -0
  125. package/ai/skills/stacks-technical-diagrams/renderers/shared/layout-report.mjs +40 -0
  126. package/ai/skills/stacks-technical-diagrams/renderers/shared/utils.mjs +88 -0
  127. package/ai/skills/stacks-technical-diagrams/renderers/shared/validator.mjs +40 -0
  128. package/ai/skills/stacks-technical-diagrams/renderers/workflow/README.md +103 -0
  129. package/ai/skills/stacks-technical-diagrams/renderers/workflow/render-workflow.mjs +481 -0
  130. package/ai/skills/stacks-technical-diagrams/schemas/README.md +68 -0
  131. package/ai/skills/stacks-technical-diagrams/schemas/architecture.schema.json +121 -0
  132. package/ai/skills/stacks-technical-diagrams/schemas/common.schema.json +43 -0
  133. package/ai/skills/stacks-technical-diagrams/schemas/dataflow.schema.json +221 -0
  134. package/ai/skills/stacks-technical-diagrams/schemas/lifecycle.schema.json +241 -0
  135. package/ai/skills/stacks-technical-diagrams/schemas/sequence.schema.json +186 -0
  136. package/ai/skills/stacks-technical-diagrams/schemas/workflow.schema.json +332 -0
  137. package/ai/skills/stacks-technical-diagrams/scripts/check-render-output.mjs +297 -0
  138. package/ai/skills/stacks-technical-diagrams/scripts/render-examples.mjs +28 -0
  139. package/ai/skills/stacks-testing/SKILL.md +129 -0
  140. package/ai/skills/stacks-tunnel/SKILL.md +125 -0
  141. package/ai/skills/stacks-types/SKILL.md +178 -0
  142. package/ai/skills/stacks-ui/SKILL.md +246 -0
  143. package/ai/skills/stacks-utils/SKILL.md +444 -0
  144. package/ai/skills/stacks-validation/SKILL.md +371 -0
  145. package/ai/skills/stacks-whois/SKILL.md +315 -0
  146. package/assets/world-map-data.ts +121 -0
  147. package/bootstrap.ts +114 -0
  148. package/docs/api-examples.md +46 -0
  149. package/docs/index.md +24 -0
  150. package/docs/markdown-examples.md +87 -0
  151. package/functions/analytics.ts +97 -0
  152. package/functions/api.ts +143 -0
  153. package/functions/auth.ts +208 -0
  154. package/functions/billing/payments.ts +149 -0
  155. package/functions/blog.ts +120 -0
  156. package/functions/cms/categorizables.ts +107 -0
  157. package/functions/cms/pages.ts +108 -0
  158. package/functions/cms/posts.ts +100 -0
  159. package/functions/cms/taggables.ts +102 -0
  160. package/functions/commerce/coupons.ts +128 -0
  161. package/functions/commerce/customers.ts +128 -0
  162. package/functions/commerce/gift-cards.ts +119 -0
  163. package/functions/commerce/orders.ts +112 -0
  164. package/functions/commerce/payments.ts +119 -0
  165. package/functions/commerce/products/categories.ts +123 -0
  166. package/functions/commerce/products/manufacturers.ts +123 -0
  167. package/functions/commerce/products/products.ts +123 -0
  168. package/functions/commerce/products/reviews.ts +123 -0
  169. package/functions/commerce/products/units.ts +123 -0
  170. package/functions/commerce/products/variants.ts +123 -0
  171. package/functions/commerce/shippings/delivery-routes.ts +123 -0
  172. package/functions/commerce/shippings/digital-deliveries.ts +119 -0
  173. package/functions/commerce/shippings/drivers.ts +123 -0
  174. package/functions/commerce/shippings/license-keys.ts +123 -0
  175. package/functions/commerce/shippings/shipping-methods.ts +123 -0
  176. package/functions/commerce/shippings/shipping-rates.ts +119 -0
  177. package/functions/commerce/shippings/shipping-zones.ts +119 -0
  178. package/functions/commerce/taxes.ts +119 -0
  179. package/functions/commerce/waitlist/products.ts +123 -0
  180. package/functions/commerce/waitlist/restaurants.ts +123 -0
  181. package/functions/craft.ts +107 -0
  182. package/functions/dashboard.ts +153 -0
  183. package/functions/inbox.ts +95 -0
  184. package/functions/jobs.ts +86 -0
  185. package/functions/monitoring/errors.ts +295 -0
  186. package/functions/queue.ts +111 -0
  187. package/functions/realtime/websockets.ts +96 -0
  188. package/functions/realtime.ts +52 -0
  189. package/functions/releases.ts +49 -0
  190. package/functions/search.ts +126 -0
  191. package/functions/toasts.ts +95 -0
  192. package/functions/uploads.ts +216 -0
  193. package/ide/.gitignore +4 -0
  194. package/ide/cursor/rules/auto-imports.mdc +574 -0
  195. package/ide/cursor/rules/code-style.mdc +12 -0
  196. package/ide/cursor/rules/documentation.mdc +9 -0
  197. package/ide/cursor/rules/error-handling-validation.mdc +11 -0
  198. package/ide/cursor/rules/key-conventions.mdc +11 -0
  199. package/ide/cursor/rules/project-structure.mdc +169 -0
  200. package/ide/cursor/rules/readme.mdc +318 -0
  201. package/ide/cursor/rules/syntax-formatting.mdc +9 -0
  202. package/ide/cursor/rules/testing.mdc +10 -0
  203. package/ide/cursor/rules/typescript.mdc +9 -0
  204. package/ide/cursor/rules/ui-styling.mdc +0 -0
  205. package/ide/dictionary.txt +397 -0
  206. package/ide/jetbrains/.fleet/settings.json +4 -0
  207. package/ide/jetbrains/.idea/.gitignore +5 -0
  208. package/ide/jetbrains/.idea/.name +1 -0
  209. package/ide/jetbrains/.idea/inspectionProfiles/Project_Default.xml +6 -0
  210. package/ide/jetbrains/.idea/jsLinters/eslint.xml +7 -0
  211. package/ide/jetbrains/.idea/modules.xml +8 -0
  212. package/ide/jetbrains/.idea/stacks.iml +22 -0
  213. package/ide/jetbrains/.idea/vcs.xml +6 -0
  214. package/ide/jetbrains/.idea/webResources.xml +14 -0
  215. package/ide/jetbrains/IntelliJ IDEA Global Settings +0 -0
  216. package/ide/jetbrains/installed.txt +4 -0
  217. package/ide/jetbrains/options/github-copilot.xml +5 -0
  218. package/ide/jetbrains/options/nodejs.xml +7 -0
  219. package/ide/jetbrains/options/templates.xml +124 -0
  220. package/ide/jetbrains/templates/JavaScript.xml +6 -0
  221. package/ide/jetbrains/templates/Stacks.xml +8 -0
  222. package/ide/vscode/.vscode/README.md +23 -0
  223. package/ide/vscode/.vscode/extensions.json +5 -0
  224. package/ide/vscode/.vscode/settings.json +176 -0
  225. package/ide/vscode/.vscode/stacks.code-snippets +181 -0
  226. package/ide/vscode/LICENSE.md +21 -0
  227. package/ide/vscode/README.md +36 -0
  228. package/ide/vscode/logo.png +0 -0
  229. package/ide/vscode/package.json +79 -0
  230. package/ide/zed/.zed/settings.json +139 -0
  231. package/lang/README.md +28 -0
  232. package/lang/de.yml +14 -0
  233. package/lang/en.yml +15 -0
  234. package/package.json +19 -3
  235. package/project/bootstrap +161 -0
  236. package/project/buddy +175 -0
  237. package/project/storage/framework/tsconfig.app.json +50 -0
  238. package/project/storage/framework/tsconfig.base.json +58 -0
  239. package/routes/core.ts +78 -0
  240. package/routes/dashboard-api.ts +233 -0
  241. package/routes/dashboard.ts +739 -0
  242. package/routes/email.ts +129 -0
  243. package/stores/[name].stx +16 -0
  244. package/stores/git.ts +71 -0
  245. package/stores/payment.ts +474 -0
  246. package/stores/queue.ts +43 -0
  247. package/stores/user.ts +29 -0
  248. package/stx-components-plugin.ts +25 -0
  249. package/styles/design-tokens.css +597 -0
  250. package/types/dashboard.ts +70 -0
  251. package/types/defaults.ts +438 -0
  252. package/vcs/github/CODE_OF_CONDUCT.md +83 -0
  253. package/vcs/github/CONTRIBUTING.md +187 -0
  254. package/vcs/github/EXPLANATIONS.md +41 -0
  255. package/vcs/github/FUNDING.yml +1 -0
  256. package/vcs/github/ISSUE_TEMPLATE/bug_report.yml +49 -0
  257. package/vcs/github/ISSUE_TEMPLATE/config.yml +10 -0
  258. package/vcs/github/ISSUE_TEMPLATE/feature_request.yml +44 -0
  259. package/vcs/github/SECURITY.md +70 -0
  260. package/vcs/github/renovate.json +5 -0
  261. package/vcs/github/stale.yml +14 -0
  262. package/vcs/github/workflows/README.md +16 -0
  263. package/vcs/github/workflows/ci.yml +114 -0
  264. package/vcs/github/workflows/export-size.yml +25 -0
  265. package/vcs/github/workflows/labeler.yml +13 -0
  266. package/vcs/github/workflows/release.yml +219 -0
  267. package/views/[...all].stx +8 -0
  268. package/views/about.md +3 -0
  269. package/views/auth/login.stx +1 -0
  270. package/views/auth/signup.stx +85 -0
  271. package/views/dashboard/.discovered-models.json +542 -0
  272. package/views/dashboard/AUDIT.md +904 -0
  273. package/views/dashboard/[...all].stx +89 -0
  274. package/views/dashboard/access-tokens/index.stx +177 -0
  275. package/views/dashboard/actions/index.stx +129 -0
  276. package/views/dashboard/analytics/blog/index.stx +356 -0
  277. package/views/dashboard/analytics/browsers/index.stx +263 -0
  278. package/views/dashboard/analytics/commerce/sales/index.stx +329 -0
  279. package/views/dashboard/analytics/commerce/web/index.stx +379 -0
  280. package/views/dashboard/analytics/countries/index.stx +289 -0
  281. package/views/dashboard/analytics/devices/index.stx +305 -0
  282. package/views/dashboard/analytics/events/index.stx +536 -0
  283. package/views/dashboard/analytics/index.stx +88 -0
  284. package/views/dashboard/analytics/marketing/index.stx +315 -0
  285. package/views/dashboard/analytics/pages/index.stx +271 -0
  286. package/views/dashboard/analytics/referrers/index.stx +319 -0
  287. package/views/dashboard/analytics/web/index.stx +356 -0
  288. package/views/dashboard/buddy/index.stx +198 -0
  289. package/views/dashboard/ci/index.stx +462 -0
  290. package/views/dashboard/cloud/index.stx +452 -0
  291. package/views/dashboard/commands/index.stx +295 -0
  292. package/views/dashboard/commerce/categories/index.stx +406 -0
  293. package/views/dashboard/commerce/coupons/index.stx +485 -0
  294. package/views/dashboard/commerce/customers/index.stx +410 -0
  295. package/views/dashboard/commerce/dashboard/index.stx +287 -0
  296. package/views/dashboard/commerce/delivery/delivery-routes.stx +305 -0
  297. package/views/dashboard/commerce/delivery/digital-delivery.stx +332 -0
  298. package/views/dashboard/commerce/delivery/drivers.stx +397 -0
  299. package/views/dashboard/commerce/delivery/index.stx +18 -0
  300. package/views/dashboard/commerce/delivery/license-keys.stx +380 -0
  301. package/views/dashboard/commerce/delivery/shipping-methods.stx +346 -0
  302. package/views/dashboard/commerce/delivery/shipping-rates.stx +338 -0
  303. package/views/dashboard/commerce/delivery/shipping-zones.stx +302 -0
  304. package/views/dashboard/commerce/delivery/tabs.ts +25 -0
  305. package/views/dashboard/commerce/gift-cards/index.stx +561 -0
  306. package/views/dashboard/commerce/manufacturers/index.stx +308 -0
  307. package/views/dashboard/commerce/orders/index.stx +247 -0
  308. package/views/dashboard/commerce/payments/index.stx +535 -0
  309. package/views/dashboard/commerce/pos/index.stx +653 -0
  310. package/views/dashboard/commerce/printers/devices/index.stx +273 -0
  311. package/views/dashboard/commerce/printers/receipts/index.stx +308 -0
  312. package/views/dashboard/commerce/products/detail.stx +563 -0
  313. package/views/dashboard/commerce/products/index.stx +370 -0
  314. package/views/dashboard/commerce/reviews/index.stx +656 -0
  315. package/views/dashboard/commerce/reviews/index.ts +0 -0
  316. package/views/dashboard/commerce/taxes/index.stx +377 -0
  317. package/views/dashboard/commerce/units/index.stx +317 -0
  318. package/views/dashboard/commerce/variants/index.stx +319 -0
  319. package/views/dashboard/commerce/waitlist/products.stx +942 -0
  320. package/views/dashboard/commerce/waitlist/restaurant.stx +1024 -0
  321. package/views/dashboard/components/index.stx +330 -0
  322. package/views/dashboard/composables/index.ts +19 -0
  323. package/views/dashboard/composables/useChart.ts +77 -0
  324. package/views/dashboard/composables/useNavigation.ts +99 -0
  325. package/views/dashboard/composables/useRole.ts +58 -0
  326. package/views/dashboard/composables/useTheme.ts +74 -0
  327. package/views/dashboard/content/authors/index.stx +171 -0
  328. package/views/dashboard/content/blog/index.stx +493 -0
  329. package/views/dashboard/content/categories/index.stx +169 -0
  330. package/views/dashboard/content/comments/index.stx +189 -0
  331. package/views/dashboard/content/dashboard.stx +383 -0
  332. package/views/dashboard/content/files/index.stx +706 -0
  333. package/views/dashboard/content/pages/index.stx +174 -0
  334. package/views/dashboard/content/posts/index.stx +269 -0
  335. package/views/dashboard/content/seo/index.stx +240 -0
  336. package/views/dashboard/content/tags/index.stx +167 -0
  337. package/views/dashboard/data/activity/index.stx +261 -0
  338. package/views/dashboard/data/dashboard/index.stx +116 -0
  339. package/views/dashboard/data/subscribers.stx +270 -0
  340. package/views/dashboard/data/teams.stx +275 -0
  341. package/views/dashboard/data/users.stx +279 -0
  342. package/views/dashboard/dependencies/index.stx +178 -0
  343. package/views/dashboard/deployments/[id].stx +234 -0
  344. package/views/dashboard/deployments/index.stx +9 -0
  345. package/views/dashboard/dns/index.stx +163 -0
  346. package/views/dashboard/environment/index.stx +283 -0
  347. package/views/dashboard/errors/index.stx +274 -0
  348. package/views/dashboard/forgot-password.stx +57 -0
  349. package/views/dashboard/functions/index.stx +159 -0
  350. package/views/dashboard/health/index.stx +248 -0
  351. package/views/dashboard/inbox/activity.stx +350 -0
  352. package/views/dashboard/inbox/index.stx +452 -0
  353. package/views/dashboard/inbox/settings.stx +290 -0
  354. package/views/dashboard/index.stx +252 -0
  355. package/views/dashboard/insights/index.stx +529 -0
  356. package/views/dashboard/jobs/[id].stx +430 -0
  357. package/views/dashboard/jobs/history.stx +222 -0
  358. package/views/dashboard/jobs/index.stx +214 -0
  359. package/views/dashboard/kanban/[id].stx +899 -0
  360. package/views/dashboard/kanban/index.stx +260 -0
  361. package/views/dashboard/layouts/default.stx +565 -0
  362. package/views/dashboard/layouts/guest.stx +10 -0
  363. package/views/dashboard/login.stx +48 -0
  364. package/views/dashboard/logs/index.stx +540 -0
  365. package/views/dashboard/mailboxes/index.stx +149 -0
  366. package/views/dashboard/management/permissions/index.stx +490 -0
  367. package/views/dashboard/marketing/campaigns/index.stx +604 -0
  368. package/views/dashboard/marketing/lists/index.stx +514 -0
  369. package/views/dashboard/marketing/reviews/index.stx +475 -0
  370. package/views/dashboard/marketing/social-posts/index.stx +560 -0
  371. package/views/dashboard/models/[model].stx +195 -0
  372. package/views/dashboard/models/index.stx +159 -0
  373. package/views/dashboard/monitoring/errors/index.stx +415 -0
  374. package/views/dashboard/notifications/dashboard.stx +383 -0
  375. package/views/dashboard/notifications/email.stx +336 -0
  376. package/views/dashboard/notifications/history.stx +373 -0
  377. package/views/dashboard/notifications/sms.stx +332 -0
  378. package/views/dashboard/packages/index.stx +195 -0
  379. package/views/dashboard/queries/[id].stx +381 -0
  380. package/views/dashboard/queries/history.stx +227 -0
  381. package/views/dashboard/queries/index.stx +335 -0
  382. package/views/dashboard/queries/slow.stx +318 -0
  383. package/views/dashboard/queue/index.stx +427 -0
  384. package/views/dashboard/realtime/index.stx +429 -0
  385. package/views/dashboard/register.stx +46 -0
  386. package/views/dashboard/releases/index.stx +389 -0
  387. package/views/dashboard/requests/index.stx +462 -0
  388. package/views/dashboard/serverless/index.stx +475 -0
  389. package/views/dashboard/servers/[id].stx +299 -0
  390. package/views/dashboard/servers/index.stx +483 -0
  391. package/views/dashboard/settings/billing.stx +50 -0
  392. package/views/dashboard/settings/index.stx +256 -0
  393. package/views/dashboard/settings/mail.stx +252 -0
  394. package/views/dashboard/stores/auth.ts +123 -0
  395. package/views/dashboard/stores/ci.ts +342 -0
  396. package/views/dashboard/stores/index.ts +129 -0
  397. package/views/dashboard/stores/kanban.ts +723 -0
  398. package/views/dashboard/stores/rbac.ts +350 -0
  399. package/views/dashboard/stx.config.ts +34 -0
  400. package/views/dashboard/teams/[id].stx +170 -0
  401. package/views/forum/category.stx +92 -0
  402. package/views/forum/index.stx +209 -0
  403. package/views/forum/new-topic.stx +113 -0
  404. package/views/forum/profile.stx +1 -0
  405. package/views/forum/topic.stx +143 -0
  406. package/views/hello-world/[name].stx +47 -0
  407. package/views/index.stx +21 -0
  408. package/views/system-tray/index.stx +147 -0
@@ -0,0 +1,121 @@
1
+ // This file contains a simplified world map data for ECharts
2
+ // It's a simplified version of the world map GeoJSON data
3
+
4
+ export const world = {
5
+ type: 'FeatureCollection' as const,
6
+ features: [
7
+ // North America
8
+ {
9
+ type: 'Feature' as const,
10
+ id: 'USA',
11
+ properties: { name: 'United States of America' },
12
+ geometry: {
13
+ type: 'MultiPolygon' as const,
14
+ coordinates: [[[[0, 0], [10, 0], [10, 10], [0, 10], [0, 0]]]], // Simplified coordinates
15
+ },
16
+ },
17
+ {
18
+ type: 'Feature' as const,
19
+ id: 'CAN',
20
+ properties: { name: 'Canada' },
21
+ geometry: {
22
+ type: 'MultiPolygon' as const,
23
+ coordinates: [[[[0, 10], [10, 10], [10, 20], [0, 20], [0, 10]]]], // Simplified coordinates
24
+ },
25
+ },
26
+ // Europe
27
+ {
28
+ type: 'Feature' as const,
29
+ id: 'DEU',
30
+ properties: { name: 'Germany' },
31
+ geometry: {
32
+ type: 'Polygon' as const,
33
+ coordinates: [[[-10, 0], [0, 0], [0, 10], [-10, 10], [-10, 0]]], // Simplified coordinates
34
+ },
35
+ },
36
+ {
37
+ type: 'Feature' as const,
38
+ id: 'GBR',
39
+ properties: { name: 'United Kingdom' },
40
+ geometry: {
41
+ type: 'MultiPolygon' as const,
42
+ coordinates: [[[[-15, 5], [-10, 5], [-10, 15], [-15, 15], [-15, 5]]]], // Simplified coordinates
43
+ },
44
+ },
45
+ {
46
+ type: 'Feature' as const,
47
+ id: 'FRA',
48
+ properties: { name: 'France' },
49
+ geometry: {
50
+ type: 'MultiPolygon' as const,
51
+ coordinates: [[[[-15, 0], [-5, 0], [-5, 5], [-15, 5], [-15, 0]]]], // Simplified coordinates
52
+ },
53
+ },
54
+ {
55
+ type: 'Feature' as const,
56
+ id: 'ESP',
57
+ properties: { name: 'Spain' },
58
+ geometry: {
59
+ type: 'Polygon' as const,
60
+ coordinates: [[[-20, -5], [-10, -5], [-10, 0], [-20, 0], [-20, -5]]], // Simplified coordinates
61
+ },
62
+ },
63
+ {
64
+ type: 'Feature' as const,
65
+ id: 'NLD',
66
+ properties: { name: 'Netherlands' },
67
+ geometry: {
68
+ type: 'MultiPolygon' as const,
69
+ coordinates: [[[[-5, 5], [0, 5], [0, 10], [-5, 10], [-5, 5]]]], // Simplified coordinates
70
+ },
71
+ },
72
+ // Asia
73
+ {
74
+ type: 'Feature' as const,
75
+ id: 'IND',
76
+ properties: { name: 'India' },
77
+ geometry: {
78
+ type: 'Polygon' as const,
79
+ coordinates: [[[20, -10], [30, -10], [30, 0], [20, 0], [20, -10]]], // Simplified coordinates
80
+ },
81
+ },
82
+ {
83
+ type: 'Feature' as const,
84
+ id: 'IDN',
85
+ properties: { name: 'Indonesia' },
86
+ geometry: {
87
+ type: 'MultiPolygon' as const,
88
+ coordinates: [[[[20, -20], [30, -20], [30, -15], [20, -15], [20, -20]]]], // Simplified coordinates
89
+ },
90
+ },
91
+ {
92
+ type: 'Feature' as const,
93
+ id: 'JPN',
94
+ properties: { name: 'Japan' },
95
+ geometry: {
96
+ type: 'MultiPolygon' as const,
97
+ coordinates: [[[[35, 0], [40, 0], [40, 10], [35, 10], [35, 0]]]], // Simplified coordinates
98
+ },
99
+ },
100
+ // Oceania
101
+ {
102
+ type: 'Feature' as const,
103
+ id: 'AUS',
104
+ properties: { name: 'Australia' },
105
+ geometry: {
106
+ type: 'MultiPolygon' as const,
107
+ coordinates: [[[[20, -30], [30, -30], [30, -20], [20, -20], [20, -30]]]], // Simplified coordinates
108
+ },
109
+ },
110
+ // South America
111
+ {
112
+ type: 'Feature' as const,
113
+ id: 'BRA',
114
+ properties: { name: 'Brazil' },
115
+ geometry: {
116
+ type: 'Polygon' as const,
117
+ coordinates: [[[-10, -20], [0, -20], [0, -10], [-10, -10], [-10, -20]]], // Simplified coordinates
118
+ },
119
+ },
120
+ ],
121
+ }
package/bootstrap.ts ADDED
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Framework Bootstrap
3
+ *
4
+ * Single source of truth for which framework packages are wired into
5
+ * boot. Each entry below either:
6
+ *
7
+ * 1. Imports a framework package whose `index.ts` self-registers via
8
+ * `route.register(...)` on import — analogous to the service
9
+ * provider pattern other frameworks (competitors) use to give
10
+ * packages a chance to wire themselves up at boot. This is the
11
+ * preferred shape for packages that own their own routes,
12
+ * migrations, etc.
13
+ *
14
+ * 2. Registers a framework routes file directly via `route.register()`
15
+ * — used when a routes file isn't yet wrapped in its own package.
16
+ *
17
+ * Adding a new framework package? Add a line here. There is no
18
+ * filesystem scanning, no auto-discovery: this file is the entire
19
+ * grep-able answer to "what does the framework load on boot?".
20
+ *
21
+ * @see storage/framework/core/router/src/route-loader.ts:loadFrameworkRoutes
22
+ */
23
+
24
+ import { feature } from '@stacksjs/config'
25
+ import { frameworkPath } from '@stacksjs/path'
26
+ import { route } from '@stacksjs/router'
27
+ import MaintenanceMiddleware from './app/Middleware/Maintenance'
28
+
29
+ // RBAC: wire the bun-query-builder-backed store so `hasRole(user, …)` and
30
+ // friends from `@stacksjs/auth` actually hit the database (otherwise every
31
+ // call throws "RBAC store not configured"). The store is a thin adapter
32
+ // over the `roles` / `permissions` / `user_roles` / `user_permissions` /
33
+ // `role_permissions` tables created by migrations 0000000101–0000000105.
34
+ // Registered unconditionally because the auth middleware + Role middleware
35
+ // both reach for the helpers at request time regardless of which feature
36
+ // the project opts into.
37
+ // DEFERRED, non-blocking wiring on purpose. This file is dynamically
38
+ // imported by the route loader while other entrypoints (a test file, the
39
+ // API server) may still be mid-way through evaluating the @stacksjs/auth
40
+ // async module graph. With a static `import { setRbacStore } ...`, Bun
41
+ // could execute this module against auth's partially-evaluated record:
42
+ // the exported function exists (hoisted) but rbac.ts's module-level
43
+ // `let store` hadn't initialized, so calling it threw
44
+ // `Cannot access 'store' before initialization`, the whole bootstrap
45
+ // import failed, and EVERY framework default route (auth, 2FA, passkeys,
46
+ // dashboard) silently vanished — the loader logs one line and carries
47
+ // on. A blocking `await import('@stacksjs/auth')` here deadlocks instead
48
+ // (auth's evaluation can be waiting on the same route-loading pass that
49
+ // is importing this file), so the wiring is fire-and-forget: routes
50
+ // register immediately, and the RBAC store lands the moment auth's
51
+ // evaluation completes — before any real request needs it.
52
+ import('@stacksjs/auth')
53
+ .then(({ createBqbRbacStore, setRbacStore }) => setRbacStore(createBqbRbacStore()))
54
+ .catch(err => console.error('[bootstrap] RBAC store wiring failed:', err))
55
+
56
+ // Global maintenance / coming-soon gate. Registered first so the
57
+ // `buddy down` / `buddy coming-soon` (and their env-var equivalents)
58
+ // state files intercept every request before any other middleware or
59
+ // route runs.
60
+ //
61
+ // The middleware is a thin wrapper around `maintenanceGate()` in
62
+ // @stacksjs/server, which is also called from the dev server's
63
+ // `onRequest` hook — so dev and prod use one implementation. The gate
64
+ // itself reads `activeSiteModePayload()` so it covers both maintenance
65
+ // and coming-soon modes (plus `APP_MAINTENANCE` / `APP_COMING_SOON`
66
+ // env overrides) without the bootstrap needing to know the details.
67
+ //
68
+ // `toRouterHandler()` adapts the Middleware contract (return void to
69
+ // continue, throw a Response to short-circuit) to bun-router's
70
+ // `(req, next) => Response` shape. Without the adapter, `handle` would
71
+ // return `undefined`, bun-router's chain treats that as a short-circuit
72
+ // to an empty 200, and every route returns `200 OK Content-Length: 0`.
73
+ route.use(MaintenanceMiddleware.toRouterHandler() as any)
74
+
75
+ // Locale cookie + STX-style path redirect (`/locale/en` → `/en/…`).
76
+ // Overridable by registering the same path in app routes first.
77
+ await route.register(frameworkPath('defaults/routes/core.ts'))
78
+
79
+ // Feature-gated route registration. The dashboard.ts file currently bundles
80
+ // ~687 lines covering auth, password reset, email subscribe, storefront
81
+ // cart/checkout, reviews, sitemap, AI, voice, and the admin dashboard's
82
+ // REST surface. Until that file is split per-feature (auth.ts, marketing.ts,
83
+ // commerce.ts, monitoring.ts), the whole thing loads when `dashboard` is
84
+ // activated and stays inert otherwise.
85
+ //
86
+ // Apps that need only a slice — e.g. a marketing site that wants
87
+ // `/api/email/subscribe` and `/api/contact` but not the rest — can either
88
+ // 1. Activate `dashboard` and live with the over-broad register; the
89
+ // action handlers for routes you don't hit never fire, and their
90
+ // models stay un-loaded as long as the corresponding feature flag
91
+ // (`commerce`, `cms`, `monitoring`) is off, so there's no hidden
92
+ // cost beyond the bun-router route-table entries.
93
+ // 2. Define the routes they want directly in `routes/api.ts` —
94
+ // first-registration-wins means the user version takes priority.
95
+ //
96
+ // Once the per-feature route split lands, each `if (feature('X'))` block
97
+ // below registers just the X-specific routes file.
98
+ if (feature('dashboard')) {
99
+ await route.register(frameworkPath('defaults/routes/dashboard.ts'))
100
+ // JSON endpoints for the dev dashboard UI. Kept separate from the view
101
+ // routes above so the data layer is one obvious file to grep.
102
+ await route.register(frameworkPath('defaults/routes/dashboard-api.ts'))
103
+ }
104
+
105
+ // Email webhook + unsubscribe routes (stacksjs/stacks#1881, #1880).
106
+ // Always mounted when the `email` feature is on — the underlying
107
+ // handlers self-disable when their provider credentials aren't
108
+ // configured (they 401 rather than processing). Apps that need a
109
+ // non-default mount path register their own routes in `routes/api.ts`
110
+ // and the framework's mount silently no-ops since user routes
111
+ // register first.
112
+ if (feature('email')) {
113
+ await route.register(frameworkPath('defaults/routes/email.ts'))
114
+ }
@@ -0,0 +1,46 @@
1
+ ---
2
+ title: Runtime Data Examples
3
+ team: Stacks
4
+ outline: deep
5
+ ---
6
+
7
+ # {{ title }}
8
+
9
+ BunPress exposes frontmatter and files from `docs/.data/` directly to the STX render context. No client framework or runtime composable is required.
10
+
11
+ ## Frontmatter
12
+
13
+ **Input**
14
+
15
+ ```md
16
+ ---
17
+ title: Runtime Data Examples
18
+ team: Stacks
19
+ ---
20
+
21
+ # {{ title }}
22
+
23
+ Built by {{ team }}.
24
+ ```
25
+
26
+ **Output**
27
+
28
+ Built by {{ team }}.
29
+
30
+ ## Global data
31
+
32
+ Add `docs/.data/project.json`:
33
+
34
+ ```json
35
+ {
36
+ "repository": "stacksjs/stacks"
37
+ }
38
+ ```
39
+
40
+ The object is available as `project` in Markdown and STX expressions:
41
+
42
+ ```md
43
+ Repository: {{ project.repository }}
44
+ ```
45
+
46
+ See the [BunPress data-loading guide](https://github.com/stacksjs/bunpress/blob/main/docs/advanced.md#data-loading) for loaders and build-time data sources.
package/docs/index.md ADDED
@@ -0,0 +1,24 @@
1
+ ---
2
+ # BunPress home-page frontmatter
3
+ layout: home
4
+
5
+ hero:
6
+ name: "Stacks.js"
7
+ text: "A better developer environment."
8
+ tagline: A rapid development environment for modern web applications & libraries.
9
+ actions:
10
+ - theme: brand
11
+ text: Markdown Examples
12
+ link: /markdown-examples
13
+ - theme: alt
14
+ text: API Examples
15
+ link: /api-examples
16
+
17
+ features:
18
+ - title: Feature A
19
+ details: Lorem ipsum dolor sit amet, consectetur adipiscing elit
20
+ - title: Feature B
21
+ details: Lorem ipsum dolor sit amet, consectetur adipiscing elit
22
+ - title: Feature C
23
+ details: Lorem ipsum dolor sit amet, consectetur adipiscing elit
24
+ ---
@@ -0,0 +1,87 @@
1
+ # Markdown Extension Examples
2
+
3
+ This page demonstrates the built-in Markdown extensions provided by BunPress.
4
+
5
+ ## Syntax Highlighting
6
+
7
+ BunPress provides syntax highlighting powered by [Shiki](https://github.com/shikijs/shiki), with additional features such as line highlighting:
8
+
9
+ **Input**
10
+
11
+ ````md
12
+ ```js{4}
13
+
14
+ export default {
15
+ data () {
16
+ return {
17
+ msg: 'Highlighted!'
18
+ }
19
+ }
20
+ }
21
+
22
+ ```
23
+ ````
24
+
25
+ **Output**
26
+
27
+ ```js{4}
28
+ <script server>
29
+ const message = 'Highlighted!'
30
+ </script>
31
+
32
+ <template>
33
+ <p>{{ message }}</p>
34
+ </template>
35
+ ```
36
+
37
+ ## Custom Containers
38
+
39
+ **Input**
40
+
41
+ ```md
42
+ ::: info
43
+ This is an info box.
44
+ :::
45
+
46
+ ::: tip
47
+ This is a tip.
48
+ :::
49
+
50
+ ::: warning
51
+ This is a warning.
52
+ :::
53
+
54
+ ::: danger
55
+ This is a dangerous warning.
56
+ :::
57
+
58
+ ::: details
59
+ This is a details block.
60
+ :::
61
+ ```
62
+
63
+ **Output**
64
+
65
+ ::: info
66
+ This is an info box.
67
+ :::
68
+
69
+ ::: tip
70
+ This is a tip.
71
+ :::
72
+
73
+ ::: warning
74
+ This is a warning.
75
+ :::
76
+
77
+ ::: danger
78
+ This is a dangerous warning.
79
+ :::
80
+
81
+ ::: details
82
+ This is a details block.
83
+ :::
84
+
85
+ ## More
86
+
87
+ See the [BunPress markdown extensions reference](https://github.com/stacksjs/bunpress/blob/main/docs/markdown-extensions.md) for the complete syntax.
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Analytics Composable
3
+ */
4
+ import { ref } from '@stacksjs/stx'
5
+
6
+ const baseUrl = process.env.VITE_API_URL || `http://localhost:${process.env.PORT_API || '3008'}`
7
+
8
+ export interface AnalyticsOverview {
9
+ realtime: number
10
+ people: number
11
+ views: number
12
+ avgTimeOnSite: string
13
+ bounceRate: string
14
+ eventCompletions: number
15
+ }
16
+
17
+ export interface TrafficDataPoint {
18
+ date: string
19
+ visitors: number
20
+ pageViews: number
21
+ }
22
+
23
+ export interface PageData {
24
+ path: string
25
+ entries: number
26
+ visitors: number
27
+ views: number
28
+ percentage: number
29
+ }
30
+
31
+ export interface ReferrerData {
32
+ name: string
33
+ visitors: number
34
+ views: number
35
+ percentage: number
36
+ }
37
+
38
+ export interface DeviceData {
39
+ name: string
40
+ visitors: number
41
+ percentage: number
42
+ }
43
+
44
+ export interface BrowserData {
45
+ name: string
46
+ visitors: number
47
+ percentage: number
48
+ }
49
+
50
+ export interface CountryData {
51
+ name: string
52
+ visitors: number
53
+ percentage: number
54
+ flag: string
55
+ }
56
+
57
+ export function useAnalytics() {
58
+ const overview = ref<AnalyticsOverview>({ realtime: 0, people: 0, views: 0, avgTimeOnSite: '0s', bounceRate: '0%', eventCompletions: 0 })
59
+ const trafficData = ref<TrafficDataPoint[]>([])
60
+ const pagesData = ref<PageData[]>([])
61
+ const referrersData = ref<ReferrerData[]>([])
62
+ const devicesData = ref<DeviceData[]>([])
63
+ const browsersData = ref<BrowserData[]>([])
64
+ const countriesData = ref<CountryData[]>([])
65
+ const isLoading = ref(false)
66
+ const error = ref<string | null>(null)
67
+
68
+ async function fetchAll(dateRange = '7d') {
69
+ isLoading.value = true
70
+ error.value = null
71
+ try {
72
+ const response = await fetch(`${baseUrl}/analytics/web?range=${dateRange}`, {
73
+ headers: { 'Accept': 'application/json' },
74
+ })
75
+ if (response.ok) {
76
+ const data = await response.json()
77
+ overview.value = data.overview || overview.value
78
+ trafficData.value = data.traffic || []
79
+ pagesData.value = data.pages || []
80
+ referrersData.value = data.referrers || []
81
+ devicesData.value = data.devices || []
82
+ browsersData.value = data.browsers || []
83
+ countriesData.value = data.countries || []
84
+ }
85
+ } catch (e) {
86
+ error.value = 'Failed to load analytics data.'
87
+ console.error('Failed to fetch analytics:', e)
88
+ } finally {
89
+ isLoading.value = false
90
+ }
91
+ }
92
+
93
+ return {
94
+ overview, trafficData, pagesData, referrersData, devicesData, browsersData, countriesData,
95
+ isLoading, error, fetchAll,
96
+ }
97
+ }
@@ -0,0 +1,143 @@
1
+ /**
2
+ * API Client for Dashboard
3
+ *
4
+ * Provides a simple fetch wrapper with authentication and error handling.
5
+ */
6
+
7
+ import { useAuth } from './auth'
8
+
9
+ const baseUrl = process.env.VITE_API_URL || `http://localhost:${process.env.PORT_API || '3008'}`
10
+
11
+ export interface ApiResponse<T> {
12
+ data: T
13
+ message?: string
14
+ }
15
+
16
+ export interface ApiError {
17
+ message: string
18
+ errors?: Record<string, string[]>
19
+ }
20
+
21
+ /**
22
+ * Create headers with authentication
23
+ */
24
+ function createHeaders(contentType = 'application/json'): Headers {
25
+ const { getToken } = useAuth()
26
+ const headers = new Headers({
27
+ 'Accept': 'application/json',
28
+ 'Content-Type': contentType,
29
+ })
30
+
31
+ const token = getToken()
32
+ if (token) {
33
+ headers.set('Authorization', `Bearer ${token}`)
34
+ }
35
+
36
+ return headers
37
+ }
38
+
39
+ /**
40
+ * Handle API response
41
+ */
42
+ async function handleResponse<T>(response: Response): Promise<T> {
43
+ if (!response.ok) {
44
+ const error = await response.json().catch(() => ({
45
+ message: `HTTP error! status: ${response.status}`,
46
+ }))
47
+ throw new Error(error.message || `HTTP error! status: ${response.status}`)
48
+ }
49
+
50
+ return response.json() as Promise<T>
51
+ }
52
+
53
+ /**
54
+ * GET request
55
+ */
56
+ export async function get<T>(endpoint: string): Promise<T> {
57
+ const response = await fetch(`${baseUrl}${endpoint}`, {
58
+ method: 'GET',
59
+ headers: createHeaders(),
60
+ })
61
+
62
+ return handleResponse<T>(response)
63
+ }
64
+
65
+ /**
66
+ * POST request
67
+ */
68
+ export async function post<T>(endpoint: string, body?: unknown): Promise<T> {
69
+ const response = await fetch(`${baseUrl}${endpoint}`, {
70
+ method: 'POST',
71
+ headers: createHeaders(),
72
+ body: body ? JSON.stringify(body) : undefined,
73
+ })
74
+
75
+ return handleResponse<T>(response)
76
+ }
77
+
78
+ /**
79
+ * PUT request
80
+ */
81
+ export async function put<T>(endpoint: string, body?: unknown): Promise<T> {
82
+ const response = await fetch(`${baseUrl}${endpoint}`, {
83
+ method: 'PUT',
84
+ headers: createHeaders(),
85
+ body: body ? JSON.stringify(body) : undefined,
86
+ })
87
+
88
+ return handleResponse<T>(response)
89
+ }
90
+
91
+ /**
92
+ * PATCH request
93
+ */
94
+ export async function patch<T>(endpoint: string, body?: unknown): Promise<T> {
95
+ const response = await fetch(`${baseUrl}${endpoint}`, {
96
+ method: 'PATCH',
97
+ headers: createHeaders(),
98
+ body: body ? JSON.stringify(body) : undefined,
99
+ })
100
+
101
+ return handleResponse<T>(response)
102
+ }
103
+
104
+ /**
105
+ * DELETE request
106
+ */
107
+ export async function del<T>(endpoint: string): Promise<T> {
108
+ const response = await fetch(`${baseUrl}${endpoint}`, {
109
+ method: 'DELETE',
110
+ headers: createHeaders(),
111
+ })
112
+
113
+ return handleResponse<T>(response)
114
+ }
115
+
116
+ /**
117
+ * Create a typed API resource helper
118
+ */
119
+ export function createResource<T>(basePath: string) {
120
+ return {
121
+ list: () => get<ApiResponse<T[]>>(basePath),
122
+ get: (id: string | number) => get<ApiResponse<T>>(`${basePath}/${id}`),
123
+ create: (data: Partial<T>) => post<ApiResponse<T>>(basePath, data),
124
+ update: (id: string | number, data: Partial<T>) => put<ApiResponse<T>>(`${basePath}/${id}`, data),
125
+ patch: (id: string | number, data: Partial<T>) => patch<ApiResponse<T>>(`${basePath}/${id}`, data),
126
+ delete: (id: string | number) => del<ApiResponse<void>>(`${basePath}/${id}`),
127
+ }
128
+ }
129
+
130
+ /**
131
+ * API composable
132
+ */
133
+ export function useApi() {
134
+ return {
135
+ get,
136
+ post,
137
+ put,
138
+ patch,
139
+ delete: del,
140
+ createResource,
141
+ baseUrl,
142
+ }
143
+ }