@beignet/core 0.0.1 → 0.0.3
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/CHANGELOG.md +27 -0
- package/README.md +202 -8
- package/dist/application/index.d.ts +93 -9
- package/dist/application/index.d.ts.map +1 -1
- package/dist/application/index.js +11 -11
- package/dist/application/index.js.map +1 -1
- package/dist/client/client.d.ts +73 -12
- package/dist/client/client.d.ts.map +1 -1
- package/dist/client/client.js +37 -12
- package/dist/client/client.js.map +1 -1
- package/dist/client/index.d.ts +12 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +6 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/types.d.ts +69 -8
- package/dist/client/types.d.ts.map +1 -1
- package/dist/config/index.d.ts +84 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +36 -0
- package/dist/config/index.js.map +1 -1
- package/dist/contracts/contract-builder.d.ts +49 -22
- package/dist/contracts/contract-builder.d.ts.map +1 -1
- package/dist/contracts/contract-builder.js +48 -21
- package/dist/contracts/contract-builder.js.map +1 -1
- package/dist/contracts/contract-group.d.ts +35 -19
- package/dist/contracts/contract-group.d.ts.map +1 -1
- package/dist/contracts/contract-group.js +35 -19
- package/dist/contracts/contract-group.js.map +1 -1
- package/dist/contracts/contract-like.d.ts +4 -4
- package/dist/contracts/contract-like.d.ts.map +1 -1
- package/dist/contracts/contract-like.js +2 -1
- package/dist/contracts/contract-like.js.map +1 -1
- package/dist/contracts/index.d.ts +28 -0
- package/dist/contracts/index.d.ts.map +1 -1
- package/dist/contracts/index.js +12 -0
- package/dist/contracts/index.js.map +1 -1
- package/dist/contracts/openapi-meta.d.ts +8 -8
- package/dist/contracts/openapi-meta.d.ts.map +1 -1
- package/dist/contracts/path-template.d.ts +27 -0
- package/dist/contracts/path-template.d.ts.map +1 -1
- package/dist/contracts/path-template.js +6 -0
- package/dist/contracts/path-template.js.map +1 -1
- package/dist/contracts/types.d.ts +104 -10
- package/dist/contracts/types.d.ts.map +1 -1
- package/dist/contracts/types.js +15 -0
- package/dist/contracts/types.js.map +1 -1
- package/dist/contracts/utils.d.ts +6 -0
- package/dist/contracts/utils.d.ts.map +1 -1
- package/dist/contracts/utils.js +6 -0
- package/dist/contracts/utils.js.map +1 -1
- package/dist/domain/entity.d.ts +22 -11
- package/dist/domain/entity.d.ts.map +1 -1
- package/dist/domain/entity.js +5 -1
- package/dist/domain/entity.js.map +1 -1
- package/dist/domain/events.d.ts +5 -2
- package/dist/domain/events.d.ts.map +1 -1
- package/dist/domain/events.js +4 -1
- package/dist/domain/events.js.map +1 -1
- package/dist/domain/value-object.d.ts +19 -9
- package/dist/domain/value-object.d.ts.map +1 -1
- package/dist/domain/value-object.js +5 -1
- package/dist/domain/value-object.js.map +1 -1
- package/dist/errors/catalog.d.ts +40 -16
- package/dist/errors/catalog.d.ts.map +1 -1
- package/dist/errors/catalog.js +18 -7
- package/dist/errors/catalog.js.map +1 -1
- package/dist/errors/response.d.ts +16 -4
- package/dist/errors/response.d.ts.map +1 -1
- package/dist/errors/response.js +3 -3
- package/dist/errors/response.js.map +1 -1
- package/dist/errors/validation.d.ts +10 -1
- package/dist/errors/validation.d.ts.map +1 -1
- package/dist/errors/validation.js +3 -0
- package/dist/errors/validation.js.map +1 -1
- package/dist/events/index.d.ts +133 -0
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +30 -0
- package/dist/events/index.js.map +1 -1
- package/dist/idempotency/index.d.ts +355 -0
- package/dist/idempotency/index.d.ts.map +1 -0
- package/dist/idempotency/index.js +360 -0
- package/dist/idempotency/index.js.map +1 -0
- package/dist/jobs/index.d.ts +248 -4
- package/dist/jobs/index.d.ts.map +1 -1
- package/dist/jobs/index.js +183 -1
- package/dist/jobs/index.js.map +1 -1
- package/dist/mail/index.d.ts +149 -0
- package/dist/mail/index.d.ts.map +1 -1
- package/dist/mail/index.js +30 -0
- package/dist/mail/index.js.map +1 -1
- package/dist/notifications/index.d.ts +369 -0
- package/dist/notifications/index.d.ts.map +1 -0
- package/dist/notifications/index.js +310 -0
- package/dist/notifications/index.js.map +1 -0
- package/dist/openapi/index.d.ts +132 -16
- package/dist/openapi/index.d.ts.map +1 -1
- package/dist/openapi/index.js +1 -1
- package/dist/openapi/index.js.map +1 -1
- package/dist/outbox/index.d.ts +474 -0
- package/dist/outbox/index.d.ts.map +1 -0
- package/dist/outbox/index.js +538 -0
- package/dist/outbox/index.js.map +1 -0
- package/dist/pagination/index.d.ts +166 -0
- package/dist/pagination/index.d.ts.map +1 -0
- package/dist/pagination/index.js +96 -0
- package/dist/pagination/index.js.map +1 -0
- package/dist/ports/audit.d.ts +271 -0
- package/dist/ports/audit.d.ts.map +1 -1
- package/dist/ports/audit.js +128 -0
- package/dist/ports/audit.js.map +1 -1
- package/dist/ports/auth.d.ts +70 -0
- package/dist/ports/auth.d.ts.map +1 -1
- package/dist/ports/auth.js +30 -0
- package/dist/ports/auth.js.map +1 -1
- package/dist/ports/cache.d.ts +41 -0
- package/dist/ports/cache.d.ts.map +1 -1
- package/dist/ports/cache.js +10 -0
- package/dist/ports/cache.js.map +1 -1
- package/dist/ports/clock.d.ts +38 -0
- package/dist/ports/clock.d.ts.map +1 -1
- package/dist/ports/clock.js +20 -0
- package/dist/ports/clock.js.map +1 -1
- package/dist/ports/id-generator.d.ts +37 -0
- package/dist/ports/id-generator.d.ts.map +1 -1
- package/dist/ports/id-generator.js +22 -0
- package/dist/ports/id-generator.js.map +1 -1
- package/dist/ports/index.d.ts +83 -0
- package/dist/ports/index.d.ts.map +1 -1
- package/dist/ports/index.js +41 -5
- package/dist/ports/index.js.map +1 -1
- package/dist/ports/logger.d.ts +56 -0
- package/dist/ports/logger.d.ts.map +1 -1
- package/dist/ports/logger.js +17 -0
- package/dist/ports/logger.js.map +1 -1
- package/dist/ports/policy.d.ts +132 -0
- package/dist/ports/policy.d.ts.map +1 -1
- package/dist/ports/policy.js +45 -0
- package/dist/ports/policy.js.map +1 -1
- package/dist/ports/rate-limit.d.ts +25 -0
- package/dist/ports/rate-limit.d.ts.map +1 -1
- package/dist/ports/rate-limit.js +10 -0
- package/dist/ports/rate-limit.js.map +1 -1
- package/dist/ports/redaction.d.ts +101 -0
- package/dist/ports/redaction.d.ts.map +1 -1
- package/dist/ports/redaction.js +59 -0
- package/dist/ports/redaction.js.map +1 -1
- package/dist/ports/storage.d.ts +100 -0
- package/dist/ports/storage.d.ts.map +1 -1
- package/dist/ports/storage.js +10 -0
- package/dist/ports/storage.js.map +1 -1
- package/dist/ports/testing.d.ts +47 -0
- package/dist/ports/testing.d.ts.map +1 -1
- package/dist/ports/testing.js +23 -0
- package/dist/ports/testing.js.map +1 -1
- package/dist/ports/unit-of-work.d.ts +60 -3
- package/dist/ports/unit-of-work.d.ts.map +1 -1
- package/dist/ports/unit-of-work.js +11 -2
- package/dist/ports/unit-of-work.js.map +1 -1
- package/dist/providers/instrumentation.d.ts +205 -1
- package/dist/providers/instrumentation.d.ts.map +1 -1
- package/dist/providers/instrumentation.js +14 -0
- package/dist/providers/instrumentation.js.map +1 -1
- package/dist/providers/provider.d.ts +14 -1
- package/dist/providers/provider.d.ts.map +1 -1
- package/dist/providers/provider.js.map +1 -1
- package/dist/schedules/index.d.ts +246 -0
- package/dist/schedules/index.d.ts.map +1 -1
- package/dist/schedules/index.js +27 -0
- package/dist/schedules/index.js.map +1 -1
- package/dist/server/health.d.ts +14 -5
- package/dist/server/health.d.ts.map +1 -1
- package/dist/server/health.js +5 -2
- package/dist/server/health.js.map +1 -1
- package/dist/server/hooks/auth.d.ts +68 -26
- package/dist/server/hooks/auth.d.ts.map +1 -1
- package/dist/server/hooks/auth.js +44 -55
- package/dist/server/hooks/auth.js.map +1 -1
- package/dist/server/hooks/cors.d.ts +27 -0
- package/dist/server/hooks/cors.d.ts.map +1 -1
- package/dist/server/hooks/cors.js +12 -0
- package/dist/server/hooks/cors.js.map +1 -1
- package/dist/server/hooks/errors.d.ts +15 -6
- package/dist/server/hooks/errors.d.ts.map +1 -1
- package/dist/server/hooks/errors.js.map +1 -1
- package/dist/server/hooks/index.d.ts +4 -1
- package/dist/server/hooks/index.d.ts.map +1 -1
- package/dist/server/hooks/index.js +3 -0
- package/dist/server/hooks/index.js.map +1 -1
- package/dist/server/hooks/logging.d.ts +36 -0
- package/dist/server/hooks/logging.d.ts.map +1 -1
- package/dist/server/hooks/logging.js +6 -0
- package/dist/server/hooks/logging.js.map +1 -1
- package/dist/server/hooks/rate-limit.d.ts +33 -0
- package/dist/server/hooks/rate-limit.d.ts.map +1 -1
- package/dist/server/hooks/rate-limit.js +11 -0
- package/dist/server/hooks/rate-limit.js.map +1 -1
- package/dist/server/http.d.ts +222 -0
- package/dist/server/http.d.ts.map +1 -1
- package/dist/server/http.js +20 -1
- package/dist/server/http.js.map +1 -1
- package/dist/server/index.d.ts +19 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +7 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/openapi.d.ts +5 -3
- package/dist/server/openapi.d.ts.map +1 -1
- package/dist/server/openapi.js +4 -2
- package/dist/server/openapi.js.map +1 -1
- package/dist/server/providers/loadProviderConfig.d.ts +9 -0
- package/dist/server/providers/loadProviderConfig.d.ts.map +1 -1
- package/dist/server/providers/loadProviderConfig.js +9 -0
- package/dist/server/providers/loadProviderConfig.js.map +1 -1
- package/dist/server/server.d.ts +159 -19
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +72 -31
- package/dist/server/server.js.map +1 -1
- package/dist/testing/index.d.ts +171 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +127 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/uploads/client.d.ts +278 -0
- package/dist/uploads/client.d.ts.map +1 -0
- package/dist/uploads/client.js +428 -0
- package/dist/uploads/client.js.map +1 -0
- package/dist/uploads/index.d.ts +361 -0
- package/dist/uploads/index.d.ts.map +1 -0
- package/dist/uploads/index.js +543 -0
- package/dist/uploads/index.js.map +1 -0
- package/package.json +31 -2
- package/src/application/index.ts +85 -22
- package/src/client/client.ts +73 -12
- package/src/client/index.ts +12 -0
- package/src/client/types.ts +70 -9
- package/src/config/index.ts +86 -0
- package/src/contracts/contract-builder.ts +49 -22
- package/src/contracts/contract-group.ts +35 -19
- package/src/contracts/contract-like.ts +4 -4
- package/src/contracts/index.ts +28 -1
- package/src/contracts/openapi-meta.ts +8 -8
- package/src/contracts/path-template.ts +27 -0
- package/src/contracts/types.ts +111 -10
- package/src/contracts/utils.ts +6 -0
- package/src/domain/entity.ts +22 -11
- package/src/domain/events.ts +5 -2
- package/src/domain/value-object.ts +19 -9
- package/src/errors/catalog.ts +40 -16
- package/src/errors/response.ts +16 -4
- package/src/errors/validation.ts +10 -1
- package/src/events/index.ts +134 -0
- package/src/idempotency/index.ts +767 -0
- package/src/jobs/index.ts +437 -5
- package/src/mail/index.ts +149 -0
- package/src/notifications/index.ts +771 -0
- package/src/openapi/index.ts +133 -16
- package/src/outbox/index.ts +1104 -0
- package/src/pagination/index.ts +278 -0
- package/src/ports/audit.ts +271 -0
- package/src/ports/auth.ts +70 -0
- package/src/ports/cache.ts +41 -0
- package/src/ports/clock.ts +38 -0
- package/src/ports/id-generator.ts +37 -0
- package/src/ports/index.ts +106 -11
- package/src/ports/logger.ts +56 -0
- package/src/ports/policy.ts +133 -0
- package/src/ports/rate-limit.ts +25 -0
- package/src/ports/redaction.ts +101 -0
- package/src/ports/storage.ts +100 -0
- package/src/ports/testing.ts +47 -0
- package/src/ports/unit-of-work.ts +60 -3
- package/src/providers/instrumentation.ts +211 -1
- package/src/providers/provider.ts +14 -1
- package/src/schedules/index.ts +247 -0
- package/src/server/health.ts +14 -5
- package/src/server/hooks/auth.ts +105 -120
- package/src/server/hooks/cors.ts +27 -0
- package/src/server/hooks/errors.ts +15 -6
- package/src/server/hooks/index.ts +4 -5
- package/src/server/hooks/logging.ts +36 -0
- package/src/server/hooks/rate-limit.ts +33 -0
- package/src/server/http.ts +249 -1
- package/src/server/index.ts +19 -1
- package/src/server/openapi.ts +5 -3
- package/src/server/providers/loadProviderConfig.ts +9 -0
- package/src/server/server.ts +296 -30
- package/src/testing/index.ts +348 -0
- package/src/uploads/client.ts +861 -0
- package/src/uploads/index.ts +1067 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,32 @@
|
|
|
1
1
|
# @beignet/core
|
|
2
2
|
|
|
3
|
+
## 0.0.3
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 3160184: Add `beignet db generate|migrate|seed|reset`, scaffold standard seed/reset database entrypoints, and expose a factory reset helper for test data workflows.
|
|
8
|
+
- 254ef6d: Add scoped route hooks for route and route-group policy, update auth hooks to expose public/optional/required route-hook factories, and teach CLI route inspection about curried route groups.
|
|
9
|
+
- 4cb1784: Add first-class upload router primitives, a typed browser upload client, a
|
|
10
|
+
React upload adapter, Next.js upload route helper, S3-compatible direct upload
|
|
11
|
+
signing, devtools upload watcher support, an upload generator, and a
|
|
12
|
+
first-class `beignet make feature` command with optional policy, event, job,
|
|
13
|
+
and upload artifacts for the standard vertical slice. Add first-class job retry
|
|
14
|
+
helpers, outbox retry policy integration, and job retry/dead-letter devtools
|
|
15
|
+
events. Add a Next.js outbox drain route helper and doctor warnings for
|
|
16
|
+
serverless background-work footguns.
|
|
17
|
+
- 8bd9085: Add `@beignet/web` as a framework-neutral Web Fetch adapter, include a `@beignet/web/testing` route test harness, and have `@beignet/next` reuse the Web adapter for standard Request/Response handling.
|
|
18
|
+
|
|
19
|
+
## 0.0.2
|
|
20
|
+
|
|
21
|
+
### Patch Changes
|
|
22
|
+
|
|
23
|
+
- 90b29ad: Add pagination primitives and generate list responses with `items` and `page`.
|
|
24
|
+
- 07fa19c: Add durable outbox primitives for transactionally recording events and jobs, plus a Drizzle/Turso outbox adapter.
|
|
25
|
+
- 08bae67: Add test factory and seed primitives under `@beignet/core/testing`.
|
|
26
|
+
- 730a818: Add idempotency primitives for retry-safe commands, webhooks, and jobs.
|
|
27
|
+
- a79f60c: Add first-class notification primitives, devtools notification watcher support,
|
|
28
|
+
and dependency-direction lint coverage for feature workflow folders.
|
|
29
|
+
|
|
3
30
|
## 0.0.1
|
|
4
31
|
|
|
5
32
|
- Initial Beignet release under the `@beignet` npm scope.
|
package/README.md
CHANGED
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
This package provides Beignet's framework primitives: contracts, server runtime,
|
|
6
6
|
typed client, use cases, ports, domain helpers, app errors, config, events,
|
|
7
|
-
mail, schedules,
|
|
7
|
+
idempotency, outbox, mail, notifications, schedules, uploads, pagination helpers,
|
|
8
|
+
testing helpers, and OpenAPI generation.
|
|
8
9
|
|
|
9
10
|
## Installation
|
|
10
11
|
|
|
@@ -39,14 +40,21 @@ name the framework area they depend on.
|
|
|
39
40
|
| `@beignet/core/domain` | Entities, value objects, and domain events |
|
|
40
41
|
| `@beignet/core/errors` | Error catalogs and response helpers |
|
|
41
42
|
| `@beignet/core/events` | Events and listeners |
|
|
42
|
-
| `@beignet/core/
|
|
43
|
+
| `@beignet/core/idempotency` | Retry-safe command, webhook, and job primitives |
|
|
44
|
+
| `@beignet/core/jobs` | Job definitions, retry policies, and inline job dispatch |
|
|
43
45
|
| `@beignet/core/mail` | Mail port and memory mailer |
|
|
46
|
+
| `@beignet/core/notifications` | Notification definitions, dispatchers, mail channels, and test adapters |
|
|
44
47
|
| `@beignet/core/openapi` | OpenAPI generation |
|
|
48
|
+
| `@beignet/core/outbox` | Durable event and job outbox |
|
|
49
|
+
| `@beignet/core/pagination` | Offset/cursor page types, normalizers, and result helpers |
|
|
45
50
|
| `@beignet/core/ports` | App-facing ports, auth, audit, policies, cache, storage, logging, and redaction |
|
|
46
51
|
| `@beignet/core/ports/testing` | Port and policy test helpers |
|
|
47
52
|
| `@beignet/core/providers` | Provider lifecycle and instrumentation primitives |
|
|
48
53
|
| `@beignet/core/schedules` | Scheduled task primitives |
|
|
49
54
|
| `@beignet/core/server` | Framework-agnostic server runtime and hook helpers |
|
|
55
|
+
| `@beignet/core/testing` | Test factories, seed definitions, and seed runners |
|
|
56
|
+
| `@beignet/core/uploads` | Upload definitions, router, signer port, and test signer |
|
|
57
|
+
| `@beignet/core/uploads/client` | Browser upload client for server and direct uploads |
|
|
50
58
|
|
|
51
59
|
## Key concepts
|
|
52
60
|
|
|
@@ -61,7 +69,7 @@ A **contract** is the single source of truth for an API endpoint. It describes:
|
|
|
61
69
|
|
|
62
70
|
### Contract group
|
|
63
71
|
|
|
64
|
-
A **contract group** allows you to share configuration across related endpoints, such as a common namespace,
|
|
72
|
+
A **contract group** allows you to share configuration across related endpoints, such as a common namespace, route metadata, headers, and shared response schemas.
|
|
65
73
|
|
|
66
74
|
## Usage
|
|
67
75
|
|
|
@@ -162,9 +170,157 @@ Prefixes compose immutably and normalize boundary slashes. `namespace()` control
|
|
|
162
170
|
resource identity for contract names, OpenAPI tags, and client cache grouping;
|
|
163
171
|
`prefix()` only controls URL paths.
|
|
164
172
|
|
|
165
|
-
###
|
|
173
|
+
### Test factories and seeds
|
|
166
174
|
|
|
167
|
-
Use
|
|
175
|
+
Use `@beignet/core/testing` to keep feature tests and demo seed data
|
|
176
|
+
port-based. Factories build app-owned records, and optional `persist` functions
|
|
177
|
+
write through the context you pass in:
|
|
178
|
+
|
|
179
|
+
```ts
|
|
180
|
+
import {
|
|
181
|
+
defineFactory,
|
|
182
|
+
defineSeed,
|
|
183
|
+
resetFactories,
|
|
184
|
+
runSeeds,
|
|
185
|
+
} from "@beignet/core/testing";
|
|
186
|
+
|
|
187
|
+
const postFactory = defineFactory("post", {
|
|
188
|
+
defaults: ({ sequence }) => ({
|
|
189
|
+
title: `Post ${sequence}`,
|
|
190
|
+
content: "Created in a test.",
|
|
191
|
+
}),
|
|
192
|
+
persist: (ctx: AppContext, post) => ctx.ports.posts.create(post),
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
const demoPostsSeed = defineSeed("demo-posts", {
|
|
196
|
+
run: async (ctx: AppContext) => {
|
|
197
|
+
await postFactory.createList(ctx, 3);
|
|
198
|
+
},
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
export async function seedDemoPosts(ctx: AppContext) {
|
|
202
|
+
await runSeeds({ ctx, seeds: [demoPostsSeed] });
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
export function resetPostFactories() {
|
|
206
|
+
resetFactories(postFactory);
|
|
207
|
+
}
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
Keep factories and seeds app-owned. They should not import database clients,
|
|
211
|
+
ORM table objects, or provider SDKs directly.
|
|
212
|
+
|
|
213
|
+
### Pagination
|
|
214
|
+
|
|
215
|
+
Use `@beignet/core/pagination` to keep list use cases and repository ports
|
|
216
|
+
consistent without coupling them to an ORM:
|
|
217
|
+
|
|
218
|
+
```ts
|
|
219
|
+
import { normalizeOffsetPage } from "@beignet/core/pagination";
|
|
220
|
+
|
|
221
|
+
const page = normalizeOffsetPage(input, {
|
|
222
|
+
defaultLimit: 20,
|
|
223
|
+
maxLimit: 100,
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
return ctx.ports.posts.findMany({
|
|
227
|
+
page,
|
|
228
|
+
filters: { status: input.status },
|
|
229
|
+
sort: { field: "createdAt", direction: "desc" },
|
|
230
|
+
});
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
Beignet's convention is `items` for list contents and `page` for pagination
|
|
234
|
+
metadata. Keep filters and sort options app-owned plain objects.
|
|
235
|
+
|
|
236
|
+
### Idempotency
|
|
237
|
+
|
|
238
|
+
Use `@beignet/core/idempotency` when a command, webhook, or job may be retried
|
|
239
|
+
and must not perform duplicate work:
|
|
240
|
+
|
|
241
|
+
```ts
|
|
242
|
+
import {
|
|
243
|
+
createIdempotencyFingerprint,
|
|
244
|
+
runIdempotently,
|
|
245
|
+
} from "@beignet/core/idempotency";
|
|
246
|
+
|
|
247
|
+
const result = await runIdempotently(ctx.ports.idempotency, {
|
|
248
|
+
namespace: "todos.create",
|
|
249
|
+
key: input.idempotencyKey,
|
|
250
|
+
scope: {
|
|
251
|
+
tenantId: ctx.tenant?.id,
|
|
252
|
+
actorId: ctx.actor?.id,
|
|
253
|
+
},
|
|
254
|
+
fingerprint: await createIdempotencyFingerprint(input, {
|
|
255
|
+
omit: ["idempotencyKey"],
|
|
256
|
+
}),
|
|
257
|
+
ttlSec: 60 * 60 * 24,
|
|
258
|
+
run: () => ctx.ports.uow.transaction((tx) => tx.todos.create(input)),
|
|
259
|
+
});
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
The memory store is useful for tests and local examples:
|
|
263
|
+
|
|
264
|
+
```ts
|
|
265
|
+
import { createMemoryIdempotencyStore } from "@beignet/core/idempotency";
|
|
266
|
+
|
|
267
|
+
const idempotency = createMemoryIdempotencyStore();
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
Production apps should back `IdempotencyPort` with atomic SQL or Redis storage.
|
|
271
|
+
For high-integrity workflows, prefer exposing a transaction-scoped
|
|
272
|
+
`tx.idempotency` port from the app Unit of Work so reservation, business writes,
|
|
273
|
+
audit records, domain-event records, and idempotency completion commit together.
|
|
274
|
+
|
|
275
|
+
### Outbox
|
|
276
|
+
|
|
277
|
+
Use `@beignet/core/outbox` when events or jobs must be recorded in the same
|
|
278
|
+
database transaction as the business write, then delivered later with retries:
|
|
279
|
+
|
|
280
|
+
```ts
|
|
281
|
+
import {
|
|
282
|
+
createOutboxEventRecorder,
|
|
283
|
+
defineOutboxRegistry,
|
|
284
|
+
drainOutbox,
|
|
285
|
+
} from "@beignet/core/outbox";
|
|
286
|
+
import {
|
|
287
|
+
createDrizzleTursoOutboxPort,
|
|
288
|
+
createDrizzleTursoUnitOfWork,
|
|
289
|
+
} from "@beignet/provider-drizzle-turso";
|
|
290
|
+
|
|
291
|
+
const uow = createDrizzleTursoUnitOfWork({
|
|
292
|
+
db,
|
|
293
|
+
createTransactionPorts: (tx) => {
|
|
294
|
+
const outbox = createDrizzleTursoOutboxPort(tx);
|
|
295
|
+
|
|
296
|
+
return {
|
|
297
|
+
posts: createPostRepository(tx),
|
|
298
|
+
events: createOutboxEventRecorder(outbox),
|
|
299
|
+
outbox,
|
|
300
|
+
};
|
|
301
|
+
},
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
const registry = defineOutboxRegistry({
|
|
305
|
+
events: [PostPublished],
|
|
306
|
+
jobs: [SendPostPublishedEmailJob],
|
|
307
|
+
});
|
|
308
|
+
|
|
309
|
+
await drainOutbox({
|
|
310
|
+
outbox: ctx.ports.outbox,
|
|
311
|
+
registry,
|
|
312
|
+
eventBus: ctx.ports.eventBus,
|
|
313
|
+
jobs: ctx.ports.jobs,
|
|
314
|
+
});
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
The outbox is at-least-once delivery. Use idempotent listeners or jobs when a
|
|
318
|
+
duplicate delivery would be harmful.
|
|
319
|
+
|
|
320
|
+
### Contract metadata and route hooks
|
|
321
|
+
|
|
322
|
+
Use metadata to describe cross-cutting concerns for OpenAPI, clients, docs, and
|
|
323
|
+
app conventions:
|
|
168
324
|
|
|
169
325
|
```ts
|
|
170
326
|
const sendMessage = messages
|
|
@@ -174,9 +330,10 @@ const sendMessage = messages
|
|
|
174
330
|
.meta({
|
|
175
331
|
auth: "required",
|
|
176
332
|
idempotency: {
|
|
177
|
-
|
|
178
|
-
header: "
|
|
179
|
-
|
|
333
|
+
required: true,
|
|
334
|
+
header: "idempotency-key",
|
|
335
|
+
scope: "actor-tenant",
|
|
336
|
+
ttlSec: 300,
|
|
180
337
|
},
|
|
181
338
|
rateLimit: {
|
|
182
339
|
max: 60,
|
|
@@ -186,6 +343,41 @@ const sendMessage = messages
|
|
|
186
343
|
});
|
|
187
344
|
```
|
|
188
345
|
|
|
346
|
+
Use route hooks for runtime enforcement where the route is wired:
|
|
347
|
+
|
|
348
|
+
```ts
|
|
349
|
+
import {
|
|
350
|
+
createAuthHooks,
|
|
351
|
+
defineRoute,
|
|
352
|
+
defineRouteGroup,
|
|
353
|
+
} from "@beignet/core/server";
|
|
354
|
+
|
|
355
|
+
const auth = createAuthHooks<AppContext, { user: CurrentUser }>({
|
|
356
|
+
resolve: async ({ ctx, req }) => {
|
|
357
|
+
const session = await ctx.ports.auth.getSession(req);
|
|
358
|
+
|
|
359
|
+
return session ? { user: session.user } : null;
|
|
360
|
+
},
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
const route = defineRoute<AppContext>();
|
|
364
|
+
|
|
365
|
+
export const messageRoutes = defineRouteGroup<AppContext>()({
|
|
366
|
+
name: "messages",
|
|
367
|
+
routes: [
|
|
368
|
+
route({
|
|
369
|
+
contract: sendMessage,
|
|
370
|
+
hooks: [auth.required()],
|
|
371
|
+
handle: async ({ ctx, body }) => {
|
|
372
|
+
ctx.user.id;
|
|
373
|
+
|
|
374
|
+
return sendMessageUseCase.run({ ctx, input: body });
|
|
375
|
+
},
|
|
376
|
+
}),
|
|
377
|
+
],
|
|
378
|
+
});
|
|
379
|
+
```
|
|
380
|
+
|
|
189
381
|
### OpenAPI metadata
|
|
190
382
|
|
|
191
383
|
Add OpenAPI-specific metadata for documentation using the `.openapi()` method:
|
|
@@ -277,9 +469,11 @@ OpenAPI generation currently requires Zod schemas, even though core contracts ca
|
|
|
277
469
|
|
|
278
470
|
## Related packages
|
|
279
471
|
|
|
472
|
+
- [`@beignet/web`](https://beignet.dev/server) - Web Fetch server adapter
|
|
280
473
|
- [`@beignet/next`](https://beignet.dev/server) - Next.js server adapter
|
|
281
474
|
- [`@beignet/react-query`](https://beignet.dev/react-query) - TanStack Query integration
|
|
282
475
|
- [`@beignet/react-hook-form`](https://beignet.dev/react-hook-form) - React Hook Form integration
|
|
476
|
+
- [`@beignet/react-uploads`](https://beignet.dev/react-uploads) - React upload state and progress hooks
|
|
283
477
|
- [`@beignet/nuqs`](https://beignet.dev/nuqs) - URL query state integration with nuqs
|
|
284
478
|
- [`@beignet/devtools`](https://beignet.dev/devtools) - Local request, provider, and audit timeline
|
|
285
479
|
|
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
import type { StandardSchemaV1 } from "@standard-schema/spec";
|
|
2
2
|
/**
|
|
3
|
-
* Any Standard Schema validator
|
|
3
|
+
* Any Standard Schema compatible validator.
|
|
4
4
|
*/
|
|
5
5
|
export type StandardSchema = StandardSchemaV1<unknown, unknown>;
|
|
6
6
|
/**
|
|
7
|
-
* Infer the output type from a Standard Schema
|
|
7
|
+
* Infer the parsed output type from a Standard Schema.
|
|
8
8
|
*/
|
|
9
9
|
export type InferOutput<T extends StandardSchemaV1> = StandardSchemaV1.InferOutput<T>;
|
|
10
10
|
/**
|
|
11
|
-
* Infer the input type accepted by a Standard Schema
|
|
11
|
+
* Infer the input type accepted by a Standard Schema.
|
|
12
12
|
*/
|
|
13
13
|
export type InferInput<T extends StandardSchemaV1> = StandardSchemaV1.InferInput<T>;
|
|
14
14
|
type SchemaOutput<T> = T extends StandardSchemaV1 ? InferOutput<T> : never;
|
|
15
|
+
/**
|
|
16
|
+
* Boundary phase that failed use-case schema validation.
|
|
17
|
+
*/
|
|
15
18
|
export type UseCaseValidationPhase = "input" | "output";
|
|
16
19
|
/**
|
|
17
20
|
* Error thrown when a use case input or output fails schema validation.
|
|
@@ -58,11 +61,20 @@ export declare class UseCaseEventValidationError extends Error {
|
|
|
58
61
|
});
|
|
59
62
|
}
|
|
60
63
|
/**
|
|
61
|
-
*
|
|
62
|
-
*
|
|
64
|
+
* Minimal domain event definition accepted by use-case event helpers.
|
|
65
|
+
*
|
|
66
|
+
* This matches events from `@beignet/core/events` and compatible app-owned
|
|
67
|
+
* definitions without forcing the application builder to depend on one event
|
|
68
|
+
* implementation.
|
|
63
69
|
*/
|
|
64
70
|
export interface DomainEventLike {
|
|
71
|
+
/**
|
|
72
|
+
* Stable event name.
|
|
73
|
+
*/
|
|
65
74
|
name: string;
|
|
75
|
+
/**
|
|
76
|
+
* Standard Schema payload validator.
|
|
77
|
+
*/
|
|
66
78
|
payload: StandardSchema;
|
|
67
79
|
}
|
|
68
80
|
/**
|
|
@@ -73,12 +85,18 @@ export type InferUseCaseEventPayload<E extends DomainEventLike> = E["payload"] e
|
|
|
73
85
|
* Minimal recorder shape accepted by use-case event helpers.
|
|
74
86
|
*/
|
|
75
87
|
export interface UseCaseEventRecorderTarget {
|
|
76
|
-
|
|
88
|
+
/**
|
|
89
|
+
* Record a domain event payload.
|
|
90
|
+
*/
|
|
91
|
+
record<E extends DomainEventLike>(event: E, payload: InferUseCaseEventPayload<E>): Promise<void> | void;
|
|
77
92
|
}
|
|
78
93
|
/**
|
|
79
94
|
* Minimal event-bus shape accepted by use-case event helpers.
|
|
80
95
|
*/
|
|
81
96
|
export interface UseCaseEventBusTarget {
|
|
97
|
+
/**
|
|
98
|
+
* Publish a domain event payload.
|
|
99
|
+
*/
|
|
82
100
|
publish<E extends DomainEventLike>(event: E, payload: InferUseCaseEventPayload<E>): Promise<void> | void;
|
|
83
101
|
}
|
|
84
102
|
/**
|
|
@@ -111,34 +129,68 @@ export interface UseCaseEventHelpers<Emits extends readonly DomainEventLike[]> {
|
|
|
111
129
|
*/
|
|
112
130
|
export type UseCaseKind = "command" | "query";
|
|
113
131
|
/**
|
|
114
|
-
*
|
|
132
|
+
* Finalized use case definition.
|
|
133
|
+
*
|
|
134
|
+
* Use cases validate their input before `run(...)` executes and validate their
|
|
135
|
+
* output before returning, unless validation is disabled on the builder.
|
|
115
136
|
*/
|
|
116
137
|
export interface UseCaseDef<Ctx, Name extends string, Kind extends UseCaseKind, InputSchema extends StandardSchemaV1, OutputSchema extends StandardSchemaV1, Emits extends readonly DomainEventLike[] = readonly []> {
|
|
138
|
+
/**
|
|
139
|
+
* Stable use-case name, usually namespaced by feature.
|
|
140
|
+
*/
|
|
117
141
|
name: Name;
|
|
142
|
+
/**
|
|
143
|
+
* Whether this use case is a command or query.
|
|
144
|
+
*/
|
|
118
145
|
kind: Kind;
|
|
119
146
|
/** Input schema, suitable for reuse in HTTP contracts and forms. */
|
|
120
147
|
inputSchema: InputSchema;
|
|
121
148
|
/** Output schema, suitable for reuse in HTTP contracts and clients. */
|
|
122
149
|
outputSchema: OutputSchema;
|
|
150
|
+
/**
|
|
151
|
+
* Domain events this use case is allowed to record or publish through the
|
|
152
|
+
* scoped `events` helper.
|
|
153
|
+
*/
|
|
123
154
|
emits: Emits;
|
|
155
|
+
/**
|
|
156
|
+
* Execute the use case with application context and typed input.
|
|
157
|
+
*/
|
|
124
158
|
run: (args: {
|
|
125
159
|
ctx: Ctx;
|
|
126
160
|
input: InferInput<InputSchema>;
|
|
127
161
|
}) => Promise<InferOutput<OutputSchema>>;
|
|
128
162
|
}
|
|
129
163
|
/**
|
|
130
|
-
* Event passed to the onRun hook for instrumentation
|
|
164
|
+
* Event passed to the `onRun` hook for instrumentation.
|
|
131
165
|
*/
|
|
132
166
|
export interface UseCaseRunEvent<Ctx> {
|
|
167
|
+
/**
|
|
168
|
+
* Use-case name.
|
|
169
|
+
*/
|
|
133
170
|
name: string;
|
|
171
|
+
/**
|
|
172
|
+
* Use-case kind.
|
|
173
|
+
*/
|
|
134
174
|
kind: UseCaseKind;
|
|
175
|
+
/**
|
|
176
|
+
* Execution phase being observed.
|
|
177
|
+
*/
|
|
135
178
|
phase: "start" | "end" | "error";
|
|
179
|
+
/**
|
|
180
|
+
* Elapsed time for end/error events.
|
|
181
|
+
*/
|
|
136
182
|
durationMs?: number;
|
|
183
|
+
/**
|
|
184
|
+
* Error captured for error events.
|
|
185
|
+
*/
|
|
137
186
|
error?: unknown;
|
|
187
|
+
/**
|
|
188
|
+
* Application context used for the run.
|
|
189
|
+
*/
|
|
138
190
|
ctx: Ctx;
|
|
139
191
|
}
|
|
140
192
|
/**
|
|
141
|
-
* Options for createUseCase
|
|
193
|
+
* Options for `createUseCase(...)`.
|
|
142
194
|
*/
|
|
143
195
|
export interface CreateUseCaseOptions<Ctx> {
|
|
144
196
|
/**
|
|
@@ -212,18 +264,27 @@ export interface UseCaseBuilderRoot<Ctx> {
|
|
|
212
264
|
*/
|
|
213
265
|
query<Name extends string>(name: Name): UseCaseBuilder<Ctx, Name, "query", undefined, undefined, readonly []>;
|
|
214
266
|
}
|
|
267
|
+
/**
|
|
268
|
+
* Infer the application context type from a finalized use case.
|
|
269
|
+
*/
|
|
215
270
|
export type UseCaseContext<TUseCase> = TUseCase extends {
|
|
216
271
|
run: (args: {
|
|
217
272
|
ctx: infer Ctx;
|
|
218
273
|
input: infer _Input;
|
|
219
274
|
}) => Promise<infer _Output>;
|
|
220
275
|
} ? Ctx : never;
|
|
276
|
+
/**
|
|
277
|
+
* Infer the public input type accepted by a finalized use case.
|
|
278
|
+
*/
|
|
221
279
|
export type UseCaseInput<TUseCase> = TUseCase extends {
|
|
222
280
|
run: (args: {
|
|
223
281
|
ctx: infer _Ctx;
|
|
224
282
|
input: infer Input;
|
|
225
283
|
}) => Promise<infer _Output>;
|
|
226
284
|
} ? Input : never;
|
|
285
|
+
/**
|
|
286
|
+
* Infer the public output type returned by a finalized use case.
|
|
287
|
+
*/
|
|
227
288
|
export type UseCaseOutput<TUseCase> = TUseCase extends {
|
|
228
289
|
run: (args: {
|
|
229
290
|
ctx: infer _Ctx;
|
|
@@ -231,6 +292,9 @@ export type UseCaseOutput<TUseCase> = TUseCase extends {
|
|
|
231
292
|
}) => Promise<infer Output>;
|
|
232
293
|
} ? Output : never;
|
|
233
294
|
type MaybePromise<T> = T | Promise<T>;
|
|
295
|
+
/**
|
|
296
|
+
* Small test harness for running use cases with typed inputs.
|
|
297
|
+
*/
|
|
234
298
|
export interface UseCaseTester<Ctx> {
|
|
235
299
|
/**
|
|
236
300
|
* Create a fresh test context.
|
|
@@ -255,6 +319,26 @@ export interface UseCaseTester<Ctx> {
|
|
|
255
319
|
* for simple, immutable tests.
|
|
256
320
|
*/
|
|
257
321
|
export declare function createUseCaseTester<Ctx>(createContext: Ctx | (() => MaybePromise<Ctx>)): UseCaseTester<Ctx>;
|
|
322
|
+
/**
|
|
323
|
+
* Create a use case builder with a specific context type.
|
|
324
|
+
*
|
|
325
|
+
* Create this once in app code, usually in `lib/use-case.ts`, then import that
|
|
326
|
+
* configured builder from feature use-case modules.
|
|
327
|
+
*
|
|
328
|
+
* @example
|
|
329
|
+
* ```ts
|
|
330
|
+
* export const useCase = createUseCase<AppContext>();
|
|
331
|
+
*
|
|
332
|
+
* export const createTodo = useCase
|
|
333
|
+
* .command("todos.create")
|
|
334
|
+
* .input(CreateTodoInput)
|
|
335
|
+
* .output(CreateTodoOutput)
|
|
336
|
+
* .run(async ({ ctx, input }) => ctx.ports.todos.create(input));
|
|
337
|
+
* ```
|
|
338
|
+
*
|
|
339
|
+
* @param options - Optional instrumentation and validation configuration.
|
|
340
|
+
* @returns A root builder for command and query use cases.
|
|
341
|
+
*/
|
|
258
342
|
export declare function createUseCase<Ctx>(options?: CreateUseCaseOptions<Ctx>): UseCaseBuilderRoot<Ctx>;
|
|
259
343
|
export {};
|
|
260
344
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/application/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAEhE;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,gBAAgB,IAChD,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;AAElC;;GAEG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,gBAAgB,IAC/C,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAGjC,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS,gBAAgB,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;AAE3E,MAAM,MAAM,sBAAsB,GAAG,OAAO,GAAG,QAAQ,CAAC;AAExD;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,IAAI,4BAA4B;IACzC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,sBAAsB,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,SAAS,gBAAgB,CAAC,KAAK,EAAE,CAAC;gBAEvC,IAAI,EAAE;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,sBAAsB,CAAC;QAC9B,MAAM,EAAE,SAAS,gBAAgB,CAAC,KAAK,EAAE,CAAC;KAC3C;CAQF;AAED;;;GAGG;AACH,qBAAa,4BAA6B,SAAQ,KAAK;IACrD,QAAQ,CAAC,IAAI,kCAAkC;IAC/C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;gBAEnC,IAAI,EAAE;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;KACvC;CAaF;AAsBD;;;GAGG;AACH,qBAAa,2BAA4B,SAAQ,KAAK;IACpD,QAAQ,CAAC,IAAI,iCAAiC;IAC9C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,gBAAgB,CAAC,KAAK,EAAE,CAAC;gBAEvC,IAAI,EAAE;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,SAAS,gBAAgB,CAAC,KAAK,EAAE,CAAC;KAC3C;CAQF;AAsBD
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/application/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -124,7 +124,7 @@ function createUseCaseEventHelpers(useCaseName, declared) {
|
|
|
124
124
|
async record(recorder, event, payload) {
|
|
125
125
|
const declaredEvent = resolveDeclared(event);
|
|
126
126
|
const parsed = await parseEventPayload(declaredEvent, payload, useCaseName);
|
|
127
|
-
recorder.record(declaredEvent, parsed);
|
|
127
|
+
await recorder.record(declaredEvent, parsed);
|
|
128
128
|
},
|
|
129
129
|
async publish(eventBus, event, payload) {
|
|
130
130
|
const declaredEvent = resolveDeclared(event);
|
|
@@ -279,28 +279,28 @@ export function createUseCaseTester(createContext) {
|
|
|
279
279
|
},
|
|
280
280
|
};
|
|
281
281
|
}
|
|
282
|
+
/** Empty emits array used as default. */
|
|
283
|
+
const EMPTY_EMITS = [];
|
|
282
284
|
/**
|
|
283
285
|
* Create a use case builder with a specific context type.
|
|
284
286
|
*
|
|
287
|
+
* Create this once in app code, usually in `lib/use-case.ts`, then import that
|
|
288
|
+
* configured builder from feature use-case modules.
|
|
289
|
+
*
|
|
285
290
|
* @example
|
|
286
291
|
* ```ts
|
|
287
|
-
*
|
|
288
|
-
* import type { AppCtx } from "./ctx";
|
|
289
|
-
*
|
|
290
|
-
* export const useCase = createUseCase<AppCtx>();
|
|
292
|
+
* export const useCase = createUseCase<AppContext>();
|
|
291
293
|
*
|
|
292
294
|
* export const createTodo = useCase
|
|
293
295
|
* .command("todos.create")
|
|
294
296
|
* .input(CreateTodoInput)
|
|
295
297
|
* .output(CreateTodoOutput)
|
|
296
|
-
* .run(async ({ ctx, input }) =>
|
|
297
|
-
* const todo = await ctx.ports.db.todos.create(input);
|
|
298
|
-
* return { id: todo.id, title: todo.title };
|
|
299
|
-
* });
|
|
298
|
+
* .run(async ({ ctx, input }) => ctx.ports.todos.create(input));
|
|
300
299
|
* ```
|
|
300
|
+
*
|
|
301
|
+
* @param options - Optional instrumentation and validation configuration.
|
|
302
|
+
* @returns A root builder for command and query use cases.
|
|
301
303
|
*/
|
|
302
|
-
/** Empty emits array used as default */
|
|
303
|
-
const EMPTY_EMITS = [];
|
|
304
304
|
export function createUseCase(options) {
|
|
305
305
|
const onRun = options?.onRun;
|
|
306
306
|
const validation = normalizeValidationOptions(options?.validate);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/application/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/application/index.ts"],"names":[],"mappings":"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"}
|