@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,100 @@
1
+ import type { Posts, StorePost } from '../../types/defaults'
2
+ import { useFetch, useStorage } from '@stacksjs/browser'
3
+
4
+ // Create a persistent posts array using STX useStorage
5
+ const posts = useStorage<Posts[]>('posts', [])
6
+
7
+ const baseURL = process.env.VITE_API_URL || `http://localhost:${process.env.PORT_API || '3008'}`
8
+
9
+ // Basic fetch function to get all posts
10
+ async function fetchPosts() {
11
+ const { error, data } = await useFetch(`${baseURL}/cms/posts`).get().json()
12
+
13
+ const postsJson = data.value as Posts[]
14
+ if (error.value) {
15
+ console.error('Error fetching posts:', error.value)
16
+ return []
17
+ }
18
+
19
+ // Ensure data is an array before assigning
20
+ if (Array.isArray(data.value)) {
21
+ posts.value = postsJson
22
+ return data.value
23
+ }
24
+ else {
25
+ console.error('Expected array of posts but received:', typeof data.value)
26
+ return []
27
+ }
28
+ }
29
+
30
+ async function createPost(post: Partial<StorePost>): Promise<Posts | null> {
31
+ const { error, data } = await useFetch(`${baseURL}/cms/posts`)
32
+ .post(JSON.stringify(post))
33
+ .json()
34
+
35
+ if (error.value) {
36
+ console.error('Error creating post:', error.value)
37
+ return null
38
+ }
39
+
40
+ const newPost = data.value as Posts
41
+ if (newPost) {
42
+ posts.value.unshift(newPost)
43
+ return newPost
44
+ }
45
+ return null
46
+ }
47
+
48
+ async function updatePost(id: number, post: Partial<Posts>) {
49
+ const { error, data } = await useFetch(`${baseURL}/cms/posts/${id}`)
50
+ .patch(JSON.stringify({
51
+ ...post,
52
+ author_name: post.author_name,
53
+ author_email: post.author_email,
54
+ }))
55
+ .json()
56
+
57
+ if (error.value) {
58
+ console.error('Error updating post:', error.value)
59
+ return null
60
+ }
61
+
62
+ const updatedPost = data.value as Posts
63
+ if (updatedPost) {
64
+ const index = posts.value.findIndex(p => p.id === id)
65
+ if (index !== -1) {
66
+ posts.value[index] = updatedPost
67
+ }
68
+ return updatedPost
69
+ }
70
+ return null
71
+ }
72
+
73
+ async function deletePost(id: number) {
74
+ const { error } = await useFetch(`${baseURL}/cms/posts/${id}`)
75
+ .delete()
76
+ .json()
77
+
78
+ if (error.value) {
79
+ console.error('Error deleting post:', error.value)
80
+ return false
81
+ }
82
+
83
+ const index = posts.value.findIndex(p => p.id === id)
84
+ if (index !== -1) {
85
+ posts.value.splice(index, 1)
86
+ }
87
+
88
+ return true
89
+ }
90
+
91
+ // Export the composable
92
+ export function usePosts() {
93
+ return {
94
+ posts,
95
+ fetchPosts,
96
+ createPost,
97
+ updatePost,
98
+ deletePost,
99
+ }
100
+ }
@@ -0,0 +1,102 @@
1
+ import type { Taggables } from '../../types/defaults'
2
+ import { useFetch, useStorage } from '@stacksjs/browser'
3
+
4
+ // Create a persistent tags array using STX useStorage
5
+ const taggables = useStorage<Taggables[]>('taggables', [])
6
+
7
+ const baseURL = process.env.VITE_API_URL || `http://localhost:${process.env.PORT_API || '3008'}`
8
+
9
+ // Basic fetch function to get all tags
10
+ async function fetchTaggables(): Promise<Taggables[]> {
11
+ const { error, data } = await useFetch(`${baseURL}/cms/tags`).get().json()
12
+
13
+ const taggablesJson = data.value as Taggables[]
14
+ if (error.value) {
15
+ console.error('Error fetching taggables:', error.value)
16
+ return []
17
+ }
18
+
19
+ // Ensure data is an array before assigning
20
+ if (Array.isArray(data.value)) {
21
+ taggables.value = taggablesJson
22
+
23
+ return taggablesJson
24
+ }
25
+ else {
26
+ console.error('Expected array of taggables but received:', typeof data.value)
27
+ return []
28
+ }
29
+ }
30
+
31
+ async function createTaggable(taggable: Partial<Taggables>) {
32
+ const taggableData = {
33
+ ...taggable,
34
+ taggable_type: 'posts',
35
+ }
36
+
37
+ const { error, data } = await useFetch(`${baseURL}/cms/tags`)
38
+ .post(JSON.stringify(taggableData))
39
+ .json()
40
+
41
+ if (error.value) {
42
+ console.error('Error creating taggable:', error.value)
43
+ return null
44
+ }
45
+
46
+ const newTaggable = data.value as Taggables
47
+ if (newTaggable) {
48
+ taggables.value.push(newTaggable)
49
+ return newTaggable
50
+ }
51
+ return null
52
+ }
53
+
54
+ async function updateTaggable(id: number, taggable: Partial<Taggables>) {
55
+ const { error, data } = await useFetch(`${baseURL}/cms/tags/${id}`)
56
+ .patch(JSON.stringify(taggable))
57
+ .json()
58
+
59
+ if (error.value) {
60
+ console.error('Error updating taggable:', error.value)
61
+ return null
62
+ }
63
+
64
+ const updatedTaggable = data.value as Taggables
65
+ if (updatedTaggable) {
66
+ const index = taggables.value.findIndex(t => t.id === id)
67
+ if (index !== -1) {
68
+ taggables.value[index] = updatedTaggable
69
+ }
70
+ return updatedTaggable
71
+ }
72
+ return null
73
+ }
74
+
75
+ async function deleteTaggable(id: number) {
76
+ const { error } = await useFetch(`${baseURL}/cms/tags/${id}`)
77
+ .delete()
78
+ .json()
79
+
80
+ if (error.value) {
81
+ console.error('Error deleting taggable:', error.value)
82
+ return false
83
+ }
84
+
85
+ const index = taggables.value.findIndex(t => t.id === id)
86
+ if (index !== -1) {
87
+ taggables.value.splice(index, 1)
88
+ }
89
+
90
+ return true
91
+ }
92
+
93
+ // Export the composable
94
+ export function useTaggables() {
95
+ return {
96
+ taggables,
97
+ fetchTaggables,
98
+ createTaggable,
99
+ updateTaggable,
100
+ deleteTaggable,
101
+ }
102
+ }
@@ -0,0 +1,128 @@
1
+ import type { Coupons, NewCoupon } from '../../types/defaults'
2
+ import { useStorage } from '@stacksjs/browser'
3
+ import { pushToast } from '../toasts'
4
+
5
+ // Create a persistent coupons array using STX useStorage
6
+ const coupons = useStorage<Coupons[]>('coupons', [])
7
+
8
+ const baseURL = process.env.VITE_API_URL || `http://localhost:${process.env.PORT_API || '3008'}`
9
+
10
+ // Basic fetch function to get all coupons
11
+ async function fetchCoupons() {
12
+ try {
13
+ const response = await fetch(`${baseURL}/commerce/coupons`)
14
+ if (!response.ok) {
15
+ throw new Error(`HTTP error! status: ${response.status}`)
16
+ }
17
+ const { data } = await response.json() as { data: Coupons[] }
18
+
19
+ if (Array.isArray(data)) {
20
+ // Update both the storage and the reactive ref
21
+ coupons.value = data
22
+
23
+ return data
24
+ }
25
+ else {
26
+ pushToast('error', 'Couldn\'t load coupons', { detail: `Expected array but received ${typeof data}` })
27
+ return []
28
+ }
29
+ }
30
+ catch (error) {
31
+ pushToast('error', 'Couldn\'t load coupons', { detail: String(error) })
32
+ return coupons.value
33
+ }
34
+ }
35
+
36
+ async function createCoupon(coupon: Omit<Coupons, 'id'>) {
37
+ try {
38
+ const response = await fetch(`${baseURL}/commerce/coupons`, {
39
+ method: 'POST',
40
+ headers: {
41
+ 'Content-Type': 'application/json',
42
+ },
43
+ body: JSON.stringify(coupon),
44
+ })
45
+
46
+ if (!response.ok) {
47
+ throw new Error(`HTTP error! status: ${response.status}`)
48
+ }
49
+
50
+ const data = await response.json() as Coupons
51
+ if (data) {
52
+ coupons.value = [...coupons.value, data]
53
+ pushToast('success', 'Coupon created')
54
+ return data
55
+ }
56
+ return null
57
+ }
58
+ catch (error) {
59
+ pushToast('error', 'Failed to create coupon', { detail: String(error) })
60
+ return null
61
+ }
62
+ }
63
+
64
+ async function updateCoupon(id: number, coupon: NewCoupon) {
65
+ try {
66
+ const response = await fetch(`${baseURL}/commerce/coupons/${id}`, {
67
+ method: 'PATCH',
68
+ headers: {
69
+ 'Content-Type': 'application/json',
70
+ },
71
+ body: JSON.stringify(coupon),
72
+ })
73
+
74
+ if (!response.ok) {
75
+ throw new Error(`HTTP error! status: ${response.status}`)
76
+ }
77
+
78
+ const data = await response.json() as Coupons
79
+ if (data) {
80
+ const index = coupons.value.findIndex(c => c.id === coupon.id)
81
+ if (index !== -1) {
82
+ coupons.value = [
83
+ ...coupons.value.slice(0, index),
84
+ data,
85
+ ...coupons.value.slice(index + 1),
86
+ ]
87
+ }
88
+ pushToast('success', 'Coupon updated')
89
+ return data
90
+ }
91
+ return null
92
+ }
93
+ catch (error) {
94
+ pushToast('error', 'Failed to update coupon', { detail: String(error) })
95
+ return null
96
+ }
97
+ }
98
+
99
+ async function deleteCoupon(id: number) {
100
+ try {
101
+ const response = await fetch(`${baseURL}/commerce/coupons/${id}`, {
102
+ method: 'DELETE',
103
+ })
104
+
105
+ if (!response.ok) {
106
+ throw new Error(`HTTP error! status: ${response.status}`)
107
+ }
108
+
109
+ coupons.value = coupons.value.filter(c => c.id !== id)
110
+ pushToast('success', 'Coupon deleted')
111
+ return true
112
+ }
113
+ catch (error) {
114
+ pushToast('error', 'Failed to delete coupon', { detail: String(error) })
115
+ return false
116
+ }
117
+ }
118
+
119
+ // Export the composable
120
+ export function useCoupons() {
121
+ return {
122
+ coupons,
123
+ fetchCoupons,
124
+ createCoupon,
125
+ updateCoupon,
126
+ deleteCoupon,
127
+ }
128
+ }
@@ -0,0 +1,128 @@
1
+ import type { Customers } from '../../types/defaults'
2
+ import { useStorage } from '@stacksjs/browser'
3
+ import { pushToast } from '../toasts'
4
+
5
+ // Create a persistent customers array using STX useStorage
6
+ const customers = useStorage<Customers[]>('customers', [])
7
+
8
+ const baseURL = process.env.VITE_API_URL || `http://localhost:${process.env.PORT_API || '3008'}`
9
+
10
+ // Basic fetch function to get all customers
11
+ async function fetchCustomers() {
12
+ try {
13
+ const response = await fetch(`${baseURL}/commerce/customers`)
14
+ if (!response.ok) {
15
+ throw new Error(`HTTP error! status: ${response.status}`)
16
+ }
17
+ const { data } = await response.json() as { data: Customers[] }
18
+
19
+ if (Array.isArray(data)) {
20
+ // Update both the storage and the reactive ref
21
+ customers.value = data
22
+ return data
23
+ }
24
+ else {
25
+ pushToast('error', 'Couldn\'t load customers', { detail: `Expected array but received ${typeof data}` })
26
+ return []
27
+ }
28
+ }
29
+ catch (error) {
30
+ pushToast('error', 'Couldn\'t load customers', { detail: String(error) })
31
+ // Fall back to whatever we already had cached
32
+ return customers.value
33
+ }
34
+ }
35
+
36
+ async function createCustomer(customer: Omit<Customers, 'id'>) {
37
+ try {
38
+ const response = await fetch(`${baseURL}/commerce/customers`, {
39
+ method: 'POST',
40
+ headers: {
41
+ 'Content-Type': 'application/json',
42
+ },
43
+ body: JSON.stringify(customer),
44
+ })
45
+
46
+ if (!response.ok) {
47
+ throw new Error(`HTTP error! status: ${response.status}`)
48
+ }
49
+
50
+ const { data } = await response.json() as { data: Customers }
51
+ if (data) {
52
+ customers.value = [...customers.value, data]
53
+ pushToast('success', 'Customer created')
54
+ return data
55
+ }
56
+ return null
57
+ }
58
+ catch (error) {
59
+ pushToast('error', 'Failed to create customer', { detail: String(error) })
60
+ return null
61
+ }
62
+ }
63
+
64
+ async function updateCustomer(customer: Customers) {
65
+ try {
66
+ const response = await fetch(`${baseURL}/commerce/customers/${customer.id}`, {
67
+ method: 'PATCH',
68
+ headers: {
69
+ 'Content-Type': 'application/json',
70
+ },
71
+ body: JSON.stringify(customer),
72
+ })
73
+
74
+ if (!response.ok) {
75
+ throw new Error(`HTTP error! status: ${response.status}`)
76
+ }
77
+
78
+ const { data } = await response.json() as { data: Customers }
79
+ if (data) {
80
+ const index = customers.value.findIndex(c => c.id === customer.id)
81
+ if (index !== -1) {
82
+ customers.value = [
83
+ ...customers.value.slice(0, index),
84
+ data,
85
+ ...customers.value.slice(index + 1),
86
+ ]
87
+ }
88
+ pushToast('success', 'Customer updated')
89
+ return data
90
+ }
91
+ return null
92
+ }
93
+ catch (error) {
94
+ pushToast('error', 'Failed to update customer', { detail: String(error) })
95
+ return null
96
+ }
97
+ }
98
+
99
+ async function deleteCustomer(id: number) {
100
+ try {
101
+ const response = await fetch(`${baseURL}/commerce/customers/${id}`, {
102
+ method: 'DELETE',
103
+ })
104
+
105
+ if (!response.ok) {
106
+ throw new Error(`HTTP error! status: ${response.status}`)
107
+ }
108
+
109
+ customers.value = customers.value.filter(c => c.id !== id)
110
+ pushToast('success', 'Customer deleted')
111
+ return true
112
+ }
113
+ catch (error) {
114
+ pushToast('error', 'Failed to delete customer', { detail: String(error) })
115
+ return false
116
+ }
117
+ }
118
+
119
+ // Export the composable
120
+ export function useCustomers() {
121
+ return {
122
+ customers,
123
+ fetchCustomers,
124
+ createCustomer,
125
+ updateCustomer,
126
+ deleteCustomer,
127
+ }
128
+ }
@@ -0,0 +1,119 @@
1
+ import type { GiftCards } from '../../types/defaults'
2
+ import { useStorage } from '@stacksjs/browser'
3
+ import { pushToast } from '../toasts'
4
+
5
+ // Create a persistent gift cards array using STX useStorage
6
+ const giftCards = useStorage<GiftCards[]>('giftCards', [])
7
+
8
+ const baseURL = process.env.VITE_API_URL || `http://localhost:${process.env.PORT_API || '3008'}`
9
+
10
+ async function fetchGiftCards(): Promise<GiftCards[]> {
11
+ try {
12
+ const response = await fetch(`${baseURL}/commerce/gift-cards`)
13
+ if (!response.ok) {
14
+ throw new Error(`HTTP error! status: ${response.status}`)
15
+ }
16
+ const data = await response.json() as GiftCards[]
17
+
18
+ if (Array.isArray(data)) {
19
+ giftCards.value = data
20
+ return data
21
+ }
22
+ else {
23
+ pushToast('error', 'Couldn\'t load gift cards', { detail: `Expected array but received ${typeof data}` })
24
+ return []
25
+ }
26
+ }
27
+ catch (error) {
28
+ pushToast('error', 'Couldn\'t load gift cards', { detail: String(error) })
29
+ return giftCards.value
30
+ }
31
+ }
32
+
33
+ async function createGiftCard(giftCard: GiftCards): Promise<GiftCards | null> {
34
+ try {
35
+ const response = await fetch(`${baseURL}/commerce/gift-cards`, {
36
+ method: 'POST',
37
+ headers: { 'Content-Type': 'application/json' },
38
+ body: JSON.stringify(giftCard),
39
+ })
40
+
41
+ if (!response.ok) {
42
+ throw new Error(`HTTP error! status: ${response.status}`)
43
+ }
44
+
45
+ const data = await response.json() as GiftCards
46
+ if (data) {
47
+ giftCards.value.push(data)
48
+ pushToast('success', 'Gift card created')
49
+ return data
50
+ }
51
+ return null
52
+ }
53
+ catch (error) {
54
+ pushToast('error', 'Failed to create gift card', { detail: String(error) })
55
+ return null
56
+ }
57
+ }
58
+
59
+ async function updateGiftCard(giftCard: GiftCards): Promise<GiftCards | null> {
60
+ try {
61
+ const response = await fetch(`${baseURL}/commerce/gift-cards/${giftCard.id}`, {
62
+ method: 'PATCH',
63
+ headers: { 'Content-Type': 'application/json' },
64
+ body: JSON.stringify(giftCard),
65
+ })
66
+
67
+ if (!response.ok) {
68
+ throw new Error(`HTTP error! status: ${response.status}`)
69
+ }
70
+
71
+ const data = await response.json() as GiftCards
72
+ if (data) {
73
+ const index = giftCards.value.findIndex(g => g.id === giftCard.id)
74
+ if (index !== -1) {
75
+ giftCards.value[index] = data
76
+ }
77
+ pushToast('success', 'Gift card updated')
78
+ return data
79
+ }
80
+ return null
81
+ }
82
+ catch (error) {
83
+ pushToast('error', 'Failed to update gift card', { detail: String(error) })
84
+ return null
85
+ }
86
+ }
87
+
88
+ async function deleteGiftCard(id: number): Promise<boolean> {
89
+ try {
90
+ const response = await fetch(`${baseURL}/commerce/gift-cards/${id}`, {
91
+ method: 'DELETE',
92
+ })
93
+
94
+ if (!response.ok) {
95
+ throw new Error(`HTTP error! status: ${response.status}`)
96
+ }
97
+
98
+ const index = giftCards.value.findIndex(g => g.id === id)
99
+ if (index !== -1) {
100
+ giftCards.value.splice(index, 1)
101
+ }
102
+ pushToast('success', 'Gift card deleted')
103
+ return true
104
+ }
105
+ catch (error) {
106
+ pushToast('error', 'Failed to delete gift card', { detail: String(error) })
107
+ return false
108
+ }
109
+ }
110
+
111
+ export function useGiftCards() {
112
+ return {
113
+ giftCards,
114
+ fetchGiftCards,
115
+ createGiftCard,
116
+ updateGiftCard,
117
+ deleteGiftCard,
118
+ }
119
+ }
@@ -0,0 +1,112 @@
1
+ import type { Orders } from '../../types/defaults'
2
+ import { useStorage } from '@stacksjs/browser'
3
+ import { pushToast } from '../toasts'
4
+
5
+ // Create a persistent orders array using STX useStorage
6
+ const orders = useStorage<Orders[]>('orders', [])
7
+
8
+ const baseURL = process.env.VITE_API_URL || `http://localhost:${process.env.PORT_API || '3008'}`
9
+
10
+ async function fetchOrders(): Promise<Orders[]> {
11
+ try {
12
+ const response = await fetch(`${baseURL}/commerce/orders`)
13
+ if (!response.ok) {
14
+ throw new Error(`HTTP error! status: ${response.status}`)
15
+ }
16
+ const { data } = await response.json() as { data: Orders[] }
17
+ orders.value = data
18
+ return data
19
+ }
20
+ catch (error) {
21
+ pushToast('error', 'Couldn\'t load orders', { detail: String(error) })
22
+ return orders.value
23
+ }
24
+ }
25
+
26
+ async function createOrder(order: Orders) {
27
+ try {
28
+ const response = await fetch(`${baseURL}/commerce/orders`, {
29
+ method: 'POST',
30
+ headers: { 'Content-Type': 'application/json' },
31
+ body: JSON.stringify(order),
32
+ })
33
+
34
+ if (!response.ok) {
35
+ throw new Error(`HTTP error! status: ${response.status}`)
36
+ }
37
+
38
+ const data = await response.json() as Orders
39
+ if (data) {
40
+ orders.value.push(data)
41
+ pushToast('success', 'Order created')
42
+ return data
43
+ }
44
+ return null
45
+ }
46
+ catch (error) {
47
+ pushToast('error', 'Failed to create order', { detail: String(error) })
48
+ return null
49
+ }
50
+ }
51
+
52
+ async function updateOrder(order: Orders) {
53
+ try {
54
+ const response = await fetch(`${baseURL}/commerce/orders/${order.id}`, {
55
+ method: 'PATCH',
56
+ headers: { 'Content-Type': 'application/json' },
57
+ body: JSON.stringify(order),
58
+ })
59
+
60
+ if (!response.ok) {
61
+ throw new Error(`HTTP error! status: ${response.status}`)
62
+ }
63
+
64
+ const data = await response.json() as Orders
65
+ if (data) {
66
+ const index = orders.value.findIndex(o => o.id === order.id)
67
+ if (index !== -1) {
68
+ orders.value[index] = data
69
+ }
70
+ pushToast('success', 'Order updated')
71
+ return data
72
+ }
73
+ return null
74
+ }
75
+ catch (error) {
76
+ pushToast('error', 'Failed to update order', { detail: String(error) })
77
+ return null
78
+ }
79
+ }
80
+
81
+ async function deleteOrder(id: number) {
82
+ try {
83
+ const response = await fetch(`${baseURL}/commerce/orders/${id}`, {
84
+ method: 'DELETE',
85
+ })
86
+
87
+ if (!response.ok) {
88
+ throw new Error(`HTTP error! status: ${response.status}`)
89
+ }
90
+
91
+ const index = orders.value.findIndex(o => o.id === id)
92
+ if (index !== -1) {
93
+ orders.value.splice(index, 1)
94
+ }
95
+ pushToast('success', 'Order deleted')
96
+ return true
97
+ }
98
+ catch (error) {
99
+ pushToast('error', 'Failed to delete order', { detail: String(error) })
100
+ return false
101
+ }
102
+ }
103
+
104
+ export function useOrders() {
105
+ return {
106
+ orders,
107
+ fetchOrders,
108
+ createOrder,
109
+ updateOrder,
110
+ deleteOrder,
111
+ }
112
+ }