@stacksjs/types 0.70.23 → 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.
- package/dist/index.js +1 -1
- package/dist/src/ai.d.ts +37 -0
- package/dist/src/analytics.d.ts +36 -0
- package/dist/src/api.d.ts +26 -0
- package/dist/src/app.d.ts +28 -0
- package/dist/src/attributes.d.ts +1 -0
- package/dist/src/auth.d.ts +49 -0
- package/dist/src/auto-imports.d.ts +8 -0
- package/dist/{binary.d.ts → src/binary.d.ts} +4 -1
- package/dist/src/cache.d.ts +79 -0
- package/dist/{cdn.d.ts → src/cdn.d.ts} +1 -1
- package/dist/{chat.d.ts → src/chat.d.ts} +29 -48
- package/dist/src/cli.d.ts +308 -0
- package/dist/{cloud.d.ts → src/cloud.d.ts} +81 -26
- package/dist/{components.d.ts → src/components.d.ts} +1 -4
- package/dist/{configure.d.ts → src/configure.d.ts} +1 -1
- package/dist/{cron-jobs.d.ts → src/cron-jobs.d.ts} +33 -37
- package/dist/src/dashboard.d.ts +33 -0
- package/dist/{database.d.ts → src/database.d.ts} +20 -12
- package/dist/src/dependencies.d.ts +17 -0
- package/dist/src/deploy.d.ts +16 -0
- package/dist/{dns.d.ts → src/dns.d.ts} +59 -59
- package/dist/src/docs.d.ts +23 -0
- package/dist/src/email.d.ts +201 -0
- package/dist/src/env.d.ts +1 -0
- package/dist/{errors.d.ts → src/errors.d.ts} +17 -24
- package/dist/src/events.d.ts +31 -0
- package/dist/src/exit-code.d.ts +10 -0
- package/dist/{file-systems.d.ts → src/file-systems.d.ts} +10 -6
- package/dist/{git.d.ts → src/git.d.ts} +9 -6
- package/dist/src/hashing.d.ts +57 -0
- package/dist/src/helpers.d.ts +1 -0
- package/dist/src/i18n.d.ts +65 -0
- package/dist/src/index.d.ts +70 -0
- package/dist/{library.d.ts → src/library.d.ts} +31 -33
- package/dist/src/logging.d.ts +12 -0
- package/dist/{manifest.d.ts → src/manifest.d.ts} +4 -1
- package/dist/src/model-names.d.ts +1 -0
- package/dist/src/model.d.ts +251 -0
- package/dist/{notifications.d.ts → src/notifications.d.ts} +1 -26
- package/dist/src/oauth.d.ts +290 -0
- package/dist/{pages.d.ts → src/pages.d.ts} +1 -1
- package/dist/src/payments.d.ts +322 -0
- package/dist/src/phone.d.ts +52 -0
- package/dist/src/ports.d.ts +20 -0
- package/dist/src/promise.d.ts +1 -0
- package/dist/src/push.d.ts +108 -0
- package/dist/src/queue.d.ts +310 -0
- package/dist/src/reactivity.d.ts +1 -0
- package/dist/src/realtime.d.ts +443 -0
- package/dist/src/request.d.ts +154 -0
- package/dist/{response.d.ts → src/response.d.ts} +1 -1
- package/dist/src/router.d.ts +105 -0
- package/dist/{saas.d.ts → src/saas.d.ts} +2 -2
- package/dist/src/scheduler.d.ts +1 -0
- package/dist/{search-engine.d.ts → src/search-engine.d.ts} +41 -45
- package/dist/{security.d.ts → src/security.d.ts} +4 -8
- package/dist/{server.d.ts → src/server.d.ts} +1 -1
- package/dist/src/services.d.ts +140 -0
- package/dist/{settings-config.d.ts → src/settings-config.d.ts} +1 -1
- package/dist/src/sms.d.ts +144 -0
- package/dist/src/stack-extensions.d.ts +137 -0
- package/dist/src/stacks.d.ts +40 -0
- package/dist/src/storage.d.ts +105 -0
- package/dist/src/table-names.d.ts +1 -0
- package/dist/src/tables.d.ts +34 -0
- package/dist/src/team.d.ts +7 -0
- package/dist/src/ui.d.ts +55 -0
- package/dist/src/utils.d.ts +39 -0
- package/package.json +13 -32
- package/src/ai.ts +20 -6
- package/src/analytics.ts +38 -1
- package/src/app.ts +38 -0
- package/src/attributes.ts +5 -1
- package/src/auth.ts +122 -0
- package/src/auto-imports.ts +8 -1
- package/src/cache.ts +226 -69
- package/src/chat.ts +0 -20
- package/src/cli.ts +24 -9
- package/src/cloud.ts +40 -1
- package/src/components.ts +3 -5
- package/src/cron-jobs.ts +1 -1
- package/src/dashboard.ts +40 -0
- package/src/database.ts +18 -2
- package/src/dns.ts +1 -1
- package/src/docs.ts +3 -3
- package/src/email.ts +303 -13
- package/src/errors.ts +2 -3
- package/src/events.ts +10 -5
- package/src/git.ts +3 -3
- package/src/hashing.ts +15 -19
- package/src/i18n.ts +105 -3
- package/src/index.ts +9 -5
- package/src/library.ts +0 -5
- package/src/model-names.ts +1 -1
- package/src/model.ts +87 -10
- package/src/oauth.ts +488 -0
- package/src/payments.ts +370 -27
- package/src/phone.ts +62 -0
- package/src/push.ts +107 -0
- package/src/queue.ts +386 -28
- package/src/reactivity.ts +1 -1
- package/src/realtime.ts +584 -0
- package/src/request.ts +344 -22
- package/src/router.ts +62 -4
- package/src/search-engine.ts +13 -13
- package/src/services.ts +100 -5
- package/src/sms.ts +263 -3
- package/src/stack-extensions.ts +184 -0
- package/src/stacks.ts +34 -4
- package/src/storage.ts +140 -6
- package/src/table-names.ts +1 -1
- package/src/ui.ts +20 -12
- package/src/utils.ts +1 -1
- package/dist/ai.d.ts +0 -20
- package/dist/analytics.d.ts +0 -13
- package/dist/api.d.ts +0 -26
- package/dist/app.d.ts +0 -32
- package/dist/attributes.d.ts +0 -1
- package/dist/auto-imports.d.ts +0 -1
- package/dist/build.d.ts +0 -2
- package/dist/cache.d.ts +0 -49
- package/dist/cli.d.ts +0 -310
- package/dist/dependencies.d.ts +0 -16
- package/dist/deploy.d.ts +0 -10
- package/dist/docs.d.ts +0 -26
- package/dist/email.d.ts +0 -107
- package/dist/events.d.ts +0 -5
- package/dist/exit-code.d.ts +0 -5
- package/dist/hashing.d.ts +0 -36
- package/dist/helpers.d.ts +0 -1
- package/dist/i18n.d.ts +0 -11
- package/dist/index.d.ts +0 -65
- package/dist/inspect.d.ts +0 -3
- package/dist/logging.d.ts +0 -6
- package/dist/model-names.d.ts +0 -1
- package/dist/model.d.ts +0 -232
- package/dist/payments.d.ts +0 -94
- package/dist/ports.d.ts +0 -13
- package/dist/promise.d.ts +0 -1
- package/dist/push.d.ts +0 -35
- package/dist/pwa.d.ts +0 -3
- package/dist/queue.d.ts +0 -45
- package/dist/reactivity.d.ts +0 -1
- package/dist/request.d.ts +0 -49
- package/dist/router.d.ts +0 -65
- package/dist/scheduler.d.ts +0 -1
- package/dist/services.d.ts +0 -81
- package/dist/ssg.d.ts +0 -3
- package/dist/stacks.d.ts +0 -54
- package/dist/storage.d.ts +0 -31
- package/dist/table-names.d.ts +0 -1
- package/dist/tables.d.ts +0 -34
- package/dist/team.d.ts +0 -8
- package/dist/ui.d.ts +0 -47
- package/dist/utils.d.ts +0 -27
- package/src/build.ts +0 -2
- package/src/inspect.ts +0 -10
- package/src/layout.ts +0 -8
- package/src/pwa.ts +0 -8
- 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>;
|
|
@@ -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;
|