@stacksjs/actions 0.70.86 → 0.70.88

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 (284) hide show
  1. package/package.json +16 -16
  2. package/dist/action.d.ts +0 -149
  3. package/dist/action.js +0 -2
  4. package/dist/actions.d.ts +0 -2
  5. package/dist/actions.js +0 -2
  6. package/dist/add.d.ts +0 -6
  7. package/dist/add.js +0 -2
  8. package/dist/ai/request-model-access.d.ts +0 -1
  9. package/dist/ai/request-model-access.js +0 -2
  10. package/dist/auth/client.d.ts +0 -1
  11. package/dist/auth/client.js +0 -3
  12. package/dist/auth/prune.d.ts +0 -1
  13. package/dist/auth/prune.js +0 -2
  14. package/dist/auth/setup.d.ts +0 -1
  15. package/dist/auth/setup.js +0 -206
  16. package/dist/auth/token.d.ts +0 -1
  17. package/dist/auth/token.js +0 -2
  18. package/dist/blog.d.ts +0 -19
  19. package/dist/blog.js +0 -148
  20. package/dist/build/cli.d.ts +0 -1
  21. package/dist/build/cli.js +0 -2
  22. package/dist/build/component-libs.d.ts +0 -1
  23. package/dist/build/component-libs.js +0 -2
  24. package/dist/build/core.d.ts +0 -1
  25. package/dist/build/core.js +0 -2
  26. package/dist/build/desktop.d.ts +0 -1
  27. package/dist/build/desktop.js +0 -2
  28. package/dist/build/docs.d.ts +0 -1
  29. package/dist/build/docs.js +0 -2
  30. package/dist/build/frontend-static.d.ts +0 -16
  31. package/dist/build/frontend-static.js +0 -9
  32. package/dist/build/server.d.ts +0 -1
  33. package/dist/build/server.js +0 -2
  34. package/dist/build/stacks.d.ts +0 -1
  35. package/dist/build/stacks.js +0 -2
  36. package/dist/build/views.d.ts +0 -1
  37. package/dist/build/views.js +0 -2
  38. package/dist/build.d.ts +0 -9
  39. package/dist/build.js +0 -2
  40. package/dist/bump.d.ts +0 -1
  41. package/dist/bump.js +0 -8
  42. package/dist/cdn/invalidate-cache.d.ts +0 -1
  43. package/dist/cdn/invalidate-cache.js +0 -1
  44. package/dist/changelog.d.ts +0 -9
  45. package/dist/changelog.js +0 -3
  46. package/dist/check/ports.d.ts +0 -1
  47. package/dist/check/ports.js +0 -2
  48. package/dist/chunk-0c8sd1t6.js +0 -2
  49. package/dist/chunk-0g2nzhx9.js +0 -240
  50. package/dist/chunk-0gadhvn7.js +0 -3
  51. package/dist/chunk-0h27aa4r.js +0 -93
  52. package/dist/chunk-3peh8kqs.js +0 -851
  53. package/dist/chunk-62gdfav8.js +0 -3
  54. package/dist/chunk-6bk53y02.js +0 -3
  55. package/dist/chunk-78c5n3s2.js +0 -3
  56. package/dist/chunk-c74qv38e.js +0 -17
  57. package/dist/chunk-cdk2r2jd.js +0 -1
  58. package/dist/chunk-dbz9dp2h.js +0 -3
  59. package/dist/chunk-e142dheq.js +0 -3
  60. package/dist/chunk-ec4gky40.js +0 -3
  61. package/dist/chunk-h3d81wrg.js +0 -3
  62. package/dist/chunk-m3q0x4h0.js +0 -688
  63. package/dist/chunk-mqgbyhph.js +0 -5
  64. package/dist/chunk-n24m8prb.js +0 -3
  65. package/dist/chunk-n5eqwhck.js +0 -7
  66. package/dist/chunk-nsvnqv8y.js +0 -5
  67. package/dist/chunk-nty6mmx4.js +0 -283
  68. package/dist/chunk-s735m9mg.js +0 -1
  69. package/dist/chunk-tpb8jgsk.js +0 -7
  70. package/dist/chunk-tsbk5vne.js +0 -3
  71. package/dist/chunk-xg9xscqz.js +0 -1
  72. package/dist/chunk-y6e448he.js +0 -7
  73. package/dist/clean.d.ts +0 -1
  74. package/dist/clean.js +0 -2
  75. package/dist/commit.d.ts +0 -3
  76. package/dist/commit.js +0 -2
  77. package/dist/copy-types.d.ts +0 -1
  78. package/dist/copy-types.js +0 -3
  79. package/dist/database/seed.d.ts +0 -1
  80. package/dist/database/seed.js +0 -2
  81. package/dist/deploy/create-receipt-rule.d.ts +0 -1
  82. package/dist/deploy/create-receipt-rule.js +0 -2
  83. package/dist/deploy/index.d.ts +0 -1
  84. package/dist/deploy/index.js +0 -300
  85. package/dist/dev/api.d.ts +0 -1
  86. package/dist/dev/api.js +0 -6
  87. package/dist/dev/components.d.ts +0 -1
  88. package/dist/dev/components.js +0 -2
  89. package/dist/dev/dashboard-globals.d.ts +0 -4
  90. package/dist/dev/dashboard-globals.js +0 -3
  91. package/dist/dev/dashboard-utils.d.ts +0 -150
  92. package/dist/dev/dashboard-utils.js +0 -2
  93. package/dist/dev/dashboard.d.ts +0 -22
  94. package/dist/dev/dashboard.js +0 -8
  95. package/dist/dev/desktop.d.ts +0 -1
  96. package/dist/dev/desktop.js +0 -2
  97. package/dist/dev/docs.d.ts +0 -1
  98. package/dist/dev/docs.js +0 -2
  99. package/dist/dev/index.d.ts +0 -10
  100. package/dist/dev/index.js +0 -2
  101. package/dist/dev/migrate-watcher.d.ts +0 -1
  102. package/dist/dev/migrate-watcher.js +0 -2
  103. package/dist/dev/system-tray.d.ts +0 -1
  104. package/dist/dev/system-tray.js +0 -2
  105. package/dist/dev/views.d.ts +0 -1
  106. package/dist/dev/views.js +0 -2
  107. package/dist/discover-packages.d.ts +0 -18
  108. package/dist/discover-packages.js +0 -2
  109. package/dist/domains/add.d.ts +0 -1
  110. package/dist/domains/add.js +0 -2
  111. package/dist/domains/purchase.d.ts +0 -1
  112. package/dist/domains/purchase.js +0 -2
  113. package/dist/domains/remove.d.ts +0 -1
  114. package/dist/domains/remove.js +0 -2
  115. package/dist/examples.d.ts +0 -5
  116. package/dist/examples.js +0 -2
  117. package/dist/find-projects.d.ts +0 -1
  118. package/dist/find-projects.js +0 -2
  119. package/dist/fresh.d.ts +0 -1
  120. package/dist/fresh.js +0 -2
  121. package/dist/generate/action-types.d.ts +0 -1
  122. package/dist/generate/action-types.js +0 -8
  123. package/dist/generate/component-meta.d.ts +0 -1
  124. package/dist/generate/component-meta.js +0 -3
  125. package/dist/generate/custom-cli-file.d.ts +0 -1
  126. package/dist/generate/custom-cli-file.js +0 -4
  127. package/dist/generate/env-files.d.ts +0 -1
  128. package/dist/generate/env-files.js +0 -26
  129. package/dist/generate/ide-helpers.d.ts +0 -1
  130. package/dist/generate/ide-helpers.js +0 -3
  131. package/dist/generate/index.d.ts +0 -36
  132. package/dist/generate/index.js +0 -2
  133. package/dist/generate/lib-entries.d.ts +0 -1
  134. package/dist/generate/lib-entries.js +0 -3
  135. package/dist/generate/pantry-file.d.ts +0 -1
  136. package/dist/generate/pantry-file.js +0 -2
  137. package/dist/generate/symlink-core.d.ts +0 -1
  138. package/dist/generate/symlink-core.js +0 -2
  139. package/dist/generate/types.d.ts +0 -1
  140. package/dist/generate/types.js +0 -2
  141. package/dist/generate/vscode-custom-data.d.ts +0 -1
  142. package/dist/generate/vscode-custom-data.js +0 -3
  143. package/dist/generate/web-types.d.ts +0 -1
  144. package/dist/generate/web-types.js +0 -1
  145. package/dist/helpers/component-meta.d.ts +0 -26
  146. package/dist/helpers/component-meta.js +0 -2
  147. package/dist/helpers/index.d.ts +0 -4
  148. package/dist/helpers/index.js +0 -2
  149. package/dist/helpers/lib-entries.d.ts +0 -12
  150. package/dist/helpers/lib-entries.js +0 -2
  151. package/dist/helpers/package-json.d.ts +0 -2
  152. package/dist/helpers/package-json.js +0 -43
  153. package/dist/helpers/utils.d.ts +0 -23
  154. package/dist/helpers/utils.js +0 -2
  155. package/dist/helpers/vscode-custom-data.d.ts +0 -3
  156. package/dist/helpers/vscode-custom-data.js +0 -2
  157. package/dist/index.d.ts +0 -49
  158. package/dist/index.js +0 -2
  159. package/dist/key-generate.d.ts +0 -1
  160. package/dist/key-generate.js +0 -2
  161. package/dist/lint/fix.d.ts +0 -1
  162. package/dist/lint/fix.js +0 -3
  163. package/dist/lint/index.d.ts +0 -1
  164. package/dist/lint/index.js +0 -3
  165. package/dist/lint/lint.d.ts +0 -14
  166. package/dist/lint/lint.js +0 -2
  167. package/dist/make-command.d.ts +0 -10
  168. package/dist/make-command.js +0 -45
  169. package/dist/make-job.d.ts +0 -5
  170. package/dist/make-job.js +0 -129
  171. package/dist/make-policy.d.ts +0 -10
  172. package/dist/make-policy.js +0 -94
  173. package/dist/make-resource.d.ts +0 -10
  174. package/dist/make-resource.js +0 -113
  175. package/dist/make.d.ts +0 -52
  176. package/dist/make.js +0 -2
  177. package/dist/migrate/database.d.ts +0 -1
  178. package/dist/migrate/database.js +0 -2
  179. package/dist/migrate/fresh.d.ts +0 -1
  180. package/dist/migrate/fresh.js +0 -2
  181. package/dist/orm/base.d.ts +0 -1
  182. package/dist/orm/base.js +0 -2
  183. package/dist/orm/test.d.ts +0 -1
  184. package/dist/orm/test.js +0 -1
  185. package/dist/prepublish.d.ts +0 -1
  186. package/dist/prepublish.js +0 -2
  187. package/dist/queue/clear.d.ts +0 -1
  188. package/dist/queue/clear.js +0 -2
  189. package/dist/queue/dlq-purge.d.ts +0 -1
  190. package/dist/queue/dlq-purge.js +0 -2
  191. package/dist/queue/dlq-retry.d.ts +0 -1
  192. package/dist/queue/dlq-retry.js +0 -2
  193. package/dist/queue/dlq.d.ts +0 -1
  194. package/dist/queue/dlq.js +0 -5
  195. package/dist/queue/failed.d.ts +0 -1
  196. package/dist/queue/failed.js +0 -5
  197. package/dist/queue/flush.d.ts +0 -1
  198. package/dist/queue/flush.js +0 -3
  199. package/dist/queue/inspect.d.ts +0 -1
  200. package/dist/queue/inspect.js +0 -8
  201. package/dist/queue/list.d.ts +0 -1
  202. package/dist/queue/list.js +0 -5
  203. package/dist/queue/monitor.d.ts +0 -1
  204. package/dist/queue/monitor.js +0 -7
  205. package/dist/queue/pause.d.ts +0 -1
  206. package/dist/queue/pause.js +0 -2
  207. package/dist/queue/quarantine.d.ts +0 -1
  208. package/dist/queue/quarantine.js +0 -3
  209. package/dist/queue/resume.d.ts +0 -1
  210. package/dist/queue/resume.js +0 -2
  211. package/dist/queue/retry.d.ts +0 -1
  212. package/dist/queue/retry.js +0 -2
  213. package/dist/queue/schedule-list.d.ts +0 -1
  214. package/dist/queue/schedule-list.js +0 -5
  215. package/dist/queue/schedule.d.ts +0 -1
  216. package/dist/queue/schedule.js +0 -2
  217. package/dist/queue/status.d.ts +0 -1
  218. package/dist/queue/status.js +0 -5
  219. package/dist/queue/table.d.ts +0 -1
  220. package/dist/queue/table.js +0 -2
  221. package/dist/queue/unquarantine.d.ts +0 -1
  222. package/dist/queue/unquarantine.js +0 -2
  223. package/dist/queue/work.d.ts +0 -1
  224. package/dist/queue/work.js +0 -2
  225. package/dist/release.d.ts +0 -1
  226. package/dist/release.js +0 -3
  227. package/dist/route/list.d.ts +0 -1
  228. package/dist/route/list.js +0 -3
  229. package/dist/run-action.d.ts +0 -2
  230. package/dist/run-action.js +0 -2
  231. package/dist/saas/setup.d.ts +0 -1
  232. package/dist/saas/setup.js +0 -2
  233. package/dist/scaffold-crud.d.ts +0 -25
  234. package/dist/scaffold-crud.js +0 -87
  235. package/dist/schedule/run.d.ts +0 -1
  236. package/dist/schedule/run.js +0 -2
  237. package/dist/search/flush.d.ts +0 -1
  238. package/dist/search/flush.js +0 -2
  239. package/dist/search/import.d.ts +0 -1
  240. package/dist/search/import.js +0 -2
  241. package/dist/search/settings-list.d.ts +0 -1
  242. package/dist/search/settings-list.js +0 -2
  243. package/dist/search/settings.d.ts +0 -1
  244. package/dist/search/settings.js +0 -2
  245. package/dist/serve/api.d.ts +0 -1
  246. package/dist/serve/api.js +0 -2
  247. package/dist/setup/index.d.ts +0 -1
  248. package/dist/setup/index.js +0 -2
  249. package/dist/setup/ssl.d.ts +0 -38
  250. package/dist/setup/ssl.js +0 -2
  251. package/dist/stacks.d.ts +0 -4
  252. package/dist/stacks.js +0 -2
  253. package/dist/templates.d.ts +0 -28
  254. package/dist/templates.js +0 -2
  255. package/dist/test/feature.d.ts +0 -1
  256. package/dist/test/feature.js +0 -2
  257. package/dist/test/index.d.ts +0 -1
  258. package/dist/test/index.js +0 -2
  259. package/dist/test/ui.d.ts +0 -1
  260. package/dist/test/ui.js +0 -2
  261. package/dist/test/unit.d.ts +0 -1
  262. package/dist/test/unit.js +0 -2
  263. package/dist/typecheck.d.ts +0 -1
  264. package/dist/typecheck.js +0 -2
  265. package/dist/types.d.ts +0 -3
  266. package/dist/types.js +0 -2
  267. package/dist/upgrade/binary.d.ts +0 -1
  268. package/dist/upgrade/binary.js +0 -2
  269. package/dist/upgrade/bun.d.ts +0 -1
  270. package/dist/upgrade/bun.js +0 -1
  271. package/dist/upgrade/dependencies.d.ts +0 -1
  272. package/dist/upgrade/dependencies.js +0 -2
  273. package/dist/upgrade/framework-utils.d.ts +0 -150
  274. package/dist/upgrade/framework-utils.js +0 -2
  275. package/dist/upgrade/framework.d.ts +0 -1
  276. package/dist/upgrade/framework.js +0 -7
  277. package/dist/upgrade/index.d.ts +0 -1
  278. package/dist/upgrade/index.js +0 -2
  279. package/dist/upgrade/packages.d.ts +0 -14
  280. package/dist/upgrade/packages.js +0 -12
  281. package/dist/upgrade/shell.d.ts +0 -1
  282. package/dist/upgrade/shell.js +0 -5
  283. package/dist/upgrade.d.ts +0 -7
  284. package/dist/upgrade.js +0 -2
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@stacksjs/actions",
3
3
  "type": "module",
4
4
  "sideEffects": false,
5
- "version": "0.70.86",
5
+ "version": "0.70.88",
6
6
  "description": "The Stacks actions.",
7
7
  "author": "Chris Breuer",
8
8
  "contributors": [
@@ -69,23 +69,23 @@
69
69
  "@stacksjs/ts-md": "^0.1.1"
70
70
  },
71
71
  "devDependencies": {
72
- "@stacksjs/api": "0.70.86",
73
- "@stacksjs/cli": "0.70.86",
74
- "@stacksjs/config": "0.70.86",
75
- "@stacksjs/database": "0.70.86",
72
+ "@stacksjs/api": "0.70.88",
73
+ "@stacksjs/cli": "0.70.88",
74
+ "@stacksjs/config": "0.70.88",
75
+ "@stacksjs/database": "0.70.88",
76
76
  "@stacksjs/tlsx": "^0.13.2",
77
77
  "better-dx": "^0.2.16",
78
- "@stacksjs/dns": "0.70.86",
79
- "@stacksjs/enums": "0.70.86",
80
- "@stacksjs/env": "0.70.86",
81
- "@stacksjs/error-handling": "0.70.86",
82
- "@stacksjs/logging": "0.70.86",
83
- "@stacksjs/path": "0.70.86",
84
- "@stacksjs/security": "0.70.86",
85
- "@stacksjs/storage": "0.70.86",
86
- "@stacksjs/strings": "0.70.86",
87
- "@stacksjs/utils": "0.70.86",
88
- "@stacksjs/validation": "0.70.86"
78
+ "@stacksjs/dns": "0.70.88",
79
+ "@stacksjs/enums": "0.70.88",
80
+ "@stacksjs/env": "0.70.88",
81
+ "@stacksjs/error-handling": "0.70.88",
82
+ "@stacksjs/logging": "0.70.88",
83
+ "@stacksjs/path": "0.70.88",
84
+ "@stacksjs/security": "0.70.88",
85
+ "@stacksjs/storage": "0.70.88",
86
+ "@stacksjs/strings": "0.70.88",
87
+ "@stacksjs/utils": "0.70.88",
88
+ "@stacksjs/validation": "0.70.88"
89
89
  },
90
90
  "peerDependencies": {
91
91
  "pickier": "^0.1.28"
package/dist/action.d.ts DELETED
@@ -1,149 +0,0 @@
1
- import type { ExtractParams, InferValidations, JobOptions, RequestInstance } from '@stacksjs/types';
2
- /**
3
- * Shape of `validations:` on an action. Each entry pairs a
4
- * ts-validation `Validator<T>` rule with an optional error message.
5
- *
6
- * Kept loose at the index-signature level so existing actions with
7
- * untyped validation objects keep compiling. New code that wants the
8
- * body-inference benefit (stacksjs/stacks#1851 Phase 2b) declares
9
- * validations `as const` so {@link InferValidations} can read the
10
- * concrete rule types.
11
- *
12
- * Exported so the router can run validations without redeclaring the
13
- * type (stacksjs/stacks#1870 R-3 — the previous copy in
14
- * `stacks-router.ts` would drift out of sync).
15
- */
16
- export declare interface ActionValidations {
17
- [key: string]: {
18
- rule: { validate: (value: any) => any }
19
- message?: string | Record<string, string>
20
- }
21
- }
22
- /**
23
- * Shape of {@link validateActionInput}'s return value. Lives here next
24
- * to {@link ActionValidations} so the router and actions package share
25
- * a single declaration (stacksjs/stacks#1870 R-3).
26
- */
27
- export declare interface ValidationResult {
28
- valid: boolean
29
- errors: Record<string, string[]>
30
- }
31
- declare interface ActionOptions<TModel = string, TValidations extends ActionValidations | undefined = undefined, TPath extends string = '',> {
32
- name?: string
33
- description?: string
34
- apiResponse?: boolean
35
- validations?: TValidations
36
- method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'
37
- rate?: JobOptions['rate']
38
- tries?: JobOptions['tries']
39
- backoff?: JobOptions['backoff']
40
- enabled?: JobOptions['enabled']
41
- path?: TPath
42
- requestFile?: string
43
- model?: TModel
44
- skipCsrf?: boolean
45
- csrf?: boolean
46
- authorize?: (
47
- request: InferRequest<TModel, TValidations, TPath>,
48
- ) => boolean | Response | Promise<boolean | Response>
49
- before?: (
50
- request: InferRequest<TModel, TValidations, TPath>,
51
- ) => void | Response | Promise<void | Response>
52
- handle: {
53
- bivarianceHack: (
54
- request: InferRequest<TModel, TValidations, TPath>,
55
- ) => ActionResult | Promise<ActionResult>
56
- }['bivarianceHack']
57
- dependencies?: () => Record<string, unknown>
58
- }
59
- /**
60
- * Resolve the body shape (`TFields`) for an action's request:
61
- *
62
- * 1. If `model:` is a `defineModel()` return, use its row shape —
63
- * preserves the existing model-aware ergonomics.
64
- * 2. Else if `validations:` is set as a const, infer the body
65
- * from each rule's `Validator<T>` output type
66
- * (stacksjs/stacks#1851 Phase 2b).
67
- * 3. Else fall back to `Record<string, any>` — bare-typed action
68
- * with no narrowing.
69
- */
70
- declare type ResolveBody<TModel, TValidations> = TModel extends { _isStacksModel: true }
71
- ? TModel
72
- : TValidations extends ActionValidations
73
- ? InferValidations<TValidations>
74
- : Record<string, any>;
75
- /**
76
- * Build the request type passed to the action's `handle()`. Combines
77
- * the body resolution above with path-extracted params from `TPath`
78
- * (stacksjs/stacks#1851 Phase 2a).
79
- */
80
- declare type InferRequest<TModel, TValidations, TPath extends string> = TPath extends ''
81
- ? RequestInstance<ResolveBody<TModel, TValidations>>
82
- : RequestInstance<ResolveBody<TModel, TValidations>, ExtractParams<TPath>>;
83
- /**
84
- * Everything an action's `handle()` is allowed to return. The router's
85
- * `formatResult()` walks each branch:
86
- *
87
- * - `Response` → returned as-is (caller built their own)
88
- * - `null` / `undefined` → `204` for API clients, empty `200` for browser
89
- * - object / array (incl. records) → `Response.json(...)`
90
- * - `string` / `number` / `boolean` → JSON-encoded for API clients, `text/plain`
91
- * for top-level browser navigations
92
- * - `ReadableStream` → streamed back (stacksjs/stacks#1870 R-4)
93
- *
94
- * Previously typed `Promise<any> | any`, which let non-serializable returns
95
- * (class instances with cycles, undefined-bearing tuples, etc.) sneak through
96
- * to runtime. Narrowing here surfaces them at the call site instead.
97
- * See stacksjs/stacks#1870 R-11.
98
- */
99
- export type ActionResult = | Response
100
- | ReadableStream
101
- | null
102
- | undefined
103
- | string
104
- | number
105
- | boolean
106
- | object
107
- | unknown[];
108
- export declare class Action<TModel = string, TValidations extends ActionValidations | undefined = undefined, TPath extends string = '',> {
109
- name?: string;
110
- description?: string;
111
- apiResponse?: boolean;
112
- rate?: ActionOptions['rate'];
113
- tries?: ActionOptions['tries'];
114
- backoff?: ActionOptions['backoff'];
115
- enabled?: ActionOptions['enabled'];
116
- path?: ActionOptions<TModel, TValidations, TPath>['path'];
117
- method?: ActionOptions['method'];
118
- validations?: TValidations;
119
- requestFile?: string;
120
- skipCsrf?: boolean;
121
- csrf?: boolean;
122
- authorize?: ActionOptions<TModel, TValidations, TPath>['authorize'];
123
- before?: ActionOptions<TModel, TValidations, TPath>['before'];
124
- handle: ActionOptions<TModel, TValidations, TPath>['handle'];
125
- model?: string;
126
- constructor({
127
- name,
128
- description,
129
- apiResponse,
130
- validations,
131
- handle,
132
- rate,
133
- tries,
134
- backoff,
135
- enabled,
136
- path,
137
- method,
138
- requestFile,
139
- model,
140
- skipCsrf,
141
- csrf,
142
- authorize,
143
- before,
144
- dependencies,
145
- }: ActionOptions<TModel, TValidations, TPath>);
146
- get deps(): Record<string, unknown>;
147
- overrideDependencies(overrides: Record<string, unknown>): void;
148
- resetDependencies(): void;
149
- }
package/dist/action.js DELETED
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{Hb as a}from"./chunk-6bk53y02.js";import"./chunk-h3d81wrg.js";export{a as Action};
package/dist/actions.d.ts DELETED
@@ -1,2 +0,0 @@
1
- export * from './helpers/utils';
2
- export * as actions from './helpers/utils';
package/dist/actions.js DELETED
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{Ib as a,Jb as e,Kb as f}from"./chunk-0gadhvn7.js";import"./chunk-h3d81wrg.js";export{e as runActions,a as runAction,f as hasAction,t as actions};
package/dist/add.d.ts DELETED
@@ -1,6 +0,0 @@
1
- import type { AddOptions } from '@stacksjs/types';
2
- export declare function invoke(options: AddOptions): Promise<void>;
3
- export declare function add(options: AddOptions): Promise<void>;
4
- export declare function addTable(): Promise<void>;
5
- export declare function addCalendar(): Promise<void>;
6
- export declare function installPackages(names: string[]): Promise<void>;
package/dist/add.js DELETED
@@ -1,2 +0,0 @@
1
- // @bun
2
- import"./chunk-h3d81wrg.js";import{installPackage as t}from"@stacksjs/cli";async function o(a){if(a?.table)await n();if(a?.calendar)await s()}async function r(a){return await o(a)}async function n(){await t("@stacksjs/table")}async function s(){await t("@stacksjs/calendar")}async function d(a){for(let i of a)await t(i)}export{o as invoke,d as installPackages,n as addTable,s as addCalendar,r as add};
@@ -1 +0,0 @@
1
- export {};
@@ -1,2 +0,0 @@
1
- // @bun
2
- import"../chunk-h3d81wrg.js";import{requestModelAccess as e}from"@stacksjs/ai";async function o(){try{await e()}catch(r){console.error("Error requesting model access:",r)}}if(import.meta.main)o();
@@ -1 +0,0 @@
1
- export {};
@@ -1,3 +0,0 @@
1
- // @bun
2
- import L from"process";import{randomBytes as T,scryptSync as _}from"crypto";import{db as $}from"@stacksjs/database";import{HttpError as w}from"@stacksjs/error-handling";import{log as D}from"@stacksjs/logging";var J=L.argv.slice(2),U=(G)=>{let M=J.findIndex((z)=>z.startsWith(`--${G}=`)||z.startsWith(`-${G.charAt(0)}=`));if(M!==-1){let z=J[M];if(!z)return;let O=z.indexOf("=");return O>=0?z.slice(O+1):void 0}let N=J.findIndex((z)=>z===`--${G}`||z===`-${G.charAt(0)}`),K=N!==-1?J[N+1]:void 0;if(K&&!K.startsWith("-"))return K;return},V=(G)=>{return J.includes(`--${G}`)},W=U("name")||"OAuth Client",X=U("redirect")||"http://localhost",C=V("personal"),E=V("password");D.info(`Creating OAuth client: ${W}`);var Y=T(40).toString("hex"),Q=T(16).toString("hex"),H=`${Q}:${_(Y,Q,64).toString("hex")}`,R=await $.insertInto("oauth_clients").values({name:W,secret:H,provider:"local",redirect:X,personal_access_client:C,password_client:E,revoked:!1}).executeTakeFirst(),Z=R?.insertId||Number(R?.numInsertedOrUpdatedRows);if(!Z)throw new w(500,"Failed to create OAuth client");D.success("OAuth client created successfully");D.info("");D.info("Client Details:");D.info(` Client ID: ${Z}`);D.info(" Client Secret: [REDACTED]");L.stdout.write(`Client Secret (save now, shown once): ${Y}
3
- `);D.info(` Redirect URI: ${X}`);D.info("");D.warn("Make sure to save the client secret. You will not be able to retrieve it again.");L.exit(0);
@@ -1 +0,0 @@
1
- export {};
@@ -1,2 +0,0 @@
1
- // @bun
2
- import S from"process";import{db as T,sql as V}from"@stacksjs/database";import{log as B}from"@stacksjs/logging";var G=S.argv.slice(2),U=(w)=>{return G.includes(`--${w}`)},W=(w)=>{let L=G.findIndex((z)=>z.startsWith(`--${w}=`)||z.startsWith(`-${w.charAt(0)}=`));if(L!==-1){let z=G[L];if(!z)return;let N=z.indexOf("=");return N>=0?z.slice(N+1):void 0}let M=G.findIndex((z)=>z===`--${w}`||z===`-${w.charAt(0)}`),H=M!==-1?G[M+1]:void 0;if(H&&!H.startsWith("-"))return H;return},X=!U("no-expired"),Y=!U("no-revoked"),Q=Number(W("days"))||7;B.info("Pruning authentication tokens...");var J=0,K=0;if(X)B.info("Removing expired tokens..."),J=await T.deleteFrom("personal_access_tokens").where("expires_at","<",V.raw("NOW()")).execute(),B.success(`Removed ${J} expired token(s)`);if(Y){B.info(`Removing tokens revoked more than ${Q} day(s) ago...`);let w=new Date;w.setDate(w.getDate()-Q),K=await T.deleteFrom("personal_access_tokens").where("revoked_at","is not",null).where("revoked_at","<",w.toISOString()).execute(),B.success(`Removed ${K} revoked token(s)`)}B.success(`Token pruning complete. Total removed: ${J+K}`);S.exit(0);
@@ -1 +0,0 @@
1
- export {};
@@ -1,206 +0,0 @@
1
- // @bun
2
- import J from"process";import{randomBytes as U}from"crypto";import{db as x}from"@stacksjs/database";import{log as z}from"@stacksjs/logging";import{makeHash as W}from"@stacksjs/security";import{env as X}from"@stacksjs/env";import{sqlHelpers as Y,usersEmailVerifiedAtSql as Z,usersPasswordChangedAtSql as _}from"@stacksjs/database";var O=X.DB_CONNECTION||"sqlite",K=Y(O),{isPostgres:G,isMysql:I,now:$,boolTrue:f,boolFalse:D}=K;z.info("Setting up authentication...");z.info(`Database driver: ${O}`);z.info("Ensuring OAuth tables exist...");try{if(G)await x.unsafe(`
3
- CREATE TABLE IF NOT EXISTS oauth_clients (
4
- id SERIAL PRIMARY KEY,
5
- name VARCHAR(255) NOT NULL,
6
- secret VARCHAR(100),
7
- provider VARCHAR(255),
8
- redirect VARCHAR(2000) NOT NULL,
9
- personal_access_client BOOLEAN NOT NULL DEFAULT false,
10
- password_client BOOLEAN NOT NULL DEFAULT false,
11
- revoked BOOLEAN NOT NULL DEFAULT false,
12
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
13
- updated_at TIMESTAMP
14
- )
15
- `);else if(I)await x.unsafe(`
16
- CREATE TABLE IF NOT EXISTS oauth_clients (
17
- id INTEGER AUTO_INCREMENT PRIMARY KEY,
18
- name VARCHAR(255) NOT NULL,
19
- secret VARCHAR(100),
20
- provider VARCHAR(255),
21
- redirect VARCHAR(2000) NOT NULL,
22
- personal_access_client BOOLEAN NOT NULL DEFAULT 0,
23
- password_client BOOLEAN NOT NULL DEFAULT 0,
24
- revoked BOOLEAN NOT NULL DEFAULT 0,
25
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
26
- updated_at TIMESTAMP
27
- )
28
- `);else await x.unsafe(`
29
- CREATE TABLE IF NOT EXISTS oauth_clients (
30
- id INTEGER PRIMARY KEY AUTOINCREMENT,
31
- name VARCHAR(255) NOT NULL,
32
- secret VARCHAR(100),
33
- provider VARCHAR(255),
34
- redirect VARCHAR(2000) NOT NULL,
35
- personal_access_client BOOLEAN NOT NULL DEFAULT 0,
36
- password_client BOOLEAN NOT NULL DEFAULT 0,
37
- revoked BOOLEAN NOT NULL DEFAULT 0,
38
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
39
- updated_at TIMESTAMP
40
- )
41
- `);if(G)await x.unsafe(`
42
- CREATE TABLE IF NOT EXISTS oauth_access_tokens (
43
- id SERIAL PRIMARY KEY,
44
- user_id INTEGER NOT NULL,
45
- oauth_client_id INTEGER NOT NULL,
46
- token TEXT NOT NULL,
47
- name VARCHAR(255),
48
- scopes TEXT,
49
- revoked BOOLEAN NOT NULL DEFAULT false,
50
- expires_at TIMESTAMP,
51
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
52
- updated_at TIMESTAMP
53
- )
54
- `);else if(I)await x.unsafe(`
55
- CREATE TABLE IF NOT EXISTS oauth_access_tokens (
56
- id INTEGER AUTO_INCREMENT PRIMARY KEY,
57
- user_id INTEGER NOT NULL,
58
- oauth_client_id INTEGER NOT NULL,
59
- token TEXT NOT NULL,
60
- name VARCHAR(255),
61
- scopes TEXT,
62
- revoked BOOLEAN NOT NULL DEFAULT 0,
63
- expires_at TIMESTAMP NULL,
64
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
65
- updated_at TIMESTAMP NULL
66
- )
67
- `);else await x.unsafe(`
68
- CREATE TABLE IF NOT EXISTS oauth_access_tokens (
69
- id INTEGER PRIMARY KEY AUTOINCREMENT,
70
- user_id INTEGER NOT NULL,
71
- oauth_client_id INTEGER NOT NULL,
72
- token TEXT NOT NULL,
73
- name VARCHAR(255),
74
- scopes TEXT,
75
- revoked BOOLEAN NOT NULL DEFAULT 0,
76
- expires_at TIMESTAMP,
77
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
78
- updated_at TIMESTAMP
79
- )
80
- `);if(await x.unsafe(`
81
- CREATE INDEX IF NOT EXISTS idx_oauth_access_tokens_token ON oauth_access_tokens(token)
82
- `),G)await x.unsafe(`
83
- CREATE TABLE IF NOT EXISTS oauth_refresh_tokens (
84
- id SERIAL PRIMARY KEY,
85
- access_token_id INTEGER NOT NULL,
86
- token TEXT NOT NULL,
87
- revoked BOOLEAN NOT NULL DEFAULT false,
88
- expires_at TIMESTAMP,
89
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
90
- )
91
- `);else if(I)await x.unsafe(`
92
- CREATE TABLE IF NOT EXISTS oauth_refresh_tokens (
93
- id INTEGER AUTO_INCREMENT PRIMARY KEY,
94
- access_token_id INTEGER NOT NULL,
95
- token TEXT NOT NULL,
96
- revoked BOOLEAN NOT NULL DEFAULT 0,
97
- expires_at TIMESTAMP NULL,
98
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
99
- )
100
- `);else await x.unsafe(`
101
- CREATE TABLE IF NOT EXISTS oauth_refresh_tokens (
102
- id INTEGER PRIMARY KEY AUTOINCREMENT,
103
- access_token_id INTEGER NOT NULL,
104
- token TEXT NOT NULL,
105
- revoked BOOLEAN NOT NULL DEFAULT 0,
106
- expires_at TIMESTAMP,
107
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
108
- )
109
- `);await x.unsafe(`
110
- CREATE INDEX IF NOT EXISTS idx_oauth_refresh_tokens_token ON oauth_refresh_tokens(token)
111
- `),z.success("OAuth tables ready")}catch(F){z.error("Failed to create OAuth tables",F),J.exit(1)}z.info("Ensuring password_resets table exists...");try{if(G)await x.unsafe(`
112
- CREATE TABLE IF NOT EXISTS password_resets (
113
- id SERIAL PRIMARY KEY,
114
- email VARCHAR(255) NOT NULL,
115
- token VARCHAR(255) NOT NULL,
116
- expires_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
117
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
118
- )
119
- `);else if(I)await x.unsafe(`
120
- CREATE TABLE IF NOT EXISTS password_resets (
121
- id INTEGER AUTO_INCREMENT PRIMARY KEY,
122
- email VARCHAR(255) NOT NULL,
123
- token VARCHAR(255) NOT NULL,
124
- expires_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
125
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
126
- )
127
- `);else await x.unsafe(`
128
- CREATE TABLE IF NOT EXISTS password_resets (
129
- id INTEGER PRIMARY KEY AUTOINCREMENT,
130
- email VARCHAR(255) NOT NULL,
131
- token VARCHAR(255) NOT NULL,
132
- expires_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
133
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
134
- )
135
- `);try{await x.unsafe("ALTER TABLE password_resets ADD COLUMN expires_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP")}catch{}await x.unsafe(`
136
- CREATE UNIQUE INDEX IF NOT EXISTS idx_password_resets_email_unique ON password_resets(email)
137
- `),z.success("Password resets table ready")}catch(F){z.error("Failed to create password_resets table",F),J.exit(1)}z.info("Ensuring email_verifications table exists...");try{if(G)await x.unsafe(`
138
- CREATE TABLE IF NOT EXISTS email_verifications (
139
- id SERIAL PRIMARY KEY,
140
- user_id INTEGER NOT NULL,
141
- token VARCHAR(255) NOT NULL,
142
- expires_at TIMESTAMP NOT NULL,
143
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
144
- )
145
- `);else if(I)await x.unsafe(`
146
- CREATE TABLE IF NOT EXISTS email_verifications (
147
- id INTEGER AUTO_INCREMENT PRIMARY KEY,
148
- user_id INTEGER NOT NULL,
149
- token VARCHAR(255) NOT NULL,
150
- expires_at TIMESTAMP NOT NULL,
151
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
152
- )
153
- `);else await x.unsafe(`
154
- CREATE TABLE IF NOT EXISTS email_verifications (
155
- id INTEGER PRIMARY KEY AUTOINCREMENT,
156
- user_id INTEGER NOT NULL,
157
- token VARCHAR(255) NOT NULL,
158
- expires_at TIMESTAMP NOT NULL,
159
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
160
- )
161
- `);await x.unsafe(`
162
- CREATE UNIQUE INDEX IF NOT EXISTS idx_email_verifications_user_id_unique ON email_verifications(user_id)
163
- `);try{await x.unsafe(Z(K))}catch{}try{await x.unsafe(_(K))}catch{}z.success("Email verifications table ready")}catch(F){z.error("Failed to create email_verifications table",F),J.exit(1)}z.info("Ensuring webauthn_challenges table exists...");try{if(G)await x.unsafe(`
164
- CREATE TABLE IF NOT EXISTS webauthn_challenges (
165
- id SERIAL PRIMARY KEY,
166
- user_id INTEGER NOT NULL,
167
- challenge TEXT NOT NULL,
168
- purpose VARCHAR(32) NOT NULL,
169
- expires_at TIMESTAMP NOT NULL,
170
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
171
- )
172
- `);else if(I)await x.unsafe(`
173
- CREATE TABLE IF NOT EXISTS webauthn_challenges (
174
- id INTEGER AUTO_INCREMENT PRIMARY KEY,
175
- user_id INTEGER NOT NULL,
176
- challenge TEXT NOT NULL,
177
- purpose VARCHAR(32) NOT NULL,
178
- expires_at TIMESTAMP NOT NULL,
179
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
180
- )
181
- `);else await x.unsafe(`
182
- CREATE TABLE IF NOT EXISTS webauthn_challenges (
183
- id INTEGER PRIMARY KEY AUTOINCREMENT,
184
- user_id INTEGER NOT NULL,
185
- challenge TEXT NOT NULL,
186
- purpose VARCHAR(32) NOT NULL,
187
- expires_at TIMESTAMP NOT NULL,
188
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
189
- )
190
- `);await x.unsafe(`
191
- CREATE UNIQUE INDEX IF NOT EXISTS idx_webauthn_challenges_user_purpose ON webauthn_challenges(user_id, purpose)
192
- `),z.success("WebAuthn challenges table ready")}catch(F){z.error("Failed to create webauthn_challenges table",F),J.exit(1)}z.info("Creating personal access client...");try{if((await x.unsafe(`
193
- SELECT id FROM oauth_clients WHERE personal_access_client = ${f} LIMIT 1
194
- `))?.length>0)console.log(`
195
- \u2713 Personal access client already exists`);else{let R=U(40).toString("hex"),N=await W(R,{algorithm:"bcrypt"});if(G)await x.unsafe(`
196
- INSERT INTO oauth_clients (name, secret, provider, redirect, personal_access_client, password_client, revoked, created_at)
197
- VALUES ($1, $2, $3, $4, $5, $6, $7, NOW())
198
- `,["Personal Access Client",N,"local","http://localhost",!0,!1,!1]);else await x.unsafe(`
199
- INSERT INTO oauth_clients (name, secret, provider, redirect, personal_access_client, password_client, revoked, created_at)
200
- VALUES (?, ?, ?, ?, ?, ?, ?, ${$})
201
- `,["Personal Access Client",N,"local","http://localhost",1,0,0]);console.log(`
202
- \u2713 Personal access client created successfully`)}}catch(F){console.error("Failed to create personal access client:",F),J.exit(1)}console.log(`
203
- \u2713 Authentication setup complete!`);console.log(`
204
- Features enabled:`);console.log(" - Token hashing (SHA-256) for secure storage");console.log(" - Refresh tokens for seamless token renewal");console.log(" - Scope-based authorization");console.log(" - Password reset flow");console.log(`
205
- Next steps:`);console.log(" 1. Use createToken(userId, name, scopes) to generate tokens");console.log(" 2. Use refreshToken(token) to exchange refresh tokens");console.log(' 3. Use the "auth" middleware to protect routes');console.log(" 4. Use tokenCan(scope) for authorization checks");console.log(" 5. POST /password/forgot to request password reset");console.log(` 6. POST /password/reset to reset password with token
206
- `);J.exit(0);
@@ -1 +0,0 @@
1
- export {};
@@ -1,2 +0,0 @@
1
- // @bun
2
- import q from"process";import{createPersonalAccessClient as v}from"@stacksjs/auth";import{log as w}from"@stacksjs/logging";var m=await v();if(m?.isErr)console.error(m.error),w.error("createPersonalAccessClient failed",m.error),q.exit(1);q.exit(0);
package/dist/blog.d.ts DELETED
@@ -1,19 +0,0 @@
1
- /**
2
- * Render a blog request via BunPress, or return null to let the caller handle
3
- * non-blog paths. Handles the listing, posts, the RSS feed, and the sitemap.
4
- */
5
- export declare function renderBlog(req: Request): Promise<Response | null>;
6
- /*.md` frontmatter with NO BunPress dependency, so they work in
7
- * dev and production alike. Returns null for any non-feed path (the stx page
8
- * layer then handles /blog and /blog/<slug>). Absolute URLs use the configured
9
- * site url (blog config), never the loopback request origin.
10
- */
11
- export declare function renderBlogFeed(req: Request): Promise<Response | null>;
12
- /**
13
- * Build the blog to a static directory the same way /docs is built (see
14
- * config/cloud.ts). Emits clean-URL pages (`<slug>/index.html`), the listing,
15
- * the RSS feed, and the sitemap. `baseUrl` is the deployed site origin
16
- * (e.g. https://stacksjs.com) — used for absolute feed/sitemap/share URLs.
17
- */
18
- export declare function buildBlog(options?: { outDir: string, baseUrl?: string }): Promise<void>;
19
- declare type BlogThemeMode = 'colored' | 'light' | 'dark';
package/dist/blog.js DELETED
@@ -1,148 +0,0 @@
1
- // @bun
2
- import"./chunk-h3d81wrg.js";import{existsSync as R,mkdirSync as C,readdirSync as b,readFileSync as X,writeFileSync as o}from"fs";import{homedir as i}from"os";import{join as B}from"path";var M=B(process.cwd(),"content/blog"),E=B(M,".theme.css"),y={title:"The Stacks Blog",description:"Notes from building a full-stack TypeScript framework whose only dependencies are TypeScript and Bun.",siteTitle:"Stacks Blog",author:"The Stacks Team",url:"https://stacksjs.com",nav:[{text:"Blog",link:"/blog"},{text:"Docs",link:"/docs"},{text:"GitHub",link:"https://github.com/stacksjs/stacks"}],themes:["colored","light","dark"],defaultTheme:"colored",colophon:'Built with Stacks \xB7 TypeScript &amp; Bun \xB7 <a href="/blog/feed.xml">RSS</a>',emptyTitle:"No posts yet",emptyText:"The first one is in the works. Leave your email and it will land in your inbox the moment it ships."},q=null;function w(){if(!q)q=(async()=>{try{let z=(await import(B(process.cwd(),"config/blog.ts"))).default??{},J={...y,...z};if(!z.siteTitle&&z.title)J.siteTitle=z.title;return J}catch{return y}})();return q}var O=null;async function U(){if(!O)O=(async()=>{let G=[B(i(),"Code/Tools/bunpress/packages/bunpress/dist/src/index.js"),B(process.cwd(),"pantry/@stacksjs/bunpress/dist/src/index.js"),"@stacksjs/bunpress"];for(let z of G)try{if(z.startsWith("@")||R(z))return await import(z)}catch{}return null})();return O}function $(G){return String(G).replace(/[&<>"]/g,(z)=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"})[z])}function L(G){return String(G).replace(/[&<>"']/g,(z)=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&apos;"})[z])}function S(G,z){return`${G.replace(/\/$/,"")}/blog/${z}`}function r(G){if(!G)return"";let z=new Date(G);return Number.isNaN(z.getTime())?G:z.toUTCString()}async function H(G){let z=await w(),J=G||z.url,W=x().slice(0,50).map((Z)=>{let V=S(J,Z.slug);return` <item>
3
- <title>${L(Z.fm.title||Z.slug)}</title>
4
- <link>${L(V)}</link>
5
- <guid>${L(V)}</guid>
6
- <pubDate>${L(r(Z.fm.date))}</pubDate>
7
- <description>${L(Z.fm.description||"")}</description>
8
- </item>`}).join(`
9
- `);return`<?xml version="1.0" encoding="UTF-8"?>
10
- <rss version="2.0">
11
- <channel>
12
- <title>${L(z.title)}</title>
13
- <link>${L(`${J}/blog`)}</link>
14
- <description>${L(z.description)}</description>
15
- ${W}
16
- </channel>
17
- </rss>`}async function h(G){let z=await w(),J=G||z.url;return`<?xml version="1.0" encoding="UTF-8"?>
18
- <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
19
- ${[`${J}/blog`,...x().map((W)=>S(J,W.slug))].map((W)=>` <url><loc>${L(W)}</loc></url>`).join(`
20
- `)}
21
- </urlset>`}function m(G){let z=G.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);if(!z)return{data:{},body:G};let J={},Y=z[1]??"";for(let W of Y.split(`
22
- `)){let Z=W.indexOf(":");if(Z===-1)continue;let V=W.slice(0,Z).trim(),Q=W.slice(Z+1).trim();if(Q.startsWith('"')&&Q.endsWith('"')||Q.startsWith("'")&&Q.endsWith("'"))Q=Q.slice(1,-1);J[V]=Q}return{data:J,body:z[2]??""}}function T(G){if(!G)return"";let z=new Date(G);if(Number.isNaN(z.getTime()))return G;return`${["January","February","March","April","May","June","July","August","September","October","November","December"][z.getUTCMonth()]} ${z.getUTCDate()}, ${z.getUTCFullYear()}`}var P={colored:{label:"Park theme",glyph:"\uD83C\uDF32"},light:{label:"Light theme",glyph:"\u2600"},dark:{label:"Dark theme",glyph:"\uD83C\uDF19"}};async function D(){let G=await w(),z=G.themes.length?G.themes:y.themes,J=z.includes(G.defaultTheme)?G.defaultTheme:z[0],Y=z.map((Z)=>`<button type="button" data-t="${Z}" title="${P[Z].label}" aria-label="${P[Z].label}" onclick="stxBlogTheme('${Z}')">${P[Z].glyph}</button>`).join(`
23
- `),W=z.length>1?`<div class="blog-theme-toggle" role="group" aria-label="Theme">
24
- ${Y}
25
- </div>`:"";return`<script>
26
- (function () {
27
- var modes = ${JSON.stringify(z)}
28
- function ok(theme) {
29
- return modes.indexOf(theme) !== -1
30
- }
31
-
32
- var queryTheme = ''
33
- try {
34
- queryTheme = new URLSearchParams(location.search).get('theme') || ''
35
- }
36
- catch {}
37
-
38
- var savedTheme = ''
39
- try {
40
- savedTheme = localStorage.getItem('stacks-blog-theme') || ''
41
- }
42
- catch {}
43
-
44
- var theme = ok(queryTheme) ? queryTheme : (ok(savedTheme) ? savedTheme : ${JSON.stringify(J)})
45
- document.documentElement.setAttribute('data-theme', theme)
46
- window.stxBlogTheme = function (nextTheme) {
47
- try {
48
- localStorage.setItem('stacks-blog-theme', nextTheme)
49
- }
50
- catch {}
51
- document.documentElement.setAttribute('data-theme', nextTheme)
52
- }
53
- })()
54
- </script>
55
- ${W}`}async function F(){return`<div class="blog-landscape" aria-hidden="true">
56
- <span class="ridge"></span>
57
- <span class="river"></span>
58
- <p class="colophon">${(await w()).colophon}</p>
59
- </div>`}async function v(G,z){let J=await w(),Y=R(E)?X(E,"utf-8"):"",W=G.defaultConfig.markdown?.css||"";return{...G.defaultConfig,title:z.title||J.title,description:z.description||J.description,docsDir:M,theme:"vitepress",markdown:{...G.defaultConfig.markdown,css:`${W}
60
- ${Y}`},themeConfig:{siteTitle:J.siteTitle,nav:J.nav}}}function x(){if(!R(M))return[];return b(M).filter((G)=>G.endsWith(".md")).map((G)=>{let{data:z}=m(X(B(M,G),"utf-8"));return{slug:G.replace(/\.md$/,""),fm:z}}).filter((G)=>!!G.fm.title&&!!G.fm.date).sort((G,z)=>{let J=G.fm.featured==="true"?1:0,Y=z.fm.featured==="true"?1:0;if(J!==Y)return Y-J;return(z.fm.date||"").localeCompare(G.fm.date||"")})}async function l(G){return G.wrapInLayout(await D()+`
61
- <a class="blog-back" href="/blog">\u2190 All posts</a>
62
- <div class="blog-404">
63
- <span class="blog-404-art" aria-hidden="true"></span>
64
- <h1>Nothing here</h1>
65
- <p>This post doesn't exist (or it moved). Head back to <a href="/blog">all posts</a>.</p>
66
- </div>`+await F(),await v(G,{title:"Not found"}),"/blog","page")}async function u(G,z,J){let Y=await w(),W=B(M,`${z}.md`);if(!R(W))return null;let Z=X(W,"utf-8"),{html:V,frontmatter:Q}=await G.markdownToHtml(Z,M);if(!Q.title||!Q.date)return null;let K=Q.author||Y.author,k=$(K.charAt(0).toUpperCase()),j=`
67
- <a class="blog-back" href="/blog">\u2190 All posts</a>
68
- <div class="blog-post-head">
69
- <h1>${$(Q.title||z)}</h1>
70
- <p class="blog-post-meta">
71
- <span class="author">${$(K)}</span>
72
- <span class="dot">\xB7</span>
73
- <time>${$(T(Q.date))}</time>
74
- </p>
75
- ${Q.poster?`<figure class="blog-post-poster"><img src="${$(Q.poster)}" alt="${$(Q.title||"")}"></figure>`:""}
76
- </div>`,I=Q.authorBio?`<aside class="blog-author-card">
77
- <div class="avatar">${k}</div>
78
- <div><span class="name">${$(K)}</span><p class="bio">${$(Q.authorBio)}</p></div>
79
- </aside>`:"",_=`${J}/blog/${z}`,n=`
80
- <div class="blog-share">
81
- <span class="blog-share-label">Share</span>
82
- <a href="https://twitter.com/intent/tweet?url=${encodeURIComponent(_)}&text=${encodeURIComponent(Q.title||"")}" target="_blank" rel="noreferrer">X / Twitter</a>
83
- <a href="https://www.linkedin.com/sharing/share-offsite/?url=${encodeURIComponent(_)}" target="_blank" rel="noreferrer">LinkedIn</a>
84
- </div>`,N=x().filter((A)=>A.slug!==z).slice(0,3),c=N.length?`<nav class="blog-more">
85
- <h2>More from the blog</h2>
86
- <ul>${N.map((A)=>`<li><a href="/blog/${$(A.slug)}">${$(A.fm.title||A.slug)}</a></li>`).join("")}</ul>
87
- </nav>`:"";return G.wrapInLayout(await D()+j+V+I+n+c+await F(),await v(G,Q),`/blog/${z}`,"page")}async function d(G){let z=await w(),Y=x().map((V)=>{let Q=V.fm.featured==="true",K=V.fm.poster?`<div class="blog-card-media"><img src="${$(V.fm.poster)}" alt="" loading="lazy"></div>`:"";return`<a class="blog-card${Q?" is-featured":""}" href="/blog/${$(V.slug)}">
88
- ${K}
89
- <div>
90
- ${Q?'<span class="blog-card-flag">Featured</span>':""}
91
- <h2 class="blog-card-title">${$(V.fm.title||V.slug)}</h2>
92
- <p class="blog-card-excerpt">${$((V.fm.description||"").slice(0,180))}</p>
93
- <div class="blog-card-meta">${$(V.fm.author||z.author)} \xB7 ${$(T(V.fm.date))}</div>
94
- </div>
95
- </a>`}).join(`
96
- `),W=`
97
- <div class="blog-empty">
98
- <h2>${$(z.emptyTitle)}</h2>
99
- <p>${$(z.emptyText)}</p>
100
- <form class="blog-subscribe" method="POST" action="/api/email/subscribe">
101
- <input type="email" name="email" placeholder="you@example.com" autocomplete="email" aria-label="Email address" required>
102
- <input type="hidden" name="source" value="blog-empty">
103
- <button type="submit">Subscribe</button>
104
- <p class="blog-form-note" role="status" aria-live="polite"></p>
105
- </form>
106
- </div>
107
- <script>
108
- (function () {
109
- var form = document.querySelector('.blog-subscribe')
110
- if (!form) return
111
- var note = form.querySelector('.blog-form-note')
112
- var button = form.querySelector('button[type="submit"]')
113
- var say = function (text) { if (note) note.textContent = text }
114
- form.addEventListener('submit', function (event) {
115
- event.preventDefault()
116
- var input = form.querySelector('input[name="email"]')
117
- if (!input || !input.value) { say('Enter an email address first.'); return }
118
- if (button) button.disabled = true
119
- say('Subscribing...')
120
- var body = new URLSearchParams()
121
- body.set('email', input.value)
122
- body.set('source', 'blog-empty')
123
- fetch('/api/email/subscribe', {
124
- method: 'POST',
125
- headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
126
- body: body.toString(),
127
- })
128
- .then(function (res) { return res.json().catch(function () { return {} }) })
129
- .then(function (data) {
130
- if (data && data.success) {
131
- say(data.message === 'Already subscribed' ? 'You are already on the list.' : 'Subscribed. Check your inbox to confirm.')
132
- form.reset()
133
- }
134
- else {
135
- say((data && data.message) || 'Something went wrong. Try again.')
136
- }
137
- })
138
- .catch(function () { say('Network error. Try again in a moment.') })
139
- .finally(function () { if (button) button.disabled = false })
140
- })
141
- })()
142
- </script>`,Z=`
143
- <div class="blog-listing-head">
144
- <span class="sign" aria-hidden="true"></span>
145
- <h1>${$(z.title)}</h1>
146
- <p>${$(z.description)}</p>
147
- </div>
148
- <div class="blog-cards">${Y||W}</div>`;return G.wrapInLayout(await D()+Z+await F(),await v(G,{title:z.title,description:z.description}),"/blog","page")}async function g(G,z){let J=await w(),Y={...await v(G,{title:J.title}),sitemap:{enabled:!0,baseUrl:`${z}/blog`}};return typeof G.buildRssFeed==="function"?G.buildRssFeed(M,Y,{enabled:!0,title:J.title,description:J.description,maxItems:50}):H(z)}async function f(G,z){let J={...await v(G,{title:"Blog"}),sitemap:{enabled:!0,baseUrl:`${z}/blog`}};return typeof G.buildSitemap==="function"?G.buildSitemap(M,J):h(z)}async function s(G){if(G.method!=="GET"&&G.method!=="HEAD")return null;let z=new URL(G.url),{pathname:J}=z,Y=J==="/blog/feed.xml",W=J==="/blog/sitemap.xml",Z=J==="/blog"||J==="/blog/"||/^\/blog\/[^/.]+$/.test(J);if(!Y&&!W&&!Z)return null;let V=await U();if(!V)return null;let Q=(j,I=200)=>new Response(j,{status:I,headers:{"Content-Type":"text/html; charset=utf-8"}});if(Y)return new Response(await g(V,z.origin),{headers:{"Content-Type":"application/rss+xml; charset=utf-8"}});if(W)return new Response(await f(V,z.origin),{headers:{"Content-Type":"application/xml; charset=utf-8"}});if(J==="/blog"||J==="/blog/")return Q(await d(V));let K=J.replace(/^\/blog\//,"").replace(/\/$/,""),k=await u(V,K,z.origin);return k?Q(k):Q(await l(V),404)}async function e(G){if(G.method!=="GET"&&G.method!=="HEAD")return null;let{pathname:z}=new URL(G.url);if(z==="/blog/feed.xml")return new Response(await H(""),{headers:{"Content-Type":"application/rss+xml; charset=utf-8"}});if(z==="/blog/sitemap.xml")return new Response(await h(""),{headers:{"Content-Type":"application/xml; charset=utf-8"}});return null}async function zz(G={outDir:"dist/blog"}){let z=G.outDir||"dist/blog",J=(G.baseUrl||(await w()).url).replace(/\/$/,""),Y=await U();if(!Y)throw Error("[blog] BunPress not found \u2014 cannot build the blog.");C(z,{recursive:!0});let W=(V,Q)=>{let K=B(z,V);C(B(K,".."),{recursive:!0}),o(K,Q,"utf-8")};W("index.html",await d(Y));let Z=x();for(let V of Z){let Q=await u(Y,V.slug,J);if(Q)W(B(V.slug,"index.html"),Q)}W("feed.xml",await g(Y,J)),W("sitemap.xml",await f(Y,J)),console.log(`[blog] built ${Z.length} post(s) + listing, feed.xml, sitemap.xml \u2192 ${z}`)}export{e as renderBlogFeed,s as renderBlog,zz as buildBlog};
@@ -1 +0,0 @@
1
- export {};