@gettersethya/mira 0.1.0-alpha.10 → 0.1.0-alpha.13

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 (85) hide show
  1. package/README.md +132 -103
  2. package/dist/src/app/app.d.ts +7 -6
  3. package/dist/src/app/app.d.ts.map +1 -1
  4. package/dist/src/app/app.js +21 -3
  5. package/dist/src/app/app.js.map +1 -1
  6. package/dist/src/app/builder.d.ts +17 -7
  7. package/dist/src/app/builder.d.ts.map +1 -1
  8. package/dist/src/app/builder.js +11 -0
  9. package/dist/src/app/builder.js.map +1 -1
  10. package/dist/src/app/index.d.ts +1 -1
  11. package/dist/src/app/plugin.d.ts +22 -6
  12. package/dist/src/app/plugin.d.ts.map +1 -1
  13. package/dist/src/app/plugin.js.map +1 -1
  14. package/dist/src/config/config.d.ts.map +1 -1
  15. package/dist/src/config/config.js +2 -1
  16. package/dist/src/config/config.js.map +1 -1
  17. package/dist/src/config/types.d.ts +1 -0
  18. package/dist/src/config/types.d.ts.map +1 -1
  19. package/dist/src/cron/cron-service.d.ts +13 -0
  20. package/dist/src/cron/cron-service.d.ts.map +1 -0
  21. package/dist/src/cron/cron-service.js +126 -0
  22. package/dist/src/cron/cron-service.js.map +1 -0
  23. package/dist/src/cron/index.d.ts +4 -0
  24. package/dist/src/cron/index.d.ts.map +1 -0
  25. package/dist/src/cron/index.js +3 -0
  26. package/dist/src/cron/index.js.map +1 -0
  27. package/dist/src/cron/types.d.ts +51 -0
  28. package/dist/src/cron/types.d.ts.map +1 -0
  29. package/dist/src/cron/types.js +4 -0
  30. package/dist/src/cron/types.js.map +1 -0
  31. package/dist/src/hooks/hook-service.d.ts +7 -2
  32. package/dist/src/hooks/hook-service.d.ts.map +1 -1
  33. package/dist/src/hooks/hook-service.js +33 -1
  34. package/dist/src/hooks/hook-service.js.map +1 -1
  35. package/dist/src/hooks/index.d.ts +1 -1
  36. package/dist/src/hooks/index.d.ts.map +1 -1
  37. package/dist/src/hooks/types.d.ts +22 -0
  38. package/dist/src/hooks/types.d.ts.map +1 -1
  39. package/dist/src/http/router.d.ts +1 -1
  40. package/dist/src/http/router.d.ts.map +1 -1
  41. package/dist/src/http/router.js +9 -1
  42. package/dist/src/http/router.js.map +1 -1
  43. package/dist/src/http/telemetry-routes.d.ts.map +1 -1
  44. package/dist/src/http/telemetry-routes.js +7 -3
  45. package/dist/src/http/telemetry-routes.js.map +1 -1
  46. package/dist/src/index.d.ts +3 -1
  47. package/dist/src/index.d.ts.map +1 -1
  48. package/dist/src/index.js +3 -1
  49. package/dist/src/index.js.map +1 -1
  50. package/dist/src/migrator/dialect-sqlite.d.ts.map +1 -1
  51. package/dist/src/migrator/dialect-sqlite.js +7 -1
  52. package/dist/src/migrator/dialect-sqlite.js.map +1 -1
  53. package/dist/src/repository/id.d.ts +1 -1
  54. package/dist/src/repository/id.d.ts.map +1 -1
  55. package/dist/src/repository/id.js +15 -3
  56. package/dist/src/repository/id.js.map +1 -1
  57. package/dist/src/telemetry/index.d.ts +1 -1
  58. package/dist/src/telemetry/index.d.ts.map +1 -1
  59. package/dist/src/telemetry/index.js +1 -1
  60. package/dist/src/telemetry/index.js.map +1 -1
  61. package/dist/src/telemetry/sqlite-logger.d.ts +4 -0
  62. package/dist/src/telemetry/sqlite-logger.d.ts.map +1 -1
  63. package/dist/src/telemetry/sqlite-logger.js +15 -1
  64. package/dist/src/telemetry/sqlite-logger.js.map +1 -1
  65. package/dist/tests/app/app.test.js +1 -0
  66. package/dist/tests/app/app.test.js.map +1 -1
  67. package/dist/tests/cron/cron-integration.test.d.ts +2 -0
  68. package/dist/tests/cron/cron-integration.test.d.ts.map +1 -0
  69. package/dist/tests/cron/cron-integration.test.js +108 -0
  70. package/dist/tests/cron/cron-integration.test.js.map +1 -0
  71. package/dist/tests/cron/cron-service.test.d.ts +2 -0
  72. package/dist/tests/cron/cron-service.test.d.ts.map +1 -0
  73. package/dist/tests/cron/cron-service.test.js +122 -0
  74. package/dist/tests/cron/cron-service.test.js.map +1 -0
  75. package/dist/tests/hooks/hook-service.test.js +2 -1
  76. package/dist/tests/hooks/hook-service.test.js.map +1 -1
  77. package/dist/tests/http/file-serve.test.js +1 -0
  78. package/dist/tests/http/file-serve.test.js.map +1 -1
  79. package/dist/tests/http/file-token.test.js +1 -0
  80. package/dist/tests/http/file-token.test.js.map +1 -1
  81. package/dist/tests/http/router.test.js +1 -0
  82. package/dist/tests/http/router.test.js.map +1 -1
  83. package/dist/tests/telemetry/sqlite-logger.test.js +56 -2
  84. package/dist/tests/telemetry/sqlite-logger.test.js.map +1 -1
  85. package/package.json +2 -2
package/README.md CHANGED
@@ -1,103 +1,132 @@
1
- # @gettersethya/mira
2
-
3
- > **Early pre-alpha.** Breaking changes may occur without notice.
4
-
5
- Self-hosted backend in TypeScript using [Effect](https://effect.website). Define collections, get a full REST API with auth, file storage, access rules, and schema migrations — all with zero config.
6
-
7
- ## Installation
8
-
9
- ```bash
10
- npm install @gettersethya/mira @gettersethya/mira-collection effect
11
- # or
12
- pnpm add @gettersethya/mira @gettersethya/mira-collection effect
13
- ```
14
-
15
- ## Quick start
16
-
17
- ```typescript
18
- import { LocalFileStorage, Mira, NodePlatform, SqliteDatabase } from "@gettersethya/mira"
19
- import { Posts, Users } from "./collections.js"
20
-
21
- const app = Mira.builder()
22
- .platform(NodePlatform)
23
- .database(SqliteDatabase({ filename: "mira.db" }))
24
- .storage(LocalFileStorage({ directory: "./uploads" }))
25
- .collections([Users, Posts])
26
- .build()
27
-
28
- app.serve({ port: 3000 })
29
- ```
30
-
31
- The builder uses phantom types to enforce step ordering — TypeScript will not let you call `.build()` until all four steps are complete.
32
-
33
- On first boot, Mira auto-generates a `jwt_secret`, runs schema migrations, and creates SQL views for view collections. Everything is persisted in the database.
34
-
35
- ## Builder steps
36
-
37
- | Step | Required | Description |
38
- |---|---|---|
39
- | `.platform(p)` | Yes | Runtime environment (Node.js, etc.) |
40
- | `.database(d)` | Yes | Database backend |
41
- | `.storage(s)` | Yes | File storage backend |
42
- | `.collections(c)` | Yes | Collection definitions |
43
- | `.telemetry(layer)` | No | Custom Effect telemetry layer |
44
- | `.extend(layer)` | No | Inject additional layers before serving |
45
-
46
- ## Platforms
47
-
48
- ```typescript
49
- import { NodePlatform } from "@gettersethya/mira"
50
-
51
- // Provides: CryptoService, FileSystem, HttpServerFactory, AuthService
52
- ```
53
-
54
- ## Databases
55
-
56
- ```typescript
57
- import { SqliteDatabase } from "@gettersethya/mira"
58
-
59
- SqliteDatabase({ filename: "mira.db" })
60
- SqliteDatabase({ filename: ":memory:" }) // in-memory for tests
61
- ```
62
-
63
- ## Storage
64
-
65
- ```typescript
66
- import { LocalFileStorage } from "@gettersethya/mira"
67
-
68
- LocalFileStorage({ directory: "./uploads" })
69
- ```
70
-
71
- ## Auto-generated endpoints
72
-
73
- Each collection gets a full set of REST endpoints:
74
-
75
- | Method | Path | Description |
76
- |---|---|---|
77
- | `GET` | `/api/:collection` | List (filter, sort, cursor, expand, select) |
78
- | `GET` | `/api/:collection/:id` | Get one |
79
- | `POST` | `/api/:collection` | Create |
80
- | `PATCH` | `/api/:collection/:id` | Update |
81
- | `DELETE` | `/api/:collection/:id` | Delete |
82
- | `POST` | `/api/:collection/authWithPassword` | Login (auth collections only) |
83
- | `POST` | `/api/auth/logout` | Logout |
84
- | `POST` | `/api/files/token` | Request protected file token |
85
- | `GET` | `/api/files/:collection/:id/:filename` | Serve file |
86
-
87
- ## Testing with the service layer
88
-
89
- Use `.buildServiceLayer()` to get an Effect `Layer` for all services without starting an HTTP server:
90
-
91
- ```typescript
92
- import { Effect, Layer } from "effect"
93
-
94
- const serviceLayer = app.buildServiceLayer()
95
-
96
- const test = Effect.gen(function* () {
97
- // inject and use services directly
98
- }).pipe(Effect.provide(serviceLayer))
99
- ```
100
-
101
- ## More
102
-
103
- See the [Mira root README](https://github.com/gettersethya/mira) for collection definitions, field types, rules, filter DSL, and client usage.
1
+ # @gettersethya/mira
2
+
3
+ > **Early pre-alpha.** Breaking changes may occur without notice.
4
+
5
+ Self-hosted backend in TypeScript using [Effect](https://effect.website). Define collections, get a full REST API with auth, file storage, access rules, and schema migrations — all with zero config.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ npm install @gettersethya/mira @gettersethya/mira-collection effect
11
+ # or
12
+ pnpm add @gettersethya/mira @gettersethya/mira-collection effect
13
+ ```
14
+
15
+ ## Quick start
16
+
17
+ ```typescript
18
+ import { LocalFileStorage, Mira, NodePlatform, SqliteDatabase } from "@gettersethya/mira"
19
+ import { Posts, Users } from "./collections.js"
20
+
21
+ const app = Mira.builder()
22
+ .platform(NodePlatform)
23
+ .database(SqliteDatabase({ filename: "mira.db" }))
24
+ .storage(LocalFileStorage({ directory: "./uploads" }))
25
+ .collections([Users, Posts])
26
+ .build()
27
+
28
+ app.serve({ port: 3000 })
29
+ ```
30
+
31
+ The builder uses phantom types to enforce step ordering — TypeScript will not let you call `.build()` until all four steps are complete.
32
+
33
+ On first boot, Mira auto-generates a `jwt_secret`, runs schema migrations, and creates SQL views for view collections. Everything is persisted in the database.
34
+
35
+ ## Builder steps
36
+
37
+ | Step | Required | Description |
38
+ |---|---|---|
39
+ | `.platform(p)` | Yes | Runtime environment (Node.js, etc.) |
40
+ | `.database(d)` | Yes | Database backend |
41
+ | `.storage(s)` | Yes | File storage backend |
42
+ | `.collections(c)` | Yes | Collection definitions |
43
+ | `.crons(c)` | No | Array of `CronDef` — scheduled tasks using Effect `Schedule` |
44
+ | `.telemetry(layer)` | No | Custom Effect telemetry layer |
45
+ | `.extend(plugin)` | No | Register a `MiraPlugin` (lifecycle hooks, routes, crons, layers) |
46
+
47
+ ## Platforms
48
+
49
+ ```typescript
50
+ import { NodePlatform } from "@gettersethya/mira"
51
+
52
+ // Provides: CryptoService, FileSystem, HttpServerFactory, AuthService
53
+ ```
54
+
55
+ ## Databases
56
+
57
+ ```typescript
58
+ import { SqliteDatabase } from "@gettersethya/mira"
59
+
60
+ SqliteDatabase({ filename: "mira.db" })
61
+ SqliteDatabase({ filename: ":memory:" }) // in-memory for tests
62
+ ```
63
+
64
+ ## Storage
65
+
66
+ ```typescript
67
+ import { LocalFileStorage } from "@gettersethya/mira"
68
+
69
+ LocalFileStorage({ directory: "./uploads" })
70
+ ```
71
+
72
+ ## Auto-generated endpoints
73
+
74
+ Each collection gets a full set of REST endpoints:
75
+
76
+ | Method | Path | Description |
77
+ |---|---|---|
78
+ | `GET` | `/api/:collection` | List (filter, sort, cursor, expand, select) |
79
+ | `GET` | `/api/:collection/:id` | Get one |
80
+ | `POST` | `/api/:collection` | Create |
81
+ | `PATCH` | `/api/:collection/:id` | Update |
82
+ | `DELETE` | `/api/:collection/:id` | Delete |
83
+ | `POST` | `/api/:collection/authWithPassword` | Login (auth collections only) |
84
+ | `POST` | `/api/auth/logout` | Logout |
85
+ | `POST` | `/api/files/token` | Request protected file token |
86
+ | `GET` | `/api/files/:collection/:id/:filename` | Serve file |
87
+
88
+ ## Cron jobs
89
+
90
+ Register scheduled tasks via the `.crons()` builder step. Each cron uses an Effect `Schedule` to define its recurrence.
91
+
92
+ ```typescript
93
+ import { Schedule } from "effect"
94
+ import { CronService } from "@gettersethya/mira"
95
+
96
+ const app = Mira.builder()
97
+ .platform(NodePlatform)
98
+ .database(SqliteDatabase({ filename: "mira.db" }))
99
+ .storage(LocalFileStorage({ directory: "./uploads" }))
100
+ .collections([Users, Posts])
101
+ .crons([
102
+ {
103
+ name: "cleanup",
104
+ schedule: Schedule.fixed("1 hour"),
105
+ handler: () => Effect.log("[cron] cleaning up..."),
106
+ },
107
+ ])
108
+ .build()
109
+ .serve()
110
+ ```
111
+
112
+ Cron names must be globally unique. Use `CronService.getAll()` to inspect state and `CronService.runNow(name)` to trigger immediate execution. Plugins can declare crons via `crons` and hook into `onCronStart`/`onCronExecute`/`onCronSuccess`/`onCronError`/`onCronFinished`.
113
+
114
+ See the [Mira root README](https://github.com/gettersethya/mira#cron-jobs) for full cron documentation.
115
+
116
+ ## Testing with the service layer
117
+
118
+ Use `.buildServiceLayer()` to get an Effect `Layer` for all services without starting an HTTP server:
119
+
120
+ ```typescript
121
+ import { Effect, Layer } from "effect"
122
+
123
+ const serviceLayer = app.buildServiceLayer()
124
+
125
+ const test = Effect.gen(function* () {
126
+ // inject and use services directly
127
+ }).pipe(Effect.provide(serviceLayer))
128
+ ```
129
+
130
+ ## More
131
+
132
+ See the [Mira root README](https://github.com/gettersethya/mira) for collection definitions, field types, rules, filter DSL, and client usage.
@@ -6,6 +6,7 @@ import type { Repository } from "../repository/index.js";
6
6
  import type { CollectionService } from "../collection-service/collection-service.js";
7
7
  import type { MiraAppConfig } from "./builder.js";
8
8
  import type { MiraPlugin } from "./plugin.js";
9
+ import { CronService } from "../cron/cron-service.js";
9
10
  /**
10
11
  * The assembled Mira application, ready to serve.
11
12
  *
@@ -33,25 +34,25 @@ import type { MiraPlugin } from "./plugin.js";
33
34
  * @see MiraBuilder — builds MiraApp
34
35
  * @see Mira — entry point: Mira.builder()
35
36
  */
36
- export declare class MiraApp {
37
+ export declare class MiraApp<R = never> {
37
38
  #private;
38
39
  constructor(config: MiraAppConfig);
39
40
  /** @internal for tests only */
40
41
  _getConfig(): MiraAppConfig;
41
42
  /** @internal for tests only */
42
- _getExtras(): ReadonlyArray<MiraPlugin>;
43
+ _getExtras(): ReadonlyArray<MiraPlugin<any>>;
43
44
  /**
44
45
  * Add a plugin to the application. Plugins can register lifecycle hooks,
45
46
  * record-lifecycle hooks, custom routes, service layers, and additional
46
47
  * collection definitions.
47
48
  *
48
49
  * @param plugin - A MiraPlugin (use `fromLayer()` to wrap a plain Layer)
49
- * @returns this (for chaining)
50
+ * @returns this typed as MiraApp<R | R2> (for chaining)
50
51
  *
51
52
  * @example
52
53
  * app.extend(MiraDashboard).serve()
53
54
  */
54
- extend(plugin: MiraPlugin): this;
55
+ extend<R2 = never>(plugin: MiraPlugin<R2>): MiraApp<R | R2>;
55
56
  /**
56
57
  * Build the full service layer without the HTTP server.
57
58
  * Useful for testing — you can run Effects against the service layer without
@@ -68,7 +69,7 @@ export declare class MiraApp {
68
69
  * Effect.gen(function* () { ... }).pipe(Effect.provide(serviceLayer))
69
70
  * )
70
71
  */
71
- buildServiceLayer(): Layer.Layer<Migrator | import("../index.js").FileStorage | import("./types.js").PlatformServices | import("./types.js").DatabaseServices | Repository | CollectionService | import("../thumbnail/index.js").ThumbnailService | AppConfig, import("effect/ParseResult").ParseError | import("@effect/sql/SqlError").SqlError, CollectionService>;
72
+ buildServiceLayer(): Layer.Layer<Migrator | AppConfig | import("../index.js").FileStorage | import("./types.js").PlatformServices | import("./types.js").DatabaseServices | Repository | CollectionService | import("../thumbnail/index.js").ThumbnailService | CronService, import("effect/ParseResult").ParseError | import("@effect/sql/SqlError").SqlError, any>;
72
73
  /**
73
74
  * Build the complete server layer including the HTTP router and server.
74
75
  * Accepts an optional port override (otherwise uses the port from AppConfig).
@@ -80,7 +81,7 @@ export declare class MiraApp {
80
81
  */
81
82
  buildLayer(options?: {
82
83
  port?: number;
83
- }): Layer.Layer<Migrator | HttpServer.HttpServer | import("@effect/platform/HttpPlatform").HttpPlatform | import("@effect/platform/Etag").Generator | import("../index.js").FileStorage | import("./types.js").PlatformServices | import("./types.js").DatabaseServices | Repository | CollectionService | import("../thumbnail/index.js").ThumbnailService | AppConfig, import("effect/ParseResult").ParseError | import("@effect/sql/SqlError").SqlError | import("@effect/platform/HttpServerError").ServeError, CollectionService>;
84
+ }): Layer.Layer<Migrator | AppConfig | HttpServer.HttpServer | import("@effect/platform/HttpPlatform").HttpPlatform | import("@effect/platform/Etag").Generator | import("../index.js").FileStorage | import("./types.js").PlatformServices | import("./types.js").DatabaseServices | Repository | CollectionService | import("../thumbnail/index.js").ThumbnailService | CronService, import("effect/ParseResult").ParseError | import("@effect/sql/SqlError").SqlError | import("@effect/platform/HttpServerError").ServeError, any>;
84
85
  /**
85
86
  * Start the Mira HTTP server.
86
87
  * Sets up all services, runs auto-migration, runs plugin lifecycle hooks,
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/app/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,UAAU,EAAQ,MAAM,kBAAkB,CAAA;AAE3E,OAAO,EAAU,KAAK,EAAE,MAAM,QAAQ,CAAA;AAEtC,OAAO,EAAE,QAAQ,EAAgB,MAAM,wBAAwB,CAAA;AAM/D,OAAO,EAAE,SAAS,EAAiB,MAAM,mBAAmB,CAAA;AAG5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4CAA4C,CAAA;AAEnF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAK7C;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,OAAO;;gBAIN,MAAM,EAAE,aAAa;IAKjC,+BAA+B;IAC/B,UAAU,IAAI,aAAa;IAI3B,+BAA+B;IAC/B,UAAU,IAAI,aAAa,CAAC,UAAU,CAAC;IAIvC;;;;;;;;;;OAUG;IACH,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAgBhC;;;;;;;;;;;;;;;OAeG;IACH,iBAAiB;IAgDjB;;;;;;;;OAQG;IACH,UAAU,CAAC,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE;IAgCtC;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;CAczC"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/app/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,UAAU,EAAQ,MAAM,kBAAkB,CAAA;AAE3E,OAAO,EAAU,KAAK,EAAE,MAAM,QAAQ,CAAA;AAEtC,OAAO,EAAE,QAAQ,EAAgB,MAAM,wBAAwB,CAAA;AAM/D,OAAO,EAAE,SAAS,EAAiB,MAAM,mBAAmB,CAAA;AAG5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4CAA4C,CAAA;AAEnF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAK7C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAapD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,OAAO,CAAC,CAAC,GAAG,KAAK;;gBAIhB,MAAM,EAAE,aAAa;IAKjC,+BAA+B;IAC/B,UAAU,IAAI,aAAa;IAI3B,+BAA+B;IAC/B,UAAU,IAAI,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAI5C;;;;;;;;;;OAUG;IACH,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC;IAoB3D;;;;;;;;;;;;;;;OAeG;IACH,iBAAiB;IAsDjB;;;;;;;;OAQG;IACH,UAAU,CAAC,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE;IAuCtC;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;CAczC"}
@@ -11,6 +11,16 @@ import { HttpServerFactory } from "../http/server-factory.js";
11
11
  import { makeHookServiceLayer } from "../hooks/hook-service.js";
12
12
  import { makeHookCollectionServiceLayer } from "../hooks/hook-collection.js";
13
13
  import { HookService } from "../hooks/hook-service.js";
14
+ import { makeCronServiceLayer } from "../cron/cron-service.js";
15
+ function assertUniqueCronNames(defs) {
16
+ const seen = new Set();
17
+ for (const def of defs) {
18
+ if (seen.has(def.name)) {
19
+ throw new Error(`Duplicate cron name: "${def.name}". Cron names must be globally unique.`);
20
+ }
21
+ seen.add(def.name);
22
+ }
23
+ }
14
24
  /**
15
25
  * The assembled Mira application, ready to serve.
16
26
  *
@@ -59,7 +69,7 @@ export class MiraApp {
59
69
  * collection definitions.
60
70
  *
61
71
  * @param plugin - A MiraPlugin (use `fromLayer()` to wrap a plain Layer)
62
- * @returns this (for chaining)
72
+ * @returns this typed as MiraApp<R | R2> (for chaining)
63
73
  *
64
74
  * @example
65
75
  * app.extend(MiraDashboard).serve()
@@ -77,6 +87,9 @@ export class MiraApp {
77
87
  #getAllPlugins() {
78
88
  return this.#extras;
79
89
  }
90
+ #getAllCrons() {
91
+ return [...this.#config.crons, ...this.#extras.flatMap((p) => p.crons ?? [])];
92
+ }
80
93
  /**
81
94
  * Build the full service layer without the HTTP server.
82
95
  * Useful for testing — you can run Effects against the service layer without
@@ -97,6 +110,8 @@ export class MiraApp {
97
110
  const { platform, database, storage, telemetry } = this.#config;
98
111
  const allCollections = this.#getAllCollections();
99
112
  const allPlugins = this.#getAllPlugins();
113
+ const allCronDefs = this.#getAllCrons();
114
+ assertUniqueCronNames(allCronDefs);
100
115
  const pluginLayers = allPlugins.filter((p) => p.layer !== undefined).map((p) => p.layer);
101
116
  const extrasLayer = pluginLayers.length > 0 ? pluginLayers.reduce((acc, l) => Layer.merge(acc, l)) : Layer.empty;
102
117
  // Foundation: database + storage + thumbnail + telemetry, wired on platform
@@ -118,8 +133,11 @@ export class MiraApp {
118
133
  const hookServiceLayer = makeHookServiceLayer(allPlugins);
119
134
  // Hook collection service decorator: wraps cached collection service with hooks
120
135
  const hookCollectionLayer = makeHookCollectionServiceLayer().pipe(Layer.provide(Layer.mergeAll(cachedCollectionLayer, hookServiceLayer)));
121
- // Top: hook-wrapped collection service + all mid services + auto-migration side effect
122
- return hookCollectionLayer.pipe(Layer.provideMerge(Layer.merge(fullMid, autoMigrateLayer)));
136
+ // Full top layer: hook-wrapped collection service + all mid services + auto-migration side effect
137
+ const topLayer = hookCollectionLayer.pipe(Layer.provideMerge(Layer.merge(fullMid, autoMigrateLayer)));
138
+ // Cron service: scoped fibers die when server stops; provided with full service stack + hook service
139
+ const cronServiceLayer = makeCronServiceLayer(allCronDefs).pipe(Layer.provide(Layer.mergeAll(topLayer, hookServiceLayer)));
140
+ return Layer.merge(topLayer, cronServiceLayer);
123
141
  }
124
142
  /**
125
143
  * Build the complete server layer including the HTTP router and server.
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../../../src/app/app.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../../src/app/app.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import type { Layer } from "effect";
2
2
  import type { AnyCollectionDef } from "@gettersethya/mira-client";
3
+ import type { CronDef } from "../cron/types.js";
3
4
  import type { MiraPlatform, MiraDatabase, MiraStorage } from "./types.js";
4
5
  import { MiraApp } from "./app.js";
5
6
  /**
@@ -14,6 +15,7 @@ export interface MiraAppConfig {
14
15
  database: MiraDatabase;
15
16
  storage: MiraStorage;
16
17
  collections: ReadonlyArray<AnyCollectionDef>;
18
+ crons: ReadonlyArray<CronDef<any>>;
17
19
  telemetry: Layer.Layer<never, never, never>;
18
20
  }
19
21
  /**
@@ -43,7 +45,7 @@ export interface MiraAppConfig {
43
45
  * @see MiraApp — the assembled application
44
46
  * @see Mira.builder — entry point
45
47
  */
46
- export declare class MiraBuilder<Has extends string = never> {
48
+ export declare class MiraBuilder<Has extends string = never, R = never> {
47
49
  #private;
48
50
  constructor(config?: Partial<MiraAppConfig>);
49
51
  /** @internal for tests only */
@@ -56,7 +58,7 @@ export declare class MiraBuilder<Has extends string = never> {
56
58
  * @param p - A MiraPlatform preset (e.g., NodePlatform)
57
59
  * @returns A new builder with "platform" added to the phantom type
58
60
  */
59
- platform(p: MiraPlatform): MiraBuilder<Has | "platform">;
61
+ platform(p: MiraPlatform): MiraBuilder<Has | "platform", R>;
60
62
  /**
61
63
  * Set the database backend.
62
64
  * Required step. The database provides SqlClient and Dialect implementations.
@@ -64,7 +66,7 @@ export declare class MiraBuilder<Has extends string = never> {
64
66
  * @param d - A MiraDatabase preset (e.g., SqliteDatabase({ filename: "data.db" }))
65
67
  * @returns A new builder with "database" added to the phantom type
66
68
  */
67
- database(d: MiraDatabase): MiraBuilder<Has | "database">;
69
+ database(d: MiraDatabase): MiraBuilder<Has | "database", R>;
68
70
  /**
69
71
  * Set the file storage backend.
70
72
  * Required step. Storage provides FileStorage for file upload/download operations.
@@ -72,7 +74,7 @@ export declare class MiraBuilder<Has extends string = never> {
72
74
  * @param s - A MiraStorage preset (e.g., LocalFileStorage({ directory: "./uploads" }))
73
75
  * @returns A new builder with "storage" added to the phantom type
74
76
  */
75
- storage(s: MiraStorage): MiraBuilder<Has | "storage">;
77
+ storage(s: MiraStorage): MiraBuilder<Has | "storage", R>;
76
78
  /**
77
79
  * Set the collection definitions.
78
80
  * Required step. The collections define the schema, rules, and indexes for all entities.
@@ -81,7 +83,15 @@ export declare class MiraBuilder<Has extends string = never> {
81
83
  * or ViewCollection.define()
82
84
  * @returns A new builder with "collections" added to the phantom type
83
85
  */
84
- collections(c: ReadonlyArray<AnyCollectionDef>): MiraBuilder<Has | "collections">;
86
+ collections(c: ReadonlyArray<AnyCollectionDef>): MiraBuilder<Has | "collections", R>;
87
+ /**
88
+ * Set cron job definitions (optional).
89
+ * Crons are started as scoped fibers on boot and run on their schedule until the server stops.
90
+ *
91
+ * @param c - Array of CronDef objects with name, schedule, and handler
92
+ * @returns A new builder (same phantom type — crons is optional)
93
+ */
94
+ crons<R2>(c: ReadonlyArray<CronDef<R2>>): MiraBuilder<Has, R | R2>;
85
95
  /**
86
96
  * Set a custom telemetry layer (optional).
87
97
  * Defaults to `ConsoleTelemetryLayer` (prints JSON trace lines to stdout).
@@ -89,7 +99,7 @@ export declare class MiraBuilder<Has extends string = never> {
89
99
  * @param l - A Layer providing telemetry services
90
100
  * @returns A new builder with "telemetry" added to the phantom type
91
101
  */
92
- telemetry(l: Layer.Layer<never, never, never>): MiraBuilder<Has | "telemetry">;
102
+ telemetry(l: Layer.Layer<never, never, never>): MiraBuilder<Has | "telemetry", R>;
93
103
  /**
94
104
  * Build the MiraApp from the accumulated configuration.
95
105
  * Only compiles when all required steps (platform, database, storage, collections)
@@ -101,6 +111,6 @@ export declare class MiraBuilder<Has extends string = never> {
101
111
  * @throws If build() is called before all required steps are completed
102
112
  * (caught at compile time by the phantom type)
103
113
  */
104
- build(this: MiraBuilder<"platform" | "database" | "storage" | "collections">): MiraApp;
114
+ build(this: MiraBuilder<"platform" | "database" | "storage" | "collections", R>): MiraApp<R>;
105
115
  }
106
116
  //# sourceMappingURL=builder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../../src/app/builder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AACnC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAElC;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,YAAY,CAAA;IACtB,QAAQ,EAAE,YAAY,CAAA;IACtB,OAAO,EAAE,WAAW,CAAA;IACpB,WAAW,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAA;IAC5C,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;CAC5C;AAWD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,WAAW,CAAC,GAAG,SAAS,MAAM,GAAG,KAAK;;gBAGrC,MAAM,GAAE,OAAO,CAAC,aAAa,CAAM;IAI/C,+BAA+B;IAC/B,iBAAiB,IAAI,OAAO,CAAC,aAAa,CAAC;IAI3C;;;;;;;OAOG;IACH,QAAQ,CAAC,CAAC,EAAE,YAAY,GAAG,WAAW,CAAC,GAAG,GAAG,UAAU,CAAC;IAIxD;;;;;;OAMG;IACH,QAAQ,CAAC,CAAC,EAAE,YAAY,GAAG,WAAW,CAAC,GAAG,GAAG,UAAU,CAAC;IAIxD;;;;;;OAMG;IACH,OAAO,CAAC,CAAC,EAAE,WAAW,GAAG,WAAW,CAAC,GAAG,GAAG,SAAS,CAAC;IAIrD;;;;;;;OAOG;IACH,WAAW,CAAC,CAAC,EAAE,aAAa,CAAC,gBAAgB,CAAC,GAAG,WAAW,CAAC,GAAG,GAAG,aAAa,CAAC;IAIjF;;;;;;OAMG;IACH,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,WAAW,CAAC,GAAG,GAAG,WAAW,CAAC;IAI9E;;;;;;;;;;OAUG;IACH,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,aAAa,CAAC;CAa7E"}
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../../src/app/builder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AACnC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAElC;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,YAAY,CAAA;IACtB,QAAQ,EAAE,YAAY,CAAA;IACtB,OAAO,EAAE,WAAW,CAAA;IACpB,WAAW,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAA;IAC5C,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA;IAClC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;CAC5C;AAWD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,WAAW,CAAC,GAAG,SAAS,MAAM,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK;;gBAGhD,MAAM,GAAE,OAAO,CAAC,aAAa,CAAM;IAI/C,+BAA+B;IAC/B,iBAAiB,IAAI,OAAO,CAAC,aAAa,CAAC;IAK3C;;;;;;;OAOG;IACH,QAAQ,CAAC,CAAC,EAAE,YAAY,GAAG,WAAW,CAAC,GAAG,GAAG,UAAU,EAAE,CAAC,CAAC;IAI3D;;;;;;OAMG;IACH,QAAQ,CAAC,CAAC,EAAE,YAAY,GAAG,WAAW,CAAC,GAAG,GAAG,UAAU,EAAE,CAAC,CAAC;IAI3D;;;;;;OAMG;IACH,OAAO,CAAC,CAAC,EAAE,WAAW,GAAG,WAAW,CAAC,GAAG,GAAG,SAAS,EAAE,CAAC,CAAC;IAIxD;;;;;;;OAOG;IACH,WAAW,CAAC,CAAC,EAAE,aAAa,CAAC,gBAAgB,CAAC,GAAG,WAAW,CAAC,GAAG,GAAG,aAAa,EAAE,CAAC,CAAC;IAIpF;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,EAAE,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;IAIlE;;;;;;OAMG;IACH,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,WAAW,CAAC,GAAG,GAAG,WAAW,EAAE,CAAC,CAAC;IAIjF;;;;;;;;;;OAUG;IACH,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,aAAa,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAc7F"}
@@ -84,6 +84,16 @@ export class MiraBuilder {
84
84
  collections(c) {
85
85
  return new MiraBuilder({ ...this.#config, collections: c });
86
86
  }
87
+ /**
88
+ * Set cron job definitions (optional).
89
+ * Crons are started as scoped fibers on boot and run on their schedule until the server stops.
90
+ *
91
+ * @param c - Array of CronDef objects with name, schedule, and handler
92
+ * @returns A new builder (same phantom type — crons is optional)
93
+ */
94
+ crons(c) {
95
+ return new MiraBuilder({ ...this.#config, crons: c });
96
+ }
87
97
  /**
88
98
  * Set a custom telemetry layer (optional).
89
99
  * Defaults to `ConsoleTelemetryLayer` (prints JSON trace lines to stdout).
@@ -115,6 +125,7 @@ export class MiraBuilder {
115
125
  database: config.database,
116
126
  storage: config.storage,
117
127
  collections: config.collections,
128
+ crons: config.crons ?? [],
118
129
  telemetry: config.telemetry ?? ConsoleTelemetryLayer
119
130
  });
120
131
  }
@@ -1 +1 @@
1
- {"version":3,"file":"builder.js","sourceRoot":"","sources":["../../../src/app/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAI5D,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAiBlC,SAAS,eAAe,CAAC,MAA8B;IACrD,OAAO,CACL,MAAM,CAAC,QAAQ,KAAK,SAAS;QAC7B,MAAM,CAAC,QAAQ,KAAK,SAAS;QAC7B,MAAM,CAAC,OAAO,KAAK,SAAS;QAC5B,MAAM,CAAC,WAAW,KAAK,SAAS,CACjC,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,OAAO,WAAW;IACb,OAAO,CAAwB;IAExC,YAAY,SAAiC,EAAE;QAC7C,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;IACvB,CAAC;IAED,+BAA+B;IAC/B,iBAAiB;QACf,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED;;;;;;;OAOG;IACH,QAAQ,CAAC,CAAe;QACtB,OAAO,IAAI,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAA;IAC1D,CAAC;IAED;;;;;;OAMG;IACH,QAAQ,CAAC,CAAe;QACtB,OAAO,IAAI,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAA;IAC1D,CAAC;IAED;;;;;;OAMG;IACH,OAAO,CAAC,CAAc;QACpB,OAAO,IAAI,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAA;IACzD,CAAC;IAED;;;;;;;OAOG;IACH,WAAW,CAAC,CAAkC;QAC5C,OAAO,IAAI,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAA;IAC7D,CAAC;IAED;;;;;;OAMG;IACH,SAAS,CAAC,CAAmC;QAC3C,OAAO,IAAI,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAA;IAC3D,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAA;QACvC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;QACzD,CAAC;QACD,OAAO,IAAI,OAAO,CAAC;YACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,qBAAqB;SACrD,CAAC,CAAA;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../../../src/app/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAK5D,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAkBlC,SAAS,eAAe,CAAC,MAA8B;IACrD,OAAO,CACL,MAAM,CAAC,QAAQ,KAAK,SAAS;QAC7B,MAAM,CAAC,QAAQ,KAAK,SAAS;QAC7B,MAAM,CAAC,OAAO,KAAK,SAAS;QAC5B,MAAM,CAAC,WAAW,KAAK,SAAS,CACjC,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,OAAO,WAAW;IACb,OAAO,CAAwB;IAExC,YAAY,SAAiC,EAAE;QAC7C,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;IACvB,CAAC;IAED,+BAA+B;IAC/B,iBAAiB;QACf,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAGD;;;;;;;OAOG;IACH,QAAQ,CAAC,CAAe;QACtB,OAAO,IAAI,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAA;IAC1D,CAAC;IAED;;;;;;OAMG;IACH,QAAQ,CAAC,CAAe;QACtB,OAAO,IAAI,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAA;IAC1D,CAAC;IAED;;;;;;OAMG;IACH,OAAO,CAAC,CAAc;QACpB,OAAO,IAAI,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAA;IACzD,CAAC;IAED;;;;;;;OAOG;IACH,WAAW,CAAC,CAAkC;QAC5C,OAAO,IAAI,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAA;IAC7D,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAK,CAA6B;QACrC,OAAO,IAAI,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;IACvD,CAAC;IAED;;;;;;OAMG;IACH,SAAS,CAAC,CAAmC;QAC3C,OAAO,IAAI,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAA;IAC3D,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAA;QACvC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;QACzD,CAAC;QACD,OAAO,IAAI,OAAO,CAAI;YACpB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;YACzB,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,qBAAqB;SACrD,CAAC,CAAA;IACJ,CAAC;CACF"}
@@ -23,7 +23,7 @@
23
23
  */
24
24
  import { MiraBuilder } from "./builder.js";
25
25
  export declare const Mira: {
26
- builder: () => MiraBuilder<never>;
26
+ builder: () => MiraBuilder<never, never>;
27
27
  };
28
28
  export type { MiraPlatform, MiraDatabase, MiraStorage, PlatformServices } from "./types.js";
29
29
  export type { MiraApp } from "./app.js";
@@ -6,8 +6,10 @@ import type { Repository } from "../repository/index.js";
6
6
  import type { AppConfig } from "../config/index.js";
7
7
  import type { AuthService } from "../http/auth.js";
8
8
  import type { CollectionService } from "../collection-service/collection-service.js";
9
+ import type { CronService } from "../cron/cron-service.js";
10
+ import type { CronDef } from "../cron/types.js";
9
11
  import type { PlatformServices } from "./types.js";
10
- import type { RecordHookContext, RecordResultContext, ListHookContext, ListResultContext, ViewHookContext, ViewResultContext, HookErrorContext } from "../hooks/types.js";
12
+ import type { RecordHookContext, RecordResultContext, ListHookContext, ListResultContext, ViewHookContext, ViewResultContext, HookErrorContext, CronContext, CronResultContext, CronErrorContext, CronFinishedContext } from "../hooks/types.js";
11
13
  export interface RecordHook<T> {
12
14
  readonly collections?: ReadonlyArray<string>;
13
15
  readonly handler: (ctx: T) => Effect.Effect<T, never, never>;
@@ -24,9 +26,17 @@ export interface ListSuccessHook<T> {
24
26
  readonly collections?: ReadonlyArray<string>;
25
27
  readonly handler: (ctx: T) => Effect.Effect<void, never, never>;
26
28
  }
29
+ export interface CronHook<T> {
30
+ readonly crons?: ReadonlyArray<string>;
31
+ readonly handler: (ctx: T) => Effect.Effect<T, never, never>;
32
+ }
33
+ export interface CronObserverHook<T> {
34
+ readonly crons?: ReadonlyArray<string>;
35
+ readonly handler: (ctx: T) => Effect.Effect<void, never, never>;
36
+ }
27
37
  export declare const onCollection: <T>(collections: ReadonlyArray<string>, handler: (ctx: T) => Effect.Effect<T, never, never>) => RecordHook<T>;
28
38
  export declare const onCollectionSuccess: <T>(collections: ReadonlyArray<string>, handler: (ctx: T) => Effect.Effect<void, never, never>) => RecordSuccessHook<T>;
29
- export interface MiraPlugin {
39
+ export interface MiraPlugin<R = never> {
30
40
  readonly onBootstrap?: () => Effect.Effect<void, never, AppConfig | CollectionService>;
31
41
  readonly onServe?: () => Effect.Effect<void, never, never>;
32
42
  readonly onTerminate?: () => Effect.Effect<void, never, never>;
@@ -48,13 +58,19 @@ export interface MiraPlugin {
48
58
  readonly onRecordView?: ListHook<ViewHookContext>;
49
59
  readonly onRecordViewSuccess?: ListSuccessHook<ViewResultContext>;
50
60
  readonly onRecordViewError?: ListSuccessHook<HookErrorContext>;
61
+ readonly crons?: ReadonlyArray<CronDef<R>>;
62
+ readonly onCronStart?: CronHook<CronContext>;
63
+ readonly onCronExecute?: CronHook<CronContext>;
64
+ readonly onCronFinished?: CronObserverHook<CronFinishedContext>;
65
+ readonly onCronSuccess?: CronObserverHook<CronResultContext>;
66
+ readonly onCronError?: CronObserverHook<CronErrorContext>;
51
67
  readonly layer?: Layer.Layer<never, never, PlatformServices | AppConfig | Repository | CollectionService>;
52
- readonly routes?: HttpRouter.HttpRouter<never, FileSystem.FileSystem | Path.Path | Repository | AppConfig | AuthService | SqlClient.SqlClient | CollectionService>;
68
+ readonly routes?: HttpRouter.HttpRouter<never, FileSystem.FileSystem | Path.Path | Repository | AppConfig | AuthService | SqlClient.SqlClient | CollectionService | CronService>;
53
69
  readonly collections?: ReadonlyArray<AnyCollectionDef>;
54
70
  }
55
71
  export declare const MiraPlugin: {
56
- define: (opts: MiraPlugin) => MiraPlugin;
57
- fromLayer: (layer: Layer.Layer<never, never, never>) => MiraPlugin;
58
- isMiraPlugin: (ext: unknown) => ext is MiraPlugin;
72
+ define: <R = never>(opts: MiraPlugin<R>) => MiraPlugin<R>;
73
+ fromLayer: (layer: Layer.Layer<never, never, never>) => MiraPlugin<never>;
74
+ isMiraPlugin: (ext: unknown) => ext is MiraPlugin<any>;
59
75
  };
60
76
  //# sourceMappingURL=plugin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/app/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4CAA4C,CAAA;AACnF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,kBAAkB,CAAA;AAEzB,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IAC5C,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;CAC7D;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,QAAQ,CAAC,WAAW,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IAC5C,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;CAChE;AAED,MAAM,WAAW,QAAQ,CAAC,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IAC5C,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;CAC7D;AAED,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IAC5C,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;CAChE;AAED,eAAO,MAAM,YAAY,GAAI,CAAC,EAC5B,aAAa,aAAa,CAAC,MAAM,CAAC,EAClC,SAAS,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAClD,UAAU,CAAC,CAAC,CAA+B,CAAA;AAE9C,eAAO,MAAM,mBAAmB,GAAI,CAAC,EACnC,aAAa,aAAa,CAAC,MAAM,CAAC,EAClC,SAAS,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KACrD,iBAAiB,CAAC,CAAC,CAA+B,CAAA;AAErD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,GAAG,iBAAiB,CAAC,CAAA;IACtF,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;IAC1D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;IAE9D,QAAQ,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAA;IACvD,QAAQ,CAAC,qBAAqB,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAA;IAC9D,QAAQ,CAAC,qBAAqB,CAAC,EAAE,iBAAiB,CAAC,mBAAmB,CAAC,CAAA;IACvE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,iBAAiB,CAAC,gBAAgB,CAAC,CAAA;IAElE,QAAQ,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAA;IACvD,QAAQ,CAAC,qBAAqB,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAA;IAC9D,QAAQ,CAAC,qBAAqB,CAAC,EAAE,iBAAiB,CAAC,mBAAmB,CAAC,CAAA;IACvE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,iBAAiB,CAAC,gBAAgB,CAAC,CAAA;IAElE,QAAQ,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAA;IACvD,QAAQ,CAAC,qBAAqB,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAA;IAC9D,QAAQ,CAAC,qBAAqB,CAAC,EAAE,iBAAiB,CAAC,mBAAmB,CAAC,CAAA;IACvE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,iBAAiB,CAAC,gBAAgB,CAAC,CAAA;IAElE,QAAQ,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAA;IACjD,QAAQ,CAAC,mBAAmB,CAAC,EAAE,eAAe,CAAC,iBAAiB,CAAC,CAAA;IACjE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,eAAe,CAAC,gBAAgB,CAAC,CAAA;IAE9D,QAAQ,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAA;IACjD,QAAQ,CAAC,mBAAmB,CAAC,EAAE,eAAe,CAAC,iBAAiB,CAAC,CAAA;IACjE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,eAAe,CAAC,gBAAgB,CAAC,CAAA;IAE9D,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,gBAAgB,GAAG,SAAS,GAAG,UAAU,GAAG,iBAAiB,CAAC,CAAA;IACzG,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,UAAU,CACrC,KAAK,EACL,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC,SAAS,GAAG,iBAAiB,CACnH,CAAA;IACD,QAAQ,CAAC,WAAW,CAAC,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAA;CACvD;AAMD,eAAO,MAAM,UAAU;mBACN,UAAU,KAAG,UAAU;uBAKnB,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAG,UAAU;wBAK5C,OAAO,KAAG,GAAG,IAAI,UAAU;CAKhD,CAAA"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/app/plugin.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/app/plugin.ts"],"names":[],"mappings":"AAuCA,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,WAAkC,EAClC,OAAmD,EACpC,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAA;AAE9C,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,WAAkC,EAClC,OAAsD,EAChC,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAA;AA0CrD,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,MAAM,EAAE,CAAC,IAAgB,EAAc,EAAE;QACvC,MAAM,QAAQ,GAAuB,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,IAAI,EAAE,CAAA;QACpE,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,SAAS,EAAE,CAAC,KAAuC,EAAc,EAAE;QACjE,MAAM,QAAQ,GAAuB,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAA;QAClE,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,YAAY,EAAE,CAAC,GAAY,EAAqB,EAAE;QAChD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;YAAE,OAAO,KAAK,CAAA;QACzD,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC;YAAE,OAAO,KAAK,CAAA;QAClC,OAAO,GAAG,CAAC,IAAI,KAAK,YAAY,CAAA;IAClC,CAAC;CACF,CAAA"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/app/plugin.ts"],"names":[],"mappings":"AAuDA,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,WAAkC,EAClC,OAAmD,EACpC,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAA;AAE9C,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,WAAkC,EAClC,OAAsD,EAChC,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAA;AAwDrD,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,MAAM,EAAE,CAAY,IAAmB,EAAiB,EAAE;QACxD,MAAM,QAAQ,GAA0B,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,IAAI,EAAE,CAAA;QACvE,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,SAAS,EAAE,CAAC,KAAuC,EAAqB,EAAE;QACxE,MAAM,QAAQ,GAA8B,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAA;QACzE,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,YAAY,EAAE,CAAC,GAAY,EAA0B,EAAE;QACrD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;YAAE,OAAO,KAAK,CAAA;QACzD,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC;YAAE,OAAO,KAAK,CAAA;QAClC,OAAO,GAAG,CAAC,IAAI,KAAK,YAAY,CAAA;IAClC,CAAC;CACF,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/config/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAa,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,OAAO,EAAU,KAAK,EAA4B,MAAM,QAAQ,CAAA;AACzE,OAAO,KAAK,EAAE,cAAc,EAAY,MAAM,YAAY,CAAA;;AAO1D;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,SAAU,SAAQ,cAAqD;CAAG;AAEvF;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,gJA8DzB,CAAA"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/config/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAa,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,OAAO,EAAU,KAAK,EAA4B,MAAM,QAAQ,CAAA;AACzE,OAAO,KAAK,EAAE,cAAc,EAAY,MAAM,YAAY,CAAA;;AAO1D;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,SAAU,SAAQ,cAAqD;CAAG;AAEvF;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,gJAgEzB,CAAA"}
@@ -84,6 +84,7 @@ export const AppConfigLive = Layer.effect(AppConfig, Effect.gen(function* () {
84
84
  secret: Redacted.make(yield* require("s3_secret"))
85
85
  })
86
86
  : Option.none();
87
- return { appName, port, applicationUrl, jwtSecret, useS3, s3Config };
87
+ const logRetentionDays = Number(yield* seed("log_retention_days", "30"));
88
+ return { appName, port, applicationUrl, jwtSecret, useS3, s3Config, logRetentionDays };
88
89
  }));
89
90
  //# sourceMappingURL=config.js.map