@isaijs/core 0.1.5 → 0.1.8

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 (30) hide show
  1. package/dist/adapters/storage/r2/index.d.ts +3 -0
  2. package/dist/adapters/storage/r2/index.js +13 -2
  3. package/dist/auth/index.d.ts +2 -2
  4. package/dist/auth/index.js +2 -2
  5. package/dist/cli/index.js +79 -11
  6. package/dist/client/index.d.ts +4 -0
  7. package/dist/client/index.js +18 -13
  8. package/dist/{create-auth-BHdX68Ng.js → create-auth-BCvMwlVD.js} +18 -10
  9. package/dist/{data-layer-C5oJZ8V1.js → data-layer-CVCFjPyv.js} +15 -10
  10. package/dist/{data-layer-43pme0Gy.d.ts → data-layer-nvm_ivGQ.d.ts} +6 -2
  11. package/dist/db/index.d.ts +2 -2
  12. package/dist/db/index.js +5 -5
  13. package/dist/{index-D0FEnMhn.d.ts → index-Bb9Px6SR.d.ts} +116 -22
  14. package/dist/{index-CYcklQ1l.d.ts → index-CaR3hb0i.d.ts} +5 -1
  15. package/dist/index.d.ts +2 -2
  16. package/dist/index.js +169 -79
  17. package/dist/{make-ByA-84h8.js → make-jMJABOWI.js} +21 -3
  18. package/dist/{makers-P9kg68C8.js → makers-A0Pj6Tda.js} +3 -3
  19. package/dist/{migrator-B25prc9n.js → migrator-DxTpns_-.js} +174 -30
  20. package/dist/{model-Dc3HunKb.js → model-6pJBqqGd.js} +31 -1
  21. package/dist/{policies-KsqmlX67.js → policies-C_oiSgmY.js} +1 -1
  22. package/dist/{resource-BQK7bkPQ.js → resource-BIMAiOre.js} +8 -6
  23. package/dist/{tables-DgSwge7s.js → tables-DjW96Ubl.js} +1 -1
  24. package/dist/testing/index.d.ts +1 -1
  25. package/dist/testing/index.js +4 -4
  26. package/dist/{types-BgOkJy5d.d.ts → types-D5SIVeej.d.ts} +59 -2
  27. package/dist/validation/index.d.ts +2 -2
  28. package/dist/validation/index.js +1 -1
  29. package/dist/{validation-Cppmd0RV.js → validation-C3MCRBQO.js} +26 -3
  30. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
- import { a as DatabaseDriver, b as TenantDatabases, d as RateLimiter, g as Storage, l as PdfRenderer, n as Body, p as Runtime, r as Cache, s as MailDriver, u as Queue } from "./index-Ce5p2-EB.js";
2
- import { C as ObjectShape, Y as StoredFile, w as Output } from "./index-CYcklQ1l.js";
3
- import { $ as Expr, C as WithIncludes, D as PageOptions, E as Page, J as Models, Q as Embed, S as Key, T as NumberedPageOptions, V as AnyModel, X as Condition, Z as Conditional, b as RowOf, ct as ColumnNode, gt as FieldSpec, i as Row, lt as ConditionNode, n as Patch, p as Database, t as Insert, u as Seed, ut as Operand, v as OrderKey, w as NumberedPage, x as IncludePath } from "./types-BgOkJy5d.js";
4
- import { a as PROVIDERS, i as HELD, k as Manifest } from "./data-layer-43pme0Gy.js";
1
+ import { a as DatabaseDriver, b as TenantDatabases, d as RateLimiter, f as Row, g as Storage, l as PdfRenderer, n as Body, p as Runtime, r as Cache, s as MailDriver, u as Queue } from "./index-Ce5p2-EB.js";
2
+ import { C as ObjectShape, Y as StoredFile, w as Output } from "./index-CaR3hb0i.js";
3
+ import { $ as Expr, C as WithIncludes, D as PageOptions, E as Page, J as Models, O as Write, Q as Embed, S as Key, T as NumberedPageOptions, V as AnyModel, X as Condition, Z as Conditional, b as RowOf, ct as ColumnNode, gt as FieldSpec, i as Row$1, lt as ConditionNode, n as Patch, p as Database, t as Insert, u as Seed, ut as Operand, v as OrderKey, w as NumberedPage, x as IncludePath } from "./types-D5SIVeej.js";
4
+ import { a as PROVIDERS, i as HELD, k as Manifest } from "./data-layer-nvm_ivGQ.js";
5
5
  //#region src/api/fail.d.ts
6
6
  /**
7
7
  * `fail(code, message)`: the app's own business rules, for what can't be a `.check()`, a flow or a
@@ -33,10 +33,10 @@ interface BuiltinUser {
33
33
  }
34
34
  type UserRow = Models extends {
35
35
  readonly User: infer U extends AnyModel;
36
- } ? Row<U> : BuiltinUser;
36
+ } ? Row$1<U> : BuiltinUser;
37
37
  type TenantRow$1 = Models extends {
38
38
  readonly Tenant: infer T extends AnyModel;
39
- } ? Row<T> : {
39
+ } ? Row$1<T> : {
40
40
  readonly id: string;
41
41
  readonly name: string;
42
42
  };
@@ -133,12 +133,12 @@ type Simplify<T> = { [K in keyof T]: T[K]; } & {};
133
133
  type OwnedInsert<M extends AnyModel> = Simplify<Omit<Insert<M>, OwnerKeys<M>> & Partial<Pick<Insert<M>, OwnerKeys<M> & keyof Insert<M>>>>;
134
134
  /** The route context's `db`. Transactions, upserts and raw SQL are for services (`app.db`). */
135
135
  interface RouteDatabase {
136
- findOne<M extends AnyModel>(model: M, key: Key<M>): CheckedOne<M, Row<M>>;
137
- findMany<M extends AnyModel>(model: M): CheckedQuery<M, Row<M>>;
138
- createOne<M extends AnyModel>(model: M, input: OwnedInsert<M>): Ends<Row<M>>;
139
- createMany<M extends AnyModel>(model: M, inputs: readonly OwnedInsert<M>[]): Ends<Row<M>[]>;
140
- updateOne<M extends AnyModel>(model: M, key: Key<M>, patch: Patch<M>): CheckedMaybe<Row<M>>;
141
- deleteOne<M extends AnyModel>(model: M, key: Key<M>): CheckedMaybe<Row<M>>;
136
+ findOne<M extends AnyModel>(model: M, key: Key<M>): CheckedOne<M, Row$1<M>>;
137
+ findMany<M extends AnyModel>(model: M): CheckedQuery<M, Row$1<M>>;
138
+ createOne<M extends AnyModel>(model: M, input: OwnedInsert<M>): Ends<Row$1<M>>;
139
+ createMany<M extends AnyModel>(model: M, inputs: readonly OwnedInsert<M>[]): Ends<Row$1<M>[]>;
140
+ updateOne<M extends AnyModel>(model: M, key: Key<M>, patch: Patch<M>): CheckedMaybe<Row$1<M>>;
141
+ deleteOne<M extends AnyModel>(model: M, key: Key<M>): CheckedMaybe<Row$1<M>>;
142
142
  updateMany<M extends AnyModel>(model: M, patch: Patch<M>): CheckedMany<M>;
143
143
  deleteMany<M extends AnyModel>(model: M): CheckedMany<M>;
144
144
  }
@@ -153,7 +153,7 @@ type Method = "GET" | "POST" | "PUT" | "PATCH" | "DELETE";
153
153
  */
154
154
  type User = Models extends {
155
155
  readonly User: infer U extends AnyModel;
156
- } ? Row<U> : {
156
+ } ? Row$1<U> : {
157
157
  readonly id: string;
158
158
  };
159
159
  /**
@@ -162,7 +162,7 @@ type User = Models extends {
162
162
  */
163
163
  type PlatformUser = Models extends {
164
164
  readonly PlatformUser: infer U extends AnyModel;
165
- } ? Row<U> : {
165
+ } ? Row$1<U> : {
166
166
  readonly id: string;
167
167
  };
168
168
  type ParamNames<P extends string> = P extends `${string}:${infer Name}/${infer Rest}` ? Name | ParamNames<`/${Rest}`> : P extends `${string}:${infer Name}` ? Name : never;
@@ -178,14 +178,28 @@ interface RouteOptions<S extends ObjectShape = ObjectShape, A extends boolean =
178
178
  * the platform's, `user` a platform user.
179
179
  */
180
180
  readonly platform?: Pl;
181
+ /**
182
+ * Runs before each upload to this route's file inputs is stored, once its size and type are
183
+ * known: throw (`fail`) to refuse it. `pending` is the bytes of every upload not yet attached, so
184
+ * a cap counts them: `upload: async (_, { size, pending }) => { if (used() + pending + size > cap) fail(…) }`.
185
+ */
186
+ readonly upload?: UploadCheck<A, Pl>;
187
+ }
188
+ /** An upload about to be stored: its route input's key, bytes, media type, and the bytes pending. */
189
+ interface UploadInfo {
190
+ readonly field: string;
191
+ readonly size: number;
192
+ readonly type: string;
193
+ readonly pending: number;
181
194
  }
195
+ type UploadCheck<A extends boolean = boolean, Pl extends boolean = boolean> = (context: RouteContext<string, Record<never, never>, A, Pl>, upload: UploadInfo) => unknown;
182
196
  /**
183
197
  * The current tenant's row, with tenancy: the app's `Tenant` (its own columns too) once it's in the
184
198
  * `Models` registry; `undefined` in a single-tenant app.
185
199
  */
186
200
  type TenantRow = Models extends {
187
201
  readonly Tenant: infer T extends AnyModel;
188
- } ? Row<T> : undefined;
202
+ } ? Row$1<T> : undefined;
189
203
  interface RouteContext<P extends string, S extends ObjectShape, A extends boolean, Pl extends boolean = false> {
190
204
  /**
191
205
  * The app's database at the boundary: each query ends in `.allowed(action)` (the model's policy
@@ -219,6 +233,8 @@ declare class Route<O = unknown> {
219
233
  readonly handler: (context: RouteContext<string, ObjectShape, boolean>) => unknown;
220
234
  /** Served on the platform's host instead of a tenant's. */
221
235
  readonly platform: boolean;
236
+ /** Checks each upload to its file inputs before it's stored (`upload` in its options). */
237
+ readonly upload?: UploadCheck | undefined;
222
238
  /** Type only: what the handler returns. */
223
239
  readonly "~output": O;
224
240
  constructor(method: Method, path: string,
@@ -228,7 +244,9 @@ declare class Route<O = unknown> {
228
244
  */
229
245
  input: ObjectShape | "own", anonymous: boolean, handler: (context: RouteContext<string, ObjectShape, boolean>) => unknown,
230
246
  /** Served on the platform's host instead of a tenant's. */
231
- platform?: boolean);
247
+ platform?: boolean,
248
+ /** Checks each upload to its file inputs before it's stored (`upload` in its options). */
249
+ upload?: UploadCheck | undefined);
232
250
  }
233
251
  /** A route that takes no input. */
234
252
  type NoInput = Record<never, never>;
@@ -285,6 +303,16 @@ interface TenancyConfig {
285
303
  type Named<T> = {
286
304
  readonly default: T;
287
305
  } & Readonly<Record<string, T>>;
306
+ /** Where a committed write happened, for `onWrite`. */
307
+ interface WriteContext {
308
+ /** The database's name (`tenant`, `platform`, or the one database's). */
309
+ readonly database: string;
310
+ /**
311
+ * The tenant whose request or service made it (isolated tenancy). None on the platform's
312
+ * database, nor for what a tenant's database writes as it wakes (the roles from `app.ts`).
313
+ */
314
+ readonly tenant?: Row;
315
+ }
288
316
  /** The application layer: what `app.ts` returns from `createApp`'s configure callback. */
289
317
  interface AppConfig {
290
318
  /**
@@ -314,6 +342,14 @@ interface AppConfig {
314
342
  readonly language: string;
315
343
  readonly timezone: string;
316
344
  };
345
+ /**
346
+ * Called after every committed write on any of the app's databases, with what it created,
347
+ * changed and deleted (an `atomic`'s writes in one call): for what has to follow a change outside
348
+ * the database, such as purging a cache of pages built from it. Rows the database changes
349
+ * itself (cascade deletes, counts) aren't listed, nor are migrations' writes. It runs before the
350
+ * write returns; a failure is logged and never fails the write, which is already committed.
351
+ */
352
+ readonly onWrite?: (writes: readonly Write[], context: WriteContext) => void | Promise<void>;
317
353
  readonly api?: {
318
354
  /**
319
355
  * Anonymous writes (POST, PUT, PATCH, DELETE with no session) are counted per client IP:
@@ -430,6 +466,13 @@ interface AppFiles {
430
466
  }): Promise<string>;
431
467
  /** Removes the file (and its sizes) from its storage. */
432
468
  delete(file: StoredFile): Promise<void>;
469
+ /**
470
+ * Removes the uploads no write attached before their expiry, from storage and the `Upload` table,
471
+ * in the current database (the tenant's, inside one). Run it from a schedule.
472
+ */
473
+ sweep(): Promise<{
474
+ readonly removed: number;
475
+ }>;
433
476
  }
434
477
  //#endregion
435
478
  //#region src/tenancy/services.d.ts
@@ -437,6 +480,40 @@ interface AppFiles {
437
480
  type AppServices = () => readonly Promise<object>[];
438
481
  type Service = (...args: any[]) => unknown;
439
482
  //#endregion
483
+ //#region src/tasks/schedule.d.ts
484
+ /**
485
+ * Schedules: work the app runs on the clock, each a named export of an app module listed in `apps`
486
+ * (`apps/<name>/tasks.ts`), found like routes.
487
+ *
488
+ * export const nightly = schedule({ daily: "03:00" }, async ({ now }) => { … })
489
+ * export const hourly = schedule({ hourly: true }, async () => { … })
490
+ *
491
+ * Times are in the app's timezone (`fallbackLocale.timezone`, else UTC), on the hour. The runtime
492
+ * calls `app.tick(now)` from one hourly timer (on `workers`, the cron line `"0 * * * *"` in
493
+ * `wrangler.jsonc`), and each tick runs the schedules due in that hour. A tick that's missed is
494
+ * skipped, never caught up, so a schedule's work is safe to leave to the next time it runs.
495
+ *
496
+ * A schedule runs outside any tenant: with isolated tenancy it reaches a tenant through
497
+ * `app.tenant(id).run(service)`, and the platform through `app.platform.db`.
498
+ */
499
+ /** When a schedule runs: every hour, or once a day at a whole hour (`"03:00"`). */
500
+ type When = {
501
+ readonly hourly: true;
502
+ } | {
503
+ readonly daily: `${number}:00`;
504
+ };
505
+ interface ScheduleContext {
506
+ /** The tick's time: the hour it's for. */
507
+ readonly now: Date;
508
+ }
509
+ declare class Schedule {
510
+ readonly when: When;
511
+ readonly run: (context: ScheduleContext) => unknown;
512
+ constructor(when: When, run: (context: ScheduleContext) => unknown);
513
+ }
514
+ /** `schedule(when, run)` in `#app`. */
515
+ declare function schedule(when: When, run: (context: ScheduleContext) => unknown): Schedule;
516
+ //#endregion
440
517
  //#region src/app/create-app.d.ts
441
518
  /**
442
519
  * The app instance services import from `#app`. It's usable at module scope; what it
@@ -468,7 +545,7 @@ interface App {
468
545
  }
469
546
  interface AppOptions {
470
547
  /**
471
- * Every `apps/<name>/routes.ts` and `resources.ts`, each as a lazy import, like Django's
548
+ * Every `apps/<name>/routes.ts`, `resources.ts` and `tasks.ts`, each as a lazy import, like Django's
472
549
  * INSTALLED_APPS. Lazy, because those modules import `#app` themselves.
473
550
  */
474
551
  readonly apps?: AppModules;
@@ -502,6 +579,8 @@ interface CreatedApp<Served, TenantHost = undefined> {
502
579
  /** `resource(Model, options)`: what the API exposes over a model. */
503
580
  readonly resource: typeof resource;
504
581
  readonly fail: typeof fail;
582
+ /** `schedule({ daily: "03:00" }, run)`: work on the clock, exported from an app module. */
583
+ readonly schedule: typeof schedule;
505
584
  }
506
585
  /**
507
586
  * `configure` runs once, the first time the runtime starts the core with an env.
@@ -553,6 +632,11 @@ interface InviteInput {
553
632
  /** `"platform"`: the tenant's people can't take the role away. */
554
633
  readonly held?: (typeof HELD)[number];
555
634
  }
635
+ /** What `auth.revoke` takes: an email, and the key of a role from `app.ts`. */
636
+ interface RevokeInput {
637
+ readonly email: string;
638
+ readonly role: string;
639
+ }
556
640
  //#endregion
557
641
  //#region src/auth/create-auth.d.ts
558
642
  type Provider = (typeof PROVIDERS)[number];
@@ -600,6 +684,11 @@ interface AuthConfig {
600
684
  /** Every permission key: every policy's actions, and `auth.perms`. */
601
685
  permissionKeys(): readonly string[];
602
686
  }
687
+ /** `auth.invite` and `auth.revoke`, on the app's current database: the core's to attach. */
688
+ interface AuthPeople {
689
+ invite(input: InviteInput): Promise<void>;
690
+ revoke(input: RevokeInput): Promise<void>;
691
+ }
603
692
  declare class Auth<Env = unknown> {
604
693
  private readonly define;
605
694
  readonly perms: {
@@ -612,8 +701,8 @@ declare class Auth<Env = unknown> {
612
701
  };
613
702
  /** The policies made with this instance's `policy()`. */
614
703
  readonly policies: PolicyRegistry;
615
- /** Set by the app's core when it starts: `invite` on its current database. */
616
- private invites;
704
+ /** Set by the app's core when it starts: `invite` and `revoke` on its current database. */
705
+ private people;
617
706
  constructor(define: (env: Env) => AuthDefinition);
618
707
  /**
619
708
  * Gives `email` a role from `app.ts`, from code (a tenant's setup service, a seed): now, if it has
@@ -621,8 +710,13 @@ declare class Auth<Env = unknown> {
621
710
  * `held: "platform"` puts the assignment beyond the tenant's reach.
622
711
  */
623
712
  invite(input: InviteInput): Promise<void>;
624
- /** The core's: where `invite` writes. */
625
- attach(invites: (input: InviteInput) => Promise<void>): void;
713
+ /**
714
+ * Takes a role from `email`, from code (replacing a tenant's owner): its invite to the role is
715
+ * deleted, and the role taken away if it has an account in the current database. Safe to repeat.
716
+ */
717
+ revoke(input: RevokeInput): Promise<void>;
718
+ /** The core's: where `invite` and `revoke` write. */
719
+ attach(people: AuthPeople): void;
626
720
  /** The config, for this env. Checked here for itself; against the databases by the core. */
627
721
  resolve(env: Env): AuthConfig;
628
722
  }
@@ -648,4 +742,4 @@ interface CreatedAuth<Env> {
648
742
  /** The auth instance, from `auth.ts`, with `policy()` and the placeholders policies are written with. */
649
743
  declare function createAuth<Env = unknown>(define: (env: Env) => AuthDefinition): CreatedAuth<Env>;
650
744
  //#endregion
651
- export { Permissions as A, Params as C, RouteHandler as D, RouteContext as E, Policy as F, Rules as I, StandardAction as L, Bound as M, DefinePolicy as N, RouteOptions as O, Perms as P, Rejected as R, Method as S, RouteBuilder as T, CustomAction as _, OAuthMethod as a, AppConfig as b, Roles as c, NotImplementedError as d, AppModules as f, createApp as g, CreatedApp as h, Methods as i, AnyPolicy as j, User as k, SignInMethod as l, AppOptions as m, AuthConfig as n, Provider as o, App as p, AuthDefinition as r, RoleDefinition as s, Auth as t, createAuth as u, Resource as v, Route as w, Named as x, ResourceOptions as y, fail as z };
745
+ export { RouteContext as A, Rules as B, AppConfig as C, Params as D, Method as E, AnyPolicy as F, Rejected as H, Bound as I, DefinePolicy as L, RouteOptions as M, User as N, Route as O, Permissions as P, Perms as R, ResourceOptions as S, WriteContext as T, fail as U, StandardAction as V, Schedule as _, OAuthMethod as a, CustomAction as b, Roles as c, NotImplementedError as d, AppModules as f, createApp as g, CreatedApp as h, Methods as i, RouteHandler as j, RouteBuilder as k, SignInMethod as l, AppOptions as m, AuthConfig as n, Provider as o, App as p, AuthDefinition as r, RoleDefinition as s, Auth as t, createAuth as u, ScheduleContext as v, Named as w, Resource as x, When as y, Policy as z };
@@ -222,6 +222,8 @@ declare function file(options?: FileOptions & {
222
222
  declare function image(options?: FileOptions & {
223
223
  readonly types?: readonly ImageType[];
224
224
  }): Kind<StoredFile>;
225
+ /** A PDF or an image to print or read whole (never resized), up to 100 MB. */
226
+ declare function document(options?: FileOptions): Kind<StoredFile>;
225
227
  /** Up to 10 files. */
226
228
  declare const files: (options?: FileOptions & {
227
229
  readonly types?: readonly FileType[];
@@ -230,6 +232,8 @@ declare const files: (options?: FileOptions & {
230
232
  declare const images: (options?: FileOptions & {
231
233
  readonly types?: readonly ImageType[];
232
234
  }) => Kind<StoredFile[], StoredFile[], false, false>;
235
+ /** Up to 100 documents (PDFs and images, each up to 100 MB). */
236
+ declare const documents: (options?: FileOptions) => Kind<StoredFile[], StoredFile[], false, false>;
233
237
  //#endregion
234
238
  //#region src/validation/kinds/phone.d.ts
235
239
  /**
@@ -382,4 +386,4 @@ declare const email: () => Kind<string, string, false, false>;
382
386
  /** An http(s) URL, up to 2,048 characters. */
383
387
  declare const url: () => Kind<string, string, false, false>;
384
388
  //#endregion
385
- export { images as $, validate as A, money as B, ObjectShape as C, object as D, list as E, datetime as F, FileType as G, sequence as H, fakeUlid as I, SIZES_MAX as J, ImageSize as K, flag as L, IdInput as M, choice as N, serialize as O, date as P, image as Q, id as R, LIST_MAX as S, Shape as T, phone as U, quantity as V, phoneKind as W, file as X, StoredFile as Y, files as Z, define as _, newToken as a, KindSpec as at, CarriesKind as b, slug as c, Sensitivity as ct, text as d, StandardIssue as dt, Fake as et, textKind as f, StandardProps as ft, KindDefinition as g, Definable as h, markdown as i, Kind as it, CalendarDate as j, toKind as k, slugify as l, TypeText as lt, url as m, StandardSchemaV1 as mt, host as n, AnyKind as nt, personName as o, KindTypes as ot, token as p, StandardResult as pt, ImageType as q, line as r, FileSpec as rt, secret as s, Measure as st, email as t, FakeContext as tt, subdomain as u, kind as ut, json as v, Output as w, Input as x, urls as y, int as z };
389
+ export { files as $, validate as A, money as B, ObjectShape as C, object as D, list as E, datetime as F, FileType as G, sequence as H, fakeUlid as I, SIZES_MAX as J, ImageSize as K, flag as L, IdInput as M, choice as N, serialize as O, date as P, file as Q, id as R, LIST_MAX as S, Shape as T, phone as U, quantity as V, phoneKind as W, document as X, StoredFile as Y, documents as Z, define as _, newToken as a, FileSpec as at, CarriesKind as b, slug as c, KindTypes as ct, text as d, TypeText as dt, image as et, textKind as f, kind as ft, KindDefinition as g, StandardSchemaV1 as gt, Definable as h, StandardResult as ht, markdown as i, AnyKind as it, CalendarDate as j, toKind as k, slugify as l, Measure as lt, url as m, StandardProps as mt, host as n, Fake as nt, personName as o, Kind as ot, token as p, StandardIssue as pt, ImageType as q, line as r, FakeContext as rt, secret as s, KindSpec as st, email as t, images as tt, subdomain as u, Sensitivity as ut, json as v, Output as w, Input as x, urls as y, int as z };
package/dist/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  import { p as Runtime, t as AppCore } from "./index-Ce5p2-EB.js";
2
- import { C as Params, D as RouteHandler, E as RouteContext, O as RouteOptions, R as Rejected, S as Method, T as RouteBuilder, _ as CustomAction, b as AppConfig, d as NotImplementedError, f as AppModules, g as createApp, h as CreatedApp, k as User, m as AppOptions, p as App, v as Resource, w as Route, x as Named, y as ResourceOptions, z as fail } from "./index-D0FEnMhn.js";
3
- export { type App, type AppConfig, type AppCore, type AppModules, type AppOptions, type CreatedApp, type CustomAction, type Method, type Named, NotImplementedError, type Params, Rejected, type Resource, type ResourceOptions, Route, type RouteBuilder, type RouteContext, type RouteHandler, type RouteOptions, type Runtime, type User, createApp, fail };
2
+ import { A as RouteContext, C as AppConfig, D as Params, E as Method, H as Rejected, M as RouteOptions, N as User, O as Route, S as ResourceOptions, T as WriteContext, U as fail, _ as Schedule, b as CustomAction, d as NotImplementedError, f as AppModules, g as createApp, h as CreatedApp, j as RouteHandler, k as RouteBuilder, m as AppOptions, p as App, v as ScheduleContext, w as Named, x as Resource, y as When } from "./index-Bb9Px6SR.js";
3
+ export { type App, type AppConfig, type AppCore, type AppModules, type AppOptions, type CreatedApp, type CustomAction, type Method, type Named, NotImplementedError, type Params, Rejected, type Resource, type ResourceOptions, Route, type RouteBuilder, type RouteContext, type RouteHandler, type RouteOptions, type Runtime, Schedule, type ScheduleContext, type User, type When, type WriteContext, createApp, fail };