@stacksjs/defaults 0.70.206 → 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,123 @@
|
|
|
1
|
+
import type { LicenseKeys, NewLicenseKey } from '../../../types/defaults'
|
|
2
|
+
import { useStorage } from '@stacksjs/browser'
|
|
3
|
+
import { pushToast } from '../../toasts'
|
|
4
|
+
|
|
5
|
+
// Create a persistent license keys array using STX useStorage
|
|
6
|
+
const licenseKeys = useStorage<LicenseKeys[]>('licenseKeys', [])
|
|
7
|
+
|
|
8
|
+
const baseURL = process.env.VITE_API_URL || `http://localhost:${process.env.PORT_API || '3008'}`
|
|
9
|
+
|
|
10
|
+
// Basic fetch function to get all license keys
|
|
11
|
+
async function fetchLicenseKeys() {
|
|
12
|
+
try {
|
|
13
|
+
const response = await fetch(`${baseURL}/commerce/license-keys`)
|
|
14
|
+
if (!response.ok) {
|
|
15
|
+
throw new Error(`HTTP error! status: ${response.status}`)
|
|
16
|
+
}
|
|
17
|
+
const { data } = await response.json() as { data: LicenseKeys[] }
|
|
18
|
+
|
|
19
|
+
if (Array.isArray(data)) {
|
|
20
|
+
licenseKeys.value = data
|
|
21
|
+
return data
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
pushToast('error', 'Couldn\'t load license keys', { detail: 'Server returned a non-array response' })
|
|
25
|
+
return []
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
pushToast('error', 'Error fetching license keys', { detail: String(error) })
|
|
30
|
+
return []
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async function createLicenseKey(licenseKey: NewLicenseKey) {
|
|
35
|
+
try {
|
|
36
|
+
const response = await fetch(`${baseURL}/commerce/license-keys`, {
|
|
37
|
+
method: 'POST',
|
|
38
|
+
headers: {
|
|
39
|
+
'Content-Type': 'application/json',
|
|
40
|
+
},
|
|
41
|
+
body: JSON.stringify(licenseKey),
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
if (!response.ok) {
|
|
45
|
+
throw new Error(`HTTP error! status: ${response.status}`)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const { data } = await response.json() as { data: LicenseKeys }
|
|
49
|
+
if (data) {
|
|
50
|
+
licenseKeys.value.push(data)
|
|
51
|
+
return data
|
|
52
|
+
}
|
|
53
|
+
return null
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
pushToast('error', 'Error creating license key', { detail: String(error) })
|
|
57
|
+
return null
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async function updateLicenseKey(licenseKey: LicenseKeys) {
|
|
62
|
+
try {
|
|
63
|
+
const response = await fetch(`${baseURL}/commerce/license-keys/${licenseKey.id}`, {
|
|
64
|
+
method: 'PATCH',
|
|
65
|
+
headers: {
|
|
66
|
+
'Content-Type': 'application/json',
|
|
67
|
+
},
|
|
68
|
+
body: JSON.stringify(licenseKey),
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
if (!response.ok) {
|
|
72
|
+
throw new Error(`HTTP error! status: ${response.status}`)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const { data } = await response.json() as { data: LicenseKeys }
|
|
76
|
+
if (data) {
|
|
77
|
+
const index = licenseKeys.value.findIndex(s => s.id === licenseKey.id)
|
|
78
|
+
if (index !== -1) {
|
|
79
|
+
licenseKeys.value[index] = data
|
|
80
|
+
}
|
|
81
|
+
return data
|
|
82
|
+
}
|
|
83
|
+
return null
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
pushToast('error', 'Error updating license key', { detail: String(error) })
|
|
87
|
+
return null
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
async function deleteLicenseKey(id: number) {
|
|
92
|
+
try {
|
|
93
|
+
const response = await fetch(`${baseURL}/commerce/license-keys/${id}`, {
|
|
94
|
+
method: 'DELETE',
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
if (!response.ok) {
|
|
98
|
+
throw new Error(`HTTP error! status: ${response.status}`)
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const index = licenseKeys.value.findIndex(s => s.id === id)
|
|
102
|
+
if (index !== -1) {
|
|
103
|
+
licenseKeys.value.splice(index, 1)
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return true
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
pushToast('error', 'Error deleting license key', { detail: String(error) })
|
|
110
|
+
return false
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Export the composable
|
|
115
|
+
export function useLicenseKeys() {
|
|
116
|
+
return {
|
|
117
|
+
licenseKeys,
|
|
118
|
+
fetchLicenseKeys,
|
|
119
|
+
createLicenseKey,
|
|
120
|
+
updateLicenseKey,
|
|
121
|
+
deleteLicenseKey,
|
|
122
|
+
}
|
|
123
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import type { NewShippingMethod, ShippingMethods } from '../../../types/defaults'
|
|
2
|
+
import { useStorage } from '@stacksjs/browser'
|
|
3
|
+
import { pushToast } from '../../toasts'
|
|
4
|
+
|
|
5
|
+
// Create a persistent shipping methods array using STX useStorage
|
|
6
|
+
const shippingMethods = useStorage<ShippingMethods[]>('shippingMethods', [])
|
|
7
|
+
|
|
8
|
+
const baseURL = process.env.VITE_API_URL || `http://localhost:${process.env.PORT_API || '3008'}`
|
|
9
|
+
|
|
10
|
+
// Basic fetch function to get all shipping methods
|
|
11
|
+
async function fetchShippingMethods() {
|
|
12
|
+
try {
|
|
13
|
+
const response = await fetch(`${baseURL}/commerce/shipping-methods`)
|
|
14
|
+
if (!response.ok) {
|
|
15
|
+
throw new Error(`HTTP error! status: ${response.status}`)
|
|
16
|
+
}
|
|
17
|
+
const { data } = await response.json() as { data: ShippingMethods[] }
|
|
18
|
+
|
|
19
|
+
if (Array.isArray(data)) {
|
|
20
|
+
shippingMethods.value = data
|
|
21
|
+
return data
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
pushToast('error', 'Couldn\'t load shipping methods', { detail: 'Server returned a non-array response' })
|
|
25
|
+
return []
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
pushToast('error', 'Error fetching shipping methods', { detail: String(error) })
|
|
30
|
+
return []
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async function createShippingMethod(shippingMethod: NewShippingMethod) {
|
|
35
|
+
try {
|
|
36
|
+
const response = await fetch(`${baseURL}/commerce/shipping-methods`, {
|
|
37
|
+
method: 'POST',
|
|
38
|
+
headers: {
|
|
39
|
+
'Content-Type': 'application/json',
|
|
40
|
+
},
|
|
41
|
+
body: JSON.stringify(shippingMethod),
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
if (!response.ok) {
|
|
45
|
+
throw new Error(`HTTP error! status: ${response.status}`)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const data = await response.json() as ShippingMethods
|
|
49
|
+
if (data) {
|
|
50
|
+
shippingMethods.value.push(data)
|
|
51
|
+
return data
|
|
52
|
+
}
|
|
53
|
+
return null
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
pushToast('error', 'Error creating shipping method', { detail: String(error) })
|
|
57
|
+
return null
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async function updateShippingMethod(shippingMethod: ShippingMethods) {
|
|
62
|
+
try {
|
|
63
|
+
const response = await fetch(`${baseURL}/commerce/shipping-methods/${shippingMethod.id}`, {
|
|
64
|
+
method: 'PATCH',
|
|
65
|
+
headers: {
|
|
66
|
+
'Content-Type': 'application/json',
|
|
67
|
+
},
|
|
68
|
+
body: JSON.stringify(shippingMethod),
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
if (!response.ok) {
|
|
72
|
+
throw new Error(`HTTP error! status: ${response.status}`)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const data = await response.json() as ShippingMethods
|
|
76
|
+
if (data) {
|
|
77
|
+
const index = shippingMethods.value.findIndex(s => s.id === shippingMethod.id)
|
|
78
|
+
if (index !== -1) {
|
|
79
|
+
shippingMethods.value[index] = data
|
|
80
|
+
}
|
|
81
|
+
return data
|
|
82
|
+
}
|
|
83
|
+
return null
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
pushToast('error', 'Error updating shipping method', { detail: String(error) })
|
|
87
|
+
return null
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
async function deleteShippingMethod(id: number) {
|
|
92
|
+
try {
|
|
93
|
+
const response = await fetch(`${baseURL}/commerce/shipping-methods/${id}`, {
|
|
94
|
+
method: 'DELETE',
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
if (!response.ok) {
|
|
98
|
+
throw new Error(`HTTP error! status: ${response.status}`)
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const index = shippingMethods.value.findIndex(s => s.id === id)
|
|
102
|
+
if (index !== -1) {
|
|
103
|
+
shippingMethods.value.splice(index, 1)
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return true
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
pushToast('error', 'Error deleting shipping method', { detail: String(error) })
|
|
110
|
+
return false
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Export the composable
|
|
115
|
+
export function useShippingMethods() {
|
|
116
|
+
return {
|
|
117
|
+
shippingMethods,
|
|
118
|
+
fetchShippingMethods,
|
|
119
|
+
createShippingMethod,
|
|
120
|
+
updateShippingMethod,
|
|
121
|
+
deleteShippingMethod,
|
|
122
|
+
}
|
|
123
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import type { NewShippingRate, ShippingRates } from '../../../types/defaults'
|
|
2
|
+
import { useStorage } from '@stacksjs/browser'
|
|
3
|
+
import { pushToast } from '../../toasts'
|
|
4
|
+
|
|
5
|
+
// Create a persistent shipping rates array using STX useStorage
|
|
6
|
+
const shippingRates = useStorage<ShippingRates[]>('shippingRates', [])
|
|
7
|
+
|
|
8
|
+
const baseURL = process.env.VITE_API_URL || `http://localhost:${process.env.PORT_API || '3008'}`
|
|
9
|
+
|
|
10
|
+
// Basic fetch function to get all shipping rates
|
|
11
|
+
async function fetchShippingRates() {
|
|
12
|
+
try {
|
|
13
|
+
const response = await fetch(`${baseURL}/commerce/shipping-rates`)
|
|
14
|
+
if (!response.ok) {
|
|
15
|
+
throw new Error(`HTTP error! status: ${response.status}`)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const { data } = await response.json() as { data: ShippingRates[] }
|
|
19
|
+
|
|
20
|
+
shippingRates.value = data
|
|
21
|
+
|
|
22
|
+
return data
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
pushToast('error', 'Error fetching shipping rates', { detail: String(error) })
|
|
26
|
+
return []
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async function createShippingRate(shippingRate: NewShippingRate) {
|
|
31
|
+
try {
|
|
32
|
+
const response = await fetch(`${baseURL}/commerce/shipping-rates`, {
|
|
33
|
+
method: 'POST',
|
|
34
|
+
headers: {
|
|
35
|
+
'Content-Type': 'application/json',
|
|
36
|
+
},
|
|
37
|
+
body: JSON.stringify(shippingRate),
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
if (!response.ok) {
|
|
41
|
+
throw new Error(`HTTP error! status: ${response.status}`)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const data = await response.json() as ShippingRates
|
|
45
|
+
if (data) {
|
|
46
|
+
shippingRates.value.push(data)
|
|
47
|
+
return data
|
|
48
|
+
}
|
|
49
|
+
return null
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
pushToast('error', 'Error creating shipping rate', { detail: String(error) })
|
|
53
|
+
return null
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async function updateShippingRate(shippingRate: ShippingRates) {
|
|
58
|
+
try {
|
|
59
|
+
const response = await fetch(`${baseURL}/commerce/shipping-rates/${shippingRate.id}`, {
|
|
60
|
+
method: 'PATCH',
|
|
61
|
+
headers: {
|
|
62
|
+
'Content-Type': 'application/json',
|
|
63
|
+
},
|
|
64
|
+
body: JSON.stringify(shippingRate),
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
if (!response.ok) {
|
|
68
|
+
throw new Error(`HTTP error! status: ${response.status}`)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const data = await response.json() as ShippingRates
|
|
72
|
+
if (data) {
|
|
73
|
+
const index = shippingRates.value.findIndex(s => s.id === shippingRate.id)
|
|
74
|
+
if (index !== -1) {
|
|
75
|
+
shippingRates.value[index] = data
|
|
76
|
+
}
|
|
77
|
+
return data
|
|
78
|
+
}
|
|
79
|
+
return null
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
pushToast('error', 'Error updating shipping rate', { detail: String(error) })
|
|
83
|
+
return null
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
async function deleteShippingRate(id: number) {
|
|
88
|
+
try {
|
|
89
|
+
const response = await fetch(`${baseURL}/commerce/shipping-rates/${id}`, {
|
|
90
|
+
method: 'DELETE',
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
if (!response.ok) {
|
|
94
|
+
throw new Error(`HTTP error! status: ${response.status}`)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const index = shippingRates.value.findIndex(s => s.id === id)
|
|
98
|
+
if (index !== -1) {
|
|
99
|
+
shippingRates.value.splice(index, 1)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return true
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
pushToast('error', 'Error deleting shipping rate', { detail: String(error) })
|
|
106
|
+
return false
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Export the composable
|
|
111
|
+
export function useShippingRates() {
|
|
112
|
+
return {
|
|
113
|
+
shippingRates,
|
|
114
|
+
fetchShippingRates,
|
|
115
|
+
createShippingRate,
|
|
116
|
+
updateShippingRate,
|
|
117
|
+
deleteShippingRate,
|
|
118
|
+
}
|
|
119
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import type { NewShippingZone, ShippingZones } from '../../../types/defaults'
|
|
2
|
+
import { useStorage } from '@stacksjs/browser'
|
|
3
|
+
import { pushToast } from '../../toasts'
|
|
4
|
+
|
|
5
|
+
// Create a persistent shipping zones array using STX useStorage
|
|
6
|
+
const shippingZones = useStorage<ShippingZones[]>('shippingZones', [])
|
|
7
|
+
|
|
8
|
+
const baseURL = process.env.VITE_API_URL || `http://localhost:${process.env.PORT_API || '3008'}`
|
|
9
|
+
|
|
10
|
+
// Basic fetch function to get all shipping zones
|
|
11
|
+
async function fetchShippingZones() {
|
|
12
|
+
try {
|
|
13
|
+
const response = await fetch(`${baseURL}/commerce/shipping-zones`)
|
|
14
|
+
if (!response.ok) {
|
|
15
|
+
throw new Error(`HTTP error! status: ${response.status}`)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const { data } = await response.json() as { data: ShippingZones[] }
|
|
19
|
+
|
|
20
|
+
shippingZones.value = data
|
|
21
|
+
|
|
22
|
+
return data
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
pushToast('error', 'Error fetching shipping zones', { detail: String(error) })
|
|
26
|
+
return []
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async function createShippingZone(shippingZone: NewShippingZone) {
|
|
31
|
+
try {
|
|
32
|
+
const response = await fetch(`${baseURL}/commerce/shipping-zones`, {
|
|
33
|
+
method: 'POST',
|
|
34
|
+
headers: {
|
|
35
|
+
'Content-Type': 'application/json',
|
|
36
|
+
},
|
|
37
|
+
body: JSON.stringify(shippingZone),
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
if (!response.ok) {
|
|
41
|
+
throw new Error(`HTTP error! status: ${response.status}`)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const data = await response.json() as ShippingZones
|
|
45
|
+
if (data) {
|
|
46
|
+
shippingZones.value.push(data)
|
|
47
|
+
return data
|
|
48
|
+
}
|
|
49
|
+
return null
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
pushToast('error', 'Error creating shipping zone', { detail: String(error) })
|
|
53
|
+
return null
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async function updateShippingZone(shippingZone: ShippingZones) {
|
|
58
|
+
try {
|
|
59
|
+
const response = await fetch(`${baseURL}/commerce/shipping-zones/${shippingZone.id}`, {
|
|
60
|
+
method: 'PATCH',
|
|
61
|
+
headers: {
|
|
62
|
+
'Content-Type': 'application/json',
|
|
63
|
+
},
|
|
64
|
+
body: JSON.stringify(shippingZone),
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
if (!response.ok) {
|
|
68
|
+
throw new Error(`HTTP error! status: ${response.status}`)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const data = await response.json() as ShippingZones
|
|
72
|
+
if (data) {
|
|
73
|
+
const index = shippingZones.value.findIndex(s => s.id === shippingZone.id)
|
|
74
|
+
if (index !== -1) {
|
|
75
|
+
shippingZones.value[index] = data
|
|
76
|
+
}
|
|
77
|
+
return data
|
|
78
|
+
}
|
|
79
|
+
return null
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
pushToast('error', 'Error updating shipping zone', { detail: String(error) })
|
|
83
|
+
return null
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
async function deleteShippingZone(id: number) {
|
|
88
|
+
try {
|
|
89
|
+
const response = await fetch(`${baseURL}/commerce/shipping-zones/${id}`, {
|
|
90
|
+
method: 'DELETE',
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
if (!response.ok) {
|
|
94
|
+
throw new Error(`HTTP error! status: ${response.status}`)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const index = shippingZones.value.findIndex(s => s.id === id)
|
|
98
|
+
if (index !== -1) {
|
|
99
|
+
shippingZones.value.splice(index, 1)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return true
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
pushToast('error', 'Error deleting shipping zone', { detail: String(error) })
|
|
106
|
+
return false
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Export the composable
|
|
111
|
+
export function useShippingZones() {
|
|
112
|
+
return {
|
|
113
|
+
shippingZones,
|
|
114
|
+
fetchShippingZones,
|
|
115
|
+
createShippingZone,
|
|
116
|
+
updateShippingZone,
|
|
117
|
+
deleteShippingZone,
|
|
118
|
+
}
|
|
119
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import type { TaxRates } from '../../types/defaults'
|
|
2
|
+
import { useStorage } from '@stacksjs/browser'
|
|
3
|
+
import { pushToast } from '../toasts'
|
|
4
|
+
|
|
5
|
+
// Create a persistent tax rates array using STX useStorage
|
|
6
|
+
const taxRates = useStorage<TaxRates[]>('taxRates', [])
|
|
7
|
+
|
|
8
|
+
const baseURL = process.env.VITE_API_URL || `http://localhost:${process.env.PORT_API || '3008'}`
|
|
9
|
+
|
|
10
|
+
async function fetchTaxRates() {
|
|
11
|
+
try {
|
|
12
|
+
const response = await fetch(`${baseURL}/commerce/tax-rates`)
|
|
13
|
+
if (!response.ok) {
|
|
14
|
+
throw new Error(`HTTP error! status: ${response.status}`)
|
|
15
|
+
}
|
|
16
|
+
const data = await response.json() as TaxRates[]
|
|
17
|
+
|
|
18
|
+
if (Array.isArray(data)) {
|
|
19
|
+
taxRates.value = data
|
|
20
|
+
return data
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
pushToast('error', 'Couldn\'t load tax rates', { detail: `Expected array but received ${typeof data}` })
|
|
24
|
+
return []
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
pushToast('error', 'Couldn\'t load tax rates', { detail: String(error) })
|
|
29
|
+
return taxRates.value
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async function createTaxRate(taxRate: TaxRates) {
|
|
34
|
+
try {
|
|
35
|
+
const response = await fetch(`${baseURL}/commerce/tax-rates`, {
|
|
36
|
+
method: 'POST',
|
|
37
|
+
headers: { 'Content-Type': 'application/json' },
|
|
38
|
+
body: JSON.stringify(taxRate),
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
if (!response.ok) {
|
|
42
|
+
throw new Error(`HTTP error! status: ${response.status}`)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const data = await response.json() as TaxRates
|
|
46
|
+
if (data) {
|
|
47
|
+
taxRates.value.push(data)
|
|
48
|
+
pushToast('success', 'Tax rate created')
|
|
49
|
+
return data
|
|
50
|
+
}
|
|
51
|
+
return null
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
pushToast('error', 'Failed to create tax rate', { detail: String(error) })
|
|
55
|
+
return null
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async function updateTaxRate(taxRate: TaxRates) {
|
|
60
|
+
try {
|
|
61
|
+
const response = await fetch(`${baseURL}/commerce/tax-rates/${taxRate.id}`, {
|
|
62
|
+
method: 'PATCH',
|
|
63
|
+
headers: { 'Content-Type': 'application/json' },
|
|
64
|
+
body: JSON.stringify(taxRate),
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
if (!response.ok) {
|
|
68
|
+
throw new Error(`HTTP error! status: ${response.status}`)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const data = await response.json() as TaxRates
|
|
72
|
+
if (data) {
|
|
73
|
+
const index = taxRates.value.findIndex(t => t.id === taxRate.id)
|
|
74
|
+
if (index !== -1) {
|
|
75
|
+
taxRates.value[index] = data
|
|
76
|
+
}
|
|
77
|
+
pushToast('success', 'Tax rate updated')
|
|
78
|
+
return data
|
|
79
|
+
}
|
|
80
|
+
return null
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
pushToast('error', 'Failed to update tax rate', { detail: String(error) })
|
|
84
|
+
return null
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
async function deleteTaxRate(id: number) {
|
|
89
|
+
try {
|
|
90
|
+
const response = await fetch(`${baseURL}/commerce/tax-rates/${id}`, {
|
|
91
|
+
method: 'DELETE',
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
if (!response.ok) {
|
|
95
|
+
throw new Error(`HTTP error! status: ${response.status}`)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const index = taxRates.value.findIndex(t => t.id === id)
|
|
99
|
+
if (index !== -1) {
|
|
100
|
+
taxRates.value.splice(index, 1)
|
|
101
|
+
}
|
|
102
|
+
pushToast('success', 'Tax rate deleted')
|
|
103
|
+
return true
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
pushToast('error', 'Failed to delete tax rate', { detail: String(error) })
|
|
107
|
+
return false
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export function useTaxRates() {
|
|
112
|
+
return {
|
|
113
|
+
taxRates,
|
|
114
|
+
fetchTaxRates,
|
|
115
|
+
createTaxRate,
|
|
116
|
+
updateTaxRate,
|
|
117
|
+
deleteTaxRate,
|
|
118
|
+
}
|
|
119
|
+
}
|