@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,416 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: stacks-strings
|
|
3
|
+
description: Use when working with string utilities in Stacks — case conversion (camelCase, PascalCase, snake_case, kebab-case, CONSTANT_CASE, Train-Case, etc.), pluralization, string validation (email, URL, UUID, credit card, etc.), slug generation, random strings, template interpolation, or the Str facade. Covers @stacksjs/strings.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Bun >= 1.3.0, TypeScript
|
|
6
|
+
allowed-tools: Read Edit Write Bash Grep Glob
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Stacks Strings
|
|
10
|
+
|
|
11
|
+
## Key Paths
|
|
12
|
+
- Core package: `storage/framework/core/strings/src/`
|
|
13
|
+
- Package: `@stacksjs/strings`
|
|
14
|
+
- Entry: `storage/framework/core/strings/src/string.ts` (re-exports all submodules)
|
|
15
|
+
|
|
16
|
+
## Architecture
|
|
17
|
+
|
|
18
|
+
The package re-exports from these submodules:
|
|
19
|
+
- `case.ts` — case conversion functions (camelCase, pascalCase, snakeCase, etc.)
|
|
20
|
+
- `pluralize.ts` — English pluralization/singularization with rule engine
|
|
21
|
+
- `slug.ts` — URL slug generation with extensive character map
|
|
22
|
+
- `utils.ts` — random strings, template interpolation, slash, prefix/suffix, truncate, detect-indent, detect-newline
|
|
23
|
+
- `macro.ts` — `Str` and `str` facade objects
|
|
24
|
+
- `validators.ts` — re-exports from `is.ts` (native string validators)
|
|
25
|
+
- `sponge-case.ts` — random upper/lower case
|
|
26
|
+
- `swap-case.ts` — swap upper/lower case
|
|
27
|
+
- `title-case.ts` — intelligent title case with small word handling
|
|
28
|
+
|
|
29
|
+
The top-level `index.ts` does:
|
|
30
|
+
```typescript
|
|
31
|
+
export * from './string'
|
|
32
|
+
export * as string from './string'
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
And `string.ts` does:
|
|
36
|
+
```typescript
|
|
37
|
+
export * from './case'
|
|
38
|
+
export * from './helpers'
|
|
39
|
+
export * from './macro'
|
|
40
|
+
export * from './pluralize'
|
|
41
|
+
export * from './slug'
|
|
42
|
+
export * from './utils'
|
|
43
|
+
export * from './validators'
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Case Conversion Functions
|
|
47
|
+
|
|
48
|
+
All accept `(input: string, options?: CaseOptions)` and use Unicode-aware word boundary detection via regex patterns (`\p{Ll}`, `\p{Lu}`).
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
interface CaseOptions {
|
|
52
|
+
locale?: string[] | string | false | undefined
|
|
53
|
+
split?: (value: string) => string[]
|
|
54
|
+
delimiter?: string
|
|
55
|
+
prefixCharacters?: string // characters to preserve as prefix
|
|
56
|
+
suffixCharacters?: string // characters to preserve as suffix
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
interface PascalCaseOptions extends CaseOptions {
|
|
60
|
+
mergeAmbiguousCharacters?: boolean
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Functions
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
camelCase('hello world') // 'helloWorld' — first word lowercase, rest capitalized
|
|
68
|
+
pascalCase('hello world') // 'HelloWorld' — all words capitalized
|
|
69
|
+
snakeCase('hello world') // 'hello_world' — alias for noCase with '_' delimiter
|
|
70
|
+
kebabCase('hello world') // 'hello-world' — alias for noCase with '-' delimiter
|
|
71
|
+
constantCase('hello world') // 'HELLO_WORLD' — all uppercase with '_' delimiter
|
|
72
|
+
trainCase('hello world') // 'Hello-World' — capitalCase with '-' delimiter
|
|
73
|
+
dotCase('hello world') // 'hello.world' — noCase with '.' delimiter
|
|
74
|
+
pathCase('hello world') // 'hello/world' — noCase with '/' delimiter
|
|
75
|
+
sentenceCase('hello world') // 'Hello world' — first word capitalized, rest lowercase
|
|
76
|
+
capitalCase('hello world') // 'Hello World' — all words capitalized, space delimiter
|
|
77
|
+
noCase('helloWorld') // 'hello world' — lowercase with space delimiter
|
|
78
|
+
pascalSnakeCase('hello world') // 'Hello_World' — capitalCase with '_' delimiter
|
|
79
|
+
paramCase('hello world') // 'hello-world' — alias for kebabCase
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Special Case Functions
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
spongeCase('hello world') // 'hElLo wOrLd' — random upper/lower per character
|
|
86
|
+
spongeCase('hello', 'en') // accepts optional locale
|
|
87
|
+
|
|
88
|
+
swapCase('Hello') // 'hELLO' — swaps each character's case
|
|
89
|
+
swapCase('Hello', 'en') // accepts optional locale
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Title Case
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
titleCase('hello world') // 'Hello World'
|
|
96
|
+
titleCase('the quick brown fox') // 'The Quick Brown Fox'
|
|
97
|
+
titleCase('the quick brown fox', { sentenceCase: true }) // 'The quick brown fox'
|
|
98
|
+
|
|
99
|
+
interface TitleCaseOptions {
|
|
100
|
+
locale?: string | string[]
|
|
101
|
+
sentenceCase?: boolean // only capitalize first word + after terminators
|
|
102
|
+
sentenceTerminators?: Set<string> // default: '.', '!', '?'
|
|
103
|
+
titleTerminators?: Set<string> // default: '.', '!', '?', ':', '"', "'", '"'
|
|
104
|
+
smallWords?: Set<string> // words not capitalized (see SMALL_WORDS)
|
|
105
|
+
wordSeparators?: Set<string> // default: '---', '--', '-', '---', '/'
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Handles special cases: URLs, email addresses, acronyms (e.g., "U.S.A."), camelCase words (e.g., "iPhone"), and hyphenated compound words.
|
|
110
|
+
|
|
111
|
+
### Word Splitting
|
|
112
|
+
|
|
113
|
+
```typescript
|
|
114
|
+
split('camelCase') // ['camel', 'Case']
|
|
115
|
+
split('hello_world') // ['hello', 'world']
|
|
116
|
+
split('HTTPSRequest') // ['HTTPS', 'Request']
|
|
117
|
+
splitSeparateNumbers('test123') // ['test', '123']
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Uses Unicode-aware regex for word boundary detection. Handles camelCase, PascalCase, snake_case, UPPER_CASE, and mixed formats.
|
|
121
|
+
|
|
122
|
+
## Pluralization
|
|
123
|
+
|
|
124
|
+
Full English pluralization engine with irregular words, custom rules, and uncountable nouns.
|
|
125
|
+
|
|
126
|
+
```typescript
|
|
127
|
+
import { plural, singular, pluralize } from '@stacksjs/strings'
|
|
128
|
+
|
|
129
|
+
// Basic usage
|
|
130
|
+
plural('person') // 'people'
|
|
131
|
+
plural('person', 1) // 'person' (count-aware)
|
|
132
|
+
singular('people') // 'person'
|
|
133
|
+
|
|
134
|
+
// Pluralize function with options
|
|
135
|
+
pluralize('mouse') // 'mice'
|
|
136
|
+
pluralize('mouse', { count: 1 }) // 'mouse'
|
|
137
|
+
pluralize('mouse', { count: 2 }) // 'mice'
|
|
138
|
+
pluralize('mouse', { count: 5, inclusive: true }) // '5 mice'
|
|
139
|
+
|
|
140
|
+
// Boolean checks
|
|
141
|
+
pluralize.isPlural('dogs') // true
|
|
142
|
+
pluralize.isSingular('dog') // true
|
|
143
|
+
|
|
144
|
+
// Custom rules
|
|
145
|
+
pluralize.addPluralRule(/gex$/i, 'gices')
|
|
146
|
+
pluralize.addSingularRule(/gices$/i, 'gex')
|
|
147
|
+
pluralize.addIrregularRule('person', 'people')
|
|
148
|
+
pluralize.addUncountableRule('sheep')
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Built-in Irregular Words
|
|
152
|
+
The engine includes 48 irregular word pairs (e.g., ox/oxen, foot/feet, goose/geese, child/children, person/people, die/dice, tooth/teeth, quiz/quizzes, etc.).
|
|
153
|
+
|
|
154
|
+
### Built-in Uncountable Words
|
|
155
|
+
Includes 74 uncountable words (e.g., sheep, fish, moose, aircraft, software, equipment, information, etc.) plus regex patterns for Pokemon, words ending in non-ASCII `ese`, deer, fish, measles, pox, sheep.
|
|
156
|
+
|
|
157
|
+
### Case Preservation
|
|
158
|
+
The pluralization engine preserves the case pattern of the input word:
|
|
159
|
+
- `'PERSON'` -> `'PEOPLE'`
|
|
160
|
+
- `'Person'` -> `'People'`
|
|
161
|
+
- `'person'` -> `'people'`
|
|
162
|
+
|
|
163
|
+
## Slug Generation
|
|
164
|
+
|
|
165
|
+
Two slug functions with different defaults:
|
|
166
|
+
|
|
167
|
+
### `slug(str, options?)` — Simple slug (strict + lowercase by default)
|
|
168
|
+
```typescript
|
|
169
|
+
slug('Hello World') // 'hello-world'
|
|
170
|
+
slug('Hello World', { lower: false }) // 'Hello-World'
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### `slugify(str, options?)` — Full-featured slug
|
|
174
|
+
```typescript
|
|
175
|
+
slugify('Hello World!') // 'Hello-World!' (not strict/lowercase by default)
|
|
176
|
+
slugify('Hello World!', { lower: true, strict: true }) // 'hello-world'
|
|
177
|
+
|
|
178
|
+
interface SlugifyOptions {
|
|
179
|
+
replacement?: string // default: '-'
|
|
180
|
+
remove?: RegExp // chars to remove (default: /[^\w\s$*+~.()'"!\-:@]+/g)
|
|
181
|
+
lower?: boolean // default: false
|
|
182
|
+
strict?: boolean // strip non-alphanumeric (default: false)
|
|
183
|
+
locale?: string // locale-specific char mapping
|
|
184
|
+
trim?: boolean // trim result (default: true)
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### Character Map
|
|
189
|
+
Extensive built-in character map covering:
|
|
190
|
+
- Latin extended (accented chars): A-Z with diacritics
|
|
191
|
+
- Greek alphabet
|
|
192
|
+
- Cyrillic alphabet
|
|
193
|
+
- Armenian alphabet
|
|
194
|
+
- Arabic alphabet and numerals
|
|
195
|
+
- Georgian alphabet
|
|
196
|
+
- Vietnamese diacritics
|
|
197
|
+
- Currency symbols ($, EUR, GBP, YEN, etc.)
|
|
198
|
+
- Special characters (trademark, copyright, etc.)
|
|
199
|
+
|
|
200
|
+
### Locale Support
|
|
201
|
+
Locale-specific character mappings for: `bg`, `de`, `es`, `fr`, `pt`, `uk`, `vi`, `da`, `nb`, `it`, `nl`, `sv`.
|
|
202
|
+
|
|
203
|
+
```typescript
|
|
204
|
+
slugify('AE', { locale: 'de' }) // 'AE' (German)
|
|
205
|
+
slugify('AE') // 'A' (default)
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### Extending the Character Map
|
|
209
|
+
```typescript
|
|
210
|
+
extendCharMap({ 'EUR': 'EUR', 'GBP': 'GBP' })
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
## String Utilities
|
|
214
|
+
|
|
215
|
+
```typescript
|
|
216
|
+
capitalize('hello world') // 'Hello world' — first char upper, rest lower
|
|
217
|
+
lowercase('HELLO') // 'hello'
|
|
218
|
+
slash('path\\to\\file') // 'path/to/file'
|
|
219
|
+
ensurePrefix('https://', 'google.com') // 'https://google.com'
|
|
220
|
+
ensurePrefix('https://', 'https://x.com') // 'https://x.com' (already has prefix)
|
|
221
|
+
ensureSuffix('.ts', 'file') // 'file.ts'
|
|
222
|
+
ensureSuffix('.ts', 'file.ts') // 'file.ts' (already has suffix)
|
|
223
|
+
template('Hello {0}! My name is {1}.', 'Buddy', 'Chris') // 'Hello Buddy! My name is Chris.'
|
|
224
|
+
truncate('long text here', 10, '...') // 'long te...'
|
|
225
|
+
truncate('short', 10) // 'short' (no truncation needed)
|
|
226
|
+
random() // 16-char random string (nanoid-style)
|
|
227
|
+
random(21) // 21-char random string
|
|
228
|
+
random(10, 'abc') // 10-char string from custom alphabet
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### `urlAlphabet` Constant
|
|
232
|
+
```typescript
|
|
233
|
+
// 64 URL-safe characters used by random() by default
|
|
234
|
+
const urlAlphabet = 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
## String Validators
|
|
238
|
+
|
|
239
|
+
Native TypeScript implementations (no external validator dependency). All accept a string and return boolean.
|
|
240
|
+
|
|
241
|
+
### Core Validators
|
|
242
|
+
```typescript
|
|
243
|
+
isEmail('user@example.com') // true -- regex: /^[^\s@]+@[^\s@]+\.[^\s@]+$/
|
|
244
|
+
isStrongPassword('Abc123!@#') // true -- min 8 chars, upper, lower, digit, symbol
|
|
245
|
+
isAlphanumeric('abc123') // true -- /^[a-zA-Z0-9]+$/
|
|
246
|
+
isAlpha('abcdef') // true -- /^[a-zA-Z]+$/
|
|
247
|
+
isNumeric('123') // true -- /^[0-9]+$/ (whole numbers only)
|
|
248
|
+
isURL('https://example.com') // true -- uses URL constructor, requires http(s) protocol
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
### Format Validators
|
|
252
|
+
```typescript
|
|
253
|
+
isHexColor('#ff0000') // true -- 3 or 6 hex digits with #
|
|
254
|
+
isHexadecimal('deadbeef') // true -- hex chars only
|
|
255
|
+
isBase64('SGVsbG8=') // true -- btoa(atob(x)) === x
|
|
256
|
+
isBase32('MFZWI===') // true -- /^[A-Z2-7]+=*$/
|
|
257
|
+
isAscii('hello') // true -- /^[\x00-\x7F]*$/
|
|
258
|
+
isJSON('{"key":"value"}') // true -- JSON.parse succeeds
|
|
259
|
+
isHSL('hsl(0, 100%, 50%)') // true
|
|
260
|
+
isMimeType('text/html') // true -- /^[a-z]+\/[a-z0-9\-+.]+$/i
|
|
261
|
+
isDataURI('data:text/plain;base64,...') // true
|
|
262
|
+
isJWT('eyJhbGciOi...') // true -- 3 dot-separated base64url segments
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
### Network Validators
|
|
266
|
+
```typescript
|
|
267
|
+
isIP('192.168.1.1') // true -- IPv4 and IPv6
|
|
268
|
+
isIPRange('192.168.1.0/24') // true -- CIDR notation (IPv4: 0-32, IPv6: 0-128)
|
|
269
|
+
isMACAddress('00:11:22:33:44:55') // true -- colon or hyphen separated
|
|
270
|
+
isFQDN('example.com') // true -- fully qualified domain name
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
### Financial Validators
|
|
274
|
+
```typescript
|
|
275
|
+
isCreditCard('4111111111111111') // true -- Luhn algorithm, 13-19 digits
|
|
276
|
+
isISBN('978-3-16-148410-0') // true -- ISBN-10 and ISBN-13 with checksum
|
|
277
|
+
isCurrency('$1,234.56') // true -- supports $, GBP, EUR, YEN
|
|
278
|
+
isIBAN('DE89370400440532013000') // true -- mod 97 check
|
|
279
|
+
isISIN('US0378331005') // true -- Luhn algorithm
|
|
280
|
+
isISSN('0378-5955') // true -- mod 11 check
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
### Geographic Validators
|
|
284
|
+
```typescript
|
|
285
|
+
isLatLong('40.7128,-74.0060') // true -- lat: -90..90, long: -180..180
|
|
286
|
+
isLatitude('40.7128') // true
|
|
287
|
+
isLongitude('-74.0060') // true
|
|
288
|
+
isPostalCode('12345') // true -- US, UK, Canada, generic formats
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
### Phone, Identity, Date Validators
|
|
292
|
+
```typescript
|
|
293
|
+
isMobilePhone('+1234567890') // true -- international format, min 7 digits
|
|
294
|
+
isUUID('550e8400-e29b-41d4-a716...') // true -- v1-v5
|
|
295
|
+
isISO8601('2024-01-01T00:00:00Z') // true -- with Date validity check
|
|
296
|
+
isIdentityCard('AB123456') // true -- generic 5-20 alphanumeric
|
|
297
|
+
isISRC('USRC17607839') // true
|
|
298
|
+
isISO31661Alpha2('US') // true
|
|
299
|
+
isISO31661Alpha3('USA') // true
|
|
300
|
+
validateUsername('user123') // true -- alias for isAlphanumeric
|
|
301
|
+
isHash('abc123...', 'md5') // true -- supports md5(32), sha1(40), sha256(64), sha384(96), sha512(128)
|
|
302
|
+
isByteLength('hello', { min: 1, max: 10 }) // true
|
|
303
|
+
isFullWidth('\uFF21') // true
|
|
304
|
+
isHalfWidth('a') // true
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
## Newline & Indentation Detection
|
|
308
|
+
|
|
309
|
+
### Newline Detection (from `detect-newline.ts`)
|
|
310
|
+
```typescript
|
|
311
|
+
detectNewline('line1\r\nline2') // '\r\n'
|
|
312
|
+
detectNewline('line1\nline2') // '\n'
|
|
313
|
+
detectNewline('no newline') // undefined
|
|
314
|
+
detectNewlineGraceful(text) // '\n' (fallback when no newline found)
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
The detection counts CRLF vs LF occurrences and returns the dominant type.
|
|
318
|
+
|
|
319
|
+
### Indentation Detection (from `detect-indent.ts`)
|
|
320
|
+
```typescript
|
|
321
|
+
detectIndent(' hello\n world')
|
|
322
|
+
// { amount: 2, type: 'space', indent: ' ' }
|
|
323
|
+
|
|
324
|
+
detectIndent('\thello\n\t\tworld')
|
|
325
|
+
// { amount: 1, type: 'tab', indent: '\t' }
|
|
326
|
+
|
|
327
|
+
detectIndent('no indent')
|
|
328
|
+
// { amount: 0, type: undefined, indent: '' }
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
Algorithm: builds a frequency map of indent changes (type + size), handles edge cases like single-space indentation (skipped by default to avoid false positives from code comments), then selects the most common indent pattern.
|
|
332
|
+
|
|
333
|
+
## Str Facade Object
|
|
334
|
+
|
|
335
|
+
Both `Str` and `str` are exported as equivalent facade objects providing all functions as methods.
|
|
336
|
+
|
|
337
|
+
```typescript
|
|
338
|
+
import { Str, str } from '@stacksjs/strings'
|
|
339
|
+
|
|
340
|
+
// Case conversion
|
|
341
|
+
Str.camelCase('hello world') // 'helloWorld'
|
|
342
|
+
Str.pascalCase('hello world') // 'HelloWorld'
|
|
343
|
+
Str.snakeCase('hello world') // 'hello_world'
|
|
344
|
+
Str.kebabCase('hello world') // 'hello-world'
|
|
345
|
+
Str.constantCase('hello world') // 'HELLO_WORLD'
|
|
346
|
+
Str.dotCase('hello world') // 'hello.world'
|
|
347
|
+
Str.noCase('helloWorld') // 'hello world'
|
|
348
|
+
Str.paramCase('hello world') // 'hello-world'
|
|
349
|
+
Str.pathCase('hello world') // 'hello/world'
|
|
350
|
+
Str.sentenceCase('hello world') // 'Hello world'
|
|
351
|
+
Str.capitalCase('hello world') // 'Hello World'
|
|
352
|
+
Str.titleCase('hello world') // 'Hello World'
|
|
353
|
+
|
|
354
|
+
// Utilities
|
|
355
|
+
Str.capitalize('hello') // 'Hello'
|
|
356
|
+
Str.slug('Hello World') // 'hello-world'
|
|
357
|
+
Str.random(16) // random string
|
|
358
|
+
Str.random(10, 'abc') // random from custom dict
|
|
359
|
+
Str.template('{0} {1}', 'a', 'b') // 'a b'
|
|
360
|
+
Str.truncate('long text', 5) // 'lo...'
|
|
361
|
+
Str.slash('path\\to') // 'path/to'
|
|
362
|
+
Str.ensurePrefix('/', 'path') // '/path'
|
|
363
|
+
Str.ensureSuffix('.ts', 'file') // 'file.ts'
|
|
364
|
+
Str.detectIndent(text) // { amount, type, indent }
|
|
365
|
+
Str.detectNewline(text) // '\n' | '\r\n' | undefined
|
|
366
|
+
|
|
367
|
+
// Pluralization
|
|
368
|
+
Str.plural('person') // 'people'
|
|
369
|
+
Str.singular('people') // 'person'
|
|
370
|
+
Str.isPlural('dogs') // true
|
|
371
|
+
Str.isSingular('dog') // true
|
|
372
|
+
Str.addPluralRule(/ox$/i, 'oxen')
|
|
373
|
+
Str.addSingularRule(/oxen$/i, 'ox')
|
|
374
|
+
Str.addIrregularRule('goose', 'geese')
|
|
375
|
+
Str.addUncountableRule('sheep')
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
## Exported Constants
|
|
379
|
+
|
|
380
|
+
```typescript
|
|
381
|
+
// From title-case.ts
|
|
382
|
+
WORD_SEPARATORS: Set<string> // '---', '--', '-', '---', '/'
|
|
383
|
+
SENTENCE_TERMINATORS: Set<string> // '.', '!', '?'
|
|
384
|
+
TITLE_TERMINATORS: Set<string> // '.', '!', '?', ':', '"', "'", '"'
|
|
385
|
+
SMALL_WORDS: Set<string> // 'a', 'an', 'and', 'as', 'at', 'because', 'but', 'by',
|
|
386
|
+
// 'en', 'for', 'if', 'in', 'neither', 'nor', 'of', 'on',
|
|
387
|
+
// 'only', 'or', 'over', 'per', 'so', 'some', 'than', 'that',
|
|
388
|
+
// 'the', 'to', 'up', 'upon', 'v', 'versus', 'via', 'vs',
|
|
389
|
+
// 'when', 'with', 'without', 'yet'
|
|
390
|
+
|
|
391
|
+
// From utils.ts
|
|
392
|
+
urlAlphabet: string // 64 URL-safe chars for random()
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
## Exported Types
|
|
396
|
+
|
|
397
|
+
```typescript
|
|
398
|
+
type Locale = string[] | string | false | undefined
|
|
399
|
+
interface CaseOptions { locale?, split?, delimiter?, prefixCharacters?, suffixCharacters? }
|
|
400
|
+
interface PascalCaseOptions extends CaseOptions { mergeAmbiguousCharacters? }
|
|
401
|
+
interface TitleCaseOptions { locale?, sentenceCase?, sentenceTerminators?, smallWords?, titleTerminators?, wordSeparators? }
|
|
402
|
+
interface SlugifyOptions { replacement?, remove?, lower?, strict?, locale?, trim? }
|
|
403
|
+
interface PluralizeOptions { count?, inclusive? }
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
## Gotchas
|
|
407
|
+
- Case conversion uses Unicode-aware word boundary detection (`\p{Ll}`, `\p{Lu}`) -- handles international characters
|
|
408
|
+
- `slug()` calls `slugify()` under the hood but defaults to `{ lower: true, strict: true }`; `slugify()` defaults to `{ lower: false, strict: false }`
|
|
409
|
+
- `pascalCase` and `camelCase` accept `PascalCaseOptions` with `mergeAmbiguousCharacters` to control number-prefixed word handling
|
|
410
|
+
- All case functions support `prefixCharacters`/`suffixCharacters` to preserve leading/trailing non-word characters
|
|
411
|
+
- `pluralize()` is both a function AND an object with methods -- `pluralize.plural()`, `pluralize.singular()`, etc.
|
|
412
|
+
- The `random()` function uses `Math.random()`, not crypto -- fine for IDs but not for security tokens
|
|
413
|
+
- `isNumeric()` only matches whole numbers (`/^\d+$/`), not floats -- use parseFloat for float checking
|
|
414
|
+
- `isURL()` requires `http:` or `https:` protocol -- rejects other protocols and bare domains
|
|
415
|
+
- The `Str` facade does NOT include validators -- only case, utility, and pluralization methods
|
|
416
|
+
- `helpers.ts` only exports `toString()` which returns `Object.prototype.toString.call(v)`
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: stacks-stx
|
|
3
|
+
description: Use when working with STX templates in a Stacks application — template syntax, components, directives, signals, reactivity, SSR, streaming, hydration, or debugging STX rendering. STX is the ONLY templating system for Stacks.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Bun >= 1.3.0, TypeScript
|
|
6
|
+
allowed-tools: Read Edit Write Bash Grep Glob
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# STX Templating Engine
|
|
10
|
+
|
|
11
|
+
STX is the full-stack templating and component framework for Stacks. It handles template rendering, reactivity, SSR, streaming, hydration, and more.
|
|
12
|
+
|
|
13
|
+
## Design & anti-slop skills
|
|
14
|
+
|
|
15
|
+
When the task is how a page should *look* (not just how stx renders), pair this skill with the design-taste family: `stacks-design-taste` (flagship), the aesthetic presets `stacks-design-soft` / `stacks-design-minimalist` / `stacks-design-brutalist`, `stacks-redesign`, `stacks-design-output`, and the image-first `stacks-image-to-code` / `stacks-imagegen-web` / `stacks-imagegen-mobile` / `stacks-brandkit`. They translate premium design rules into stx + Crosswind + composables.
|
|
16
|
+
|
|
17
|
+
## Key Paths
|
|
18
|
+
- STX config: `config/ui.ts`
|
|
19
|
+
- STX plugin: `bun-plugin-stx` (loaded via bunfig.toml)
|
|
20
|
+
- STX build cache + route manifest: `storage/framework/stx/` (stx's `stateDir`, set in `config/ui.ts`)
|
|
21
|
+
- Components: `resources/components/`
|
|
22
|
+
- Layouts: `resources/layouts/`
|
|
23
|
+
- Partials: `resources/partials/`
|
|
24
|
+
- Views: `resources/views/`
|
|
25
|
+
- Package: `@stacksjs/stx`
|
|
26
|
+
|
|
27
|
+
## CRITICAL Rules
|
|
28
|
+
1. **ALWAYS use STX** for templating — never write vanilla JS
|
|
29
|
+
2. **NEVER use** `var`, `document.*`, `window.*` in STX templates
|
|
30
|
+
3. STX `<script>` tags should ONLY contain stx-compatible code (signals, composables, directives)
|
|
31
|
+
|
|
32
|
+
## Template Structure
|
|
33
|
+
|
|
34
|
+
```html
|
|
35
|
+
<template>
|
|
36
|
+
<div class="container">
|
|
37
|
+
<h1>{{ title }}</h1>
|
|
38
|
+
<p x-if="showDescription">{{ description }}</p>
|
|
39
|
+
<button @click="increment">Count: {{ count }}</button>
|
|
40
|
+
</div>
|
|
41
|
+
</template>
|
|
42
|
+
|
|
43
|
+
<script>
|
|
44
|
+
import { ref, computed } from '@stacksjs/composables'
|
|
45
|
+
|
|
46
|
+
const count = ref(0)
|
|
47
|
+
const title = ref('Hello STX')
|
|
48
|
+
const showDescription = ref(true)
|
|
49
|
+
|
|
50
|
+
function increment() {
|
|
51
|
+
count.value++
|
|
52
|
+
}
|
|
53
|
+
</script>
|
|
54
|
+
|
|
55
|
+
<style>
|
|
56
|
+
/* Use crosswind utility classes or custom CSS */
|
|
57
|
+
.container { max-width: 1200px; margin: 0 auto; }
|
|
58
|
+
</style>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Configuration (config/ui.ts)
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
import type { StxOptions } from '@stacksjs/stx'
|
|
65
|
+
|
|
66
|
+
export default {
|
|
67
|
+
componentsDir: 'resources/components',
|
|
68
|
+
layoutsDir: 'resources/layouts',
|
|
69
|
+
partialsDir: 'resources/partials',
|
|
70
|
+
} satisfies StxOptions
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Full StxConfig
|
|
74
|
+
|
|
75
|
+
```typescript
|
|
76
|
+
interface StxConfig {
|
|
77
|
+
enabled: boolean
|
|
78
|
+
debug: boolean
|
|
79
|
+
componentsDir: string
|
|
80
|
+
partialsDir: string
|
|
81
|
+
layoutsDir?: string
|
|
82
|
+
defaultLayout?: string
|
|
83
|
+
templatesDir?: string
|
|
84
|
+
cachePath: string
|
|
85
|
+
ssr?: boolean
|
|
86
|
+
cache?: boolean
|
|
87
|
+
defaultTitle?: string
|
|
88
|
+
defaultDescription?: string
|
|
89
|
+
|
|
90
|
+
// Feature modules
|
|
91
|
+
i18n?: Partial<I18nConfig>
|
|
92
|
+
webComponents?: Partial<WebComponentConfig>
|
|
93
|
+
streaming?: Partial<StreamingConfig>
|
|
94
|
+
hydration?: Partial<HydrationConfig>
|
|
95
|
+
a11y?: Partial<A11yConfig>
|
|
96
|
+
seo?: Partial<SeoFeatureConfig>
|
|
97
|
+
animation?: Partial<AnimationConfig>
|
|
98
|
+
markdown?: Partial<MarkdownConfig>
|
|
99
|
+
forms?: Partial<FormConfig>
|
|
100
|
+
pwa?: Partial<PwaConfig>
|
|
101
|
+
components?: Partial<ComponentConfig>
|
|
102
|
+
media?: Partial<MediaConfig>
|
|
103
|
+
strict?: boolean | StrictModeConfig
|
|
104
|
+
customDirectives?: CustomDirective[]
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## STX Capabilities (118+ modules)
|
|
109
|
+
|
|
110
|
+
### Core
|
|
111
|
+
- Template parsing and compilation
|
|
112
|
+
- Reactivity system (ref, computed, watch)
|
|
113
|
+
- Component composition and lifecycle
|
|
114
|
+
- Dependency injection (provide/inject)
|
|
115
|
+
|
|
116
|
+
### Rendering
|
|
117
|
+
- **SSR** — Server-Side Rendering
|
|
118
|
+
- **Streaming** — Progressive HTML streaming
|
|
119
|
+
- **Hydration** — Progressive and islands-based hydration
|
|
120
|
+
- **Suspense** — Async component loading with fallbacks
|
|
121
|
+
- **Error boundaries** — Graceful error handling in components
|
|
122
|
+
|
|
123
|
+
### Features
|
|
124
|
+
- **Router** — Client-side routing
|
|
125
|
+
- **Forms** — Built-in form handling and validation
|
|
126
|
+
- **i18n** — Internationalization support
|
|
127
|
+
- **SEO** — Meta tags, Open Graph, Twitter cards, structured data
|
|
128
|
+
- **PWA** — Progressive Web App support
|
|
129
|
+
- **Animation** — CSS and JS animation system
|
|
130
|
+
- **Markdown** — Markdown rendering with syntax highlighting
|
|
131
|
+
- **A11y** — Accessibility checking and auto-fixing
|
|
132
|
+
|
|
133
|
+
### Dev Tools
|
|
134
|
+
- **Dev server** with HMR (Hot Module Replacement)
|
|
135
|
+
- **Image optimization**
|
|
136
|
+
- **Asset pipeline**
|
|
137
|
+
- **Testing utilities**
|
|
138
|
+
|
|
139
|
+
## Plugin Loading
|
|
140
|
+
|
|
141
|
+
```toml
|
|
142
|
+
# bunfig.toml
|
|
143
|
+
[serve]
|
|
144
|
+
plugins = ["bun-plugin-stx"]
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
The STX plugin processes `.stx` files during serve and build.
|
|
148
|
+
|
|
149
|
+
## Scaffolding
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
import { createProject, addComponent, addPage, addStore, addLayout } from '@stacksjs/stx'
|
|
153
|
+
|
|
154
|
+
// Create a new project
|
|
155
|
+
await createProject('my-app', { template: 'dashboard' })
|
|
156
|
+
|
|
157
|
+
// Add to existing project
|
|
158
|
+
await addComponent('UserCard', { props: true, styles: true })
|
|
159
|
+
await addPage('about', { layout: 'default' })
|
|
160
|
+
await addStore('cart', { persist: true, actions: true })
|
|
161
|
+
await addLayout('admin', { nav: true, footer: true })
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Project Templates
|
|
165
|
+
`default`, `minimal`, `full`, `blog`, `dashboard`, `landing`
|
|
166
|
+
|
|
167
|
+
## Gotchas
|
|
168
|
+
- **STX is the ONLY templating system** — do not use other template engines
|
|
169
|
+
- **`bun-plugin-stx` must be loaded** — without it, `.stx` files won't be processed
|
|
170
|
+
- **Auto-imports** — browser auto-imports defined in `storage/framework/browser-auto-imports.json`
|
|
171
|
+
- **`storage/framework/stx/`** — stx build cache and the generated route manifest. `config/ui.ts` sets stx's `stateDir` here, so nothing lands in the project root. Gitignored; safe to delete
|
|
172
|
+
- **Reactivity is custom** — `ref()` and `computed()` from STX are not Vue's implementation
|
|
173
|
+
- **Crosswind for styling** — use utility classes, not inline styles
|
|
174
|
+
- **Script block restrictions** — only stx-compatible code (signals, composables, directives), no vanilla DOM APIs
|
|
175
|
+
- **Components go in `resources/`** — not in `app/` or `storage/`
|
|
176
|
+
- **118+ modules** — STX is a comprehensive framework covering rendering, routing, forms, i18n, SEO, PWA, and more
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 tt-a1i (Archify)
|
|
4
|
+
Copyright (c) 2025 Cocoon AI (original "architecture-diagram-generator")
|
|
5
|
+
|
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
8
|
+
in the Software without restriction, including without limitation the rights
|
|
9
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
11
|
+
furnished to do so, subject to the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be included in all
|
|
14
|
+
copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
22
|
+
SOFTWARE.
|