@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,121 @@
|
|
|
1
|
+
// This file contains a simplified world map data for ECharts
|
|
2
|
+
// It's a simplified version of the world map GeoJSON data
|
|
3
|
+
|
|
4
|
+
export const world = {
|
|
5
|
+
type: 'FeatureCollection' as const,
|
|
6
|
+
features: [
|
|
7
|
+
// North America
|
|
8
|
+
{
|
|
9
|
+
type: 'Feature' as const,
|
|
10
|
+
id: 'USA',
|
|
11
|
+
properties: { name: 'United States of America' },
|
|
12
|
+
geometry: {
|
|
13
|
+
type: 'MultiPolygon' as const,
|
|
14
|
+
coordinates: [[[[0, 0], [10, 0], [10, 10], [0, 10], [0, 0]]]], // Simplified coordinates
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
type: 'Feature' as const,
|
|
19
|
+
id: 'CAN',
|
|
20
|
+
properties: { name: 'Canada' },
|
|
21
|
+
geometry: {
|
|
22
|
+
type: 'MultiPolygon' as const,
|
|
23
|
+
coordinates: [[[[0, 10], [10, 10], [10, 20], [0, 20], [0, 10]]]], // Simplified coordinates
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
// Europe
|
|
27
|
+
{
|
|
28
|
+
type: 'Feature' as const,
|
|
29
|
+
id: 'DEU',
|
|
30
|
+
properties: { name: 'Germany' },
|
|
31
|
+
geometry: {
|
|
32
|
+
type: 'Polygon' as const,
|
|
33
|
+
coordinates: [[[-10, 0], [0, 0], [0, 10], [-10, 10], [-10, 0]]], // Simplified coordinates
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
type: 'Feature' as const,
|
|
38
|
+
id: 'GBR',
|
|
39
|
+
properties: { name: 'United Kingdom' },
|
|
40
|
+
geometry: {
|
|
41
|
+
type: 'MultiPolygon' as const,
|
|
42
|
+
coordinates: [[[[-15, 5], [-10, 5], [-10, 15], [-15, 15], [-15, 5]]]], // Simplified coordinates
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
type: 'Feature' as const,
|
|
47
|
+
id: 'FRA',
|
|
48
|
+
properties: { name: 'France' },
|
|
49
|
+
geometry: {
|
|
50
|
+
type: 'MultiPolygon' as const,
|
|
51
|
+
coordinates: [[[[-15, 0], [-5, 0], [-5, 5], [-15, 5], [-15, 0]]]], // Simplified coordinates
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
type: 'Feature' as const,
|
|
56
|
+
id: 'ESP',
|
|
57
|
+
properties: { name: 'Spain' },
|
|
58
|
+
geometry: {
|
|
59
|
+
type: 'Polygon' as const,
|
|
60
|
+
coordinates: [[[-20, -5], [-10, -5], [-10, 0], [-20, 0], [-20, -5]]], // Simplified coordinates
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
type: 'Feature' as const,
|
|
65
|
+
id: 'NLD',
|
|
66
|
+
properties: { name: 'Netherlands' },
|
|
67
|
+
geometry: {
|
|
68
|
+
type: 'MultiPolygon' as const,
|
|
69
|
+
coordinates: [[[[-5, 5], [0, 5], [0, 10], [-5, 10], [-5, 5]]]], // Simplified coordinates
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
// Asia
|
|
73
|
+
{
|
|
74
|
+
type: 'Feature' as const,
|
|
75
|
+
id: 'IND',
|
|
76
|
+
properties: { name: 'India' },
|
|
77
|
+
geometry: {
|
|
78
|
+
type: 'Polygon' as const,
|
|
79
|
+
coordinates: [[[20, -10], [30, -10], [30, 0], [20, 0], [20, -10]]], // Simplified coordinates
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
type: 'Feature' as const,
|
|
84
|
+
id: 'IDN',
|
|
85
|
+
properties: { name: 'Indonesia' },
|
|
86
|
+
geometry: {
|
|
87
|
+
type: 'MultiPolygon' as const,
|
|
88
|
+
coordinates: [[[[20, -20], [30, -20], [30, -15], [20, -15], [20, -20]]]], // Simplified coordinates
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
type: 'Feature' as const,
|
|
93
|
+
id: 'JPN',
|
|
94
|
+
properties: { name: 'Japan' },
|
|
95
|
+
geometry: {
|
|
96
|
+
type: 'MultiPolygon' as const,
|
|
97
|
+
coordinates: [[[[35, 0], [40, 0], [40, 10], [35, 10], [35, 0]]]], // Simplified coordinates
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
// Oceania
|
|
101
|
+
{
|
|
102
|
+
type: 'Feature' as const,
|
|
103
|
+
id: 'AUS',
|
|
104
|
+
properties: { name: 'Australia' },
|
|
105
|
+
geometry: {
|
|
106
|
+
type: 'MultiPolygon' as const,
|
|
107
|
+
coordinates: [[[[20, -30], [30, -30], [30, -20], [20, -20], [20, -30]]]], // Simplified coordinates
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
// South America
|
|
111
|
+
{
|
|
112
|
+
type: 'Feature' as const,
|
|
113
|
+
id: 'BRA',
|
|
114
|
+
properties: { name: 'Brazil' },
|
|
115
|
+
geometry: {
|
|
116
|
+
type: 'Polygon' as const,
|
|
117
|
+
coordinates: [[[-10, -20], [0, -20], [0, -10], [-10, -10], [-10, -20]]], // Simplified coordinates
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
],
|
|
121
|
+
}
|
package/bootstrap.ts
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framework Bootstrap
|
|
3
|
+
*
|
|
4
|
+
* Single source of truth for which framework packages are wired into
|
|
5
|
+
* boot. Each entry below either:
|
|
6
|
+
*
|
|
7
|
+
* 1. Imports a framework package whose `index.ts` self-registers via
|
|
8
|
+
* `route.register(...)` on import — analogous to the service
|
|
9
|
+
* provider pattern other frameworks (competitors) use to give
|
|
10
|
+
* packages a chance to wire themselves up at boot. This is the
|
|
11
|
+
* preferred shape for packages that own their own routes,
|
|
12
|
+
* migrations, etc.
|
|
13
|
+
*
|
|
14
|
+
* 2. Registers a framework routes file directly via `route.register()`
|
|
15
|
+
* — used when a routes file isn't yet wrapped in its own package.
|
|
16
|
+
*
|
|
17
|
+
* Adding a new framework package? Add a line here. There is no
|
|
18
|
+
* filesystem scanning, no auto-discovery: this file is the entire
|
|
19
|
+
* grep-able answer to "what does the framework load on boot?".
|
|
20
|
+
*
|
|
21
|
+
* @see storage/framework/core/router/src/route-loader.ts:loadFrameworkRoutes
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import { feature } from '@stacksjs/config'
|
|
25
|
+
import { frameworkPath } from '@stacksjs/path'
|
|
26
|
+
import { route } from '@stacksjs/router'
|
|
27
|
+
import MaintenanceMiddleware from './app/Middleware/Maintenance'
|
|
28
|
+
|
|
29
|
+
// RBAC: wire the bun-query-builder-backed store so `hasRole(user, …)` and
|
|
30
|
+
// friends from `@stacksjs/auth` actually hit the database (otherwise every
|
|
31
|
+
// call throws "RBAC store not configured"). The store is a thin adapter
|
|
32
|
+
// over the `roles` / `permissions` / `user_roles` / `user_permissions` /
|
|
33
|
+
// `role_permissions` tables created by migrations 0000000101–0000000105.
|
|
34
|
+
// Registered unconditionally because the auth middleware + Role middleware
|
|
35
|
+
// both reach for the helpers at request time regardless of which feature
|
|
36
|
+
// the project opts into.
|
|
37
|
+
// DEFERRED, non-blocking wiring on purpose. This file is dynamically
|
|
38
|
+
// imported by the route loader while other entrypoints (a test file, the
|
|
39
|
+
// API server) may still be mid-way through evaluating the @stacksjs/auth
|
|
40
|
+
// async module graph. With a static `import { setRbacStore } ...`, Bun
|
|
41
|
+
// could execute this module against auth's partially-evaluated record:
|
|
42
|
+
// the exported function exists (hoisted) but rbac.ts's module-level
|
|
43
|
+
// `let store` hadn't initialized, so calling it threw
|
|
44
|
+
// `Cannot access 'store' before initialization`, the whole bootstrap
|
|
45
|
+
// import failed, and EVERY framework default route (auth, 2FA, passkeys,
|
|
46
|
+
// dashboard) silently vanished — the loader logs one line and carries
|
|
47
|
+
// on. A blocking `await import('@stacksjs/auth')` here deadlocks instead
|
|
48
|
+
// (auth's evaluation can be waiting on the same route-loading pass that
|
|
49
|
+
// is importing this file), so the wiring is fire-and-forget: routes
|
|
50
|
+
// register immediately, and the RBAC store lands the moment auth's
|
|
51
|
+
// evaluation completes — before any real request needs it.
|
|
52
|
+
import('@stacksjs/auth')
|
|
53
|
+
.then(({ createBqbRbacStore, setRbacStore }) => setRbacStore(createBqbRbacStore()))
|
|
54
|
+
.catch(err => console.error('[bootstrap] RBAC store wiring failed:', err))
|
|
55
|
+
|
|
56
|
+
// Global maintenance / coming-soon gate. Registered first so the
|
|
57
|
+
// `buddy down` / `buddy coming-soon` (and their env-var equivalents)
|
|
58
|
+
// state files intercept every request before any other middleware or
|
|
59
|
+
// route runs.
|
|
60
|
+
//
|
|
61
|
+
// The middleware is a thin wrapper around `maintenanceGate()` in
|
|
62
|
+
// @stacksjs/server, which is also called from the dev server's
|
|
63
|
+
// `onRequest` hook — so dev and prod use one implementation. The gate
|
|
64
|
+
// itself reads `activeSiteModePayload()` so it covers both maintenance
|
|
65
|
+
// and coming-soon modes (plus `APP_MAINTENANCE` / `APP_COMING_SOON`
|
|
66
|
+
// env overrides) without the bootstrap needing to know the details.
|
|
67
|
+
//
|
|
68
|
+
// `toRouterHandler()` adapts the Middleware contract (return void to
|
|
69
|
+
// continue, throw a Response to short-circuit) to bun-router's
|
|
70
|
+
// `(req, next) => Response` shape. Without the adapter, `handle` would
|
|
71
|
+
// return `undefined`, bun-router's chain treats that as a short-circuit
|
|
72
|
+
// to an empty 200, and every route returns `200 OK Content-Length: 0`.
|
|
73
|
+
route.use(MaintenanceMiddleware.toRouterHandler() as any)
|
|
74
|
+
|
|
75
|
+
// Locale cookie + STX-style path redirect (`/locale/en` → `/en/…`).
|
|
76
|
+
// Overridable by registering the same path in app routes first.
|
|
77
|
+
await route.register(frameworkPath('defaults/routes/core.ts'))
|
|
78
|
+
|
|
79
|
+
// Feature-gated route registration. The dashboard.ts file currently bundles
|
|
80
|
+
// ~687 lines covering auth, password reset, email subscribe, storefront
|
|
81
|
+
// cart/checkout, reviews, sitemap, AI, voice, and the admin dashboard's
|
|
82
|
+
// REST surface. Until that file is split per-feature (auth.ts, marketing.ts,
|
|
83
|
+
// commerce.ts, monitoring.ts), the whole thing loads when `dashboard` is
|
|
84
|
+
// activated and stays inert otherwise.
|
|
85
|
+
//
|
|
86
|
+
// Apps that need only a slice — e.g. a marketing site that wants
|
|
87
|
+
// `/api/email/subscribe` and `/api/contact` but not the rest — can either
|
|
88
|
+
// 1. Activate `dashboard` and live with the over-broad register; the
|
|
89
|
+
// action handlers for routes you don't hit never fire, and their
|
|
90
|
+
// models stay un-loaded as long as the corresponding feature flag
|
|
91
|
+
// (`commerce`, `cms`, `monitoring`) is off, so there's no hidden
|
|
92
|
+
// cost beyond the bun-router route-table entries.
|
|
93
|
+
// 2. Define the routes they want directly in `routes/api.ts` —
|
|
94
|
+
// first-registration-wins means the user version takes priority.
|
|
95
|
+
//
|
|
96
|
+
// Once the per-feature route split lands, each `if (feature('X'))` block
|
|
97
|
+
// below registers just the X-specific routes file.
|
|
98
|
+
if (feature('dashboard')) {
|
|
99
|
+
await route.register(frameworkPath('defaults/routes/dashboard.ts'))
|
|
100
|
+
// JSON endpoints for the dev dashboard UI. Kept separate from the view
|
|
101
|
+
// routes above so the data layer is one obvious file to grep.
|
|
102
|
+
await route.register(frameworkPath('defaults/routes/dashboard-api.ts'))
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Email webhook + unsubscribe routes (stacksjs/stacks#1881, #1880).
|
|
106
|
+
// Always mounted when the `email` feature is on — the underlying
|
|
107
|
+
// handlers self-disable when their provider credentials aren't
|
|
108
|
+
// configured (they 401 rather than processing). Apps that need a
|
|
109
|
+
// non-default mount path register their own routes in `routes/api.ts`
|
|
110
|
+
// and the framework's mount silently no-ops since user routes
|
|
111
|
+
// register first.
|
|
112
|
+
if (feature('email')) {
|
|
113
|
+
await route.register(frameworkPath('defaults/routes/email.ts'))
|
|
114
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Runtime Data Examples
|
|
3
|
+
team: Stacks
|
|
4
|
+
outline: deep
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# {{ title }}
|
|
8
|
+
|
|
9
|
+
BunPress exposes frontmatter and files from `docs/.data/` directly to the STX render context. No client framework or runtime composable is required.
|
|
10
|
+
|
|
11
|
+
## Frontmatter
|
|
12
|
+
|
|
13
|
+
**Input**
|
|
14
|
+
|
|
15
|
+
```md
|
|
16
|
+
---
|
|
17
|
+
title: Runtime Data Examples
|
|
18
|
+
team: Stacks
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# {{ title }}
|
|
22
|
+
|
|
23
|
+
Built by {{ team }}.
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**Output**
|
|
27
|
+
|
|
28
|
+
Built by {{ team }}.
|
|
29
|
+
|
|
30
|
+
## Global data
|
|
31
|
+
|
|
32
|
+
Add `docs/.data/project.json`:
|
|
33
|
+
|
|
34
|
+
```json
|
|
35
|
+
{
|
|
36
|
+
"repository": "stacksjs/stacks"
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
The object is available as `project` in Markdown and STX expressions:
|
|
41
|
+
|
|
42
|
+
```md
|
|
43
|
+
Repository: {{ project.repository }}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
See the [BunPress data-loading guide](https://github.com/stacksjs/bunpress/blob/main/docs/advanced.md#data-loading) for loaders and build-time data sources.
|
package/docs/index.md
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
# BunPress home-page frontmatter
|
|
3
|
+
layout: home
|
|
4
|
+
|
|
5
|
+
hero:
|
|
6
|
+
name: "Stacks.js"
|
|
7
|
+
text: "A better developer environment."
|
|
8
|
+
tagline: A rapid development environment for modern web applications & libraries.
|
|
9
|
+
actions:
|
|
10
|
+
- theme: brand
|
|
11
|
+
text: Markdown Examples
|
|
12
|
+
link: /markdown-examples
|
|
13
|
+
- theme: alt
|
|
14
|
+
text: API Examples
|
|
15
|
+
link: /api-examples
|
|
16
|
+
|
|
17
|
+
features:
|
|
18
|
+
- title: Feature A
|
|
19
|
+
details: Lorem ipsum dolor sit amet, consectetur adipiscing elit
|
|
20
|
+
- title: Feature B
|
|
21
|
+
details: Lorem ipsum dolor sit amet, consectetur adipiscing elit
|
|
22
|
+
- title: Feature C
|
|
23
|
+
details: Lorem ipsum dolor sit amet, consectetur adipiscing elit
|
|
24
|
+
---
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# Markdown Extension Examples
|
|
2
|
+
|
|
3
|
+
This page demonstrates the built-in Markdown extensions provided by BunPress.
|
|
4
|
+
|
|
5
|
+
## Syntax Highlighting
|
|
6
|
+
|
|
7
|
+
BunPress provides syntax highlighting powered by [Shiki](https://github.com/shikijs/shiki), with additional features such as line highlighting:
|
|
8
|
+
|
|
9
|
+
**Input**
|
|
10
|
+
|
|
11
|
+
````md
|
|
12
|
+
```js{4}
|
|
13
|
+
|
|
14
|
+
export default {
|
|
15
|
+
data () {
|
|
16
|
+
return {
|
|
17
|
+
msg: 'Highlighted!'
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
````
|
|
24
|
+
|
|
25
|
+
**Output**
|
|
26
|
+
|
|
27
|
+
```js{4}
|
|
28
|
+
<script server>
|
|
29
|
+
const message = 'Highlighted!'
|
|
30
|
+
</script>
|
|
31
|
+
|
|
32
|
+
<template>
|
|
33
|
+
<p>{{ message }}</p>
|
|
34
|
+
</template>
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Custom Containers
|
|
38
|
+
|
|
39
|
+
**Input**
|
|
40
|
+
|
|
41
|
+
```md
|
|
42
|
+
::: info
|
|
43
|
+
This is an info box.
|
|
44
|
+
:::
|
|
45
|
+
|
|
46
|
+
::: tip
|
|
47
|
+
This is a tip.
|
|
48
|
+
:::
|
|
49
|
+
|
|
50
|
+
::: warning
|
|
51
|
+
This is a warning.
|
|
52
|
+
:::
|
|
53
|
+
|
|
54
|
+
::: danger
|
|
55
|
+
This is a dangerous warning.
|
|
56
|
+
:::
|
|
57
|
+
|
|
58
|
+
::: details
|
|
59
|
+
This is a details block.
|
|
60
|
+
:::
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**Output**
|
|
64
|
+
|
|
65
|
+
::: info
|
|
66
|
+
This is an info box.
|
|
67
|
+
:::
|
|
68
|
+
|
|
69
|
+
::: tip
|
|
70
|
+
This is a tip.
|
|
71
|
+
:::
|
|
72
|
+
|
|
73
|
+
::: warning
|
|
74
|
+
This is a warning.
|
|
75
|
+
:::
|
|
76
|
+
|
|
77
|
+
::: danger
|
|
78
|
+
This is a dangerous warning.
|
|
79
|
+
:::
|
|
80
|
+
|
|
81
|
+
::: details
|
|
82
|
+
This is a details block.
|
|
83
|
+
:::
|
|
84
|
+
|
|
85
|
+
## More
|
|
86
|
+
|
|
87
|
+
See the [BunPress markdown extensions reference](https://github.com/stacksjs/bunpress/blob/main/docs/markdown-extensions.md) for the complete syntax.
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analytics Composable
|
|
3
|
+
*/
|
|
4
|
+
import { ref } from '@stacksjs/stx'
|
|
5
|
+
|
|
6
|
+
const baseUrl = process.env.VITE_API_URL || `http://localhost:${process.env.PORT_API || '3008'}`
|
|
7
|
+
|
|
8
|
+
export interface AnalyticsOverview {
|
|
9
|
+
realtime: number
|
|
10
|
+
people: number
|
|
11
|
+
views: number
|
|
12
|
+
avgTimeOnSite: string
|
|
13
|
+
bounceRate: string
|
|
14
|
+
eventCompletions: number
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface TrafficDataPoint {
|
|
18
|
+
date: string
|
|
19
|
+
visitors: number
|
|
20
|
+
pageViews: number
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface PageData {
|
|
24
|
+
path: string
|
|
25
|
+
entries: number
|
|
26
|
+
visitors: number
|
|
27
|
+
views: number
|
|
28
|
+
percentage: number
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface ReferrerData {
|
|
32
|
+
name: string
|
|
33
|
+
visitors: number
|
|
34
|
+
views: number
|
|
35
|
+
percentage: number
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface DeviceData {
|
|
39
|
+
name: string
|
|
40
|
+
visitors: number
|
|
41
|
+
percentage: number
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export interface BrowserData {
|
|
45
|
+
name: string
|
|
46
|
+
visitors: number
|
|
47
|
+
percentage: number
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export interface CountryData {
|
|
51
|
+
name: string
|
|
52
|
+
visitors: number
|
|
53
|
+
percentage: number
|
|
54
|
+
flag: string
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function useAnalytics() {
|
|
58
|
+
const overview = ref<AnalyticsOverview>({ realtime: 0, people: 0, views: 0, avgTimeOnSite: '0s', bounceRate: '0%', eventCompletions: 0 })
|
|
59
|
+
const trafficData = ref<TrafficDataPoint[]>([])
|
|
60
|
+
const pagesData = ref<PageData[]>([])
|
|
61
|
+
const referrersData = ref<ReferrerData[]>([])
|
|
62
|
+
const devicesData = ref<DeviceData[]>([])
|
|
63
|
+
const browsersData = ref<BrowserData[]>([])
|
|
64
|
+
const countriesData = ref<CountryData[]>([])
|
|
65
|
+
const isLoading = ref(false)
|
|
66
|
+
const error = ref<string | null>(null)
|
|
67
|
+
|
|
68
|
+
async function fetchAll(dateRange = '7d') {
|
|
69
|
+
isLoading.value = true
|
|
70
|
+
error.value = null
|
|
71
|
+
try {
|
|
72
|
+
const response = await fetch(`${baseUrl}/analytics/web?range=${dateRange}`, {
|
|
73
|
+
headers: { 'Accept': 'application/json' },
|
|
74
|
+
})
|
|
75
|
+
if (response.ok) {
|
|
76
|
+
const data = await response.json()
|
|
77
|
+
overview.value = data.overview || overview.value
|
|
78
|
+
trafficData.value = data.traffic || []
|
|
79
|
+
pagesData.value = data.pages || []
|
|
80
|
+
referrersData.value = data.referrers || []
|
|
81
|
+
devicesData.value = data.devices || []
|
|
82
|
+
browsersData.value = data.browsers || []
|
|
83
|
+
countriesData.value = data.countries || []
|
|
84
|
+
}
|
|
85
|
+
} catch (e) {
|
|
86
|
+
error.value = 'Failed to load analytics data.'
|
|
87
|
+
console.error('Failed to fetch analytics:', e)
|
|
88
|
+
} finally {
|
|
89
|
+
isLoading.value = false
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return {
|
|
94
|
+
overview, trafficData, pagesData, referrersData, devicesData, browsersData, countriesData,
|
|
95
|
+
isLoading, error, fetchAll,
|
|
96
|
+
}
|
|
97
|
+
}
|
package/functions/api.ts
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Client for Dashboard
|
|
3
|
+
*
|
|
4
|
+
* Provides a simple fetch wrapper with authentication and error handling.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { useAuth } from './auth'
|
|
8
|
+
|
|
9
|
+
const baseUrl = process.env.VITE_API_URL || `http://localhost:${process.env.PORT_API || '3008'}`
|
|
10
|
+
|
|
11
|
+
export interface ApiResponse<T> {
|
|
12
|
+
data: T
|
|
13
|
+
message?: string
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface ApiError {
|
|
17
|
+
message: string
|
|
18
|
+
errors?: Record<string, string[]>
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Create headers with authentication
|
|
23
|
+
*/
|
|
24
|
+
function createHeaders(contentType = 'application/json'): Headers {
|
|
25
|
+
const { getToken } = useAuth()
|
|
26
|
+
const headers = new Headers({
|
|
27
|
+
'Accept': 'application/json',
|
|
28
|
+
'Content-Type': contentType,
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
const token = getToken()
|
|
32
|
+
if (token) {
|
|
33
|
+
headers.set('Authorization', `Bearer ${token}`)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return headers
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Handle API response
|
|
41
|
+
*/
|
|
42
|
+
async function handleResponse<T>(response: Response): Promise<T> {
|
|
43
|
+
if (!response.ok) {
|
|
44
|
+
const error = await response.json().catch(() => ({
|
|
45
|
+
message: `HTTP error! status: ${response.status}`,
|
|
46
|
+
}))
|
|
47
|
+
throw new Error(error.message || `HTTP error! status: ${response.status}`)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return response.json() as Promise<T>
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* GET request
|
|
55
|
+
*/
|
|
56
|
+
export async function get<T>(endpoint: string): Promise<T> {
|
|
57
|
+
const response = await fetch(`${baseUrl}${endpoint}`, {
|
|
58
|
+
method: 'GET',
|
|
59
|
+
headers: createHeaders(),
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
return handleResponse<T>(response)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* POST request
|
|
67
|
+
*/
|
|
68
|
+
export async function post<T>(endpoint: string, body?: unknown): Promise<T> {
|
|
69
|
+
const response = await fetch(`${baseUrl}${endpoint}`, {
|
|
70
|
+
method: 'POST',
|
|
71
|
+
headers: createHeaders(),
|
|
72
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
return handleResponse<T>(response)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* PUT request
|
|
80
|
+
*/
|
|
81
|
+
export async function put<T>(endpoint: string, body?: unknown): Promise<T> {
|
|
82
|
+
const response = await fetch(`${baseUrl}${endpoint}`, {
|
|
83
|
+
method: 'PUT',
|
|
84
|
+
headers: createHeaders(),
|
|
85
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
86
|
+
})
|
|
87
|
+
|
|
88
|
+
return handleResponse<T>(response)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* PATCH request
|
|
93
|
+
*/
|
|
94
|
+
export async function patch<T>(endpoint: string, body?: unknown): Promise<T> {
|
|
95
|
+
const response = await fetch(`${baseUrl}${endpoint}`, {
|
|
96
|
+
method: 'PATCH',
|
|
97
|
+
headers: createHeaders(),
|
|
98
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
return handleResponse<T>(response)
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* DELETE request
|
|
106
|
+
*/
|
|
107
|
+
export async function del<T>(endpoint: string): Promise<T> {
|
|
108
|
+
const response = await fetch(`${baseUrl}${endpoint}`, {
|
|
109
|
+
method: 'DELETE',
|
|
110
|
+
headers: createHeaders(),
|
|
111
|
+
})
|
|
112
|
+
|
|
113
|
+
return handleResponse<T>(response)
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Create a typed API resource helper
|
|
118
|
+
*/
|
|
119
|
+
export function createResource<T>(basePath: string) {
|
|
120
|
+
return {
|
|
121
|
+
list: () => get<ApiResponse<T[]>>(basePath),
|
|
122
|
+
get: (id: string | number) => get<ApiResponse<T>>(`${basePath}/${id}`),
|
|
123
|
+
create: (data: Partial<T>) => post<ApiResponse<T>>(basePath, data),
|
|
124
|
+
update: (id: string | number, data: Partial<T>) => put<ApiResponse<T>>(`${basePath}/${id}`, data),
|
|
125
|
+
patch: (id: string | number, data: Partial<T>) => patch<ApiResponse<T>>(`${basePath}/${id}`, data),
|
|
126
|
+
delete: (id: string | number) => del<ApiResponse<void>>(`${basePath}/${id}`),
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* API composable
|
|
132
|
+
*/
|
|
133
|
+
export function useApi() {
|
|
134
|
+
return {
|
|
135
|
+
get,
|
|
136
|
+
post,
|
|
137
|
+
put,
|
|
138
|
+
patch,
|
|
139
|
+
delete: del,
|
|
140
|
+
createResource,
|
|
141
|
+
baseUrl,
|
|
142
|
+
}
|
|
143
|
+
}
|