@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.
- package/README.md +132 -103
- package/dist/src/app/app.d.ts +7 -6
- package/dist/src/app/app.d.ts.map +1 -1
- package/dist/src/app/app.js +21 -3
- package/dist/src/app/app.js.map +1 -1
- package/dist/src/app/builder.d.ts +17 -7
- package/dist/src/app/builder.d.ts.map +1 -1
- package/dist/src/app/builder.js +11 -0
- package/dist/src/app/builder.js.map +1 -1
- package/dist/src/app/index.d.ts +1 -1
- package/dist/src/app/plugin.d.ts +22 -6
- package/dist/src/app/plugin.d.ts.map +1 -1
- package/dist/src/app/plugin.js.map +1 -1
- package/dist/src/config/config.d.ts.map +1 -1
- package/dist/src/config/config.js +2 -1
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/types.d.ts +1 -0
- package/dist/src/config/types.d.ts.map +1 -1
- package/dist/src/cron/cron-service.d.ts +13 -0
- package/dist/src/cron/cron-service.d.ts.map +1 -0
- package/dist/src/cron/cron-service.js +126 -0
- package/dist/src/cron/cron-service.js.map +1 -0
- package/dist/src/cron/index.d.ts +4 -0
- package/dist/src/cron/index.d.ts.map +1 -0
- package/dist/src/cron/index.js +3 -0
- package/dist/src/cron/index.js.map +1 -0
- package/dist/src/cron/types.d.ts +51 -0
- package/dist/src/cron/types.d.ts.map +1 -0
- package/dist/src/cron/types.js +4 -0
- package/dist/src/cron/types.js.map +1 -0
- package/dist/src/hooks/hook-service.d.ts +7 -2
- package/dist/src/hooks/hook-service.d.ts.map +1 -1
- package/dist/src/hooks/hook-service.js +33 -1
- package/dist/src/hooks/hook-service.js.map +1 -1
- package/dist/src/hooks/index.d.ts +1 -1
- package/dist/src/hooks/index.d.ts.map +1 -1
- package/dist/src/hooks/types.d.ts +22 -0
- package/dist/src/hooks/types.d.ts.map +1 -1
- package/dist/src/http/router.d.ts +1 -1
- package/dist/src/http/router.d.ts.map +1 -1
- package/dist/src/http/router.js +9 -1
- package/dist/src/http/router.js.map +1 -1
- package/dist/src/http/telemetry-routes.d.ts.map +1 -1
- package/dist/src/http/telemetry-routes.js +7 -3
- package/dist/src/http/telemetry-routes.js.map +1 -1
- package/dist/src/index.d.ts +3 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/migrator/dialect-sqlite.d.ts.map +1 -1
- package/dist/src/migrator/dialect-sqlite.js +7 -1
- package/dist/src/migrator/dialect-sqlite.js.map +1 -1
- package/dist/src/repository/id.d.ts +1 -1
- package/dist/src/repository/id.d.ts.map +1 -1
- package/dist/src/repository/id.js +15 -3
- package/dist/src/repository/id.js.map +1 -1
- package/dist/src/telemetry/index.d.ts +1 -1
- package/dist/src/telemetry/index.d.ts.map +1 -1
- package/dist/src/telemetry/index.js +1 -1
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/sqlite-logger.d.ts +4 -0
- package/dist/src/telemetry/sqlite-logger.d.ts.map +1 -1
- package/dist/src/telemetry/sqlite-logger.js +15 -1
- package/dist/src/telemetry/sqlite-logger.js.map +1 -1
- package/dist/tests/app/app.test.js +1 -0
- package/dist/tests/app/app.test.js.map +1 -1
- package/dist/tests/cron/cron-integration.test.d.ts +2 -0
- package/dist/tests/cron/cron-integration.test.d.ts.map +1 -0
- package/dist/tests/cron/cron-integration.test.js +108 -0
- package/dist/tests/cron/cron-integration.test.js.map +1 -0
- package/dist/tests/cron/cron-service.test.d.ts +2 -0
- package/dist/tests/cron/cron-service.test.d.ts.map +1 -0
- package/dist/tests/cron/cron-service.test.js +122 -0
- package/dist/tests/cron/cron-service.test.js.map +1 -0
- package/dist/tests/hooks/hook-service.test.js +2 -1
- package/dist/tests/hooks/hook-service.test.js.map +1 -1
- package/dist/tests/http/file-serve.test.js +1 -0
- package/dist/tests/http/file-serve.test.js.map +1 -1
- package/dist/tests/http/file-token.test.js +1 -0
- package/dist/tests/http/file-token.test.js.map +1 -1
- package/dist/tests/http/router.test.js +1 -0
- package/dist/tests/http/router.test.js.map +1 -1
- package/dist/tests/telemetry/sqlite-logger.test.js +56 -2
- package/dist/tests/telemetry/sqlite-logger.test.js.map +1 -1
- 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
|
-
| `.
|
|
44
|
-
| `.
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
SqliteDatabase({ filename: "
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
| `GET` | `/api/:collection
|
|
79
|
-
| `
|
|
80
|
-
| `
|
|
81
|
-
| `
|
|
82
|
-
| `
|
|
83
|
-
| `POST` | `/api/
|
|
84
|
-
| `POST` | `/api/
|
|
85
|
-
| `
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
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.
|
package/dist/src/app/app.d.ts
CHANGED
|
@@ -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):
|
|
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 |
|
|
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 |
|
|
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;;
|
|
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"}
|
package/dist/src/app/app.js
CHANGED
|
@@ -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
|
-
//
|
|
122
|
-
|
|
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.
|
package/dist/src/app/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../../src/app/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,UAAU,EAAE,UAAU,EAAQ,MAAM,kBAAkB,CAAA;AAE3E,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAC3D,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAE/D,OAAO,EAAE,gCAAgC,EAAE,MAAM,kBAAkB,CAAA;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAA;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AAChE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAE5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAM5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAC9D,OAAO,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAA;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;
|
|
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;;
|
|
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"}
|
package/dist/src/app/builder.js
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/src/app/index.d.ts
CHANGED
|
@@ -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";
|
package/dist/src/app/plugin.d.ts
CHANGED
|
@@ -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;
|
|
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":"
|
|
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,
|
|
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
|
-
|
|
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
|