@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,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard API Routes
|
|
3
|
+
*
|
|
4
|
+
* JSON endpoints under `/api/dashboard/*` that the dev dashboard UI fetches
|
|
5
|
+
* from. Kept separate from `defaults/routes/dashboard.ts` (which mounts the
|
|
6
|
+
* STX views, auth flows, email subscribe, etc.) so the data layer for the
|
|
7
|
+
* dashboard has one obvious file to grep.
|
|
8
|
+
*
|
|
9
|
+
* Registered in `defaults/bootstrap.ts`. The dev dashboard server delegates
|
|
10
|
+
* `/api/dashboard/*` requests to the Stacks router; user-defined routes in
|
|
11
|
+
* `routes/api.ts` still take priority because they load first.
|
|
12
|
+
*
|
|
13
|
+
* Routes that mutate data or expose unpublished content are wrapped in
|
|
14
|
+
* `guard()` (see below): a no-op locally so the dev dashboard works without a
|
|
15
|
+
* token, `auth` + `role:admin` everywhere else. The remaining reads are
|
|
16
|
+
* unauthenticated by design.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { route } from '@stacksjs/router'
|
|
20
|
+
|
|
21
|
+
// The `/api/dashboard/*` surface is unauthenticated by design for the local
|
|
22
|
+
// dev dashboard (which gates content client-side via `useRole()`). Client-side
|
|
23
|
+
// gating is no protection for a JSON API, so once the dashboard is reachable
|
|
24
|
+
// off localhost the privilege-bearing endpoints — RBAC role/permission writes
|
|
25
|
+
// (assign-any-role-to-any-user = privilege escalation) and the model-row dump
|
|
26
|
+
// (arbitrary DB read) — must be gated server-side. In a local/dev/test env the
|
|
27
|
+
// guard is a no-op so the dev dashboard keeps working without a token.
|
|
28
|
+
const APP_ENV = (process.env.APP_ENV ?? process.env.NODE_ENV ?? '').toLowerCase()
|
|
29
|
+
const IS_LOCAL_ENV = APP_ENV === '' || APP_ENV === 'local' || APP_ENV === 'development' || APP_ENV === 'dev' || APP_ENV === 'test' || APP_ENV === 'testing'
|
|
30
|
+
|
|
31
|
+
// Apply auth + admin-role middleware to a sensitive route outside local envs.
|
|
32
|
+
// Returns the route builder so calls read as `guard(route.post(...))`.
|
|
33
|
+
function guard(r: any): any {
|
|
34
|
+
if (!IS_LOCAL_ENV)
|
|
35
|
+
r.middleware('auth').middleware('role:admin')
|
|
36
|
+
return r
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
route.group({ prefix: '/api/dashboard', apiResponse: true }, () => {
|
|
40
|
+
guard(route.get('/home', 'Actions/Dashboard/DashboardHomeAction'))
|
|
41
|
+
|
|
42
|
+
// CMS admin — backs the pages under `views/dashboard/content/`.
|
|
43
|
+
//
|
|
44
|
+
// This is the dashboard-reachable surface for CMS CRUD. The `/cms/*` group in
|
|
45
|
+
// `defaults/routes/dashboard.ts` is the public authoring API and is NOT usable
|
|
46
|
+
// from here: the dev dashboard server only delegates `/api/*` to the Stacks
|
|
47
|
+
// router on GET (a GET `/cms/posts` renders the STX 404 page instead), and
|
|
48
|
+
// that group is `middleware: 'auth'` while the dashboard server runs with
|
|
49
|
+
// `auth: false` and sends no credentials.
|
|
50
|
+
//
|
|
51
|
+
// Guarded for the same reason as the blog routes below: the writes mutate the
|
|
52
|
+
// database and the reads expose unpublished drafts and unmoderated comments.
|
|
53
|
+
guard(route.get('/posts', 'Actions/Dashboard/Content/PostIndexAction'))
|
|
54
|
+
guard(route.post('/posts', 'Actions/Dashboard/Content/PostStoreAction'))
|
|
55
|
+
guard(route.patch('/posts/{id}', 'Actions/Dashboard/Content/PostUpdateAction'))
|
|
56
|
+
guard(route.delete('/posts/{id}', 'Actions/Dashboard/Content/PostDestroyAction'))
|
|
57
|
+
|
|
58
|
+
guard(route.get('/authors', 'Actions/Dashboard/Content/AuthorIndexAction'))
|
|
59
|
+
guard(route.post('/authors', 'Actions/Dashboard/Content/AuthorStoreAction'))
|
|
60
|
+
guard(route.delete('/authors/{id}', 'Actions/Dashboard/Content/AuthorDestroyAction'))
|
|
61
|
+
|
|
62
|
+
guard(route.get('/categories', 'Actions/Dashboard/Content/CategoryIndexAction'))
|
|
63
|
+
guard(route.post('/categories', 'Actions/Dashboard/Content/CategoryStoreAction'))
|
|
64
|
+
guard(route.delete('/categories/{id}', 'Actions/Dashboard/Content/CategoryDestroyAction'))
|
|
65
|
+
|
|
66
|
+
guard(route.get('/tags', 'Actions/Dashboard/Content/TagIndexAction'))
|
|
67
|
+
guard(route.post('/tags', 'Actions/Dashboard/Content/TagStoreAction'))
|
|
68
|
+
guard(route.delete('/tags/{id}', 'Actions/Dashboard/Content/TagDestroyAction'))
|
|
69
|
+
|
|
70
|
+
guard(route.get('/pages', 'Actions/Dashboard/Content/PageIndexAction'))
|
|
71
|
+
guard(route.post('/pages', 'Actions/Dashboard/Content/PageStoreAction'))
|
|
72
|
+
guard(route.delete('/pages/{id}', 'Actions/Dashboard/Content/PageDestroyAction'))
|
|
73
|
+
|
|
74
|
+
// No store route: comments arrive from readers, the dashboard only moderates.
|
|
75
|
+
guard(route.get('/comments', 'Actions/Dashboard/Content/CommentIndexAction'))
|
|
76
|
+
guard(route.patch('/comments/{id}', 'Actions/Dashboard/Content/CommentUpdateAction'))
|
|
77
|
+
guard(route.delete('/comments/{id}', 'Actions/Dashboard/Content/CommentDestroyAction'))
|
|
78
|
+
|
|
79
|
+
route.get('/ci/status', 'Actions/Dashboard/Ci/StatusAction')
|
|
80
|
+
// CI drilldown (stacksjs/stacks#1848): per-repo run history + per-run
|
|
81
|
+
// job detail. On-demand reads so the polled snapshot stays cheap.
|
|
82
|
+
// `name` is the URL-meaningful identifier here; bun-router segments
|
|
83
|
+
// route on per-param basis so the `runs/{runId}/jobs` form doesn't
|
|
84
|
+
// conflict with the `runs?limit=N` collection form.
|
|
85
|
+
route.get('/ci/repos/{owner}/{name}/runs', 'Actions/Dashboard/Ci/RepoRunsAction')
|
|
86
|
+
route.get('/ci/repos/{owner}/{name}/runs/{runId}/jobs', 'Actions/Dashboard/Ci/RepoRunJobsAction')
|
|
87
|
+
// Runner-pressure history for the sparkline (stacksjs/stacks#1850).
|
|
88
|
+
// Only useful when `ci.alerts.enabled` is on — otherwise no samples
|
|
89
|
+
// have been recorded.
|
|
90
|
+
route.get('/ci/runner-history', 'Actions/Dashboard/Ci/RunnerHistoryAction')
|
|
91
|
+
|
|
92
|
+
// RBAC management surface (stacksjs/stacks#1845).
|
|
93
|
+
//
|
|
94
|
+
// These endpoints can assign any role to any user (privilege
|
|
95
|
+
// escalation) and enumerate users, so they are wrapped in `guard()`:
|
|
96
|
+
// unauthenticated in local/dev (the dashboard gates client-side via
|
|
97
|
+
// `useRole().isAdmin()`), but `auth` + `role:admin` enforced server-side
|
|
98
|
+
// in every non-local env (see the guard definition at the top of file).
|
|
99
|
+
guard(route.get('/rbac/roles', 'Actions/Dashboard/Rbac/RolesIndexAction'))
|
|
100
|
+
guard(route.post('/rbac/roles', 'Actions/Dashboard/Rbac/RoleStoreAction'))
|
|
101
|
+
guard(route.delete('/rbac/roles/{name}', 'Actions/Dashboard/Rbac/RoleDestroyAction'))
|
|
102
|
+
|
|
103
|
+
guard(route.get('/rbac/permissions', 'Actions/Dashboard/Rbac/PermissionsIndexAction'))
|
|
104
|
+
guard(route.post('/rbac/permissions', 'Actions/Dashboard/Rbac/PermissionStoreAction'))
|
|
105
|
+
guard(route.delete('/rbac/permissions/{name}', 'Actions/Dashboard/Rbac/PermissionDestroyAction'))
|
|
106
|
+
|
|
107
|
+
guard(route.get('/rbac/users', 'Actions/Dashboard/Rbac/UsersListAction'))
|
|
108
|
+
guard(route.get('/rbac/users/{id}/roles', 'Actions/Dashboard/Rbac/UserRolesShowAction'))
|
|
109
|
+
guard(route.post('/rbac/users/{id}/roles', 'Actions/Dashboard/Rbac/UserRolesSyncAction'))
|
|
110
|
+
|
|
111
|
+
guard(route.get('/rbac/roles/{name}/permissions', 'Actions/Dashboard/Rbac/RolePermissionsShowAction'))
|
|
112
|
+
guard(route.post('/rbac/roles/{name}/permissions', 'Actions/Dashboard/Rbac/RolePermissionsSyncAction'))
|
|
113
|
+
// RBAC identity endpoint (stacksjs/stacks#1843). Returns the
|
|
114
|
+
// authenticated user + their role names so the dashboard's `useRole()`
|
|
115
|
+
// composable can gate dev-mode surfaces. Tolerates unauthenticated
|
|
116
|
+
// requests — see the action for the soft-fallback shape.
|
|
117
|
+
route.get('/auth/me', 'Actions/Dashboard/Auth/MeAction')
|
|
118
|
+
|
|
119
|
+
// Kanban surface (stacksjs/stacks#1846). Phase 1: read-only.
|
|
120
|
+
//
|
|
121
|
+
// Phase 2 lands write endpoints under the same prefix:
|
|
122
|
+
// POST /kanban/boards — store
|
|
123
|
+
// PATCH /kanban/boards/{id} — update
|
|
124
|
+
// DELETE /kanban/boards/{id} — destroy
|
|
125
|
+
// POST /kanban/boards/reorder — bulk position update
|
|
126
|
+
// POST /kanban/columns — store
|
|
127
|
+
// PATCH /kanban/columns/{id} — update
|
|
128
|
+
// POST /kanban/columns/reorder — bulk position update
|
|
129
|
+
// POST /kanban/cards — store
|
|
130
|
+
// PATCH /kanban/cards/{id} — update (incl. column move)
|
|
131
|
+
// POST /kanban/cards/reorder — bulk position update
|
|
132
|
+
//
|
|
133
|
+
// No role middleware applied yet — the route group at the file level
|
|
134
|
+
// doesn't enforce auth (matches the rest of /api/dashboard/*). The
|
|
135
|
+
// page itself wraps content in `useRole().isDev()` so non-dev users
|
|
136
|
+
// see an empty surface when the dashboard ever gets exposed beyond
|
|
137
|
+
// localhost. Tighten with `.middleware('auth').middleware('role:admin,dev')`
|
|
138
|
+
// when the dashboard is deployed multi-tenant.
|
|
139
|
+
// Reads (Phase 1)
|
|
140
|
+
route.get('/kanban/boards', 'Actions/Dashboard/Kanban/BoardsIndexAction')
|
|
141
|
+
route.get('/kanban/boards/{id}', 'Actions/Dashboard/Kanban/BoardShowAction')
|
|
142
|
+
|
|
143
|
+
// Writes (Phase 2). The reorder endpoints are POST not PATCH because
|
|
144
|
+
// their semantics — "here's the full new state of this slice of the
|
|
145
|
+
// board" — match the resource-replacement intent better than PATCH's
|
|
146
|
+
// "apply this delta" verb. They also accept a body shape that PATCH
|
|
147
|
+
// verbs don't conventionally carry.
|
|
148
|
+
route.post('/kanban/boards', 'Actions/Dashboard/Kanban/BoardStoreAction')
|
|
149
|
+
route.patch('/kanban/boards/{id}', 'Actions/Dashboard/Kanban/BoardUpdateAction')
|
|
150
|
+
route.delete('/kanban/boards/{id}', 'Actions/Dashboard/Kanban/BoardDestroyAction')
|
|
151
|
+
route.post('/kanban/boards/reorder', 'Actions/Dashboard/Kanban/BoardsReorderAction')
|
|
152
|
+
|
|
153
|
+
route.post('/kanban/columns', 'Actions/Dashboard/Kanban/ColumnStoreAction')
|
|
154
|
+
route.patch('/kanban/columns/{id}', 'Actions/Dashboard/Kanban/ColumnUpdateAction')
|
|
155
|
+
route.delete('/kanban/columns/{id}', 'Actions/Dashboard/Kanban/ColumnDestroyAction')
|
|
156
|
+
route.post('/kanban/columns/reorder', 'Actions/Dashboard/Kanban/ColumnsReorderAction')
|
|
157
|
+
|
|
158
|
+
route.post('/kanban/cards', 'Actions/Dashboard/Kanban/CardStoreAction')
|
|
159
|
+
route.patch('/kanban/cards/{id}', 'Actions/Dashboard/Kanban/CardUpdateAction')
|
|
160
|
+
route.delete('/kanban/cards/{id}', 'Actions/Dashboard/Kanban/CardDestroyAction')
|
|
161
|
+
route.post('/kanban/cards/reorder', 'Actions/Dashboard/Kanban/CardsReorderAction')
|
|
162
|
+
|
|
163
|
+
// Phase 3 — card detail + labels + assignees + comments.
|
|
164
|
+
//
|
|
165
|
+
// The card-show endpoint is the only "single card with everything"
|
|
166
|
+
// read; the boards/{id} response already embeds labels + assignees
|
|
167
|
+
// per card for the kanban view, so the modal only fetches when
|
|
168
|
+
// opening (or for direct URL access).
|
|
169
|
+
route.get('/kanban/cards/{id}', 'Actions/Dashboard/Kanban/CardShowAction')
|
|
170
|
+
|
|
171
|
+
// Label CRUD. No reorder endpoint — labels are board-scoped tag
|
|
172
|
+
// palettes, no inherent order beyond alphabetical.
|
|
173
|
+
route.post('/kanban/labels', 'Actions/Dashboard/Kanban/LabelStoreAction')
|
|
174
|
+
route.patch('/kanban/labels/{id}', 'Actions/Dashboard/Kanban/LabelUpdateAction')
|
|
175
|
+
route.delete('/kanban/labels/{id}', 'Actions/Dashboard/Kanban/LabelDestroyAction')
|
|
176
|
+
|
|
177
|
+
// Card-pivot sync endpoints. Sync semantics: pass the full new
|
|
178
|
+
// list, the action diffs against current state. Single-shot calls
|
|
179
|
+
// from the modal's label/assignee pickers.
|
|
180
|
+
route.post('/kanban/cards/{id}/labels', 'Actions/Dashboard/Kanban/CardLabelsSyncAction')
|
|
181
|
+
route.post('/kanban/cards/{id}/assignees', 'Actions/Dashboard/Kanban/CardAssigneesSyncAction')
|
|
182
|
+
|
|
183
|
+
// Comments. Append-only thread: store + destroy, no edit yet — the
|
|
184
|
+
// history-preservation argument outweighs the "fix a typo" argument
|
|
185
|
+
// until someone explicitly asks for editing.
|
|
186
|
+
route.post('/kanban/cards/{id}/comments', 'Actions/Dashboard/Kanban/CardCommentStoreAction')
|
|
187
|
+
route.delete('/kanban/comments/{id}', 'Actions/Dashboard/Kanban/CardCommentDestroyAction')
|
|
188
|
+
|
|
189
|
+
// Lightweight user list for the assignee picker. Distinct from the
|
|
190
|
+
// wider `/api/dashboard/users` (Data section consumer) — the
|
|
191
|
+
// picker only needs id/name/email.
|
|
192
|
+
route.get('/kanban/users', 'Actions/Dashboard/Kanban/UsersListAction')
|
|
193
|
+
|
|
194
|
+
// Commerce dashboard stats. Same Action that backs the auth'd
|
|
195
|
+
// `/api/commerce/dashboard` — exposed here without the auth gate so
|
|
196
|
+
// the dev-mode dashboard surface in `views/dashboard/commerce/dashboard/`
|
|
197
|
+
// can load it directly. The page itself stays admin-gated via
|
|
198
|
+
// `useRole().isAdmin()` (stacksjs/stacks#1838).
|
|
199
|
+
route.get('/commerce/stats', 'Actions/Dashboard/Commerce/CommerceDashboardAction')
|
|
200
|
+
|
|
201
|
+
// Models overview. Walks `app/Models/` + framework default models,
|
|
202
|
+
// counts rows for each, returns grouped JSON for the
|
|
203
|
+
// `views/dashboard/models/index.stx` page (stacksjs/stacks#1838).
|
|
204
|
+
guard(route.get('/models', 'Actions/Dashboard/Models/ModelsIndexAction'))
|
|
205
|
+
|
|
206
|
+
// Per-model row view — first 50 rows + column list, for the
|
|
207
|
+
// dynamic `views/dashboard/models/[model].stx` page. ORM path
|
|
208
|
+
// first, raw SQLite fallback if no model file matches the slug.
|
|
209
|
+
guard(route.get('/models/{slug}', 'Actions/Dashboard/Models/ModelShowAction'))
|
|
210
|
+
|
|
211
|
+
// Markdown blog admin — the write side of the BunPress blog that /blog
|
|
212
|
+
// renders from `content/blog/*.md` (storage/framework/core/actions/src/blog.ts).
|
|
213
|
+
// Backs `views/dashboard/content/blog/index.stx`.
|
|
214
|
+
//
|
|
215
|
+
// Every route is guarded: the writes put files on disk, and the reads expose
|
|
216
|
+
// unpublished drafts. Neither belongs on an unauthenticated endpoint once the
|
|
217
|
+
// dashboard is reachable off localhost.
|
|
218
|
+
guard(route.get('/blog', 'Actions/Blog/BlogIndexAction'))
|
|
219
|
+
guard(route.get('/blog/{slug}', 'Actions/Blog/BlogShowAction'))
|
|
220
|
+
guard(route.post('/blog', 'Actions/Blog/BlogStoreAction'))
|
|
221
|
+
guard(route.patch('/blog/{slug}', 'Actions/Blog/BlogUpdateAction'))
|
|
222
|
+
guard(route.delete('/blog/{slug}', 'Actions/Blog/BlogDestroyAction'))
|
|
223
|
+
|
|
224
|
+
// Email inbox — real inbound mailbox data from S3.
|
|
225
|
+
//
|
|
226
|
+
// Reads expose recipient/subject metadata; the mark-read endpoint mutates
|
|
227
|
+
// the per-mailbox inbox.json index. Both are guarded outside local/dev
|
|
228
|
+
// because they touch real mailbox state and PII.
|
|
229
|
+
guard(route.get('/email/inbox', 'Actions/Dashboard/Email/InboxIndexAction'))
|
|
230
|
+
guard(route.get('/email/inbox/{id}', 'Actions/Dashboard/Email/InboxShowAction'))
|
|
231
|
+
guard(route.get('/email/stats', 'Actions/Dashboard/Email/InboxStatsAction'))
|
|
232
|
+
guard(route.post('/email/read', 'Actions/Dashboard/Email/InboxMarkReadAction'))
|
|
233
|
+
})
|