@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.
- package/TODO.md +21 -0
- package/ai/AGENTS.md +79 -0
- package/ai/README.md +45 -0
- package/ai/claude/launch.json +12 -0
- package/ai/skills/stacks-actions/SKILL.md +128 -0
- package/ai/skills/stacks-ai/SKILL.md +276 -0
- package/ai/skills/stacks-alias/SKILL.md +94 -0
- package/ai/skills/stacks-analytics/SKILL.md +91 -0
- package/ai/skills/stacks-api/SKILL.md +738 -0
- package/ai/skills/stacks-arrays/SKILL.md +277 -0
- package/ai/skills/stacks-auth/SKILL.md +422 -0
- package/ai/skills/stacks-auto-imports/SKILL.md +138 -0
- package/ai/skills/stacks-brandkit/SKILL.md +811 -0
- package/ai/skills/stacks-browse/SKILL.md +127 -0
- package/ai/skills/stacks-browse/scripts/browse.ts +492 -0
- package/ai/skills/stacks-browser/SKILL.md +145 -0
- package/ai/skills/stacks-buddy/SKILL.md +676 -0
- package/ai/skills/stacks-build/SKILL.md +163 -0
- package/ai/skills/stacks-cache/SKILL.md +125 -0
- package/ai/skills/stacks-calendar/SKILL.md +113 -0
- package/ai/skills/stacks-chat/SKILL.md +371 -0
- package/ai/skills/stacks-cli/SKILL.md +112 -0
- package/ai/skills/stacks-cloud/SKILL.md +192 -0
- package/ai/skills/stacks-cms/SKILL.md +217 -0
- package/ai/skills/stacks-collections/SKILL.md +82 -0
- package/ai/skills/stacks-commerce/SKILL.md +114 -0
- package/ai/skills/stacks-composables/SKILL.md +161 -0
- package/ai/skills/stacks-config/SKILL.md +144 -0
- package/ai/skills/stacks-configuration/SKILL.md +154 -0
- package/ai/skills/stacks-cron/SKILL.md +123 -0
- package/ai/skills/stacks-crosswind/SKILL.md +190 -0
- package/ai/skills/stacks-dashboard/SKILL.md +173 -0
- package/ai/skills/stacks-database/SKILL.md +286 -0
- package/ai/skills/stacks-datetime/SKILL.md +269 -0
- package/ai/skills/stacks-dependencies/SKILL.md +111 -0
- package/ai/skills/stacks-deploy/SKILL.md +102 -0
- package/ai/skills/stacks-design-brutalist/SKILL.md +110 -0
- package/ai/skills/stacks-design-minimalist/SKILL.md +115 -0
- package/ai/skills/stacks-design-output/SKILL.md +55 -0
- package/ai/skills/stacks-design-soft/SKILL.md +156 -0
- package/ai/skills/stacks-design-taste/SKILL.md +1012 -0
- package/ai/skills/stacks-design-taste-codex/SKILL.md +294 -0
- package/ai/skills/stacks-desktop/SKILL.md +78 -0
- package/ai/skills/stacks-development/SKILL.md +298 -0
- package/ai/skills/stacks-dns/SKILL.md +149 -0
- package/ai/skills/stacks-docs/SKILL.md +109 -0
- package/ai/skills/stacks-email/SKILL.md +236 -0
- package/ai/skills/stacks-enums/SKILL.md +100 -0
- package/ai/skills/stacks-env/SKILL.md +181 -0
- package/ai/skills/stacks-error-handling/SKILL.md +137 -0
- package/ai/skills/stacks-events/SKILL.md +228 -0
- package/ai/skills/stacks-faker/SKILL.md +158 -0
- package/ai/skills/stacks-git/SKILL.md +158 -0
- package/ai/skills/stacks-guard/SKILL.md +98 -0
- package/ai/skills/stacks-health/SKILL.md +75 -0
- package/ai/skills/stacks-http/SKILL.md +316 -0
- package/ai/skills/stacks-i18n/SKILL.md +198 -0
- package/ai/skills/stacks-image-to-code/SKILL.md +629 -0
- package/ai/skills/stacks-imagegen-mobile/SKILL.md +1474 -0
- package/ai/skills/stacks-imagegen-web/SKILL.md +998 -0
- package/ai/skills/stacks-investigate/SKILL.md +119 -0
- package/ai/skills/stacks-jobs/SKILL.md +136 -0
- package/ai/skills/stacks-lint/SKILL.md +184 -0
- package/ai/skills/stacks-listeners/SKILL.md +99 -0
- package/ai/skills/stacks-logging/SKILL.md +78 -0
- package/ai/skills/stacks-mail/SKILL.md +120 -0
- package/ai/skills/stacks-middleware/SKILL.md +249 -0
- package/ai/skills/stacks-migrations/SKILL.md +105 -0
- package/ai/skills/stacks-models/SKILL.md +267 -0
- package/ai/skills/stacks-new-feature/SKILL.md +206 -0
- package/ai/skills/stacks-notifications/SKILL.md +210 -0
- package/ai/skills/stacks-objects/SKILL.md +205 -0
- package/ai/skills/stacks-office-hours/SKILL.md +134 -0
- package/ai/skills/stacks-orm/SKILL.md +342 -0
- package/ai/skills/stacks-path/SKILL.md +118 -0
- package/ai/skills/stacks-payments/SKILL.md +373 -0
- package/ai/skills/stacks-plan-review/SKILL.md +152 -0
- package/ai/skills/stacks-plugins/SKILL.md +149 -0
- package/ai/skills/stacks-push/SKILL.md +376 -0
- package/ai/skills/stacks-query-builder/SKILL.md +128 -0
- package/ai/skills/stacks-queue/SKILL.md +559 -0
- package/ai/skills/stacks-realtime/SKILL.md +442 -0
- package/ai/skills/stacks-redesign/SKILL.md +182 -0
- package/ai/skills/stacks-registry/SKILL.md +58 -0
- package/ai/skills/stacks-repl/SKILL.md +80 -0
- package/ai/skills/stacks-retro/SKILL.md +122 -0
- package/ai/skills/stacks-review/SKILL.md +135 -0
- package/ai/skills/stacks-router/SKILL.md +231 -0
- package/ai/skills/stacks-routes/SKILL.md +105 -0
- package/ai/skills/stacks-scaffolding/SKILL.md +162 -0
- package/ai/skills/stacks-scheduler/SKILL.md +363 -0
- package/ai/skills/stacks-search-engine/SKILL.md +112 -0
- package/ai/skills/stacks-security/SKILL.md +129 -0
- package/ai/skills/stacks-security-audit/SKILL.md +128 -0
- package/ai/skills/stacks-server/SKILL.md +458 -0
- package/ai/skills/stacks-shell/SKILL.md +62 -0
- package/ai/skills/stacks-slug/SKILL.md +87 -0
- package/ai/skills/stacks-sms/SKILL.md +385 -0
- package/ai/skills/stacks-socials/SKILL.md +303 -0
- package/ai/skills/stacks-storage/SKILL.md +576 -0
- package/ai/skills/stacks-strings/SKILL.md +416 -0
- package/ai/skills/stacks-stx/SKILL.md +176 -0
- package/ai/skills/stacks-technical-diagrams/LICENSE +22 -0
- package/ai/skills/stacks-technical-diagrams/SKILL.md +290 -0
- package/ai/skills/stacks-technical-diagrams/agents/openai.yaml +4 -0
- package/ai/skills/stacks-technical-diagrams/assets/template.html +1252 -0
- package/ai/skills/stacks-technical-diagrams/bin/technical-diagrams.mjs +289 -0
- package/ai/skills/stacks-technical-diagrams/bunfig.toml +1 -0
- package/ai/skills/stacks-technical-diagrams/examples/agent-run.lifecycle.json +64 -0
- package/ai/skills/stacks-technical-diagrams/examples/agent-tool-call.workflow.json +88 -0
- package/ai/skills/stacks-technical-diagrams/examples/cache-miss-request.sequence.json +75 -0
- package/ai/skills/stacks-technical-diagrams/examples/product-analytics.dataflow.json +70 -0
- package/ai/skills/stacks-technical-diagrams/examples/web-app.architecture.json +41 -0
- package/ai/skills/stacks-technical-diagrams/renderers/architecture/grid.mjs +62 -0
- package/ai/skills/stacks-technical-diagrams/renderers/architecture/render-architecture.mjs +371 -0
- package/ai/skills/stacks-technical-diagrams/renderers/dataflow/README.md +82 -0
- package/ai/skills/stacks-technical-diagrams/renderers/dataflow/render-dataflow.mjs +295 -0
- package/ai/skills/stacks-technical-diagrams/renderers/lifecycle/README.md +91 -0
- package/ai/skills/stacks-technical-diagrams/renderers/lifecycle/render-lifecycle.mjs +384 -0
- package/ai/skills/stacks-technical-diagrams/renderers/sequence/README.md +84 -0
- package/ai/skills/stacks-technical-diagrams/renderers/sequence/render-sequence.mjs +257 -0
- package/ai/skills/stacks-technical-diagrams/renderers/shared/cli.mjs +42 -0
- package/ai/skills/stacks-technical-diagrams/renderers/shared/generated-validators.mjs +13 -0
- package/ai/skills/stacks-technical-diagrams/renderers/shared/geometry.mjs +230 -0
- package/ai/skills/stacks-technical-diagrams/renderers/shared/layout-report.mjs +40 -0
- package/ai/skills/stacks-technical-diagrams/renderers/shared/utils.mjs +88 -0
- package/ai/skills/stacks-technical-diagrams/renderers/shared/validator.mjs +40 -0
- package/ai/skills/stacks-technical-diagrams/renderers/workflow/README.md +103 -0
- package/ai/skills/stacks-technical-diagrams/renderers/workflow/render-workflow.mjs +481 -0
- package/ai/skills/stacks-technical-diagrams/schemas/README.md +68 -0
- package/ai/skills/stacks-technical-diagrams/schemas/architecture.schema.json +121 -0
- package/ai/skills/stacks-technical-diagrams/schemas/common.schema.json +43 -0
- package/ai/skills/stacks-technical-diagrams/schemas/dataflow.schema.json +221 -0
- package/ai/skills/stacks-technical-diagrams/schemas/lifecycle.schema.json +241 -0
- package/ai/skills/stacks-technical-diagrams/schemas/sequence.schema.json +186 -0
- package/ai/skills/stacks-technical-diagrams/schemas/workflow.schema.json +332 -0
- package/ai/skills/stacks-technical-diagrams/scripts/check-render-output.mjs +297 -0
- package/ai/skills/stacks-technical-diagrams/scripts/render-examples.mjs +28 -0
- package/ai/skills/stacks-testing/SKILL.md +129 -0
- package/ai/skills/stacks-tunnel/SKILL.md +125 -0
- package/ai/skills/stacks-types/SKILL.md +178 -0
- package/ai/skills/stacks-ui/SKILL.md +246 -0
- package/ai/skills/stacks-utils/SKILL.md +444 -0
- package/ai/skills/stacks-validation/SKILL.md +371 -0
- package/ai/skills/stacks-whois/SKILL.md +315 -0
- package/assets/world-map-data.ts +121 -0
- package/bootstrap.ts +114 -0
- package/docs/api-examples.md +46 -0
- package/docs/index.md +24 -0
- package/docs/markdown-examples.md +87 -0
- package/functions/analytics.ts +97 -0
- package/functions/api.ts +143 -0
- package/functions/auth.ts +208 -0
- package/functions/billing/payments.ts +149 -0
- package/functions/blog.ts +120 -0
- package/functions/cms/categorizables.ts +107 -0
- package/functions/cms/pages.ts +108 -0
- package/functions/cms/posts.ts +100 -0
- package/functions/cms/taggables.ts +102 -0
- package/functions/commerce/coupons.ts +128 -0
- package/functions/commerce/customers.ts +128 -0
- package/functions/commerce/gift-cards.ts +119 -0
- package/functions/commerce/orders.ts +112 -0
- package/functions/commerce/payments.ts +119 -0
- package/functions/commerce/products/categories.ts +123 -0
- package/functions/commerce/products/manufacturers.ts +123 -0
- package/functions/commerce/products/products.ts +123 -0
- package/functions/commerce/products/reviews.ts +123 -0
- package/functions/commerce/products/units.ts +123 -0
- package/functions/commerce/products/variants.ts +123 -0
- package/functions/commerce/shippings/delivery-routes.ts +123 -0
- package/functions/commerce/shippings/digital-deliveries.ts +119 -0
- package/functions/commerce/shippings/drivers.ts +123 -0
- package/functions/commerce/shippings/license-keys.ts +123 -0
- package/functions/commerce/shippings/shipping-methods.ts +123 -0
- package/functions/commerce/shippings/shipping-rates.ts +119 -0
- package/functions/commerce/shippings/shipping-zones.ts +119 -0
- package/functions/commerce/taxes.ts +119 -0
- package/functions/commerce/waitlist/products.ts +123 -0
- package/functions/commerce/waitlist/restaurants.ts +123 -0
- package/functions/craft.ts +107 -0
- package/functions/dashboard.ts +153 -0
- package/functions/inbox.ts +95 -0
- package/functions/jobs.ts +86 -0
- package/functions/monitoring/errors.ts +295 -0
- package/functions/queue.ts +111 -0
- package/functions/realtime/websockets.ts +96 -0
- package/functions/realtime.ts +52 -0
- package/functions/releases.ts +49 -0
- package/functions/search.ts +126 -0
- package/functions/toasts.ts +95 -0
- package/functions/uploads.ts +216 -0
- package/ide/.gitignore +4 -0
- package/ide/cursor/rules/auto-imports.mdc +574 -0
- package/ide/cursor/rules/code-style.mdc +12 -0
- package/ide/cursor/rules/documentation.mdc +9 -0
- package/ide/cursor/rules/error-handling-validation.mdc +11 -0
- package/ide/cursor/rules/key-conventions.mdc +11 -0
- package/ide/cursor/rules/project-structure.mdc +169 -0
- package/ide/cursor/rules/readme.mdc +318 -0
- package/ide/cursor/rules/syntax-formatting.mdc +9 -0
- package/ide/cursor/rules/testing.mdc +10 -0
- package/ide/cursor/rules/typescript.mdc +9 -0
- package/ide/cursor/rules/ui-styling.mdc +0 -0
- package/ide/dictionary.txt +397 -0
- package/ide/jetbrains/.fleet/settings.json +4 -0
- package/ide/jetbrains/.idea/.gitignore +5 -0
- package/ide/jetbrains/.idea/.name +1 -0
- package/ide/jetbrains/.idea/inspectionProfiles/Project_Default.xml +6 -0
- package/ide/jetbrains/.idea/jsLinters/eslint.xml +7 -0
- package/ide/jetbrains/.idea/modules.xml +8 -0
- package/ide/jetbrains/.idea/stacks.iml +22 -0
- package/ide/jetbrains/.idea/vcs.xml +6 -0
- package/ide/jetbrains/.idea/webResources.xml +14 -0
- package/ide/jetbrains/IntelliJ IDEA Global Settings +0 -0
- package/ide/jetbrains/installed.txt +4 -0
- package/ide/jetbrains/options/github-copilot.xml +5 -0
- package/ide/jetbrains/options/nodejs.xml +7 -0
- package/ide/jetbrains/options/templates.xml +124 -0
- package/ide/jetbrains/templates/JavaScript.xml +6 -0
- package/ide/jetbrains/templates/Stacks.xml +8 -0
- package/ide/vscode/.vscode/README.md +23 -0
- package/ide/vscode/.vscode/extensions.json +5 -0
- package/ide/vscode/.vscode/settings.json +176 -0
- package/ide/vscode/.vscode/stacks.code-snippets +181 -0
- package/ide/vscode/LICENSE.md +21 -0
- package/ide/vscode/README.md +36 -0
- package/ide/vscode/logo.png +0 -0
- package/ide/vscode/package.json +79 -0
- package/ide/zed/.zed/settings.json +139 -0
- package/lang/README.md +28 -0
- package/lang/de.yml +14 -0
- package/lang/en.yml +15 -0
- package/package.json +19 -3
- package/project/bootstrap +161 -0
- package/project/buddy +175 -0
- package/project/storage/framework/tsconfig.app.json +50 -0
- package/project/storage/framework/tsconfig.base.json +58 -0
- package/routes/core.ts +78 -0
- package/routes/dashboard-api.ts +233 -0
- package/routes/dashboard.ts +739 -0
- package/routes/email.ts +129 -0
- package/stores/[name].stx +16 -0
- package/stores/git.ts +71 -0
- package/stores/payment.ts +474 -0
- package/stores/queue.ts +43 -0
- package/stores/user.ts +29 -0
- package/stx-components-plugin.ts +25 -0
- package/styles/design-tokens.css +597 -0
- package/types/dashboard.ts +70 -0
- package/types/defaults.ts +438 -0
- package/vcs/github/CODE_OF_CONDUCT.md +83 -0
- package/vcs/github/CONTRIBUTING.md +187 -0
- package/vcs/github/EXPLANATIONS.md +41 -0
- package/vcs/github/FUNDING.yml +1 -0
- package/vcs/github/ISSUE_TEMPLATE/bug_report.yml +49 -0
- package/vcs/github/ISSUE_TEMPLATE/config.yml +10 -0
- package/vcs/github/ISSUE_TEMPLATE/feature_request.yml +44 -0
- package/vcs/github/SECURITY.md +70 -0
- package/vcs/github/renovate.json +5 -0
- package/vcs/github/stale.yml +14 -0
- package/vcs/github/workflows/README.md +16 -0
- package/vcs/github/workflows/ci.yml +114 -0
- package/vcs/github/workflows/export-size.yml +25 -0
- package/vcs/github/workflows/labeler.yml +13 -0
- package/vcs/github/workflows/release.yml +219 -0
- package/views/[...all].stx +8 -0
- package/views/about.md +3 -0
- package/views/auth/login.stx +1 -0
- package/views/auth/signup.stx +85 -0
- package/views/dashboard/.discovered-models.json +542 -0
- package/views/dashboard/AUDIT.md +904 -0
- package/views/dashboard/[...all].stx +89 -0
- package/views/dashboard/access-tokens/index.stx +177 -0
- package/views/dashboard/actions/index.stx +129 -0
- package/views/dashboard/analytics/blog/index.stx +356 -0
- package/views/dashboard/analytics/browsers/index.stx +263 -0
- package/views/dashboard/analytics/commerce/sales/index.stx +329 -0
- package/views/dashboard/analytics/commerce/web/index.stx +379 -0
- package/views/dashboard/analytics/countries/index.stx +289 -0
- package/views/dashboard/analytics/devices/index.stx +305 -0
- package/views/dashboard/analytics/events/index.stx +536 -0
- package/views/dashboard/analytics/index.stx +88 -0
- package/views/dashboard/analytics/marketing/index.stx +315 -0
- package/views/dashboard/analytics/pages/index.stx +271 -0
- package/views/dashboard/analytics/referrers/index.stx +319 -0
- package/views/dashboard/analytics/web/index.stx +356 -0
- package/views/dashboard/buddy/index.stx +198 -0
- package/views/dashboard/ci/index.stx +462 -0
- package/views/dashboard/cloud/index.stx +452 -0
- package/views/dashboard/commands/index.stx +295 -0
- package/views/dashboard/commerce/categories/index.stx +406 -0
- package/views/dashboard/commerce/coupons/index.stx +485 -0
- package/views/dashboard/commerce/customers/index.stx +410 -0
- package/views/dashboard/commerce/dashboard/index.stx +287 -0
- package/views/dashboard/commerce/delivery/delivery-routes.stx +305 -0
- package/views/dashboard/commerce/delivery/digital-delivery.stx +332 -0
- package/views/dashboard/commerce/delivery/drivers.stx +397 -0
- package/views/dashboard/commerce/delivery/index.stx +18 -0
- package/views/dashboard/commerce/delivery/license-keys.stx +380 -0
- package/views/dashboard/commerce/delivery/shipping-methods.stx +346 -0
- package/views/dashboard/commerce/delivery/shipping-rates.stx +338 -0
- package/views/dashboard/commerce/delivery/shipping-zones.stx +302 -0
- package/views/dashboard/commerce/delivery/tabs.ts +25 -0
- package/views/dashboard/commerce/gift-cards/index.stx +561 -0
- package/views/dashboard/commerce/manufacturers/index.stx +308 -0
- package/views/dashboard/commerce/orders/index.stx +247 -0
- package/views/dashboard/commerce/payments/index.stx +535 -0
- package/views/dashboard/commerce/pos/index.stx +653 -0
- package/views/dashboard/commerce/printers/devices/index.stx +273 -0
- package/views/dashboard/commerce/printers/receipts/index.stx +308 -0
- package/views/dashboard/commerce/products/detail.stx +563 -0
- package/views/dashboard/commerce/products/index.stx +370 -0
- package/views/dashboard/commerce/reviews/index.stx +656 -0
- package/views/dashboard/commerce/reviews/index.ts +0 -0
- package/views/dashboard/commerce/taxes/index.stx +377 -0
- package/views/dashboard/commerce/units/index.stx +317 -0
- package/views/dashboard/commerce/variants/index.stx +319 -0
- package/views/dashboard/commerce/waitlist/products.stx +942 -0
- package/views/dashboard/commerce/waitlist/restaurant.stx +1024 -0
- package/views/dashboard/components/index.stx +330 -0
- package/views/dashboard/composables/index.ts +19 -0
- package/views/dashboard/composables/useChart.ts +77 -0
- package/views/dashboard/composables/useNavigation.ts +99 -0
- package/views/dashboard/composables/useRole.ts +58 -0
- package/views/dashboard/composables/useTheme.ts +74 -0
- package/views/dashboard/content/authors/index.stx +171 -0
- package/views/dashboard/content/blog/index.stx +493 -0
- package/views/dashboard/content/categories/index.stx +169 -0
- package/views/dashboard/content/comments/index.stx +189 -0
- package/views/dashboard/content/dashboard.stx +383 -0
- package/views/dashboard/content/files/index.stx +706 -0
- package/views/dashboard/content/pages/index.stx +174 -0
- package/views/dashboard/content/posts/index.stx +269 -0
- package/views/dashboard/content/seo/index.stx +240 -0
- package/views/dashboard/content/tags/index.stx +167 -0
- package/views/dashboard/data/activity/index.stx +261 -0
- package/views/dashboard/data/dashboard/index.stx +116 -0
- package/views/dashboard/data/subscribers.stx +270 -0
- package/views/dashboard/data/teams.stx +275 -0
- package/views/dashboard/data/users.stx +279 -0
- package/views/dashboard/dependencies/index.stx +178 -0
- package/views/dashboard/deployments/[id].stx +234 -0
- package/views/dashboard/deployments/index.stx +9 -0
- package/views/dashboard/dns/index.stx +163 -0
- package/views/dashboard/environment/index.stx +283 -0
- package/views/dashboard/errors/index.stx +274 -0
- package/views/dashboard/forgot-password.stx +57 -0
- package/views/dashboard/functions/index.stx +159 -0
- package/views/dashboard/health/index.stx +248 -0
- package/views/dashboard/inbox/activity.stx +350 -0
- package/views/dashboard/inbox/index.stx +452 -0
- package/views/dashboard/inbox/settings.stx +290 -0
- package/views/dashboard/index.stx +252 -0
- package/views/dashboard/insights/index.stx +529 -0
- package/views/dashboard/jobs/[id].stx +430 -0
- package/views/dashboard/jobs/history.stx +222 -0
- package/views/dashboard/jobs/index.stx +214 -0
- package/views/dashboard/kanban/[id].stx +899 -0
- package/views/dashboard/kanban/index.stx +260 -0
- package/views/dashboard/layouts/default.stx +565 -0
- package/views/dashboard/layouts/guest.stx +10 -0
- package/views/dashboard/login.stx +48 -0
- package/views/dashboard/logs/index.stx +540 -0
- package/views/dashboard/mailboxes/index.stx +149 -0
- package/views/dashboard/management/permissions/index.stx +490 -0
- package/views/dashboard/marketing/campaigns/index.stx +604 -0
- package/views/dashboard/marketing/lists/index.stx +514 -0
- package/views/dashboard/marketing/reviews/index.stx +475 -0
- package/views/dashboard/marketing/social-posts/index.stx +560 -0
- package/views/dashboard/models/[model].stx +195 -0
- package/views/dashboard/models/index.stx +159 -0
- package/views/dashboard/monitoring/errors/index.stx +415 -0
- package/views/dashboard/notifications/dashboard.stx +383 -0
- package/views/dashboard/notifications/email.stx +336 -0
- package/views/dashboard/notifications/history.stx +373 -0
- package/views/dashboard/notifications/sms.stx +332 -0
- package/views/dashboard/packages/index.stx +195 -0
- package/views/dashboard/queries/[id].stx +381 -0
- package/views/dashboard/queries/history.stx +227 -0
- package/views/dashboard/queries/index.stx +335 -0
- package/views/dashboard/queries/slow.stx +318 -0
- package/views/dashboard/queue/index.stx +427 -0
- package/views/dashboard/realtime/index.stx +429 -0
- package/views/dashboard/register.stx +46 -0
- package/views/dashboard/releases/index.stx +389 -0
- package/views/dashboard/requests/index.stx +462 -0
- package/views/dashboard/serverless/index.stx +475 -0
- package/views/dashboard/servers/[id].stx +299 -0
- package/views/dashboard/servers/index.stx +483 -0
- package/views/dashboard/settings/billing.stx +50 -0
- package/views/dashboard/settings/index.stx +256 -0
- package/views/dashboard/settings/mail.stx +252 -0
- package/views/dashboard/stores/auth.ts +123 -0
- package/views/dashboard/stores/ci.ts +342 -0
- package/views/dashboard/stores/index.ts +129 -0
- package/views/dashboard/stores/kanban.ts +723 -0
- package/views/dashboard/stores/rbac.ts +350 -0
- package/views/dashboard/stx.config.ts +34 -0
- package/views/dashboard/teams/[id].stx +170 -0
- package/views/forum/category.stx +92 -0
- package/views/forum/index.stx +209 -0
- package/views/forum/new-topic.stx +113 -0
- package/views/forum/profile.stx +1 -0
- package/views/forum/topic.stx +143 -0
- package/views/hello-world/[name].stx +47 -0
- package/views/index.stx +21 -0
- 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
|
+
}
|