@lastshotlabs/bunshot 0.0.21 → 0.0.27

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 (185) hide show
  1. package/README.md +3035 -1249
  2. package/dist/adapters/localStorage.d.ts +6 -0
  3. package/dist/adapters/localStorage.js +59 -0
  4. package/dist/adapters/memoryAuth.d.ts +13 -0
  5. package/dist/adapters/memoryAuth.js +261 -2
  6. package/dist/adapters/memoryStorage.d.ts +3 -0
  7. package/dist/adapters/memoryStorage.js +44 -0
  8. package/dist/adapters/mongoAuth.js +217 -1
  9. package/dist/adapters/s3Storage.d.ts +14 -0
  10. package/dist/adapters/s3Storage.js +126 -0
  11. package/dist/adapters/sqliteAuth.d.ts +30 -0
  12. package/dist/adapters/sqliteAuth.js +352 -2
  13. package/dist/app.d.ts +203 -3
  14. package/dist/app.js +352 -48
  15. package/dist/cli.js +118 -38
  16. package/dist/index.d.ts +69 -8
  17. package/dist/index.js +46 -5
  18. package/dist/lib/HttpError.d.ts +7 -1
  19. package/dist/lib/HttpError.js +10 -1
  20. package/dist/lib/appConfig.d.ts +157 -0
  21. package/dist/lib/appConfig.js +54 -0
  22. package/dist/lib/auditLog.d.ts +58 -0
  23. package/dist/lib/auditLog.js +218 -0
  24. package/dist/lib/authAdapter.d.ts +140 -1
  25. package/dist/lib/authRateLimit.js +36 -0
  26. package/dist/lib/breachedPassword.d.ts +13 -0
  27. package/dist/lib/breachedPassword.js +48 -0
  28. package/dist/lib/captcha.d.ts +25 -0
  29. package/dist/lib/captcha.js +37 -0
  30. package/dist/lib/constants.d.ts +4 -0
  31. package/dist/lib/constants.js +4 -0
  32. package/dist/lib/context.d.ts +24 -1
  33. package/dist/lib/context.js +17 -3
  34. package/dist/lib/createRoute.d.ts +28 -2
  35. package/dist/lib/createRoute.js +54 -3
  36. package/dist/lib/credentialStuffing.d.ts +31 -0
  37. package/dist/lib/credentialStuffing.js +77 -0
  38. package/dist/lib/deletionCancelToken.d.ts +12 -0
  39. package/dist/lib/deletionCancelToken.js +88 -0
  40. package/dist/lib/emailVerification.d.ts +6 -0
  41. package/dist/lib/emailVerification.js +46 -3
  42. package/dist/lib/groups.d.ts +113 -0
  43. package/dist/lib/groups.js +133 -0
  44. package/dist/lib/idempotency.d.ts +22 -0
  45. package/dist/lib/idempotency.js +182 -0
  46. package/dist/lib/jwks.d.ts +25 -0
  47. package/dist/lib/jwks.js +51 -0
  48. package/dist/lib/jwt.d.ts +15 -2
  49. package/dist/lib/jwt.js +92 -5
  50. package/dist/lib/logger.d.ts +2 -0
  51. package/dist/lib/logger.js +6 -0
  52. package/dist/lib/m2m.d.ts +29 -0
  53. package/dist/lib/m2m.js +48 -0
  54. package/dist/lib/metrics.d.ts +14 -0
  55. package/dist/lib/metrics.js +158 -0
  56. package/dist/lib/mfaChallenge.d.ts +14 -1
  57. package/dist/lib/mfaChallenge.js +111 -6
  58. package/dist/lib/mongo.js +1 -1
  59. package/dist/lib/oauthCode.js +23 -18
  60. package/dist/lib/pagination.d.ts +119 -0
  61. package/dist/lib/pagination.js +166 -0
  62. package/dist/lib/resetPassword.js +3 -1
  63. package/dist/lib/saml.d.ts +25 -0
  64. package/dist/lib/saml.js +64 -0
  65. package/dist/lib/scim.d.ts +44 -0
  66. package/dist/lib/scim.js +54 -0
  67. package/dist/lib/securityEvents.d.ts +28 -0
  68. package/dist/lib/securityEvents.js +26 -0
  69. package/dist/lib/session.d.ts +14 -0
  70. package/dist/lib/session.js +121 -5
  71. package/dist/lib/signing.d.ts +52 -0
  72. package/dist/lib/signing.js +183 -0
  73. package/dist/lib/storageAdapter.d.ts +30 -0
  74. package/dist/lib/storageAdapter.js +1 -0
  75. package/dist/lib/stripUnreferencedSchemas.d.ts +11 -0
  76. package/dist/lib/stripUnreferencedSchemas.js +79 -0
  77. package/dist/lib/suspension.d.ts +13 -0
  78. package/dist/lib/suspension.js +23 -0
  79. package/dist/lib/tenant.js +2 -2
  80. package/dist/lib/upload.d.ts +39 -0
  81. package/dist/lib/upload.js +112 -0
  82. package/dist/lib/uploadRegistry.d.ts +18 -0
  83. package/dist/lib/uploadRegistry.js +83 -0
  84. package/dist/lib/validate.js +2 -2
  85. package/dist/lib/ws.d.ts +1 -0
  86. package/dist/lib/ws.js +28 -0
  87. package/dist/lib/wsHeartbeat.d.ts +12 -0
  88. package/dist/lib/wsHeartbeat.js +57 -0
  89. package/dist/lib/wsMessages.d.ts +40 -0
  90. package/dist/lib/wsMessages.js +330 -0
  91. package/dist/lib/wsPresence.d.ts +25 -0
  92. package/dist/lib/wsPresence.js +99 -0
  93. package/dist/middleware/auditLog.d.ts +22 -0
  94. package/dist/middleware/auditLog.js +39 -0
  95. package/dist/middleware/bearerAuth.js +1 -1
  96. package/dist/middleware/cacheResponse.js +5 -1
  97. package/dist/middleware/captcha.d.ts +10 -0
  98. package/dist/middleware/captcha.js +36 -0
  99. package/dist/middleware/csrf.js +18 -4
  100. package/dist/middleware/errorHandler.js +4 -1
  101. package/dist/middleware/identify.js +89 -14
  102. package/dist/middleware/metrics.d.ts +9 -0
  103. package/dist/middleware/metrics.js +26 -0
  104. package/dist/middleware/requestId.d.ts +3 -0
  105. package/dist/middleware/requestId.js +7 -0
  106. package/dist/middleware/requestLogger.d.ts +38 -0
  107. package/dist/middleware/requestLogger.js +68 -0
  108. package/dist/middleware/requestSigning.d.ts +20 -0
  109. package/dist/middleware/requestSigning.js +100 -0
  110. package/dist/middleware/requireMfaSetup.d.ts +16 -0
  111. package/dist/middleware/requireMfaSetup.js +37 -0
  112. package/dist/middleware/requireRole.d.ts +9 -3
  113. package/dist/middleware/requireRole.js +23 -36
  114. package/dist/middleware/requireScope.d.ts +10 -0
  115. package/dist/middleware/requireScope.js +25 -0
  116. package/dist/middleware/requireStepUp.d.ts +18 -0
  117. package/dist/middleware/requireStepUp.js +29 -0
  118. package/dist/middleware/scimAuth.d.ts +8 -0
  119. package/dist/middleware/scimAuth.js +29 -0
  120. package/dist/middleware/upload.d.ts +5 -0
  121. package/dist/middleware/upload.js +27 -0
  122. package/dist/middleware/webhookAuth.d.ts +30 -0
  123. package/dist/middleware/webhookAuth.js +58 -0
  124. package/dist/models/AuditLog.d.ts +30 -0
  125. package/dist/models/AuditLog.js +39 -0
  126. package/dist/models/AuthUser.d.ts +7 -0
  127. package/dist/models/AuthUser.js +7 -0
  128. package/dist/models/Group.d.ts +21 -0
  129. package/dist/models/Group.js +28 -0
  130. package/dist/models/GroupMembership.d.ts +21 -0
  131. package/dist/models/GroupMembership.js +25 -0
  132. package/dist/models/M2MClient.d.ts +18 -0
  133. package/dist/models/M2MClient.js +18 -0
  134. package/dist/routes/auth.d.ts +3 -2
  135. package/dist/routes/auth.js +238 -21
  136. package/dist/routes/groups.d.ts +21 -0
  137. package/dist/routes/groups.js +346 -0
  138. package/dist/routes/jobs.js +66 -46
  139. package/dist/routes/m2m.d.ts +2 -0
  140. package/dist/routes/m2m.js +72 -0
  141. package/dist/routes/metrics.d.ts +8 -0
  142. package/dist/routes/metrics.js +55 -0
  143. package/dist/routes/mfa.js +13 -1
  144. package/dist/routes/oauth.js +6 -0
  145. package/dist/routes/oidc.d.ts +2 -0
  146. package/dist/routes/oidc.js +29 -0
  147. package/dist/routes/passkey.d.ts +1 -0
  148. package/dist/routes/passkey.js +157 -0
  149. package/dist/routes/saml.d.ts +2 -0
  150. package/dist/routes/saml.js +86 -0
  151. package/dist/routes/scim.d.ts +2 -0
  152. package/dist/routes/scim.js +255 -0
  153. package/dist/routes/uploads.d.ts +14 -0
  154. package/dist/routes/uploads.js +227 -0
  155. package/dist/server.d.ts +26 -0
  156. package/dist/server.js +46 -3
  157. package/dist/services/auth.d.ts +2 -0
  158. package/dist/services/auth.js +101 -22
  159. package/dist/services/mfa.js +2 -2
  160. package/dist/ws/index.js +5 -1
  161. package/docs/sections/auth-flow/full.md +203 -47
  162. package/docs/sections/auth-flow/overview.md +2 -2
  163. package/docs/sections/auth-security-examples/full.md +388 -0
  164. package/docs/sections/authentication/full.md +130 -0
  165. package/docs/sections/authentication/overview.md +5 -0
  166. package/docs/sections/cli/full.md +13 -1
  167. package/docs/sections/configuration/full.md +17 -0
  168. package/docs/sections/configuration/overview.md +1 -0
  169. package/docs/sections/exports/full.md +34 -3
  170. package/docs/sections/logging/full.md +83 -0
  171. package/docs/sections/metrics/full.md +131 -0
  172. package/docs/sections/oauth/full.md +189 -189
  173. package/docs/sections/oauth/overview.md +1 -1
  174. package/docs/sections/pagination/full.md +93 -0
  175. package/docs/sections/passkey-login/full.md +90 -0
  176. package/docs/sections/passkey-login/overview.md +1 -0
  177. package/docs/sections/roles/full.md +224 -135
  178. package/docs/sections/roles/overview.md +3 -1
  179. package/docs/sections/signing/full.md +203 -0
  180. package/docs/sections/uploads/full.md +208 -0
  181. package/docs/sections/versioning/full.md +85 -0
  182. package/docs/sections/webhook-auth/full.md +100 -0
  183. package/docs/sections/websocket/full.md +95 -0
  184. package/docs/sections/websocket-rooms/full.md +6 -1
  185. package/package.json +18 -5
package/dist/app.d.ts CHANGED
@@ -1,10 +1,13 @@
1
1
  import { OpenAPIHono } from "@hono/zod-openapi";
2
2
  import type { MiddlewareHandler } from "hono";
3
- import type { AppEnv } from "./lib/context";
4
- import type { PrimaryField, EmailVerificationConfig, PasswordResetConfig, PasswordPolicyConfig, RefreshTokenConfig, MfaConfig, MfaEmailOtpConfig, MfaWebAuthnConfig } from "./lib/appConfig";
3
+ import type { AppEnv, ValidationErrorFormatter } from "./lib/context";
4
+ import type { RequestLogEntry, LogLevel } from "./middleware/requestLogger";
5
+ import type { PrimaryField, EmailVerificationConfig, PasswordResetConfig, PasswordPolicyConfig, RefreshTokenConfig, MfaConfig, MfaEmailOtpConfig, MfaWebAuthnConfig, SigningConfig, JwtConfig, BreachedPasswordConfig, StepUpConfig, M2MConfig, OidcConfig, SamlConfig, ScimConfig } from "./lib/appConfig";
6
+ import type { CaptchaConfig } from "./lib/captcha";
5
7
  import type { AuthAdapter } from "./lib/authAdapter";
6
8
  import type { OAuthProviderConfig } from "./lib/oauth";
7
9
  type StoreType = "redis" | "mongo" | "sqlite" | "memory";
10
+ export type { BreachedPasswordConfig } from "./lib/appConfig";
8
11
  export interface DbConfig {
9
12
  /**
10
13
  * Absolute path to the SQLite database file.
@@ -116,6 +119,22 @@ export interface AuthRateLimitConfig {
116
119
  * Use "redis" for multi-instance deployments so limits are shared across servers.
117
120
  */
118
121
  store?: "memory" | "redis";
122
+ /** Credential stuffing detection. Tracks distinct accounts per IP and IPs per account. */
123
+ credentialStuffing?: {
124
+ maxAccountsPerIp?: {
125
+ count: number;
126
+ windowMs: number;
127
+ };
128
+ maxIpsPerAccount?: {
129
+ count: number;
130
+ windowMs: number;
131
+ };
132
+ onDetected?: (signal: {
133
+ type: "ip" | "account";
134
+ key: string;
135
+ count: number;
136
+ }) => void;
137
+ };
119
138
  }
120
139
  export interface AuthConfig {
121
140
  /** Set false to skip mounting /auth/* routes. Defaults to true */
@@ -172,6 +191,49 @@ export interface AuthConfig {
172
191
  * OAuth logins skip MFA (the OAuth provider is treated as the second factor).
173
192
  */
174
193
  mfa?: MfaConfig;
194
+ /**
195
+ * JWT claims configuration. When set, `iss`, `aud`, and `iat` are included in all tokens.
196
+ * Tokens with a non-matching issuer or audience will fail verification.
197
+ *
198
+ * - **`iss`** (issuer) and **`aud`** (audience) are validated on every token verification when
199
+ * configured. A token issued for a different issuer or intended for a different audience is
200
+ * rejected outright.
201
+ * - **`iat`** (issued-at) is always included in tokens once this config is set. Use it to detect
202
+ * token reuse or implement absolute expiry windows independent of `exp`.
203
+ *
204
+ * Recommended for fintech and multi-service deployments where tokens from one service should
205
+ * never be accepted by another.
206
+ * Use `algorithm: "RS256"` to enable OIDC mode.
207
+ */
208
+ jwt?: JwtConfig;
209
+ /**
210
+ * When true, suspension status is checked on every authenticated request (via identify middleware).
211
+ * This adds one adapter call per request. Default: false.
212
+ * Suspension is always enforced at login time regardless of this setting.
213
+ */
214
+ checkSuspensionOnIdentify?: boolean;
215
+ /**
216
+ * Breached password detection using the HaveIBeenPwned k-Anonymity API.
217
+ * Checks passwords at registration and reset. No full hash leaves the server.
218
+ */
219
+ breachedPasswordCheck?: BreachedPasswordConfig;
220
+ /**
221
+ * Step-up MFA configuration. When set, the requireStepUp() middleware and
222
+ * POST /auth/step-up endpoint are available. Requires auth.mfa to be configured.
223
+ */
224
+ stepUp?: StepUpConfig;
225
+ /** M2M client credentials configuration. Enables POST /oauth/token with client_credentials grant. */
226
+ m2m?: M2MConfig;
227
+ /**
228
+ * OIDC discovery and RS256 JWT signing configuration.
229
+ * When set, mounts /.well-known/openid-configuration and /.well-known/jwks.json.
230
+ * Auto-generates an RSA-2048 key pair on startup if signingKey is not provided.
231
+ */
232
+ oidc?: OidcConfig;
233
+ /** SAML 2.0 SSO configuration. Enables /auth/saml/* routes. Requires samlify peer dependency. */
234
+ saml?: SamlConfig;
235
+ /** SCIM 2.0 user provisioning. Enables /scim/v2/* endpoints with its own bearer token. */
236
+ scim?: ScimConfig;
175
237
  }
176
238
  export interface AccountDeletionConfig {
177
239
  /** Called before deletion. Throw to abort (e.g., active subscription check). */
@@ -204,7 +266,8 @@ export interface AuthSessionPolicyConfig {
204
266
  */
205
267
  trackLastActive?: boolean;
206
268
  }
207
- export type { PrimaryField, EmailVerificationConfig, PasswordResetConfig, RefreshTokenConfig, MfaConfig, MfaEmailOtpConfig, MfaWebAuthnConfig };
269
+ export type { PrimaryField, EmailVerificationConfig, PasswordResetConfig, RefreshTokenConfig, MfaConfig, MfaEmailOtpConfig, MfaWebAuthnConfig, SigningConfig, JwtConfig, StepUpConfig, OidcConfig, SamlConfig, ScimConfig };
270
+ export type { CaptchaConfig, CaptchaProvider } from "./lib/captcha";
208
271
  export interface BotProtectionConfig {
209
272
  /**
210
273
  * List of IPv4 CIDRs (e.g. "198.51.100.0/24"), IPv4 addresses, or IPv6 addresses to block outright.
@@ -267,6 +330,16 @@ export interface SecurityConfig {
267
330
  * Only validates when the auth cookie is present on state-changing requests.
268
331
  */
269
332
  csrf?: CsrfConfig;
333
+ /**
334
+ * Unified HMAC signing for cookies, cursors, presigned URLs, request signing,
335
+ * idempotency key hashing, and session binding. All features are opt-in.
336
+ */
337
+ signing?: SigningConfig;
338
+ /**
339
+ * Global CAPTCHA configuration. When set, use requireCaptcha() middleware on specific routes,
340
+ * or enable adaptive mode to auto-require CAPTCHA after rate limit thresholds.
341
+ */
342
+ captcha?: CaptchaConfig;
270
343
  }
271
344
  export interface ModelSchemasConfig {
272
345
  /**
@@ -309,6 +382,12 @@ export interface JobsConfig {
309
382
  allowedQueues?: string[];
310
383
  /** When using userAuth, restrict job visibility to the user who created it. Default: false. */
311
384
  scopeToUser?: boolean;
385
+ /**
386
+ * Explicitly acknowledge that jobs endpoint is public in production.
387
+ * Set to true only when auth is "none" and you understand the risk.
388
+ * Without this, createApp throws in production when auth is "none".
389
+ */
390
+ unsafePublic?: boolean;
312
391
  }
313
392
  export interface TenantConfig {
314
393
  [key: string]: unknown;
@@ -331,6 +410,101 @@ export interface TenancyConfig {
331
410
  /** HTTP status when onResolve returns null. Default: 403. */
332
411
  rejectionStatus?: 403 | 404;
333
412
  }
413
+ export interface LoggingConfig {
414
+ /** Enable structured request logging. Default: true. When false, no logger is registered at all. */
415
+ enabled?: boolean;
416
+ /** Custom log handler. Default: `console.log(JSON.stringify(entry))`. */
417
+ onLog?: (entry: RequestLogEntry) => void | Promise<void>;
418
+ /** Minimum log level to emit. Entries below this level are dropped. */
419
+ level?: LogLevel;
420
+ /**
421
+ * Paths to exclude from logging. Strings use **prefix matching**.
422
+ * Default: `["/health", "/docs", "/openapi.json"]`.
423
+ */
424
+ excludePaths?: (string | RegExp)[];
425
+ /** HTTP methods to exclude from logging (e.g. `["OPTIONS"]`). */
426
+ excludeMethods?: string[];
427
+ }
428
+ export interface MetricsConfig {
429
+ /** Enable the /metrics endpoint. Default: false (must be explicitly enabled). */
430
+ enabled?: boolean;
431
+ /**
432
+ * Auth protection for the /metrics endpoint.
433
+ * - `"userAuth"` — requires authenticated user session.
434
+ * - `"none"` — no auth (default — logs a production warning).
435
+ * - `MiddlewareHandler[]` — custom middleware stack.
436
+ */
437
+ auth?: "userAuth" | "none" | MiddlewareHandler<AppEnv>[];
438
+ /** Paths to exclude from metrics collection. Strings use prefix matching. */
439
+ excludePaths?: (string | RegExp)[];
440
+ /** Custom path normalizer to prevent high-cardinality labels. */
441
+ normalizePath?: (path: string) => string;
442
+ /** BullMQ queue names to report depth gauges for. */
443
+ queues?: string[];
444
+ /**
445
+ * Explicitly acknowledge that metrics endpoint is public in production.
446
+ * Set to true only when auth is "none" and you understand the risk.
447
+ * Without this, createApp throws in production when auth is "none".
448
+ */
449
+ unsafePublic?: boolean;
450
+ }
451
+ export interface ValidationConfig {
452
+ /** Custom formatter for Zod validation errors. Receives issues + requestId, returns the JSON body. */
453
+ formatError?: ValidationErrorFormatter;
454
+ }
455
+ export interface VersioningConfig {
456
+ /**
457
+ * Version identifiers in ascending order, e.g. `["v1", "v2"]`.
458
+ * Each version needs a matching subdirectory under `routesDir` (e.g. `routes/v1/`).
459
+ */
460
+ versions: string[];
461
+ /**
462
+ * Subdirectory name for routes shared across all versions. Shared route schemas
463
+ * receive unprefixed names since they are version-agnostic. Default: `"shared"`.
464
+ * Set `false` to disable shared route discovery.
465
+ */
466
+ sharedDir?: string | false;
467
+ /**
468
+ * Which version `/docs` and `/openapi.json` redirect to.
469
+ * Defaults to the last version in the array (i.e. the latest).
470
+ */
471
+ defaultVersion?: string;
472
+ }
473
+ export interface PresignedUrlConfig {
474
+ expirySeconds?: number;
475
+ path?: string;
476
+ }
477
+ export interface UploadConfig {
478
+ storage: import("./lib/storageAdapter").StorageAdapter;
479
+ maxFileSize?: number;
480
+ maxFiles?: number;
481
+ allowedMimeTypes?: string[];
482
+ keyPrefix?: string;
483
+ generateKey?: (file: File, ctx: {
484
+ userId?: string;
485
+ tenantId?: string;
486
+ }) => string;
487
+ tenantScopedKeys?: boolean;
488
+ presignedUrls?: boolean | PresignedUrlConfig;
489
+ /**
490
+ * Authorization callback for upload read/delete operations.
491
+ * Called when registry ownership check fails or key is not in registry.
492
+ */
493
+ authorization?: {
494
+ authorize?: (input: {
495
+ action: "read" | "delete";
496
+ key: string;
497
+ userId?: string;
498
+ tenantId?: string;
499
+ }) => boolean | Promise<boolean>;
500
+ };
501
+ /**
502
+ * Allow operations on keys not in the upload registry.
503
+ * When false (default), operations on unknown keys return 404.
504
+ * When true, requires an authorize callback — denies if absent.
505
+ */
506
+ allowExternalKeys?: boolean;
507
+ }
334
508
  export interface CreateAppConfig {
335
509
  /** Absolute path to the service's routes directory (use import.meta.dir + "/routes") */
336
510
  routesDir: string;
@@ -355,5 +529,31 @@ export interface CreateAppConfig {
355
529
  jobs?: JobsConfig;
356
530
  /** Multi-tenancy configuration. When set, tenant middleware resolves tenant on each request. */
357
531
  tenancy?: TenancyConfig;
532
+ /**
533
+ * Groups feature configuration. When set, the groups lib is available.
534
+ * Set managementRoutes to mount built-in CRUD routes for groups and memberships.
535
+ */
536
+ groups?: import("./routes/groups").GroupsConfig;
537
+ /** Structured request logging configuration. Replaces Hono's built-in text logger. */
538
+ logging?: LoggingConfig;
539
+ /** Prometheus-compatible /metrics endpoint. Opt-in. */
540
+ metrics?: MetricsConfig;
541
+ /** Zod validation error formatting configuration. */
542
+ validation?: ValidationConfig;
543
+ /** File upload configuration. When set, registers storage adapter and upload settings. */
544
+ upload?: UploadConfig;
545
+ /**
546
+ * API versioning configuration. When set, routes are discovered per-version from
547
+ * subdirectories of `routesDir` (e.g. `routes/v1/`, `routes/v2/`). Each version
548
+ * gets its own OpenAPI spec at `/{version}/openapi.json` and Scalar docs at
549
+ * `/{version}/docs`. Root `/docs` becomes a version selector.
550
+ */
551
+ versioning?: VersioningConfig;
552
+ /**
553
+ * Security event streaming (SIEM integration). When set, auth and security events
554
+ * are emitted to the provided onEvent callback. Non-blocking — errors are swallowed.
555
+ * Use include/exclude to filter event types.
556
+ */
557
+ securityEvents?: import("./lib/securityEvents").SecurityEventConfig;
358
558
  }
359
559
  export declare const createApp: (config: CreateAppConfig) => Promise<OpenAPIHono<AppEnv>>;