@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.
Files changed (408) hide show
  1. package/TODO.md +21 -0
  2. package/ai/AGENTS.md +79 -0
  3. package/ai/README.md +45 -0
  4. package/ai/claude/launch.json +12 -0
  5. package/ai/skills/stacks-actions/SKILL.md +128 -0
  6. package/ai/skills/stacks-ai/SKILL.md +276 -0
  7. package/ai/skills/stacks-alias/SKILL.md +94 -0
  8. package/ai/skills/stacks-analytics/SKILL.md +91 -0
  9. package/ai/skills/stacks-api/SKILL.md +738 -0
  10. package/ai/skills/stacks-arrays/SKILL.md +277 -0
  11. package/ai/skills/stacks-auth/SKILL.md +422 -0
  12. package/ai/skills/stacks-auto-imports/SKILL.md +138 -0
  13. package/ai/skills/stacks-brandkit/SKILL.md +811 -0
  14. package/ai/skills/stacks-browse/SKILL.md +127 -0
  15. package/ai/skills/stacks-browse/scripts/browse.ts +492 -0
  16. package/ai/skills/stacks-browser/SKILL.md +145 -0
  17. package/ai/skills/stacks-buddy/SKILL.md +676 -0
  18. package/ai/skills/stacks-build/SKILL.md +163 -0
  19. package/ai/skills/stacks-cache/SKILL.md +125 -0
  20. package/ai/skills/stacks-calendar/SKILL.md +113 -0
  21. package/ai/skills/stacks-chat/SKILL.md +371 -0
  22. package/ai/skills/stacks-cli/SKILL.md +112 -0
  23. package/ai/skills/stacks-cloud/SKILL.md +192 -0
  24. package/ai/skills/stacks-cms/SKILL.md +217 -0
  25. package/ai/skills/stacks-collections/SKILL.md +82 -0
  26. package/ai/skills/stacks-commerce/SKILL.md +114 -0
  27. package/ai/skills/stacks-composables/SKILL.md +161 -0
  28. package/ai/skills/stacks-config/SKILL.md +144 -0
  29. package/ai/skills/stacks-configuration/SKILL.md +154 -0
  30. package/ai/skills/stacks-cron/SKILL.md +123 -0
  31. package/ai/skills/stacks-crosswind/SKILL.md +190 -0
  32. package/ai/skills/stacks-dashboard/SKILL.md +173 -0
  33. package/ai/skills/stacks-database/SKILL.md +286 -0
  34. package/ai/skills/stacks-datetime/SKILL.md +269 -0
  35. package/ai/skills/stacks-dependencies/SKILL.md +111 -0
  36. package/ai/skills/stacks-deploy/SKILL.md +102 -0
  37. package/ai/skills/stacks-design-brutalist/SKILL.md +110 -0
  38. package/ai/skills/stacks-design-minimalist/SKILL.md +115 -0
  39. package/ai/skills/stacks-design-output/SKILL.md +55 -0
  40. package/ai/skills/stacks-design-soft/SKILL.md +156 -0
  41. package/ai/skills/stacks-design-taste/SKILL.md +1012 -0
  42. package/ai/skills/stacks-design-taste-codex/SKILL.md +294 -0
  43. package/ai/skills/stacks-desktop/SKILL.md +78 -0
  44. package/ai/skills/stacks-development/SKILL.md +298 -0
  45. package/ai/skills/stacks-dns/SKILL.md +149 -0
  46. package/ai/skills/stacks-docs/SKILL.md +109 -0
  47. package/ai/skills/stacks-email/SKILL.md +236 -0
  48. package/ai/skills/stacks-enums/SKILL.md +100 -0
  49. package/ai/skills/stacks-env/SKILL.md +181 -0
  50. package/ai/skills/stacks-error-handling/SKILL.md +137 -0
  51. package/ai/skills/stacks-events/SKILL.md +228 -0
  52. package/ai/skills/stacks-faker/SKILL.md +158 -0
  53. package/ai/skills/stacks-git/SKILL.md +158 -0
  54. package/ai/skills/stacks-guard/SKILL.md +98 -0
  55. package/ai/skills/stacks-health/SKILL.md +75 -0
  56. package/ai/skills/stacks-http/SKILL.md +316 -0
  57. package/ai/skills/stacks-i18n/SKILL.md +198 -0
  58. package/ai/skills/stacks-image-to-code/SKILL.md +629 -0
  59. package/ai/skills/stacks-imagegen-mobile/SKILL.md +1474 -0
  60. package/ai/skills/stacks-imagegen-web/SKILL.md +998 -0
  61. package/ai/skills/stacks-investigate/SKILL.md +119 -0
  62. package/ai/skills/stacks-jobs/SKILL.md +136 -0
  63. package/ai/skills/stacks-lint/SKILL.md +184 -0
  64. package/ai/skills/stacks-listeners/SKILL.md +99 -0
  65. package/ai/skills/stacks-logging/SKILL.md +78 -0
  66. package/ai/skills/stacks-mail/SKILL.md +120 -0
  67. package/ai/skills/stacks-middleware/SKILL.md +249 -0
  68. package/ai/skills/stacks-migrations/SKILL.md +105 -0
  69. package/ai/skills/stacks-models/SKILL.md +267 -0
  70. package/ai/skills/stacks-new-feature/SKILL.md +206 -0
  71. package/ai/skills/stacks-notifications/SKILL.md +210 -0
  72. package/ai/skills/stacks-objects/SKILL.md +205 -0
  73. package/ai/skills/stacks-office-hours/SKILL.md +134 -0
  74. package/ai/skills/stacks-orm/SKILL.md +342 -0
  75. package/ai/skills/stacks-path/SKILL.md +118 -0
  76. package/ai/skills/stacks-payments/SKILL.md +373 -0
  77. package/ai/skills/stacks-plan-review/SKILL.md +152 -0
  78. package/ai/skills/stacks-plugins/SKILL.md +149 -0
  79. package/ai/skills/stacks-push/SKILL.md +376 -0
  80. package/ai/skills/stacks-query-builder/SKILL.md +128 -0
  81. package/ai/skills/stacks-queue/SKILL.md +559 -0
  82. package/ai/skills/stacks-realtime/SKILL.md +442 -0
  83. package/ai/skills/stacks-redesign/SKILL.md +182 -0
  84. package/ai/skills/stacks-registry/SKILL.md +58 -0
  85. package/ai/skills/stacks-repl/SKILL.md +80 -0
  86. package/ai/skills/stacks-retro/SKILL.md +122 -0
  87. package/ai/skills/stacks-review/SKILL.md +135 -0
  88. package/ai/skills/stacks-router/SKILL.md +231 -0
  89. package/ai/skills/stacks-routes/SKILL.md +105 -0
  90. package/ai/skills/stacks-scaffolding/SKILL.md +162 -0
  91. package/ai/skills/stacks-scheduler/SKILL.md +363 -0
  92. package/ai/skills/stacks-search-engine/SKILL.md +112 -0
  93. package/ai/skills/stacks-security/SKILL.md +129 -0
  94. package/ai/skills/stacks-security-audit/SKILL.md +128 -0
  95. package/ai/skills/stacks-server/SKILL.md +458 -0
  96. package/ai/skills/stacks-shell/SKILL.md +62 -0
  97. package/ai/skills/stacks-slug/SKILL.md +87 -0
  98. package/ai/skills/stacks-sms/SKILL.md +385 -0
  99. package/ai/skills/stacks-socials/SKILL.md +303 -0
  100. package/ai/skills/stacks-storage/SKILL.md +576 -0
  101. package/ai/skills/stacks-strings/SKILL.md +416 -0
  102. package/ai/skills/stacks-stx/SKILL.md +176 -0
  103. package/ai/skills/stacks-technical-diagrams/LICENSE +22 -0
  104. package/ai/skills/stacks-technical-diagrams/SKILL.md +290 -0
  105. package/ai/skills/stacks-technical-diagrams/agents/openai.yaml +4 -0
  106. package/ai/skills/stacks-technical-diagrams/assets/template.html +1252 -0
  107. package/ai/skills/stacks-technical-diagrams/bin/technical-diagrams.mjs +289 -0
  108. package/ai/skills/stacks-technical-diagrams/bunfig.toml +1 -0
  109. package/ai/skills/stacks-technical-diagrams/examples/agent-run.lifecycle.json +64 -0
  110. package/ai/skills/stacks-technical-diagrams/examples/agent-tool-call.workflow.json +88 -0
  111. package/ai/skills/stacks-technical-diagrams/examples/cache-miss-request.sequence.json +75 -0
  112. package/ai/skills/stacks-technical-diagrams/examples/product-analytics.dataflow.json +70 -0
  113. package/ai/skills/stacks-technical-diagrams/examples/web-app.architecture.json +41 -0
  114. package/ai/skills/stacks-technical-diagrams/renderers/architecture/grid.mjs +62 -0
  115. package/ai/skills/stacks-technical-diagrams/renderers/architecture/render-architecture.mjs +371 -0
  116. package/ai/skills/stacks-technical-diagrams/renderers/dataflow/README.md +82 -0
  117. package/ai/skills/stacks-technical-diagrams/renderers/dataflow/render-dataflow.mjs +295 -0
  118. package/ai/skills/stacks-technical-diagrams/renderers/lifecycle/README.md +91 -0
  119. package/ai/skills/stacks-technical-diagrams/renderers/lifecycle/render-lifecycle.mjs +384 -0
  120. package/ai/skills/stacks-technical-diagrams/renderers/sequence/README.md +84 -0
  121. package/ai/skills/stacks-technical-diagrams/renderers/sequence/render-sequence.mjs +257 -0
  122. package/ai/skills/stacks-technical-diagrams/renderers/shared/cli.mjs +42 -0
  123. package/ai/skills/stacks-technical-diagrams/renderers/shared/generated-validators.mjs +13 -0
  124. package/ai/skills/stacks-technical-diagrams/renderers/shared/geometry.mjs +230 -0
  125. package/ai/skills/stacks-technical-diagrams/renderers/shared/layout-report.mjs +40 -0
  126. package/ai/skills/stacks-technical-diagrams/renderers/shared/utils.mjs +88 -0
  127. package/ai/skills/stacks-technical-diagrams/renderers/shared/validator.mjs +40 -0
  128. package/ai/skills/stacks-technical-diagrams/renderers/workflow/README.md +103 -0
  129. package/ai/skills/stacks-technical-diagrams/renderers/workflow/render-workflow.mjs +481 -0
  130. package/ai/skills/stacks-technical-diagrams/schemas/README.md +68 -0
  131. package/ai/skills/stacks-technical-diagrams/schemas/architecture.schema.json +121 -0
  132. package/ai/skills/stacks-technical-diagrams/schemas/common.schema.json +43 -0
  133. package/ai/skills/stacks-technical-diagrams/schemas/dataflow.schema.json +221 -0
  134. package/ai/skills/stacks-technical-diagrams/schemas/lifecycle.schema.json +241 -0
  135. package/ai/skills/stacks-technical-diagrams/schemas/sequence.schema.json +186 -0
  136. package/ai/skills/stacks-technical-diagrams/schemas/workflow.schema.json +332 -0
  137. package/ai/skills/stacks-technical-diagrams/scripts/check-render-output.mjs +297 -0
  138. package/ai/skills/stacks-technical-diagrams/scripts/render-examples.mjs +28 -0
  139. package/ai/skills/stacks-testing/SKILL.md +129 -0
  140. package/ai/skills/stacks-tunnel/SKILL.md +125 -0
  141. package/ai/skills/stacks-types/SKILL.md +178 -0
  142. package/ai/skills/stacks-ui/SKILL.md +246 -0
  143. package/ai/skills/stacks-utils/SKILL.md +444 -0
  144. package/ai/skills/stacks-validation/SKILL.md +371 -0
  145. package/ai/skills/stacks-whois/SKILL.md +315 -0
  146. package/assets/world-map-data.ts +121 -0
  147. package/bootstrap.ts +114 -0
  148. package/docs/api-examples.md +46 -0
  149. package/docs/index.md +24 -0
  150. package/docs/markdown-examples.md +87 -0
  151. package/functions/analytics.ts +97 -0
  152. package/functions/api.ts +143 -0
  153. package/functions/auth.ts +208 -0
  154. package/functions/billing/payments.ts +149 -0
  155. package/functions/blog.ts +120 -0
  156. package/functions/cms/categorizables.ts +107 -0
  157. package/functions/cms/pages.ts +108 -0
  158. package/functions/cms/posts.ts +100 -0
  159. package/functions/cms/taggables.ts +102 -0
  160. package/functions/commerce/coupons.ts +128 -0
  161. package/functions/commerce/customers.ts +128 -0
  162. package/functions/commerce/gift-cards.ts +119 -0
  163. package/functions/commerce/orders.ts +112 -0
  164. package/functions/commerce/payments.ts +119 -0
  165. package/functions/commerce/products/categories.ts +123 -0
  166. package/functions/commerce/products/manufacturers.ts +123 -0
  167. package/functions/commerce/products/products.ts +123 -0
  168. package/functions/commerce/products/reviews.ts +123 -0
  169. package/functions/commerce/products/units.ts +123 -0
  170. package/functions/commerce/products/variants.ts +123 -0
  171. package/functions/commerce/shippings/delivery-routes.ts +123 -0
  172. package/functions/commerce/shippings/digital-deliveries.ts +119 -0
  173. package/functions/commerce/shippings/drivers.ts +123 -0
  174. package/functions/commerce/shippings/license-keys.ts +123 -0
  175. package/functions/commerce/shippings/shipping-methods.ts +123 -0
  176. package/functions/commerce/shippings/shipping-rates.ts +119 -0
  177. package/functions/commerce/shippings/shipping-zones.ts +119 -0
  178. package/functions/commerce/taxes.ts +119 -0
  179. package/functions/commerce/waitlist/products.ts +123 -0
  180. package/functions/commerce/waitlist/restaurants.ts +123 -0
  181. package/functions/craft.ts +107 -0
  182. package/functions/dashboard.ts +153 -0
  183. package/functions/inbox.ts +95 -0
  184. package/functions/jobs.ts +86 -0
  185. package/functions/monitoring/errors.ts +295 -0
  186. package/functions/queue.ts +111 -0
  187. package/functions/realtime/websockets.ts +96 -0
  188. package/functions/realtime.ts +52 -0
  189. package/functions/releases.ts +49 -0
  190. package/functions/search.ts +126 -0
  191. package/functions/toasts.ts +95 -0
  192. package/functions/uploads.ts +216 -0
  193. package/ide/.gitignore +4 -0
  194. package/ide/cursor/rules/auto-imports.mdc +574 -0
  195. package/ide/cursor/rules/code-style.mdc +12 -0
  196. package/ide/cursor/rules/documentation.mdc +9 -0
  197. package/ide/cursor/rules/error-handling-validation.mdc +11 -0
  198. package/ide/cursor/rules/key-conventions.mdc +11 -0
  199. package/ide/cursor/rules/project-structure.mdc +169 -0
  200. package/ide/cursor/rules/readme.mdc +318 -0
  201. package/ide/cursor/rules/syntax-formatting.mdc +9 -0
  202. package/ide/cursor/rules/testing.mdc +10 -0
  203. package/ide/cursor/rules/typescript.mdc +9 -0
  204. package/ide/cursor/rules/ui-styling.mdc +0 -0
  205. package/ide/dictionary.txt +397 -0
  206. package/ide/jetbrains/.fleet/settings.json +4 -0
  207. package/ide/jetbrains/.idea/.gitignore +5 -0
  208. package/ide/jetbrains/.idea/.name +1 -0
  209. package/ide/jetbrains/.idea/inspectionProfiles/Project_Default.xml +6 -0
  210. package/ide/jetbrains/.idea/jsLinters/eslint.xml +7 -0
  211. package/ide/jetbrains/.idea/modules.xml +8 -0
  212. package/ide/jetbrains/.idea/stacks.iml +22 -0
  213. package/ide/jetbrains/.idea/vcs.xml +6 -0
  214. package/ide/jetbrains/.idea/webResources.xml +14 -0
  215. package/ide/jetbrains/IntelliJ IDEA Global Settings +0 -0
  216. package/ide/jetbrains/installed.txt +4 -0
  217. package/ide/jetbrains/options/github-copilot.xml +5 -0
  218. package/ide/jetbrains/options/nodejs.xml +7 -0
  219. package/ide/jetbrains/options/templates.xml +124 -0
  220. package/ide/jetbrains/templates/JavaScript.xml +6 -0
  221. package/ide/jetbrains/templates/Stacks.xml +8 -0
  222. package/ide/vscode/.vscode/README.md +23 -0
  223. package/ide/vscode/.vscode/extensions.json +5 -0
  224. package/ide/vscode/.vscode/settings.json +176 -0
  225. package/ide/vscode/.vscode/stacks.code-snippets +181 -0
  226. package/ide/vscode/LICENSE.md +21 -0
  227. package/ide/vscode/README.md +36 -0
  228. package/ide/vscode/logo.png +0 -0
  229. package/ide/vscode/package.json +79 -0
  230. package/ide/zed/.zed/settings.json +139 -0
  231. package/lang/README.md +28 -0
  232. package/lang/de.yml +14 -0
  233. package/lang/en.yml +15 -0
  234. package/package.json +19 -3
  235. package/project/bootstrap +161 -0
  236. package/project/buddy +175 -0
  237. package/project/storage/framework/tsconfig.app.json +50 -0
  238. package/project/storage/framework/tsconfig.base.json +58 -0
  239. package/routes/core.ts +78 -0
  240. package/routes/dashboard-api.ts +233 -0
  241. package/routes/dashboard.ts +739 -0
  242. package/routes/email.ts +129 -0
  243. package/stores/[name].stx +16 -0
  244. package/stores/git.ts +71 -0
  245. package/stores/payment.ts +474 -0
  246. package/stores/queue.ts +43 -0
  247. package/stores/user.ts +29 -0
  248. package/stx-components-plugin.ts +25 -0
  249. package/styles/design-tokens.css +597 -0
  250. package/types/dashboard.ts +70 -0
  251. package/types/defaults.ts +438 -0
  252. package/vcs/github/CODE_OF_CONDUCT.md +83 -0
  253. package/vcs/github/CONTRIBUTING.md +187 -0
  254. package/vcs/github/EXPLANATIONS.md +41 -0
  255. package/vcs/github/FUNDING.yml +1 -0
  256. package/vcs/github/ISSUE_TEMPLATE/bug_report.yml +49 -0
  257. package/vcs/github/ISSUE_TEMPLATE/config.yml +10 -0
  258. package/vcs/github/ISSUE_TEMPLATE/feature_request.yml +44 -0
  259. package/vcs/github/SECURITY.md +70 -0
  260. package/vcs/github/renovate.json +5 -0
  261. package/vcs/github/stale.yml +14 -0
  262. package/vcs/github/workflows/README.md +16 -0
  263. package/vcs/github/workflows/ci.yml +114 -0
  264. package/vcs/github/workflows/export-size.yml +25 -0
  265. package/vcs/github/workflows/labeler.yml +13 -0
  266. package/vcs/github/workflows/release.yml +219 -0
  267. package/views/[...all].stx +8 -0
  268. package/views/about.md +3 -0
  269. package/views/auth/login.stx +1 -0
  270. package/views/auth/signup.stx +85 -0
  271. package/views/dashboard/.discovered-models.json +542 -0
  272. package/views/dashboard/AUDIT.md +904 -0
  273. package/views/dashboard/[...all].stx +89 -0
  274. package/views/dashboard/access-tokens/index.stx +177 -0
  275. package/views/dashboard/actions/index.stx +129 -0
  276. package/views/dashboard/analytics/blog/index.stx +356 -0
  277. package/views/dashboard/analytics/browsers/index.stx +263 -0
  278. package/views/dashboard/analytics/commerce/sales/index.stx +329 -0
  279. package/views/dashboard/analytics/commerce/web/index.stx +379 -0
  280. package/views/dashboard/analytics/countries/index.stx +289 -0
  281. package/views/dashboard/analytics/devices/index.stx +305 -0
  282. package/views/dashboard/analytics/events/index.stx +536 -0
  283. package/views/dashboard/analytics/index.stx +88 -0
  284. package/views/dashboard/analytics/marketing/index.stx +315 -0
  285. package/views/dashboard/analytics/pages/index.stx +271 -0
  286. package/views/dashboard/analytics/referrers/index.stx +319 -0
  287. package/views/dashboard/analytics/web/index.stx +356 -0
  288. package/views/dashboard/buddy/index.stx +198 -0
  289. package/views/dashboard/ci/index.stx +462 -0
  290. package/views/dashboard/cloud/index.stx +452 -0
  291. package/views/dashboard/commands/index.stx +295 -0
  292. package/views/dashboard/commerce/categories/index.stx +406 -0
  293. package/views/dashboard/commerce/coupons/index.stx +485 -0
  294. package/views/dashboard/commerce/customers/index.stx +410 -0
  295. package/views/dashboard/commerce/dashboard/index.stx +287 -0
  296. package/views/dashboard/commerce/delivery/delivery-routes.stx +305 -0
  297. package/views/dashboard/commerce/delivery/digital-delivery.stx +332 -0
  298. package/views/dashboard/commerce/delivery/drivers.stx +397 -0
  299. package/views/dashboard/commerce/delivery/index.stx +18 -0
  300. package/views/dashboard/commerce/delivery/license-keys.stx +380 -0
  301. package/views/dashboard/commerce/delivery/shipping-methods.stx +346 -0
  302. package/views/dashboard/commerce/delivery/shipping-rates.stx +338 -0
  303. package/views/dashboard/commerce/delivery/shipping-zones.stx +302 -0
  304. package/views/dashboard/commerce/delivery/tabs.ts +25 -0
  305. package/views/dashboard/commerce/gift-cards/index.stx +561 -0
  306. package/views/dashboard/commerce/manufacturers/index.stx +308 -0
  307. package/views/dashboard/commerce/orders/index.stx +247 -0
  308. package/views/dashboard/commerce/payments/index.stx +535 -0
  309. package/views/dashboard/commerce/pos/index.stx +653 -0
  310. package/views/dashboard/commerce/printers/devices/index.stx +273 -0
  311. package/views/dashboard/commerce/printers/receipts/index.stx +308 -0
  312. package/views/dashboard/commerce/products/detail.stx +563 -0
  313. package/views/dashboard/commerce/products/index.stx +370 -0
  314. package/views/dashboard/commerce/reviews/index.stx +656 -0
  315. package/views/dashboard/commerce/reviews/index.ts +0 -0
  316. package/views/dashboard/commerce/taxes/index.stx +377 -0
  317. package/views/dashboard/commerce/units/index.stx +317 -0
  318. package/views/dashboard/commerce/variants/index.stx +319 -0
  319. package/views/dashboard/commerce/waitlist/products.stx +942 -0
  320. package/views/dashboard/commerce/waitlist/restaurant.stx +1024 -0
  321. package/views/dashboard/components/index.stx +330 -0
  322. package/views/dashboard/composables/index.ts +19 -0
  323. package/views/dashboard/composables/useChart.ts +77 -0
  324. package/views/dashboard/composables/useNavigation.ts +99 -0
  325. package/views/dashboard/composables/useRole.ts +58 -0
  326. package/views/dashboard/composables/useTheme.ts +74 -0
  327. package/views/dashboard/content/authors/index.stx +171 -0
  328. package/views/dashboard/content/blog/index.stx +493 -0
  329. package/views/dashboard/content/categories/index.stx +169 -0
  330. package/views/dashboard/content/comments/index.stx +189 -0
  331. package/views/dashboard/content/dashboard.stx +383 -0
  332. package/views/dashboard/content/files/index.stx +706 -0
  333. package/views/dashboard/content/pages/index.stx +174 -0
  334. package/views/dashboard/content/posts/index.stx +269 -0
  335. package/views/dashboard/content/seo/index.stx +240 -0
  336. package/views/dashboard/content/tags/index.stx +167 -0
  337. package/views/dashboard/data/activity/index.stx +261 -0
  338. package/views/dashboard/data/dashboard/index.stx +116 -0
  339. package/views/dashboard/data/subscribers.stx +270 -0
  340. package/views/dashboard/data/teams.stx +275 -0
  341. package/views/dashboard/data/users.stx +279 -0
  342. package/views/dashboard/dependencies/index.stx +178 -0
  343. package/views/dashboard/deployments/[id].stx +234 -0
  344. package/views/dashboard/deployments/index.stx +9 -0
  345. package/views/dashboard/dns/index.stx +163 -0
  346. package/views/dashboard/environment/index.stx +283 -0
  347. package/views/dashboard/errors/index.stx +274 -0
  348. package/views/dashboard/forgot-password.stx +57 -0
  349. package/views/dashboard/functions/index.stx +159 -0
  350. package/views/dashboard/health/index.stx +248 -0
  351. package/views/dashboard/inbox/activity.stx +350 -0
  352. package/views/dashboard/inbox/index.stx +452 -0
  353. package/views/dashboard/inbox/settings.stx +290 -0
  354. package/views/dashboard/index.stx +252 -0
  355. package/views/dashboard/insights/index.stx +529 -0
  356. package/views/dashboard/jobs/[id].stx +430 -0
  357. package/views/dashboard/jobs/history.stx +222 -0
  358. package/views/dashboard/jobs/index.stx +214 -0
  359. package/views/dashboard/kanban/[id].stx +899 -0
  360. package/views/dashboard/kanban/index.stx +260 -0
  361. package/views/dashboard/layouts/default.stx +565 -0
  362. package/views/dashboard/layouts/guest.stx +10 -0
  363. package/views/dashboard/login.stx +48 -0
  364. package/views/dashboard/logs/index.stx +540 -0
  365. package/views/dashboard/mailboxes/index.stx +149 -0
  366. package/views/dashboard/management/permissions/index.stx +490 -0
  367. package/views/dashboard/marketing/campaigns/index.stx +604 -0
  368. package/views/dashboard/marketing/lists/index.stx +514 -0
  369. package/views/dashboard/marketing/reviews/index.stx +475 -0
  370. package/views/dashboard/marketing/social-posts/index.stx +560 -0
  371. package/views/dashboard/models/[model].stx +195 -0
  372. package/views/dashboard/models/index.stx +159 -0
  373. package/views/dashboard/monitoring/errors/index.stx +415 -0
  374. package/views/dashboard/notifications/dashboard.stx +383 -0
  375. package/views/dashboard/notifications/email.stx +336 -0
  376. package/views/dashboard/notifications/history.stx +373 -0
  377. package/views/dashboard/notifications/sms.stx +332 -0
  378. package/views/dashboard/packages/index.stx +195 -0
  379. package/views/dashboard/queries/[id].stx +381 -0
  380. package/views/dashboard/queries/history.stx +227 -0
  381. package/views/dashboard/queries/index.stx +335 -0
  382. package/views/dashboard/queries/slow.stx +318 -0
  383. package/views/dashboard/queue/index.stx +427 -0
  384. package/views/dashboard/realtime/index.stx +429 -0
  385. package/views/dashboard/register.stx +46 -0
  386. package/views/dashboard/releases/index.stx +389 -0
  387. package/views/dashboard/requests/index.stx +462 -0
  388. package/views/dashboard/serverless/index.stx +475 -0
  389. package/views/dashboard/servers/[id].stx +299 -0
  390. package/views/dashboard/servers/index.stx +483 -0
  391. package/views/dashboard/settings/billing.stx +50 -0
  392. package/views/dashboard/settings/index.stx +256 -0
  393. package/views/dashboard/settings/mail.stx +252 -0
  394. package/views/dashboard/stores/auth.ts +123 -0
  395. package/views/dashboard/stores/ci.ts +342 -0
  396. package/views/dashboard/stores/index.ts +129 -0
  397. package/views/dashboard/stores/kanban.ts +723 -0
  398. package/views/dashboard/stores/rbac.ts +350 -0
  399. package/views/dashboard/stx.config.ts +34 -0
  400. package/views/dashboard/teams/[id].stx +170 -0
  401. package/views/forum/category.stx +92 -0
  402. package/views/forum/index.stx +209 -0
  403. package/views/forum/new-topic.stx +113 -0
  404. package/views/forum/profile.stx +1 -0
  405. package/views/forum/topic.stx +143 -0
  406. package/views/hello-world/[name].stx +47 -0
  407. package/views/index.stx +21 -0
  408. package/views/system-tray/index.stx +147 -0
package/package.json CHANGED
@@ -2,15 +2,31 @@
2
2
  "name": "@stacksjs/defaults",
3
3
  "type": "module",
4
4
  "sideEffects": false,
5
- "version": "0.70.206",
6
- "description": "Default Stacks scaffold resources (views, layouts, components, preloader) shipped so apps consuming the framework from node_modules get the same fallback resources a vendored checkout provides. Source of truth: storage/framework/defaults.",
5
+ "version": "0.70.208",
6
+ "description": "The complete managed Stacks application scaffold, including runtime defaults, AI guidance, editor metadata, and npm-backed project support files.",
7
7
  "author": "Chris Breuer",
8
8
  "license": "MIT",
9
9
  "homepage": "https://github.com/stacksjs/stacks/tree/main/storage/framework/defaults",
10
10
  "files": [
11
11
  "README.md",
12
+ "TODO.md",
13
+ "ai",
12
14
  "resources",
13
- "app"
15
+ "app",
16
+ "assets",
17
+ "docs",
18
+ "functions",
19
+ "ide",
20
+ "lang",
21
+ "routes",
22
+ "stores",
23
+ "styles",
24
+ "types",
25
+ "vcs",
26
+ "views",
27
+ "bootstrap.ts",
28
+ "stx-components-plugin.ts",
29
+ "project"
14
30
  ],
15
31
  "exports": {
16
32
  "./*": "./*",
@@ -0,0 +1,161 @@
1
+ #!/bin/sh
2
+ set -eu
3
+
4
+ ## To learn more, visit https://stacksjs.com/docs/guide/bootstrap
5
+ ## Usage:
6
+ ## ./bootstrap
7
+ ## curl -fsSL https://stacksjs.com/install | sh
8
+ ## curl -fsSL https://stacksjs.com/install | sh -s -- my-project
9
+
10
+ ASSUME_YES=0
11
+ PROJECT_NAME=""
12
+
13
+ while [ "$#" -gt 0 ]; do
14
+ case "$1" in
15
+ -y|--yes) ASSUME_YES=1 ;;
16
+ -h|--help)
17
+ echo "Usage: ./bootstrap [--yes] [project-name]"
18
+ exit 0
19
+ ;;
20
+ -*)
21
+ echo "Unknown option: $1"
22
+ exit 1
23
+ ;;
24
+ *)
25
+ if [ -n "$PROJECT_NAME" ]; then
26
+ echo "Only one project name may be supplied."
27
+ exit 1
28
+ fi
29
+ PROJECT_NAME="$1"
30
+ ;;
31
+ esac
32
+ shift
33
+ done
34
+
35
+ TEMP_DIR=""
36
+ cleanup() {
37
+ if [ -n "$TEMP_DIR" ] && [ -d "$TEMP_DIR" ]; then
38
+ rm -rf "$TEMP_DIR"
39
+ fi
40
+ }
41
+ trap cleanup EXIT INT TERM
42
+
43
+ confirm_install() {
44
+ if [ "$ASSUME_YES" -eq 1 ]; then
45
+ return 0
46
+ fi
47
+
48
+ if [ ! -r /dev/tty ]; then
49
+ echo "Pantry is required to provision Bun and the local toolchain."
50
+ echo "Run again with --yes to approve its installation."
51
+ return 1
52
+ fi
53
+
54
+ printf "Pantry will install Bun and the local development toolchain. Continue? [Y/n] " > /dev/tty
55
+ IFS= read -r answer < /dev/tty || answer=""
56
+ case "$answer" in
57
+ ""|y|Y|yes|YES|Yes) return 0 ;;
58
+ *) echo "Installation cancelled."; return 1 ;;
59
+ esac
60
+ }
61
+
62
+ # --- Pantry installer (inlined so it works via curl-pipe-bash before clone) ---
63
+ ensure_pantry() {
64
+ if command -v pantry >/dev/null 2>&1; then
65
+ return
66
+ fi
67
+
68
+ confirm_install || exit 1
69
+
70
+ OS=$(uname -s | tr '[:upper:]' '[:lower:]')
71
+ ARCH=$(uname -m)
72
+ case "$ARCH" in
73
+ x86_64|amd64) ARCH="x64" ;;
74
+ arm64|aarch64) ARCH="arm64" ;;
75
+ esac
76
+
77
+ INSTALL_DIR="${HOME}/.local/bin"
78
+ mkdir -p "$INSTALL_DIR"
79
+
80
+ ZIP="pantry-${OS}-${ARCH}.zip"
81
+ URL="https://github.com/home-lang/pantry/releases/latest/download/${ZIP}"
82
+
83
+ echo "Downloading Pantry from ${URL}..."
84
+ TEMP_DIR=$(mktemp -d)
85
+ curl -fsSL -o "${TEMP_DIR}/${ZIP}" "$URL"
86
+ unzip -oq "${TEMP_DIR}/${ZIP}" -d "$INSTALL_DIR"
87
+ chmod +x "${INSTALL_DIR}/pantry"
88
+ rm -rf "$TEMP_DIR"
89
+ TEMP_DIR=""
90
+
91
+ export PATH="${INSTALL_DIR}:${PATH}"
92
+ echo "Pantry installed to ${INSTALL_DIR}/pantry"
93
+ }
94
+
95
+ # --- Main ---
96
+
97
+ # If we are outside a project, create one from the latest stable release.
98
+ if [ ! -d "storage/framework/core" ]; then
99
+ if [ -z "$PROJECT_NAME" ]; then
100
+ PROJECT_NAME="${STACKS_PROJECT:-stacks}"
101
+
102
+ if [ -r /dev/tty ]; then
103
+ printf "Project directory [%s]: " "$PROJECT_NAME" > /dev/tty
104
+ IFS= read -r requested_name < /dev/tty || requested_name=""
105
+ if [ -n "$requested_name" ]; then
106
+ PROJECT_NAME="$requested_name"
107
+ fi
108
+ fi
109
+ fi
110
+
111
+ if [ -e "$PROJECT_NAME" ]; then
112
+ echo "Path '$PROJECT_NAME' already exists. Please use a different name."
113
+ exit 1
114
+ fi
115
+
116
+ RELEASE_TAG="${STACKS_VERSION:-}"
117
+ if [ -z "$RELEASE_TAG" ]; then
118
+ RELEASE_URL=$(curl -fsSL -o /dev/null -w '%{url_effective}' "https://github.com/stacksjs/stacks/releases/latest")
119
+ RELEASE_TAG=${RELEASE_URL##*/}
120
+ fi
121
+
122
+ case "$RELEASE_TAG" in
123
+ v*) ;;
124
+ *) RELEASE_TAG="v${RELEASE_TAG}" ;;
125
+ esac
126
+
127
+ echo "Downloading Stacks ${RELEASE_TAG}..."
128
+ TEMP_DIR=$(mktemp -d)
129
+ curl -fsSL -o "${TEMP_DIR}/stacks.zip" "https://github.com/stacksjs/stacks/archive/refs/tags/${RELEASE_TAG}.zip"
130
+ unzip -q "${TEMP_DIR}/stacks.zip" -d "$TEMP_DIR"
131
+ ARCHIVE_DIR="${TEMP_DIR}/stacks-${RELEASE_TAG#v}"
132
+
133
+ if [ ! -d "$ARCHIVE_DIR" ]; then
134
+ echo "The Stacks release archive had an unexpected layout."
135
+ exit 1
136
+ fi
137
+
138
+ mv "$ARCHIVE_DIR" "$PROJECT_NAME"
139
+ rm -rf "$TEMP_DIR"
140
+ TEMP_DIR=""
141
+ cd "$PROJECT_NAME"
142
+ fi
143
+
144
+ # Detect if we're in a Stacks project
145
+ if [ ! -d "storage/framework/core" ]; then
146
+ echo "Error: not inside a Stacks project."
147
+ exit 1
148
+ fi
149
+
150
+ PROJECT_ROOT=$(pwd)
151
+
152
+ ensure_pantry
153
+
154
+ echo "Bootstrapping Stacks project..."
155
+ "${PROJECT_ROOT}/buddy" setup --skip-aws
156
+
157
+ echo ""
158
+ echo "Project bootstrapped successfully!"
159
+ if [ -n "$PROJECT_NAME" ]; then
160
+ echo "Run 'cd $PROJECT_NAME && ./buddy dev' to start the dev server."
161
+ fi
package/project/buddy ADDED
@@ -0,0 +1,175 @@
1
+ #!/bin/sh
2
+ set -e
3
+
4
+ ROOT_DIR=$(CDPATH= cd -- "$(dirname "$0")" && pwd)
5
+ PANTRY_LOCAL_BIN="${ROOT_DIR}/pantry/.bin"
6
+ PANTRY_DIR="${ROOT_DIR}/pantry"
7
+ USER_LOCAL_BIN="${HOME}/.local/bin"
8
+ PANTRY_INSTALLER="${ROOT_DIR}/storage/framework/scripts/pantry-install"
9
+ PANTRY_SETUP_DONE="${PANTRY_DIR}/.postsetup-done"
10
+ PANTRY_BOOTSTRAP_TIMEOUT_SECONDS="${PANTRY_BOOTSTRAP_TIMEOUT_SECONDS:-600}"
11
+ PANTRY_DEPENDENCIES_TIMEOUT_SECONDS="${PANTRY_DEPENDENCIES_TIMEOUT_SECONDS:-1200}"
12
+
13
+ # Resolve which CLI entrypoint to invoke. Resolution order matches the
14
+ # action-runner fallback chain in `@stacksjs/actions`:
15
+ #
16
+ # 1. `storage/framework/core/buddy/src/cli.ts` — userland override (legacy
17
+ # "framework lives in the project" layout). Kept FIRST so projects that
18
+ # have published buddy via `buddy publish:core buddy` still win.
19
+ # 2. `node_modules/@stacksjs/buddy/src/cli.ts` — installed package, TS source
20
+ # (workspace symlink or a real npm install with `src/` shipped).
21
+ # 3. `node_modules/@stacksjs/buddy/dist/cli.js` — published JS-only build.
22
+ #
23
+ # If none of these are present the script bails with a clear message instead
24
+ # of `bun` exploding on a missing file.
25
+ resolve_buddy_entry() {
26
+ for candidate in \
27
+ "${ROOT_DIR}/storage/framework/core/buddy/src/cli.ts" \
28
+ "${ROOT_DIR}/node_modules/@stacksjs/buddy/src/cli.ts" \
29
+ "${ROOT_DIR}/node_modules/@stacksjs/buddy/dist/cli.js" \
30
+ ; do
31
+ if [ -f "${candidate}" ]; then
32
+ echo "${candidate}"
33
+ return 0
34
+ fi
35
+ done
36
+ return 1
37
+ }
38
+
39
+ if ! BUDDY_ENTRY=$(resolve_buddy_entry); then
40
+ echo "buddy: could not locate CLI entrypoint." >&2
41
+ echo " Tried: storage/framework/core/buddy/src/cli.ts, node_modules/@stacksjs/buddy/{src/cli.ts,dist/cli.js}." >&2
42
+ echo " Run \`bun install\` or \`buddy publish:core buddy\` to make the CLI available." >&2
43
+ exit 1
44
+ fi
45
+
46
+ run_with_timeout() {
47
+ timeout_seconds="$1"
48
+ shift
49
+ timeout_flag="${TMPDIR:-/tmp}/buddy-timeout-$$"
50
+ rm -f "${timeout_flag}"
51
+
52
+ "$@" &
53
+ cmd_pid=$!
54
+
55
+ (
56
+ sleep "${timeout_seconds}"
57
+
58
+ if kill -0 "${cmd_pid}" 2>/dev/null; then
59
+ echo "Command timed out after ${timeout_seconds}s: $*" >&2
60
+ : > "${timeout_flag}"
61
+ kill "${cmd_pid}" 2>/dev/null || true
62
+ sleep 2
63
+ kill -9 "${cmd_pid}" 2>/dev/null || true
64
+ fi
65
+ ) &
66
+ watchdog_pid=$!
67
+
68
+ wait "${cmd_pid}"
69
+ status=$?
70
+
71
+ kill "${watchdog_pid}" 2>/dev/null || true
72
+ wait "${watchdog_pid}" 2>/dev/null || true
73
+
74
+ if [ -f "${timeout_flag}" ]; then
75
+ rm -f "${timeout_flag}"
76
+ return 124
77
+ fi
78
+
79
+ rm -f "${timeout_flag}"
80
+ return "${status}"
81
+ }
82
+
83
+ is_usable_bun() {
84
+ [ -x "$1" ] && sh -c '"$1" --version >/dev/null 2>&1' sh "$1" 2>/dev/null
85
+ }
86
+
87
+ # Run buddy with the correct PATH and NODE_PATH for pantry resolution.
88
+ run_buddy() {
89
+ BUN_CMD="$1"
90
+ shift
91
+
92
+ # When the framework SOURCE is vendored here (storage/framework/core) AND the
93
+ # installed @stacksjs/* packages actually ship src (a workspace/source-linked
94
+ # checkout), resolve them from src via the `development` export condition so the
95
+ # monorepo runs build-free (a fresh checkout has no dist yet).
96
+ #
97
+ # Guard on a representative package having src: an app that vendors the core but
98
+ # installs the PUBLISHED (dist-only) packages has no src, so the `development`
99
+ # condition would resolve to ./src/* files that were never shipped (`error:
100
+ # preload not found "@stacksjs/env/plugin.js"`, then Cannot-find-module for
101
+ # every other import). In that case omit the flag and let bun/import/default
102
+ # resolve the dist.
103
+ CONDITIONS=""
104
+ if [ -d "${ROOT_DIR}/storage/framework/core" ] && [ -f "${ROOT_DIR}/node_modules/@stacksjs/env/src/index.ts" ]; then
105
+ CONDITIONS="--conditions development"
106
+ fi
107
+
108
+ # Only prepend the pantry dir to NODE_PATH when the setup completed: for a
109
+ # node_modules app there is no ./pantry, and pointing NODE_PATH at a missing
110
+ # (or half-installed, after a failed bootstrap) dir makes bun miss
111
+ # node_modules (e.g. `Cannot find module '@stacksjs/env'` from a preload).
112
+ if [ -f "${PANTRY_SETUP_DONE}" ]; then
113
+ exec env PATH="${PANTRY_LOCAL_BIN}:${USER_LOCAL_BIN}:${PATH}" NODE_PATH="${PANTRY_DIR}:${NODE_PATH:-}" "${BUN_CMD}" ${CONDITIONS} "${BUDDY_ENTRY}" "$@"
114
+ fi
115
+ exec env PATH="${PANTRY_LOCAL_BIN}:${USER_LOCAL_BIN}:${PATH}" "${BUN_CMD}" ${CONDITIONS} "${BUDDY_ENTRY}" "$@"
116
+ }
117
+
118
+ # Fast path: if pantry is already set up, run immediately. We deliberately
119
+ # DO NOT run `pantry install` here — re-installing on every invocation
120
+ # burned ~1s of `buddy --help` startup time (and made shell completion
121
+ # unusable). Once the pantry directory exists and a bun is on PATH, we
122
+ # trust that state until the user explicitly runs `bun install` or
123
+ # `buddy install`. To force a refresh, set STACKS_FORCE_PANTRY=1.
124
+ if is_usable_bun "${PANTRY_LOCAL_BIN}/bun" && [ "${STACKS_FORCE_PANTRY:-}" != "1" ]; then
125
+ run_buddy "${PANTRY_LOCAL_BIN}/bun" "$@"
126
+ fi
127
+
128
+ if [ -d "${PANTRY_DIR}" ] && command -v bun >/dev/null 2>&1 && [ "${STACKS_FORCE_PANTRY:-}" != "1" ]; then
129
+ run_buddy "$(command -v bun)" "$@"
130
+ fi
131
+
132
+ # node_modules layout (framework from npm, not vendored): there is no per-project
133
+ # pantry to bootstrap and none is needed to run the CLI — if a bun runtime is on
134
+ # PATH and the pantry installer is absent, just use it.
135
+ if command -v bun >/dev/null 2>&1 && [ "${STACKS_FORCE_PANTRY:-}" != "1" ] && [ ! -x "${PANTRY_INSTALLER}" ]; then
136
+ run_buddy "$(command -v bun)" "$@"
137
+ fi
138
+
139
+ # Pantry not set up (or an earlier bootstrap died halfway) - bootstrap it.
140
+ # Every step is failure-tolerant on purpose: a pantry download/install hiccup
141
+ # (a registry outage, or an unpublished release winning the race against CI)
142
+ # must not abort this script under `set -e` before the bun fallbacks below
143
+ # run. With a bun on PATH and node_modules present, the CLI runs identically
144
+ # without pantry.
145
+ pantry_bootstrap_failed=0
146
+ if ! command -v pantry >/dev/null 2>&1; then
147
+ if [ -x "${PANTRY_INSTALLER}" ]; then
148
+ run_with_timeout "${PANTRY_BOOTSTRAP_TIMEOUT_SECONDS}" "${PANTRY_INSTALLER}" || pantry_bootstrap_failed=1
149
+ export PATH="${USER_LOCAL_BIN}:${PATH}"
150
+ else
151
+ echo "Pantry installer not found at ${PANTRY_INSTALLER}" >&2
152
+ pantry_bootstrap_failed=1
153
+ fi
154
+ fi
155
+
156
+ if command -v pantry >/dev/null 2>&1; then
157
+ run_with_timeout "${PANTRY_DEPENDENCIES_TIMEOUT_SECONDS}" pantry install || pantry_bootstrap_failed=1
158
+ else
159
+ pantry_bootstrap_failed=1
160
+ fi
161
+
162
+ # After install, try again
163
+ if is_usable_bun "${PANTRY_LOCAL_BIN}/bun"; then
164
+ run_buddy "${PANTRY_LOCAL_BIN}/bun" "$@"
165
+ fi
166
+
167
+ if command -v bun >/dev/null 2>&1; then
168
+ if [ "${pantry_bootstrap_failed}" = "1" ]; then
169
+ echo "buddy: pantry bootstrap incomplete; falling back to the bun on PATH." >&2
170
+ fi
171
+ run_buddy "$(command -v bun)" "$@"
172
+ fi
173
+
174
+ echo "Pantry did not provide a local bun runtime." >&2
175
+ exit 1
@@ -0,0 +1,50 @@
1
+ {
2
+ // Framework-provided defaults for YOUR application code: `app/`, `config/`,
3
+ // `resources/` and `routes/`. The project's root `tsconfig.json` extends this
4
+ // file, so everything set here applies unless the root overrides it.
5
+ //
6
+ // Framework internals are checked separately, by `tsconfig.framework.json`.
7
+ "extends": "./tsconfig.base.json",
8
+ "compilerOptions": {
9
+ // App code runs on both the server and in the browser (stx templates,
10
+ // stores, composables), so DOM types sit on top of the base `esnext` lib.
11
+ "lib": ["esnext", "dom"],
12
+ "rootDir": "../..",
13
+ // Kept inside the framework's own cache rather than `node_modules/.cache`,
14
+ // so the incremental build survives a `bun install` and never lands in a
15
+ // hoisted or symlinked `node_modules` shared with another project.
16
+ "tsBuildInfoFile": "./.cache/typescript/app.tsbuildinfo",
17
+ "paths": {
18
+ "@stacksjs/actions/*": ["./core/actions/src/*"],
19
+ "@stacksjs/*": ["./core/*/src"],
20
+ "stacks/*": ["./core/*/src"],
21
+ "buddy": ["./core/buddy/src/index.ts"],
22
+ "buddy/*": ["./core/buddy/src/*"],
23
+ "Actions/*": ["../../app/Actions/*"],
24
+ "Commands/*": ["../../app/Commands/*"],
25
+ "Jobs/*": ["../../app/Jobs/*"],
26
+ "Middleware/*": ["../../app/Middleware/*"],
27
+ "Models/*": ["../../app/Models/*"],
28
+ "Notifications/*": ["../../app/Notifications/*"],
29
+ "~/*": ["../../*"],
30
+ "@/*": ["../../resources/*"]
31
+ }
32
+ },
33
+ // Only the four directories you author, plus the generated framework
34
+ // declarations (auto-imports, ORM globals, model attributes) they rely on.
35
+ // Keeping this list tight is the single biggest lever on check time.
36
+ "include": [
37
+ "./types/**/*.d.ts",
38
+ "../../app/**/*.ts",
39
+ "../../config/**/*.ts",
40
+ "../../resources/**/*.ts",
41
+ "../../routes/**/*.ts"
42
+ ],
43
+ "exclude": [
44
+ "../../cloud/**",
45
+ "../../dist/**",
46
+ "../../node_modules/**",
47
+ "../../pantry/**",
48
+ "../../resources/assets/**"
49
+ ]
50
+ }
@@ -0,0 +1,58 @@
1
+ {
2
+ // The single source of truth for TypeScript defaults across a Stacks project.
3
+ //
4
+ // Nothing extends this file by accident: editors only auto-discover
5
+ // `tsconfig.json`, so this base is loaded exclusively through `extends`. It
6
+ // deliberately carries compiler options ONLY - `include`, `exclude` and
7
+ // `paths` are per-project concerns and live in the configs that extend it
8
+ // (`tsconfig.app.json`, `tsconfig.framework.json`, `core/tsconfig.json`).
9
+ //
10
+ // Every option below is written out explicitly rather than inherited, so the
11
+ // full default set is readable in one place and a project can override any
12
+ // single line without having to rediscover what the rest of them were.
13
+ //
14
+ // Type checking runs on TypeScript 7 (`tsc`, the native Go compiler). Options
15
+ // dropped in 7.0 - `baseUrl`, `importsNotUsedAsValues`, `preserveValueImports`,
16
+ // `suppressImplicitAnyIndexErrors`, `out`, `charset` - are intentionally absent.
17
+ // Path mappings resolve relative to the config file that declares them, which
18
+ // is why no `baseUrl` is needed.
19
+ "compilerOptions": {
20
+ /* Language and environment */
21
+ "target": "esnext",
22
+ "lib": ["esnext"],
23
+ "jsx": "preserve",
24
+
25
+ /* Modules */
26
+ "module": "esnext",
27
+ "moduleDetection": "force",
28
+ "moduleResolution": "bundler",
29
+ "resolveJsonModule": true,
30
+ "allowImportingTsExtensions": true,
31
+ // Only Bun's ambient types are loaded automatically. Anything else has to
32
+ // be imported explicitly, which keeps tsgo from scanning every @types
33
+ // package it can reach.
34
+ "types": ["bun"],
35
+
36
+ /* Interop */
37
+ "allowSyntheticDefaultImports": true,
38
+ "esModuleInterop": true,
39
+ "forceConsistentCasingInFileNames": true,
40
+ "isolatedModules": true,
41
+
42
+ /* Type checking */
43
+ "strict": true,
44
+ "strictNullChecks": true,
45
+ "noUncheckedIndexedAccess": true,
46
+ "noUncheckedSideEffectImports": true,
47
+ // Left off because pickier already reports unused locals, and it can
48
+ // auto-fix them. Two tools flagging the same thing is just noise.
49
+ "noUnusedLocals": false,
50
+
51
+ /* Emit - Bun does the bundling, tsc only ever type checks */
52
+ "noEmit": true,
53
+
54
+ /* Performance */
55
+ "incremental": true,
56
+ "skipLibCheck": true
57
+ }
58
+ }
package/routes/core.ts ADDED
@@ -0,0 +1,78 @@
1
+ import process from 'node:process'
2
+ import { route } from '@stacksjs/router'
3
+
4
+ /**
5
+ * Framework routes shared by every Stacks app.
6
+ *
7
+ * User routes load first — defining the same path in `routes/web.ts` or
8
+ * `routes/api.ts` overrides these defaults.
9
+ */
10
+ route.get('/locale/{locale}', 'Actions/Locale/SetLocaleAction')
11
+
12
+ // robots.txt — block crawler indexing on non-production envs so staging /
13
+ // preview deploys don't end up in search results (stacksjs/stacks#1077).
14
+ // APP_ENV wins over NODE_ENV because Stacks apps key everything off APP_ENV.
15
+ // Define a `/robots.txt` route in your own routes to override.
16
+ route.get('/robots.txt', () => {
17
+ const env = (process.env.APP_ENV ?? process.env.NODE_ENV ?? '').toLowerCase()
18
+ const body = env === 'production'
19
+ ? 'User-agent: *\nAllow: /\n'
20
+ : 'User-agent: *\nDisallow: /\n'
21
+ return new Response(body, {
22
+ headers: { 'Content-Type': 'text/plain; charset=utf-8' },
23
+ })
24
+ }).skipCsrf()
25
+
26
+ // Mailable preview routes (stacksjs/stacks#1900 A3) — dev-only HTML
27
+ // pages that render every Mailable in `app/Mail/` with sample props
28
+ // from `resources/emails/_previews/<slug>.ts`. Production deployments
29
+ // short-circuit to 404 so even an accidental route registration in
30
+ // prod can't leak the preview surface.
31
+ function isProduction(): boolean {
32
+ const env = (process.env.APP_ENV ?? process.env.NODE_ENV ?? '').toLowerCase()
33
+ return env === 'production'
34
+ }
35
+
36
+ function notFound(): Response {
37
+ return new Response('Not Found', { status: 404 })
38
+ }
39
+
40
+ route.get('/_stacks/mail/preview', async () => {
41
+ if (isProduction()) return notFound()
42
+ const { discoverMailables, renderIndexHtml } = await import('@stacksjs/email')
43
+ return new Response(renderIndexHtml(discoverMailables()), {
44
+ headers: { 'Content-Type': 'text/html; charset=utf-8' },
45
+ })
46
+ }).skipCsrf()
47
+
48
+ route.get('/_stacks/mail/preview/{name}', async (req: any) => {
49
+ if (isProduction()) return notFound()
50
+ const { discoverMailables, renderMailablePreview, renderPreviewHtml } = await import('@stacksjs/email')
51
+ const slug = String(req?.params?.name ?? '')
52
+ const mailable = discoverMailables().find(m => m.slug === slug)
53
+ if (!mailable) return notFound()
54
+ const preview = await renderMailablePreview(mailable)
55
+ const url = new URL(req.url)
56
+ const view = url.searchParams.get('view')
57
+ const variant: 'desktop' | 'mobile' | 'text'
58
+ = view === 'mobile' ? 'mobile' : view === 'text' ? 'text' : 'desktop'
59
+ return new Response(renderPreviewHtml(mailable, preview, variant), {
60
+ headers: { 'Content-Type': 'text/html; charset=utf-8' },
61
+ })
62
+ }).skipCsrf()
63
+
64
+ // Raw rendered body for the preview-page iframe — same handler shape
65
+ // but skips the surrounding UI chrome so the iframe renders only the
66
+ // email body itself. Returning text/html lets the browser style it
67
+ // natively without our outer stylesheet leaking in.
68
+ route.get('/_stacks/mail/preview/{name}/raw', async (req: any) => {
69
+ if (isProduction()) return notFound()
70
+ const { discoverMailables, renderMailablePreview } = await import('@stacksjs/email')
71
+ const slug = String(req?.params?.name ?? '')
72
+ const mailable = discoverMailables().find(m => m.slug === slug)
73
+ if (!mailable) return notFound()
74
+ const preview = await renderMailablePreview(mailable)
75
+ return new Response(preview.html || '<!DOCTYPE html><html><body><p style="font-family:sans-serif;color:#6b7280;padding:40px;text-align:center">No HTML body — try the Text tab.</p></body></html>', {
76
+ headers: { 'Content-Type': 'text/html; charset=utf-8' },
77
+ })
78
+ }).skipCsrf()