@stacksjs/types 0.70.22 → 0.70.25

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 (161) hide show
  1. package/dist/index.js +1 -1
  2. package/dist/src/ai.d.ts +37 -0
  3. package/dist/src/analytics.d.ts +36 -0
  4. package/dist/src/api.d.ts +26 -0
  5. package/dist/src/app.d.ts +28 -0
  6. package/dist/src/attributes.d.ts +1 -0
  7. package/dist/src/auth.d.ts +49 -0
  8. package/dist/src/auto-imports.d.ts +8 -0
  9. package/dist/{binary.d.ts → src/binary.d.ts} +4 -1
  10. package/dist/src/cache.d.ts +79 -0
  11. package/dist/{cdn.d.ts → src/cdn.d.ts} +1 -1
  12. package/dist/{chat.d.ts → src/chat.d.ts} +29 -48
  13. package/dist/src/cli.d.ts +308 -0
  14. package/dist/{cloud.d.ts → src/cloud.d.ts} +81 -26
  15. package/dist/{components.d.ts → src/components.d.ts} +1 -4
  16. package/dist/{configure.d.ts → src/configure.d.ts} +1 -1
  17. package/dist/{cron-jobs.d.ts → src/cron-jobs.d.ts} +33 -37
  18. package/dist/src/dashboard.d.ts +33 -0
  19. package/dist/{database.d.ts → src/database.d.ts} +20 -12
  20. package/dist/src/dependencies.d.ts +17 -0
  21. package/dist/src/deploy.d.ts +16 -0
  22. package/dist/{dns.d.ts → src/dns.d.ts} +59 -59
  23. package/dist/src/docs.d.ts +23 -0
  24. package/dist/src/email.d.ts +201 -0
  25. package/dist/src/env.d.ts +1 -0
  26. package/dist/{errors.d.ts → src/errors.d.ts} +17 -24
  27. package/dist/src/events.d.ts +31 -0
  28. package/dist/src/exit-code.d.ts +10 -0
  29. package/dist/{file-systems.d.ts → src/file-systems.d.ts} +10 -6
  30. package/dist/{git.d.ts → src/git.d.ts} +9 -6
  31. package/dist/src/hashing.d.ts +57 -0
  32. package/dist/src/helpers.d.ts +1 -0
  33. package/dist/src/i18n.d.ts +65 -0
  34. package/dist/src/index.d.ts +70 -0
  35. package/dist/{library.d.ts → src/library.d.ts} +31 -33
  36. package/dist/src/logging.d.ts +12 -0
  37. package/dist/{manifest.d.ts → src/manifest.d.ts} +4 -1
  38. package/dist/src/model-names.d.ts +1 -0
  39. package/dist/src/model.d.ts +251 -0
  40. package/dist/{notifications.d.ts → src/notifications.d.ts} +1 -26
  41. package/dist/src/oauth.d.ts +290 -0
  42. package/dist/{pages.d.ts → src/pages.d.ts} +1 -1
  43. package/dist/src/payments.d.ts +322 -0
  44. package/dist/src/phone.d.ts +52 -0
  45. package/dist/src/ports.d.ts +20 -0
  46. package/dist/src/promise.d.ts +1 -0
  47. package/dist/src/push.d.ts +108 -0
  48. package/dist/src/queue.d.ts +310 -0
  49. package/dist/src/reactivity.d.ts +1 -0
  50. package/dist/src/realtime.d.ts +443 -0
  51. package/dist/src/request.d.ts +154 -0
  52. package/dist/{response.d.ts → src/response.d.ts} +1 -1
  53. package/dist/src/router.d.ts +105 -0
  54. package/dist/{saas.d.ts → src/saas.d.ts} +2 -2
  55. package/dist/src/scheduler.d.ts +1 -0
  56. package/dist/{search-engine.d.ts → src/search-engine.d.ts} +41 -45
  57. package/dist/{security.d.ts → src/security.d.ts} +4 -8
  58. package/dist/{server.d.ts → src/server.d.ts} +1 -1
  59. package/dist/src/services.d.ts +140 -0
  60. package/dist/{settings-config.d.ts → src/settings-config.d.ts} +1 -1
  61. package/dist/src/sms.d.ts +144 -0
  62. package/dist/src/stack-extensions.d.ts +137 -0
  63. package/dist/src/stacks.d.ts +40 -0
  64. package/dist/src/storage.d.ts +105 -0
  65. package/dist/src/table-names.d.ts +1 -0
  66. package/dist/src/tables.d.ts +34 -0
  67. package/dist/src/team.d.ts +7 -0
  68. package/dist/src/ui.d.ts +55 -0
  69. package/dist/src/utils.d.ts +39 -0
  70. package/package.json +13 -32
  71. package/src/ai.ts +20 -6
  72. package/src/analytics.ts +38 -1
  73. package/src/app.ts +38 -0
  74. package/src/attributes.ts +5 -1
  75. package/src/auth.ts +122 -0
  76. package/src/auto-imports.ts +8 -1
  77. package/src/cache.ts +226 -69
  78. package/src/chat.ts +0 -20
  79. package/src/cli.ts +24 -9
  80. package/src/cloud.ts +40 -1
  81. package/src/components.ts +3 -5
  82. package/src/cron-jobs.ts +1 -1
  83. package/src/dashboard.ts +40 -0
  84. package/src/database.ts +18 -2
  85. package/src/dns.ts +1 -1
  86. package/src/docs.ts +3 -3
  87. package/src/email.ts +303 -13
  88. package/src/errors.ts +2 -3
  89. package/src/events.ts +10 -5
  90. package/src/git.ts +3 -3
  91. package/src/hashing.ts +15 -19
  92. package/src/i18n.ts +105 -3
  93. package/src/index.ts +9 -5
  94. package/src/library.ts +0 -5
  95. package/src/model-names.ts +1 -1
  96. package/src/model.ts +94 -11
  97. package/src/oauth.ts +488 -0
  98. package/src/payments.ts +370 -27
  99. package/src/phone.ts +62 -0
  100. package/src/push.ts +107 -0
  101. package/src/queue.ts +386 -28
  102. package/src/reactivity.ts +1 -1
  103. package/src/realtime.ts +584 -0
  104. package/src/request.ts +344 -22
  105. package/src/router.ts +63 -5
  106. package/src/search-engine.ts +13 -13
  107. package/src/services.ts +100 -5
  108. package/src/sms.ts +263 -3
  109. package/src/stack-extensions.ts +184 -0
  110. package/src/stacks.ts +34 -4
  111. package/src/storage.ts +140 -6
  112. package/src/table-names.ts +1 -1
  113. package/src/ui.ts +20 -12
  114. package/src/utils.ts +1 -1
  115. package/dist/ai.d.ts +0 -20
  116. package/dist/analytics.d.ts +0 -13
  117. package/dist/api.d.ts +0 -26
  118. package/dist/app.d.ts +0 -32
  119. package/dist/attributes.d.ts +0 -1
  120. package/dist/auto-imports.d.ts +0 -1
  121. package/dist/build.d.ts +0 -2
  122. package/dist/cache.d.ts +0 -49
  123. package/dist/cli.d.ts +0 -310
  124. package/dist/dependencies.d.ts +0 -16
  125. package/dist/deploy.d.ts +0 -10
  126. package/dist/docs.d.ts +0 -26
  127. package/dist/email.d.ts +0 -107
  128. package/dist/events.d.ts +0 -5
  129. package/dist/exit-code.d.ts +0 -5
  130. package/dist/hashing.d.ts +0 -36
  131. package/dist/helpers.d.ts +0 -1
  132. package/dist/i18n.d.ts +0 -11
  133. package/dist/index.d.ts +0 -65
  134. package/dist/inspect.d.ts +0 -3
  135. package/dist/logging.d.ts +0 -6
  136. package/dist/model-names.d.ts +0 -1
  137. package/dist/model.d.ts +0 -226
  138. package/dist/payments.d.ts +0 -94
  139. package/dist/ports.d.ts +0 -13
  140. package/dist/promise.d.ts +0 -1
  141. package/dist/push.d.ts +0 -35
  142. package/dist/pwa.d.ts +0 -3
  143. package/dist/queue.d.ts +0 -45
  144. package/dist/reactivity.d.ts +0 -1
  145. package/dist/request.d.ts +0 -49
  146. package/dist/router.d.ts +0 -65
  147. package/dist/scheduler.d.ts +0 -1
  148. package/dist/services.d.ts +0 -81
  149. package/dist/ssg.d.ts +0 -3
  150. package/dist/stacks.d.ts +0 -54
  151. package/dist/storage.d.ts +0 -31
  152. package/dist/table-names.d.ts +0 -1
  153. package/dist/tables.d.ts +0 -34
  154. package/dist/team.d.ts +0 -8
  155. package/dist/ui.d.ts +0 -47
  156. package/dist/utils.d.ts +0 -27
  157. package/src/build.ts +0 -2
  158. package/src/inspect.ts +0 -10
  159. package/src/layout.ts +0 -8
  160. package/src/pwa.ts +0 -8
  161. package/src/ssg.ts +0 -3
@@ -0,0 +1,443 @@
1
+ /**
2
+ * Realtime configuration presets for common use cases
3
+ */
4
+ export declare const RealtimePresets: {
5
+ /**
6
+ * Server mode presets (ts-broadcasting)
7
+ */
8
+ server: {
9
+ /**
10
+ * Development preset - minimal config, debug enabled
11
+ */
12
+ development: {
13
+ enabled: true;
14
+ mode: 'server';
15
+ debug: true;
16
+ server: {
17
+ host: 'localhost';
18
+ port: 6001;
19
+ scheme: 'ws';
20
+ driver: 'bun';
21
+ rateLimit: {
22
+ enabled: false
23
+ };
24
+ healthCheck: {
25
+ enabled: true;
26
+ path: '/health'
27
+ }
28
+ };
29
+ channels: {
30
+ public: true;
31
+ private: true;
32
+ presence: true
33
+ }
34
+ };
35
+ /**
36
+ * Production preset - optimized for production workloads
37
+ */
38
+ production: {
39
+ enabled: true;
40
+ mode: 'server';
41
+ debug: false;
42
+ server: {
43
+ host: '0.0.0.0';
44
+ port: 6001;
45
+ scheme: 'wss';
46
+ driver: 'bun';
47
+ redis: {
48
+ enabled: true;
49
+ prefix: 'stacks:realtime:'
50
+ };
51
+ rateLimit: {
52
+ enabled: true;
53
+ maxConnectionsPerIp: 100;
54
+ maxMessagesPerSecond: 50;
55
+ maxPayloadSize: 65536
56
+ };
57
+ loadManagement: {
58
+ maxConnections: 10000;
59
+ backpressureThreshold: 1000;
60
+ messageQueueSize: 10000;
61
+ gracefulShutdownTimeout: 30000
62
+ };
63
+ autoScaling: {
64
+ min: 2;
65
+ max: 10;
66
+ targetCPU: 70
67
+ };
68
+ healthCheck: {
69
+ enabled: true;
70
+ path: '/health';
71
+ interval: 30
72
+ };
73
+ metrics: {
74
+ enabled: true;
75
+ port: 9090;
76
+ path: '/metrics'
77
+ }
78
+ };
79
+ channels: {
80
+ public: true;
81
+ private: true;
82
+ presence: true
83
+ }
84
+ };
85
+ /**
86
+ * High performance preset - optimized for high throughput
87
+ */
88
+ highPerformance: {
89
+ enabled: true;
90
+ mode: 'server';
91
+ server: {
92
+ driver: 'bun';
93
+ redis: {
94
+ enabled: true;
95
+ cluster: true
96
+ };
97
+ rateLimit: {
98
+ enabled: true;
99
+ maxConnectionsPerIp: 500;
100
+ maxMessagesPerSecond: 200;
101
+ maxPayloadSize: 131072
102
+ };
103
+ loadManagement: {
104
+ maxConnections: 100000;
105
+ backpressureThreshold: 5000;
106
+ messageQueueSize: 50000;
107
+ gracefulShutdownTimeout: 60000
108
+ };
109
+ autoScaling: {
110
+ min: 4;
111
+ max: 50;
112
+ targetCPU: 60
113
+ }
114
+ }
115
+ };
116
+ /**
117
+ * Chat application preset
118
+ */
119
+ chat: {
120
+ enabled: true;
121
+ mode: 'server';
122
+ server: {
123
+ driver: 'bun';
124
+ redis: {
125
+ enabled: true
126
+ };
127
+ rateLimit: {
128
+ enabled: true;
129
+ maxConnectionsPerIp: 10;
130
+ maxMessagesPerSecond: 20
131
+ };
132
+ loadManagement: {
133
+ maxConnections: 50000
134
+ }
135
+ };
136
+ channels: {
137
+ public: true;
138
+ private: true;
139
+ presence: {
140
+ enabled: true;
141
+ maxMembersPerChannel: 500;
142
+ memberInfoTtl: 60
143
+ }
144
+ }
145
+ };
146
+ /**
147
+ * Gaming preset - low latency, high throughput
148
+ */
149
+ gaming: {
150
+ enabled: true;
151
+ mode: 'server';
152
+ server: {
153
+ driver: 'bun';
154
+ redis: {
155
+ enabled: true;
156
+ cluster: true
157
+ };
158
+ rateLimit: {
159
+ enabled: true;
160
+ maxConnectionsPerIp: 50;
161
+ maxMessagesPerSecond: 100
162
+ };
163
+ loadManagement: {
164
+ maxConnections: 50000;
165
+ backpressureThreshold: 2000;
166
+ messageQueueSize: 20000
167
+ };
168
+ autoScaling: {
169
+ min: 2;
170
+ max: 20;
171
+ targetCPU: 50
172
+ }
173
+ };
174
+ channels: {
175
+ public: true;
176
+ private: true;
177
+ presence: true
178
+ }
179
+ }
180
+ };
181
+ /**
182
+ * Serverless mode presets (API Gateway WebSocket)
183
+ */
184
+ serverless: {
185
+ /**
186
+ * Development preset
187
+ */
188
+ development: {
189
+ enabled: true;
190
+ mode: 'serverless';
191
+ debug: true;
192
+ serverless: {
193
+ connectionTimeout: 3600;
194
+ idleTimeout: 600;
195
+ stageName: 'dev';
196
+ memorySize: 256;
197
+ timeout: 30
198
+ };
199
+ channels: {
200
+ public: true;
201
+ private: true;
202
+ presence: true
203
+ }
204
+ };
205
+ /**
206
+ * Production preset
207
+ */
208
+ production: {
209
+ enabled: true;
210
+ mode: 'serverless';
211
+ debug: false;
212
+ serverless: {
213
+ connectionTimeout: 3600;
214
+ idleTimeout: 600;
215
+ stageName: 'production';
216
+ memorySize: 512;
217
+ timeout: 30;
218
+ provisionedConcurrency: 2
219
+ };
220
+ channels: {
221
+ public: true;
222
+ private: true;
223
+ presence: true
224
+ }
225
+ };
226
+ /**
227
+ * Notifications preset - simple push notifications
228
+ */
229
+ notifications: {
230
+ enabled: true;
231
+ mode: 'serverless';
232
+ serverless: {
233
+ connectionTimeout: 7200;
234
+ idleTimeout: 1800;
235
+ memorySize: 256;
236
+ timeout: 15
237
+ };
238
+ channels: {
239
+ public: true;
240
+ private: true;
241
+ presence: false
242
+ }
243
+ }
244
+ }
245
+ };
246
+ /**
247
+ * Redis adapter configuration for horizontal scaling
248
+ */
249
+ export declare interface RealtimeRedisConfig {
250
+ enabled?: boolean
251
+ host?: string
252
+ port?: number
253
+ password?: string
254
+ prefix?: string
255
+ cluster?: boolean
256
+ sentinels?: Array<{ host: string, port: number }>
257
+ sentinelName?: string
258
+ }
259
+ /**
260
+ * Rate limiting configuration
261
+ */
262
+ export declare interface RealtimeRateLimitConfig {
263
+ enabled?: boolean
264
+ maxConnectionsPerIp?: number
265
+ maxMessagesPerSecond?: number
266
+ maxPayloadSize?: number
267
+ banDuration?: number
268
+ }
269
+ /**
270
+ * Encryption configuration
271
+ */
272
+ export declare interface RealtimeEncryptionConfig {
273
+ enabled?: boolean
274
+ algorithm?: 'aes-256-gcm' | 'chacha20-poly1305'
275
+ keyRotationInterval?: number
276
+ }
277
+ /**
278
+ * Webhook configuration
279
+ */
280
+ export declare interface RealtimeWebhooksConfig {
281
+ enabled?: boolean
282
+ url?: string
283
+ events?: Array<'connection' | 'disconnection' | 'subscription' | 'message' | 'error'>
284
+ headers?: Record<string, string>
285
+ timeout?: number
286
+ retries?: number
287
+ }
288
+ /**
289
+ * Queue integration configuration
290
+ */
291
+ export declare interface RealtimeQueueConfig {
292
+ enabled?: boolean
293
+ driver?: 'redis' | 'sqs' | 'memory'
294
+ batchSize?: number
295
+ flushInterval?: number
296
+ }
297
+ /**
298
+ * Load management configuration
299
+ */
300
+ export declare interface RealtimeLoadConfig {
301
+ maxConnections?: number
302
+ backpressureThreshold?: number
303
+ messageQueueSize?: number
304
+ gracefulShutdownTimeout?: number
305
+ }
306
+ /**
307
+ * Presence channel configuration
308
+ */
309
+ export declare interface RealtimePresenceConfig {
310
+ enabled?: boolean
311
+ maxMembersPerChannel?: number
312
+ memberInfoTtl?: number
313
+ }
314
+ /**
315
+ * Server mode configuration (ts-broadcasting)
316
+ */
317
+ export declare interface RealtimeServerConfig {
318
+ host?: string
319
+ port?: number
320
+ scheme?: 'ws' | 'wss'
321
+ driver?: 'bun' | 'reverb' | 'pusher' | 'ably'
322
+ redis?: RealtimeRedisConfig
323
+ rateLimit?: RealtimeRateLimitConfig
324
+ encryption?: RealtimeEncryptionConfig
325
+ webhooks?: RealtimeWebhooksConfig
326
+ queue?: RealtimeQueueConfig
327
+ loadManagement?: RealtimeLoadConfig
328
+ instances?: number
329
+ autoScaling?: {
330
+ min?: number
331
+ max?: number
332
+ targetCPU?: number
333
+ targetMemory?: number
334
+ }
335
+ healthCheck?: {
336
+ enabled?: boolean
337
+ path?: string
338
+ interval?: number
339
+ }
340
+ metrics?: {
341
+ enabled?: boolean
342
+ port?: number
343
+ path?: string
344
+ }
345
+ tls?: {
346
+ enabled?: boolean
347
+ cert?: string
348
+ key?: string
349
+ }
350
+ }
351
+ /**
352
+ * Serverless mode configuration
353
+ */
354
+ export declare interface RealtimeServerlessConfig {
355
+ connectionTimeout?: number
356
+ idleTimeout?: number
357
+ stageName?: string
358
+ memorySize?: number
359
+ timeout?: number
360
+ provisionedConcurrency?: number
361
+ }
362
+ /**
363
+ * Channel configuration
364
+ */
365
+ export declare interface RealtimeChannelsConfig {
366
+ public?: boolean
367
+ private?: boolean
368
+ presence?: boolean | RealtimePresenceConfig
369
+ }
370
+ export declare interface RealtimeOptions {
371
+ enabled?: boolean
372
+ mode?: RealtimeMode
373
+ driver?: 'socket' | 'pusher' | 'bun' | 'reverb' | 'ably'
374
+ server?: RealtimeServerConfig
375
+ serverless?: RealtimeServerlessConfig
376
+ channels?: RealtimeChannelsConfig
377
+ socket?: {
378
+ port?: number
379
+ host?: string
380
+ cors?: {
381
+ origin: string | string[]
382
+ methods: string[]
383
+ }
384
+ }
385
+ pusher?: {
386
+ appId: string
387
+ key: string
388
+ secret: string
389
+ cluster?: string
390
+ useTLS?: boolean
391
+ }
392
+ app?: {
393
+ id?: string
394
+ key?: string
395
+ secret?: string
396
+ }
397
+ domain?: string
398
+ debug?: boolean
399
+ }
400
+ export declare interface RealtimeInstance {
401
+ event: string
402
+ handle?: (data?: any) => Promise<{ channel: string, type: 'public' | 'private' | 'presence' } | void>
403
+ }
404
+ export declare interface RealtimeDriver {
405
+ connect: () => Promise<void>
406
+ disconnect: () => Promise<void>
407
+ subscribe: (channel: string, callback: (data: any) => void) => void
408
+ unsubscribe: (channel: string) => void
409
+ publish: (channel: string, data: any) => void
410
+ broadcast: (channel: string, event: string, data?: any, type?: ChannelType) => void
411
+ isConnected: () => boolean
412
+ }
413
+ export declare interface Broadcastable {
414
+ broadcastEvent: () => Promise<void>
415
+ broadcastEventNow: () => Promise<void>
416
+ setChannel: (channel: string) => this
417
+ excludeCurrentUser: () => this
418
+ setPresenceChannel: () => this
419
+ setPrivateChannel: () => this
420
+ }
421
+ export declare interface BroadcastInstance {
422
+ channel?: string
423
+ event?: string
424
+ handle?: (data: any) => Promise<void>
425
+ }
426
+ /**
427
+ * Options for the emit function
428
+ */
429
+ export declare interface EmitOptions {
430
+ private?: boolean
431
+ presence?: boolean
432
+ exclude?: string | string[]
433
+ driver?: DriverType
434
+ }
435
+ /**
436
+ * Realtime deployment mode
437
+ * - 'serverless': Uses API Gateway WebSocket + Lambda + DynamoDB
438
+ * - 'server': Uses ts-broadcasting Bun WebSocket server (ECS/Fargate)
439
+ */
440
+ export type RealtimeMode = 'serverless' | 'server';
441
+ export type RealtimeConfig = Partial<RealtimeOptions>;
442
+ export type DriverType = 'socket' | 'pusher' | 'bun' | 'reverb' | 'ably';
443
+ export type ChannelType = 'public' | 'private' | 'presence';
@@ -0,0 +1,154 @@
1
+ import { User } from '@stacksjs/orm';
2
+ import type { AuthToken } from '@stacksjs/types';
3
+ import type { ModelRow } from '@stacksjs/orm';
4
+ import type { UploadedFile } from '@stacksjs/storage';
5
+ declare interface RequestData {
6
+ [key: string]: any
7
+ }
8
+ /**
9
+ * Collection interface for array data (Laravel-style)
10
+ */
11
+ export declare interface Collection<T> {
12
+ items: T[]
13
+ count: () => number
14
+ first: () => T | undefined
15
+ last: () => T | undefined
16
+ map: <U>(fn: (item: T, index: number) => U) => Collection<U>
17
+ filter: (fn: (item: T, index: number) => boolean) => Collection<T>
18
+ find: (fn: (item: T, index: number) => boolean) => T | undefined
19
+ reduce: <U>(fn: (acc: U, item: T, index: number) => U, initial: U) => U
20
+ forEach: (fn: (item: T, index: number) => void) => void
21
+ toArray: () => T[]
22
+ isEmpty: () => boolean
23
+ isNotEmpty: () => boolean
24
+ pluck: <K extends keyof T>(key: K) => Collection<T[K]>
25
+ unique: () => Collection<T>
26
+ sortBy: <K extends keyof T>(key: K, direction?: 'asc' | 'desc') => Collection<T>
27
+ groupBy: <K extends keyof T>(key: K) => Map<T[K], Collection<T>>
28
+ chunk: (size: number) => Collection<Collection<T>>
29
+ take: (count: number) => Collection<T>
30
+ skip: (count: number) => Collection<T>
31
+ reverse: () => Collection<T>
32
+ sum: (key?: keyof T) => number
33
+ avg: (key?: keyof T) => number
34
+ min: (key?: keyof T) => T | undefined
35
+ max: (key?: keyof T) => T | undefined
36
+ }
37
+ /**
38
+ * Safe validated data wrapper (Laravel-style)
39
+ */
40
+ export declare interface SafeData<T extends Record<string, any> = Record<string, any>> {
41
+ only: <K extends keyof T>(keys: K[]) => Pick<T, K>
42
+ except: <K extends keyof T>(keys: K[]) => Omit<T, K>
43
+ merge: <U extends Record<string, unknown>>(data: U) => T & U
44
+ all: () => T
45
+ has: (key: keyof T) => boolean
46
+ get: <K extends keyof T>(key: K) => T[K]
47
+ }
48
+ export declare interface RequestInstance<TFields extends Record<string, any> = Record<string, any>> {
49
+ url: string
50
+ method: string
51
+ headers: Headers
52
+ query: RequestData
53
+ params: RouteParams
54
+ jsonBody?: any
55
+ formBody?: any
56
+ files: Record<string, File | File[]>
57
+ get: <K extends keyof TFields & string>(key: K, defaultValue?: TFields[K]) => TFields[K]
58
+ input: <K extends keyof TFields & string>(key: K, defaultValue?: TFields[K]) => TFields[K]
59
+ all: () => TFields
60
+ only: <K extends keyof TFields & string>(keys: K[]) => Pick<TFields, K>
61
+ except: <K extends keyof TFields & string>(keys: K[]) => Omit<TFields, K>
62
+ has: (key: (keyof TFields & string) | (keyof TFields & string)[]) => boolean
63
+ hasAny: (keys: (keyof TFields & string)[]) => boolean
64
+ filled: (key: (keyof TFields & string) | (keyof TFields & string)[]) => boolean
65
+ missing: (key: (keyof TFields & string) | (keyof TFields & string)[]) => boolean
66
+ merge: (data: Partial<TFields>) => void
67
+ keys: () => (keyof TFields & string)[]
68
+ string: (key: keyof TFields & string, defaultValue?: string) => string
69
+ integer: (key: keyof TFields & string, defaultValue?: number) => number
70
+ float: (key: keyof TFields & string, defaultValue?: number) => number
71
+ boolean: (key: keyof TFields & string, defaultValue?: boolean) => boolean
72
+ array: <T = unknown>(key: keyof TFields & string) => T[]
73
+ date: (key: keyof TFields & string, format?: string) => Date | null
74
+ enum: <T extends Record<string, string | number>>(key: keyof TFields & string, enumType: T) => T[keyof T] | null
75
+ collect: <T = unknown>(key: keyof TFields & string) => Collection<T>
76
+ validate: (rules?: Record<string, string>, messages?: Record<string, string>) => Promise<TFields>
77
+ getValidated: () => TFields
78
+ safe: () => SafeData<TFields>
79
+ whenHas: <T>(key: keyof TFields & string, callback: (value: T) => void, defaultCallback?: () => void) => void
80
+ whenFilled: <T>(key: keyof TFields & string, callback: (value: T) => void, defaultCallback?: () => void) => void
81
+ isValue: (key: keyof TFields & string, value: unknown) => boolean
82
+ file: (key: string) => UploadedFile | null
83
+ getFiles: (key: string) => UploadedFile[]
84
+ hasFile: (key: string) => boolean
85
+ allFiles: () => Record<string, UploadedFile | UploadedFile[]>
86
+ header: (key: string) => string | null
87
+ bearerToken: () => string | null | AuthToken
88
+ getParam: <K extends string>(key: K) => K extends NumericField ? number : string
89
+ route: (key: string) => number | string | null
90
+ getParams: () => RouteParams
91
+ getParamAsInt: (key: string) => number | null
92
+ old: <T = unknown>(key: keyof TFields & string, defaultValue?: T) => T
93
+ flashInput: (keys?: (keyof TFields & string)[]) => void
94
+ flashInputOnly: (keys: (keyof TFields & string)[]) => void
95
+ flashInputExcept: (keys: (keyof TFields & string)[]) => void
96
+ json: <T = any>() => Promise<T>
97
+ isEmpty: () => boolean
98
+ browser: () => string | null
99
+ ip: () => string | null
100
+ ipForRateLimit: () => string | null
101
+ getMethod: () => HttpMethod
102
+ user: () => Promise<UserJsonResponse | undefined>
103
+ }
104
+ declare type UserJsonResponse = ModelRow<typeof User>;
105
+ declare type RouteParams = { [key: string]: string | number } | null;
106
+ declare type NumericField = 'id' | 'age' | 'count' | 'quantity' | 'amount' | 'price' | 'total' | 'score' | 'rating' | 'duration' | 'size' | 'weight' | 'height' | 'width' | 'length' | 'distance' | 'speed' | 'temperature' | 'volume' | 'capacity' | 'density' | 'pressure' | 'force' | 'energy' | 'power' | 'frequency' | 'voltage' | 'current' | 'resistance' | 'time' | 'date' | 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second' | 'millisecond' | 'microsecond' | 'nanosecond';
107
+ export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS' | 'CONNECT' | 'TRACE';
108
+ /**
109
+ * RequestInstance - Generic, model-aware request interface with Laravel-style methods.
110
+ *
111
+ * When used bare (`RequestInstance`), all methods accept any string keys (backward compatible).
112
+ * When parameterized with model fields (`RequestInstance<{ title: string, views: number }>`),
113
+ * all input methods narrow to those fields with full autocomplete and type inference.
114
+ *
115
+ * The global type alias connects this to models:
116
+ * `RequestInstance<typeof Post>` → narrows to Post's fields automatically.
117
+ *
118
+ * @example
119
+ * // Untyped (accepts any key)
120
+ * function handle(request: RequestInstance) {
121
+ * request.get('anything') // returns any
122
+ * }
123
+ *
124
+ * @example
125
+ * // Model-aware (narrows to Post's fields)
126
+ * function handle(request: RequestInstance<typeof Post>) {
127
+ * request.get('title') // autocompletes, returns string
128
+ * request.get('views') // autocompletes, returns number
129
+ * request.get('invalid') // TS error!
130
+ * const data = await request.validate() // returns typed Post fields
131
+ * }
132
+ */
133
+ /**
134
+ * Public alias for `RequestInstance<TFields>`. Use this in actions when
135
+ * you want to type the `request` argument explicitly (e.g. without
136
+ * pulling in a model object).
137
+ *
138
+ * @example
139
+ * ```ts
140
+ * import { Action } from '@stacksjs/actions'
141
+ * import type { ActionRequest } from '@stacksjs/types'
142
+ *
143
+ * type CreatePostInput = { title: string; body: string }
144
+ *
145
+ * export default new Action({
146
+ * name: 'CreatePost',
147
+ * handle(request: ActionRequest<CreatePostInput>) {
148
+ * const { title, body } = request.only(['title', 'body'])
149
+ * // ^ inferred as { title: string; body: string }
150
+ * },
151
+ * })
152
+ * ```
153
+ */
154
+ export type ActionRequest<TFields extends Record<string, any> = Record<string, any>> = RequestInstance<TFields>;
@@ -12,4 +12,4 @@ export declare interface ResponseData {
12
12
  status: number
13
13
  headers: { [key: string]: string }
14
14
  body: string
15
- }
15
+ }
@@ -0,0 +1,105 @@
1
+ import type { Action } from '@stacksjs/actions';
2
+ import type { HttpMethod } from './request';
3
+ import type { ValidationType } from '@stacksjs/ts-validation';
4
+ export declare interface RequestData {
5
+ [key: string]: any
6
+ }
7
+ export declare interface ValidationField {
8
+ rule: ValidationType
9
+ message: Record<string, string>
10
+ }
11
+ export declare interface CustomAttributes {
12
+ [key: string]: ValidationField
13
+ }
14
+ export declare interface RouteParams { [key: string]: string | number }
15
+ export declare interface Route {
16
+ name: string
17
+ uri: string
18
+ url: string
19
+ path?: string
20
+ prefix?: string
21
+ method: HttpMethod
22
+ pattern: RegExp
23
+ callback: RouteCallback | ActionPath | Action | Promise<any>
24
+ paramNames: string[]
25
+ middleware?: string | string[]
26
+ statusCode?: StatusCode
27
+ }
28
+ export declare interface ServeOptions {
29
+ host?: string
30
+ port?: number
31
+ debug?: boolean
32
+ timezone?: string
33
+ }
34
+ export declare interface Options {
35
+ statusCode?: StatusCode
36
+ }
37
+ export declare interface MiddlewareOptions {
38
+ name: string
39
+ description?: string
40
+ priority: number
41
+ handle: (request: Request) => Promise<void> | void
42
+ }
43
+ export declare interface RouteParam { [key: string]: string | number }
44
+ export declare interface Middlewares {
45
+ logger: MiddlewareFn
46
+ auth: MiddlewareFn
47
+ [key: string]: MiddlewareFn
48
+ }
49
+ export declare interface RouteGroupOptions {
50
+ prefix?: string
51
+ middleware?: Route['middleware']
52
+ }
53
+ export declare interface RouterInterface {
54
+ get: (url: Route['url'], callback: Route['callback']) => this
55
+ post: (url: Route['url'], callback: Route['callback']) => this
56
+ view: (url: Route['url'], callback: Route['callback']) => this
57
+ redirect: (url: Route['url'], callback: Route['callback'], status?: RedirectCode) => this
58
+ delete: (url: Route['url'], callback: Route['callback']) => this
59
+ patch: (url: Route['url'], callback: Route['callback']) => this
60
+ put: (url: Route['url'], callback: Route['callback']) => this
61
+ email: (url: Route['url']) => Promise<this>
62
+ health: () => Promise<this>
63
+ job: (url: Route['url']) => Promise<this>
64
+ action: (url: Route['url']) => Promise<this>
65
+ group: (options: Prefix | RouteGroupOptions, callback: () => void) => this
66
+ name: (name: string) => this
67
+ middleware: (middleware: Route['middleware']) => this
68
+ getRoutes: () => Promise<Route[]>
69
+ }
70
+ export declare interface RouterInstance {
71
+ query: any
72
+ params: RouteParams
73
+ headers: any
74
+ addQuery: (url: URL) => void
75
+ addBodies: (params: any) => void
76
+ addParam: (param: RouteParam) => void
77
+ addHeaders: (headerParams: Headers) => void
78
+ get: <K extends string>(element: K, defaultValue?: K extends NumericField ? number : string) => K extends NumericField ? number : string
79
+ all: () => any
80
+ validate: (attributes?: CustomAttributes) => Promise<void>
81
+ has: (element: string) => boolean
82
+ isEmpty: () => boolean
83
+ extractParamsFromRoute: (routePattern: string, pathname: string) => void
84
+ header: (headerParam: string) => string | number | boolean | null
85
+ getHeaders: () => any
86
+ Header: (headerParam: string) => string | number | boolean | null
87
+ getParam: <T>(key: string) => T
88
+ route: (key: string) => number | string | null
89
+ bearerToken: () => string | null | RouterAuthToken
90
+ getParams: () => RouteParams
91
+ getParamAsInt: (key: string) => number | null
92
+ browser: () => string | null
93
+ ip: () => string | null
94
+ ipForRateLimit: () => string | null
95
+ }
96
+ declare type Request = any;
97
+ declare type ActionPath = string;
98
+ // need to refactor before, after, view to be a part of some other type
99
+ export type RouteCallback = ((_params?: Record<string, any>) => any | string | object) | ((req: any, res: any) => Promise<void>);
100
+ export type RouterAuthToken = `${number}:${number}:${string}`;
101
+ export type NumericField = 'id' | 'age' | 'count' | 'quantity' | 'amount' | 'price' | 'total' | 'score' | 'rating' | 'duration' | 'size' | 'weight' | 'height' | 'width' | 'length' | 'distance' | 'speed' | 'temperature' | 'volume' | 'capacity' | 'density' | 'pressure' | 'force' | 'energy' | 'power' | 'frequency' | 'voltage' | 'current' | 'resistance' | 'time' | 'date' | 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second' | 'millisecond' | 'microsecond' | 'nanosecond';
102
+ export type StatusCode = 200 | 201 | 202 | 204 | 301 | 302 | 304 | 400 | 401 | 403 | 404 | 500;
103
+ export type RedirectCode = Extract<StatusCode, 301 | 302>;
104
+ export type MiddlewareFn = (_request: Request) => Promise<void>;
105
+ declare type Prefix = string;