@beignet/core 0.0.1
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 +5 -0
- package/README.md +288 -0
- package/dist/application/index.d.ts +260 -0
- package/dist/application/index.d.ts.map +1 -0
- package/dist/application/index.js +324 -0
- package/dist/application/index.js.map +1 -0
- package/dist/client/client.d.ts +241 -0
- package/dist/client/client.d.ts.map +1 -0
- package/dist/client/client.js +531 -0
- package/dist/client/client.js.map +1 -0
- package/dist/client/index.d.ts +10 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +8 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/types.d.ts +139 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +2 -0
- package/dist/client/types.js.map +1 -0
- package/dist/config/index.d.ts +122 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +216 -0
- package/dist/config/index.js.map +1 -0
- package/dist/contracts/contract-builder.d.ts +121 -0
- package/dist/contracts/contract-builder.d.ts.map +1 -0
- package/dist/contracts/contract-builder.js +346 -0
- package/dist/contracts/contract-builder.js.map +1 -0
- package/dist/contracts/contract-group.d.ts +106 -0
- package/dist/contracts/contract-group.d.ts.map +1 -0
- package/dist/contracts/contract-group.js +240 -0
- package/dist/contracts/contract-group.js.map +1 -0
- package/dist/contracts/contract-like.d.ts +21 -0
- package/dist/contracts/contract-like.d.ts.map +1 -0
- package/dist/contracts/contract-like.js +9 -0
- package/dist/contracts/contract-like.js.map +1 -0
- package/dist/contracts/index.d.ts +15 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +11 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/contracts/openapi-meta.d.ts +23 -0
- package/dist/contracts/openapi-meta.d.ts.map +1 -0
- package/dist/contracts/openapi-meta.js +2 -0
- package/dist/contracts/openapi-meta.js.map +1 -0
- package/dist/contracts/path-template.d.ts +17 -0
- package/dist/contracts/path-template.d.ts.map +1 -0
- package/dist/contracts/path-template.js +50 -0
- package/dist/contracts/path-template.js.map +1 -0
- package/dist/contracts/rate-limit.d.ts +50 -0
- package/dist/contracts/rate-limit.d.ts.map +1 -0
- package/dist/contracts/rate-limit.js +2 -0
- package/dist/contracts/rate-limit.js.map +1 -0
- package/dist/contracts/types.d.ts +97 -0
- package/dist/contracts/types.d.ts.map +1 -0
- package/dist/contracts/types.js +54 -0
- package/dist/contracts/types.js.map +1 -0
- package/dist/contracts/utils.d.ts +3 -0
- package/dist/contracts/utils.d.ts.map +1 -0
- package/dist/contracts/utils.js +44 -0
- package/dist/contracts/utils.js.map +1 -0
- package/dist/domain/entity.d.ts +87 -0
- package/dist/domain/entity.d.ts.map +1 -0
- package/dist/domain/entity.js +155 -0
- package/dist/domain/entity.js.map +1 -0
- package/dist/domain/events.d.ts +41 -0
- package/dist/domain/events.d.ts.map +1 -0
- package/dist/domain/events.js +21 -0
- package/dist/domain/events.js.map +1 -0
- package/dist/domain/index.d.ts +14 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +14 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/domain/value-object.d.ts +60 -0
- package/dist/domain/value-object.d.ts.map +1 -0
- package/dist/domain/value-object.js +87 -0
- package/dist/domain/value-object.js.map +1 -0
- package/dist/errors/catalog.d.ts +71 -0
- package/dist/errors/catalog.d.ts.map +1 -0
- package/dist/errors/catalog.js +71 -0
- package/dist/errors/catalog.js.map +1 -0
- package/dist/errors/http.d.ts +77 -0
- package/dist/errors/http.d.ts.map +1 -0
- package/dist/errors/http.js +74 -0
- package/dist/errors/http.js.map +1 -0
- package/dist/errors/index.d.ts +10 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +14 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/response.d.ts +26 -0
- package/dist/errors/response.d.ts.map +1 -0
- package/dist/errors/response.js +34 -0
- package/dist/errors/response.js.map +1 -0
- package/dist/errors/validation.d.ts +18 -0
- package/dist/errors/validation.d.ts.map +1 -0
- package/dist/errors/validation.js +21 -0
- package/dist/errors/validation.js.map +1 -0
- package/dist/events/index.d.ts +58 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +102 -0
- package/dist/events/index.js.map +1 -0
- package/dist/jobs/index.d.ts +56 -0
- package/dist/jobs/index.d.ts.map +1 -0
- package/dist/jobs/index.js +89 -0
- package/dist/jobs/index.js.map +1 -0
- package/dist/mail/index.d.ts +75 -0
- package/dist/mail/index.d.ts.map +1 -0
- package/dist/mail/index.js +84 -0
- package/dist/mail/index.js.map +1 -0
- package/dist/openapi/index.d.ts +207 -0
- package/dist/openapi/index.d.ts.map +1 -0
- package/dist/openapi/index.js +449 -0
- package/dist/openapi/index.js.map +1 -0
- package/dist/openapi/schema-introspector.d.ts +38 -0
- package/dist/openapi/schema-introspector.d.ts.map +1 -0
- package/dist/openapi/schema-introspector.js +67 -0
- package/dist/openapi/schema-introspector.js.map +1 -0
- package/dist/ports/audit.d.ts +58 -0
- package/dist/ports/audit.d.ts.map +1 -0
- package/dist/ports/audit.js +74 -0
- package/dist/ports/audit.js.map +1 -0
- package/dist/ports/auth.d.ts +23 -0
- package/dist/ports/auth.d.ts.map +1 -0
- package/dist/ports/auth.js +31 -0
- package/dist/ports/auth.js.map +1 -0
- package/dist/ports/builder.d.ts +61 -0
- package/dist/ports/builder.d.ts.map +1 -0
- package/dist/ports/builder.js +48 -0
- package/dist/ports/builder.js.map +1 -0
- package/dist/ports/cache.d.ts +15 -0
- package/dist/ports/cache.d.ts.map +1 -0
- package/dist/ports/cache.js +57 -0
- package/dist/ports/cache.js.map +1 -0
- package/dist/ports/clock.d.ts +10 -0
- package/dist/ports/clock.d.ts.map +1 -0
- package/dist/ports/clock.js +21 -0
- package/dist/ports/clock.js.map +1 -0
- package/dist/ports/events.d.ts +71 -0
- package/dist/ports/events.d.ts.map +1 -0
- package/dist/ports/events.js +2 -0
- package/dist/ports/events.js.map +1 -0
- package/dist/ports/id-generator.d.ts +12 -0
- package/dist/ports/id-generator.d.ts.map +1 -0
- package/dist/ports/id-generator.js +22 -0
- package/dist/ports/id-generator.js.map +1 -0
- package/dist/ports/index.d.ts +98 -0
- package/dist/ports/index.d.ts.map +1 -0
- package/dist/ports/index.js +67 -0
- package/dist/ports/index.js.map +1 -0
- package/dist/ports/logger.d.ts +22 -0
- package/dist/ports/logger.d.ts.map +1 -0
- package/dist/ports/logger.js +34 -0
- package/dist/ports/logger.js.map +1 -0
- package/dist/ports/mailer.d.ts +6 -0
- package/dist/ports/mailer.d.ts.map +1 -0
- package/dist/ports/mailer.js +2 -0
- package/dist/ports/mailer.js.map +1 -0
- package/dist/ports/policy.d.ts +53 -0
- package/dist/ports/policy.d.ts.map +1 -0
- package/dist/ports/policy.js +81 -0
- package/dist/ports/policy.js.map +1 -0
- package/dist/ports/rate-limit.d.ts +41 -0
- package/dist/ports/rate-limit.d.ts.map +1 -0
- package/dist/ports/rate-limit.js +37 -0
- package/dist/ports/rate-limit.js.map +1 -0
- package/dist/ports/redaction.d.ts +26 -0
- package/dist/ports/redaction.d.ts.map +1 -0
- package/dist/ports/redaction.js +126 -0
- package/dist/ports/redaction.js.map +1 -0
- package/dist/ports/schedules.d.ts +9 -0
- package/dist/ports/schedules.d.ts.map +1 -0
- package/dist/ports/schedules.js +2 -0
- package/dist/ports/schedules.js.map +1 -0
- package/dist/ports/storage.d.ts +47 -0
- package/dist/ports/storage.d.ts.map +1 -0
- package/dist/ports/storage.js +185 -0
- package/dist/ports/storage.js.map +1 -0
- package/dist/ports/testing.d.ts +73 -0
- package/dist/ports/testing.d.ts.map +1 -0
- package/dist/ports/testing.js +105 -0
- package/dist/ports/testing.js.map +1 -0
- package/dist/ports/unit-of-work.d.ts +56 -0
- package/dist/ports/unit-of-work.d.ts.map +1 -0
- package/dist/ports/unit-of-work.js +64 -0
- package/dist/ports/unit-of-work.js.map +1 -0
- package/dist/providers/index.d.ts +8 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +8 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/instrumentation.d.ts +91 -0
- package/dist/providers/instrumentation.d.ts.map +1 -0
- package/dist/providers/instrumentation.js +93 -0
- package/dist/providers/instrumentation.js.map +1 -0
- package/dist/providers/provider.d.ts +146 -0
- package/dist/providers/provider.d.ts.map +1 -0
- package/dist/providers/provider.js +31 -0
- package/dist/providers/provider.js.map +1 -0
- package/dist/schedules/index.d.ts +105 -0
- package/dist/schedules/index.d.ts.map +1 -0
- package/dist/schedules/index.js +178 -0
- package/dist/schedules/index.js.map +1 -0
- package/dist/server/contract-like.d.ts +5 -0
- package/dist/server/contract-like.d.ts.map +1 -0
- package/dist/server/contract-like.js +5 -0
- package/dist/server/contract-like.js.map +1 -0
- package/dist/server/health.d.ts +41 -0
- package/dist/server/health.d.ts.map +1 -0
- package/dist/server/health.js +46 -0
- package/dist/server/health.js.map +1 -0
- package/dist/server/hooks/auth.d.ts +42 -0
- package/dist/server/hooks/auth.d.ts.map +1 -0
- package/dist/server/hooks/auth.js +61 -0
- package/dist/server/hooks/auth.js.map +1 -0
- package/dist/server/hooks/cors.d.ts +13 -0
- package/dist/server/hooks/cors.d.ts.map +1 -0
- package/dist/server/hooks/cors.js +70 -0
- package/dist/server/hooks/cors.js.map +1 -0
- package/dist/server/hooks/errors.d.ts +66 -0
- package/dist/server/hooks/errors.d.ts.map +1 -0
- package/dist/server/hooks/errors.js +83 -0
- package/dist/server/hooks/errors.js.map +1 -0
- package/dist/server/hooks/index.d.ts +12 -0
- package/dist/server/hooks/index.d.ts.map +1 -0
- package/dist/server/hooks/index.js +12 -0
- package/dist/server/hooks/index.js.map +1 -0
- package/dist/server/hooks/logging.d.ts +33 -0
- package/dist/server/hooks/logging.d.ts.map +1 -0
- package/dist/server/hooks/logging.js +90 -0
- package/dist/server/hooks/logging.js.map +1 -0
- package/dist/server/hooks/rate-limit.d.ts +29 -0
- package/dist/server/hooks/rate-limit.d.ts.map +1 -0
- package/dist/server/hooks/rate-limit.js +93 -0
- package/dist/server/hooks/rate-limit.js.map +1 -0
- package/dist/server/hooks/utils.d.ts +9 -0
- package/dist/server/hooks/utils.d.ts.map +1 -0
- package/dist/server/hooks/utils.js +16 -0
- package/dist/server/hooks/utils.js.map +1 -0
- package/dist/server/hooks.d.ts +2 -0
- package/dist/server/hooks.d.ts.map +1 -0
- package/dist/server/hooks.js +2 -0
- package/dist/server/hooks.js.map +1 -0
- package/dist/server/http.d.ts +124 -0
- package/dist/server/http.d.ts.map +1 -0
- package/dist/server/http.js +2 -0
- package/dist/server/http.js.map +1 -0
- package/dist/server/index.d.ts +19 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +15 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/openapi.d.ts +32 -0
- package/dist/server/openapi.d.ts.map +1 -0
- package/dist/server/openapi.js +43 -0
- package/dist/server/openapi.js.map +1 -0
- package/dist/server/providers/index.d.ts +4 -0
- package/dist/server/providers/index.d.ts.map +1 -0
- package/dist/server/providers/index.js +4 -0
- package/dist/server/providers/index.js.map +1 -0
- package/dist/server/providers/loadProviderConfig.d.ts +7 -0
- package/dist/server/providers/loadProviderConfig.d.ts.map +1 -0
- package/dist/server/providers/loadProviderConfig.js +42 -0
- package/dist/server/providers/loadProviderConfig.js.map +1 -0
- package/dist/server/server.d.ts +86 -0
- package/dist/server/server.d.ts.map +1 -0
- package/dist/server/server.js +1031 -0
- package/dist/server/server.js.map +1 -0
- package/dist/server/types.d.ts +3 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +3 -0
- package/dist/server/types.js.map +1 -0
- package/package.json +129 -0
- package/src/application/index.ts +747 -0
- package/src/client/client.ts +1105 -0
- package/src/client/index.ts +45 -0
- package/src/client/types.ts +305 -0
- package/src/config/index.ts +497 -0
- package/src/contracts/contract-builder.ts +583 -0
- package/src/contracts/contract-group.ts +502 -0
- package/src/contracts/contract-like.ts +29 -0
- package/src/contracts/index.ts +53 -0
- package/src/contracts/openapi-meta.ts +22 -0
- package/src/contracts/path-template.ts +91 -0
- package/src/contracts/rate-limit.ts +50 -0
- package/src/contracts/types.ts +207 -0
- package/src/contracts/utils.ts +56 -0
- package/src/domain/entity.ts +256 -0
- package/src/domain/events.ts +52 -0
- package/src/domain/index.ts +18 -0
- package/src/domain/value-object.ts +135 -0
- package/src/errors/catalog.ts +149 -0
- package/src/errors/http.ts +80 -0
- package/src/errors/index.ts +28 -0
- package/src/errors/response.ts +54 -0
- package/src/errors/validation.ts +35 -0
- package/src/events/index.ts +246 -0
- package/src/jobs/index.ts +211 -0
- package/src/mail/index.ts +177 -0
- package/src/openapi/index.ts +865 -0
- package/src/openapi/schema-introspector.ts +107 -0
- package/src/ports/audit.ts +176 -0
- package/src/ports/auth.ts +76 -0
- package/src/ports/builder.ts +97 -0
- package/src/ports/cache.ts +94 -0
- package/src/ports/clock.ts +34 -0
- package/src/ports/events.ts +100 -0
- package/src/ports/id-generator.ts +36 -0
- package/src/ports/index.ts +221 -0
- package/src/ports/logger.ts +67 -0
- package/src/ports/policy.ts +242 -0
- package/src/ports/rate-limit.ts +91 -0
- package/src/ports/redaction.ts +199 -0
- package/src/ports/storage.ts +282 -0
- package/src/ports/testing.ts +234 -0
- package/src/ports/unit-of-work.ts +134 -0
- package/src/providers/index.ts +40 -0
- package/src/providers/instrumentation.ts +248 -0
- package/src/providers/provider.ts +191 -0
- package/src/schedules/index.ts +442 -0
- package/src/server/contract-like.ts +8 -0
- package/src/server/health.ts +82 -0
- package/src/server/hooks/auth.ts +147 -0
- package/src/server/hooks/cors.ts +87 -0
- package/src/server/hooks/errors.ts +126 -0
- package/src/server/hooks/index.ts +43 -0
- package/src/server/hooks/logging.ts +121 -0
- package/src/server/hooks/rate-limit.ts +171 -0
- package/src/server/hooks/utils.ts +16 -0
- package/src/server/hooks.ts +1 -0
- package/src/server/http.ts +189 -0
- package/src/server/index.ts +35 -0
- package/src/server/openapi.ts +72 -0
- package/src/server/providers/index.ts +3 -0
- package/src/server/providers/loadProviderConfig.ts +72 -0
- package/src/server/server.ts +1521 -0
- package/src/server/types.ts +2 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export const BEIGNET_ERROR_OWNER_HEADER = "x-beignet-error-owner";
|
|
2
|
+
export const BODY_HTTP_METHODS = [
|
|
3
|
+
"POST",
|
|
4
|
+
"PUT",
|
|
5
|
+
"PATCH",
|
|
6
|
+
];
|
|
7
|
+
export function methodSupportsRequestBody(method) {
|
|
8
|
+
return BODY_HTTP_METHODS.includes(method);
|
|
9
|
+
}
|
|
10
|
+
export const STANDARD_ERROR_RESPONSE_SCHEMA = {
|
|
11
|
+
"~standard": {
|
|
12
|
+
version: 1,
|
|
13
|
+
vendor: "beignet",
|
|
14
|
+
validate(value) {
|
|
15
|
+
if (typeof value !== "object" || value === null) {
|
|
16
|
+
return {
|
|
17
|
+
issues: [{ message: "Expected error response body object." }],
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
const body = value;
|
|
21
|
+
const issues = [];
|
|
22
|
+
if (typeof body.code !== "string") {
|
|
23
|
+
issues.push({ message: 'Expected "code" to be a string.' });
|
|
24
|
+
}
|
|
25
|
+
if (typeof body.message !== "string") {
|
|
26
|
+
issues.push({ message: 'Expected "message" to be a string.' });
|
|
27
|
+
}
|
|
28
|
+
if (body.requestId !== undefined && typeof body.requestId !== "string") {
|
|
29
|
+
issues.push({ message: 'Expected "requestId" to be a string.' });
|
|
30
|
+
}
|
|
31
|
+
if (issues.length) {
|
|
32
|
+
return { issues };
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
value: {
|
|
36
|
+
code: body.code,
|
|
37
|
+
message: body.message,
|
|
38
|
+
...(body.details !== undefined ? { details: body.details } : {}),
|
|
39
|
+
...(body.requestId !== undefined
|
|
40
|
+
? { requestId: body.requestId }
|
|
41
|
+
: {}),
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
export function getContractHeaderSchemas(headers) {
|
|
48
|
+
if (!headers)
|
|
49
|
+
return [];
|
|
50
|
+
return Array.isArray(headers)
|
|
51
|
+
? headers
|
|
52
|
+
: [headers];
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/contracts/types.ts"],"names":[],"mappings":"AAqCA,MAAM,CAAC,MAAM,0BAA0B,GAAG,uBAAuB,CAAC;AAoDlE,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,MAAM;IACN,KAAK;IACL,OAAO;CACqC,CAAC;AAE/C,MAAM,UAAU,yBAAyB,CACvC,MAAkB;IAElB,OAAQ,iBAA2C,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,CAAC,MAAM,8BAA8B,GAAgC;IACzE,WAAW,EAAE;QACX,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,SAAS;QACjB,QAAQ,CAAC,KAAK;YACZ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBAChD,OAAO;oBACL,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,sCAAsC,EAAE,CAAC;iBAC9D,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,GAAG,KAAgC,CAAC;YAC9C,MAAM,MAAM,GAA6B,EAAE,CAAC;YAC5C,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAClC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,iCAAiC,EAAE,CAAC,CAAC;YAC9D,CAAC;YACD,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACrC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,oCAAoC,EAAE,CAAC,CAAC;YACjE,CAAC;YACD,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;gBACvE,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,sCAAsC,EAAE,CAAC,CAAC;YACnE,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClB,OAAO,EAAE,MAAM,EAAE,CAAC;YACpB,CAAC;YAED,OAAO;gBACL,KAAK,EAAE;oBACL,IAAI,EAAE,IAAI,CAAC,IAAc;oBACzB,OAAO,EAAE,IAAI,CAAC,OAAiB;oBAC/B,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAChE,GAAG,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS;wBAC9B,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAmB,EAAE;wBACzC,CAAC,CAAC,EAAE,CAAC;iBACR;aACF,CAAC;QACJ,CAAC;KACF;CACF,CAAC;AA4DF,MAAM,UAAU,wBAAwB,CACtC,OAA0C;IAE1C,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAC3B,CAAC,CAAE,OAAqC;QACxC,CAAC,CAAC,CAAC,OAAyB,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/contracts/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAkC1C,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAoB7E"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { parsePathTemplate } from "./path-template";
|
|
2
|
+
const methodNameMap = {
|
|
3
|
+
GET: "get",
|
|
4
|
+
POST: "create",
|
|
5
|
+
PUT: "update",
|
|
6
|
+
PATCH: "patch",
|
|
7
|
+
DELETE: "delete",
|
|
8
|
+
HEAD: "head",
|
|
9
|
+
OPTIONS: "options",
|
|
10
|
+
};
|
|
11
|
+
function toPascalCase(value) {
|
|
12
|
+
return value
|
|
13
|
+
.replace(/([a-z0-9])([A-Z])/g, "$1 $2")
|
|
14
|
+
.split(/[^a-zA-Z0-9]+/)
|
|
15
|
+
.filter(Boolean)
|
|
16
|
+
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
|
17
|
+
.join("");
|
|
18
|
+
}
|
|
19
|
+
function getMeaningfulPathSegments(path) {
|
|
20
|
+
const segments = parsePathTemplate(path).segments;
|
|
21
|
+
if (segments[0]?.kind === "static" &&
|
|
22
|
+
segments[0].value.toLowerCase() === "api") {
|
|
23
|
+
return segments.slice(1);
|
|
24
|
+
}
|
|
25
|
+
return segments;
|
|
26
|
+
}
|
|
27
|
+
export function generateContractName(method, path) {
|
|
28
|
+
const methodPrefix = methodNameMap[method];
|
|
29
|
+
const segments = getMeaningfulPathSegments(path);
|
|
30
|
+
if (segments.length === 0) {
|
|
31
|
+
return `${methodPrefix}Root`;
|
|
32
|
+
}
|
|
33
|
+
const nameSuffix = segments
|
|
34
|
+
.map((segment) => {
|
|
35
|
+
if (segment.kind === "dynamic") {
|
|
36
|
+
const paramName = toPascalCase(segment.name);
|
|
37
|
+
return `By${paramName || "Param"}`;
|
|
38
|
+
}
|
|
39
|
+
return toPascalCase(segment.value) || "Resource";
|
|
40
|
+
})
|
|
41
|
+
.join("");
|
|
42
|
+
return `${methodPrefix}${nameSuffix}`;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/contracts/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAG9E,MAAM,aAAa,GAA+B;IAChD,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,QAAQ;IACd,GAAG,EAAE,QAAQ;IACb,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,SAAS;CACnB,CAAC;AAEF,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK;SACT,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,KAAK,CAAC,eAAe,CAAC;SACtB,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3D,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,SAAS,yBAAyB,CAAC,IAAY;IAC7C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC;IAElD,IACE,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,QAAQ;QAC9B,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,KAAK,EACzC,CAAC;QACD,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAkB,EAAE,IAAY;IACnE,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,yBAAyB,CAAC,IAAI,CAAC,CAAC;IAEjD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,GAAG,YAAY,MAAM,CAAC;IAC/B,CAAC;IAED,MAAM,UAAU,GAAG,QAAQ;SACxB,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACf,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC7C,OAAO,KAAK,SAAS,IAAI,OAAO,EAAE,CAAC;QACrC,CAAC;QAED,OAAO,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC;IACnD,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,OAAO,GAAG,YAAY,GAAG,UAAU,EAAE,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { StandardSchemaV1 } from "@standard-schema/spec";
|
|
2
|
+
/**
|
|
3
|
+
* Any Standard Schema validator type
|
|
4
|
+
*/
|
|
5
|
+
export type StandardSchema = StandardSchemaV1<unknown, unknown>;
|
|
6
|
+
/**
|
|
7
|
+
* Infer the output type from a Standard Schema
|
|
8
|
+
*/
|
|
9
|
+
export type InferOutput<T extends StandardSchemaV1> = StandardSchemaV1.InferOutput<T>;
|
|
10
|
+
type AnyMethods = Record<string, any>;
|
|
11
|
+
/**
|
|
12
|
+
* Represents an instance of an entity with props, methods, and immutable update capability.
|
|
13
|
+
*/
|
|
14
|
+
export type EntityInstance<Name extends string, Schema extends StandardSchema, Methods extends AnyMethods> = InferOutput<Schema> & {
|
|
15
|
+
/**
|
|
16
|
+
* Create a new entity instance with updated properties (immutable update).
|
|
17
|
+
*/
|
|
18
|
+
with(patch: Partial<InferOutput<Schema>>): EntityInstance<Name, Schema, Methods> | Promise<EntityInstance<Name, Schema, Methods>>;
|
|
19
|
+
/**
|
|
20
|
+
* Convert the entity to a plain JSON object for persistence.
|
|
21
|
+
*/
|
|
22
|
+
toJSON(): InferOutput<Schema>;
|
|
23
|
+
} & Methods;
|
|
24
|
+
/**
|
|
25
|
+
* Represents a defined Entity with schema and factory methods.
|
|
26
|
+
*/
|
|
27
|
+
export interface EntityDef<Name extends string, Schema extends StandardSchema, Methods extends AnyMethods> {
|
|
28
|
+
/** The name of this entity (for debugging/introspection) */
|
|
29
|
+
name: Name;
|
|
30
|
+
/** The Standard Schema for validating entity props */
|
|
31
|
+
schema: Schema;
|
|
32
|
+
/** Create a new entity instance from props */
|
|
33
|
+
create(props: InferOutput<Schema>): EntityInstance<Name, Schema, Methods> | Promise<EntityInstance<Name, Schema, Methods>>;
|
|
34
|
+
/** Reconstruct an entity instance from JSON (e.g., from persistence) */
|
|
35
|
+
fromJSON(json: InferOutput<Schema>): EntityInstance<Name, Schema, Methods> | Promise<EntityInstance<Name, Schema, Methods>>;
|
|
36
|
+
/** Type alias for the entity instance type */
|
|
37
|
+
Type: EntityInstance<Name, Schema, Methods>;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Builder class for creating Entities/Aggregates.
|
|
41
|
+
*/
|
|
42
|
+
declare class EntityBuilder<Name extends string, Schema extends StandardSchema, Methods extends AnyMethods> {
|
|
43
|
+
private readonly cfg;
|
|
44
|
+
constructor(cfg: {
|
|
45
|
+
name: Name;
|
|
46
|
+
schema?: Schema;
|
|
47
|
+
methods?: (self: any) => Methods;
|
|
48
|
+
});
|
|
49
|
+
/**
|
|
50
|
+
* Define the schema for this entity using any Standard Schema compatible validator.
|
|
51
|
+
*/
|
|
52
|
+
props<S extends StandardSchema>(schema: S): EntityBuilder<Name, S, Methods>;
|
|
53
|
+
/**
|
|
54
|
+
* Define methods to attach to entity instances.
|
|
55
|
+
* The method builder receives the base instance (with props, with, and toJSON).
|
|
56
|
+
*/
|
|
57
|
+
methods<M extends AnyMethods>(build: (self: any) => M): EntityBuilder<Name, Schema, M>;
|
|
58
|
+
/**
|
|
59
|
+
* Finalize and build the entity definition.
|
|
60
|
+
*/
|
|
61
|
+
build(): EntityDef<Name, Schema, Methods>;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Create a new Entity builder.
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```ts
|
|
68
|
+
* const Todo = defineEntity("Todo")
|
|
69
|
+
* .props(z.object({
|
|
70
|
+
* id: z.string(),
|
|
71
|
+
* title: z.string(),
|
|
72
|
+
* assigneeIds: z.array(z.string()).default([]),
|
|
73
|
+
* }))
|
|
74
|
+
* .methods((self) => ({
|
|
75
|
+
* addAssignee(id: string) {
|
|
76
|
+
* if (self.assigneeIds.includes(id)) return self;
|
|
77
|
+
* return self.with({ assigneeIds: [...self.assigneeIds, id] });
|
|
78
|
+
* },
|
|
79
|
+
* }))
|
|
80
|
+
* .build();
|
|
81
|
+
*
|
|
82
|
+
* type Todo = typeof Todo.Type;
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
export declare function defineEntity<Name extends string>(name: Name): EntityBuilder<Name, any, Record<string, never>>;
|
|
86
|
+
export {};
|
|
87
|
+
//# sourceMappingURL=entity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../../src/domain/entity.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;AAuDlC,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAEtC;;GAEG;AACH,MAAM,MAAM,cAAc,CACxB,IAAI,SAAS,MAAM,EACnB,MAAM,SAAS,cAAc,EAC7B,OAAO,SAAS,UAAU,IACxB,WAAW,CAAC,MAAM,CAAC,GAAG;IACxB;;OAEG;IACH,IAAI,CACF,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,GAEjC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,GACrC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD;;OAEG;IACH,MAAM,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;CAC/B,GAAG,OAAO,CAAC;AAEZ;;GAEG;AACH,MAAM,WAAW,SAAS,CACxB,IAAI,SAAS,MAAM,EACnB,MAAM,SAAS,cAAc,EAC7B,OAAO,SAAS,UAAU;IAE1B,4DAA4D;IAC5D,IAAI,EAAE,IAAI,CAAC;IACX,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,MAAM,CACJ,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,GAExB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,GACrC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,wEAAwE;IACxE,QAAQ,CACN,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,GAEvB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,GACrC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,8CAA8C;IAC9C,IAAI,EAAE,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7C;AAED;;GAEG;AACH,cAAM,aAAa,CACjB,IAAI,SAAS,MAAM,EACnB,MAAM,SAAS,cAAc,EAC7B,OAAO,SAAS,UAAU;IAGxB,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE;QACpB,IAAI,EAAE,IAAI,CAAC;QACX,MAAM,CAAC,EAAE,MAAM,CAAC;QAEhB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC;KAClC;IAGH;;OAEG;IACH,KAAK,CAAC,CAAC,SAAS,cAAc,EAAE,MAAM,EAAE,CAAC,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC;IAQ3E;;;OAGG;IACH,OAAO,CAAC,CAAC,SAAS,UAAU,EAE1B,KAAK,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,GACtB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAQjC;;OAEG;IACH,KAAK,IAAI,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC;CAgE1C;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,YAAY,CAAC,IAAI,SAAS,MAAM,EAAE,IAAI,EAAE,IAAI,mDAG3D"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validate data using a Standard Schema validator synchronously if possible
|
|
3
|
+
*/
|
|
4
|
+
function validateSchemaSync(schema, data) {
|
|
5
|
+
const result = schema["~standard"].validate(data);
|
|
6
|
+
if (result instanceof Promise) {
|
|
7
|
+
return result.then((resolved) => {
|
|
8
|
+
if (resolved.issues?.length) {
|
|
9
|
+
const message = resolved.issues
|
|
10
|
+
.map((issue) => {
|
|
11
|
+
const path = issue.path !== undefined
|
|
12
|
+
? Array.isArray(issue.path)
|
|
13
|
+
? issue.path.join(".")
|
|
14
|
+
: String(issue.path)
|
|
15
|
+
: "";
|
|
16
|
+
return path ? `${path}: ${issue.message}` : issue.message;
|
|
17
|
+
})
|
|
18
|
+
.join("; ");
|
|
19
|
+
throw new Error(`Validation failed: ${message}`);
|
|
20
|
+
}
|
|
21
|
+
if ("value" in resolved) {
|
|
22
|
+
return resolved.value;
|
|
23
|
+
}
|
|
24
|
+
throw new Error("Invalid Standard Schema result: missing value");
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
if (result.issues?.length) {
|
|
28
|
+
const message = result.issues
|
|
29
|
+
.map((issue) => {
|
|
30
|
+
const path = issue.path !== undefined
|
|
31
|
+
? Array.isArray(issue.path)
|
|
32
|
+
? issue.path.join(".")
|
|
33
|
+
: String(issue.path)
|
|
34
|
+
: "";
|
|
35
|
+
return path ? `${path}: ${issue.message}` : issue.message;
|
|
36
|
+
})
|
|
37
|
+
.join("; ");
|
|
38
|
+
throw new Error(`Validation failed: ${message}`);
|
|
39
|
+
}
|
|
40
|
+
if ("value" in result) {
|
|
41
|
+
return result.value;
|
|
42
|
+
}
|
|
43
|
+
throw new Error("Invalid Standard Schema result: missing value");
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Builder class for creating Entities/Aggregates.
|
|
47
|
+
*/
|
|
48
|
+
class EntityBuilder {
|
|
49
|
+
cfg;
|
|
50
|
+
constructor(cfg) {
|
|
51
|
+
this.cfg = cfg;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Define the schema for this entity using any Standard Schema compatible validator.
|
|
55
|
+
*/
|
|
56
|
+
props(schema) {
|
|
57
|
+
return new EntityBuilder({
|
|
58
|
+
name: this.cfg.name,
|
|
59
|
+
schema,
|
|
60
|
+
methods: this.cfg.methods,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Define methods to attach to entity instances.
|
|
65
|
+
* The method builder receives the base instance (with props, with, and toJSON).
|
|
66
|
+
*/
|
|
67
|
+
methods(
|
|
68
|
+
// biome-ignore lint/suspicious/noExplicitAny: Methods builder receives base instance with props
|
|
69
|
+
build) {
|
|
70
|
+
return new EntityBuilder({
|
|
71
|
+
name: this.cfg.name,
|
|
72
|
+
schema: this.cfg.schema,
|
|
73
|
+
methods: build,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Finalize and build the entity definition.
|
|
78
|
+
*/
|
|
79
|
+
build() {
|
|
80
|
+
if (!this.cfg.schema) {
|
|
81
|
+
throw new Error(`Entity "${this.cfg.name}" is missing props schema`);
|
|
82
|
+
}
|
|
83
|
+
const schema = this.cfg.schema;
|
|
84
|
+
const methodsBuilder = this.cfg.methods;
|
|
85
|
+
const createInstance = (raw) => {
|
|
86
|
+
const validationResult = validateSchemaSync(schema, raw);
|
|
87
|
+
const buildInstance = (parsed) => {
|
|
88
|
+
// Cast parsed to a plain object for spreading
|
|
89
|
+
const parsedObj = parsed;
|
|
90
|
+
// biome-ignore lint/suspicious/noExplicitAny: Dynamic object construction
|
|
91
|
+
const base = {
|
|
92
|
+
...parsedObj,
|
|
93
|
+
// Immutable update - creates a new validated instance
|
|
94
|
+
// Note: Re-validates the merged props for data integrity
|
|
95
|
+
with(patch) {
|
|
96
|
+
const patchObj = patch;
|
|
97
|
+
return createInstance({
|
|
98
|
+
...parsedObj,
|
|
99
|
+
...patchObj,
|
|
100
|
+
});
|
|
101
|
+
},
|
|
102
|
+
toJSON() {
|
|
103
|
+
return parsed;
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
const methods = methodsBuilder?.(base) ?? {};
|
|
107
|
+
const instance = Object.freeze({
|
|
108
|
+
...base,
|
|
109
|
+
...methods,
|
|
110
|
+
});
|
|
111
|
+
return instance;
|
|
112
|
+
};
|
|
113
|
+
if (validationResult instanceof Promise) {
|
|
114
|
+
return validationResult.then(buildInstance);
|
|
115
|
+
}
|
|
116
|
+
return buildInstance(validationResult);
|
|
117
|
+
};
|
|
118
|
+
const def = {
|
|
119
|
+
name: this.cfg.name,
|
|
120
|
+
schema,
|
|
121
|
+
create: createInstance,
|
|
122
|
+
fromJSON: createInstance,
|
|
123
|
+
// Type is undefined at runtime - used only for TypeScript type inference via `typeof Entity.Type`
|
|
124
|
+
Type: undefined,
|
|
125
|
+
};
|
|
126
|
+
return def;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Create a new Entity builder.
|
|
131
|
+
*
|
|
132
|
+
* @example
|
|
133
|
+
* ```ts
|
|
134
|
+
* const Todo = defineEntity("Todo")
|
|
135
|
+
* .props(z.object({
|
|
136
|
+
* id: z.string(),
|
|
137
|
+
* title: z.string(),
|
|
138
|
+
* assigneeIds: z.array(z.string()).default([]),
|
|
139
|
+
* }))
|
|
140
|
+
* .methods((self) => ({
|
|
141
|
+
* addAssignee(id: string) {
|
|
142
|
+
* if (self.assigneeIds.includes(id)) return self;
|
|
143
|
+
* return self.with({ assigneeIds: [...self.assigneeIds, id] });
|
|
144
|
+
* },
|
|
145
|
+
* }))
|
|
146
|
+
* .build();
|
|
147
|
+
*
|
|
148
|
+
* type Todo = typeof Todo.Type;
|
|
149
|
+
* ```
|
|
150
|
+
*/
|
|
151
|
+
export function defineEntity(name) {
|
|
152
|
+
// biome-ignore lint/suspicious/noExplicitAny: Initial schema type will be set via .props()
|
|
153
|
+
return new EntityBuilder({ name });
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=entity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity.js","sourceRoot":"","sources":["../../src/domain/entity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { EventDef, InferEventPayload, StandardSchema } from "../events";
|
|
2
|
+
/**
|
|
3
|
+
* Represents a defined Domain Event with name and payload schema.
|
|
4
|
+
*/
|
|
5
|
+
export type DomainEventDef<Name extends string = string, Payload extends StandardSchema = StandardSchema> = EventDef<Name, Payload>;
|
|
6
|
+
/**
|
|
7
|
+
* Infer the payload type from a DomainEventDef.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* const UserRegistered = defineDomainEvent(
|
|
12
|
+
* "user.registered",
|
|
13
|
+
* z.object({
|
|
14
|
+
* userId: z.string(),
|
|
15
|
+
* email: z.string().email(),
|
|
16
|
+
* })
|
|
17
|
+
* );
|
|
18
|
+
*
|
|
19
|
+
* type Payload = InferEventPayload<typeof UserRegistered>;
|
|
20
|
+
* // { userId: string; email: string }
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export type { InferEventPayload };
|
|
24
|
+
/**
|
|
25
|
+
* Create a new Domain Event definition.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```ts
|
|
29
|
+
* const UserRegistered = defineDomainEvent(
|
|
30
|
+
* "user.registered",
|
|
31
|
+
* z.object({
|
|
32
|
+
* userId: z.string(),
|
|
33
|
+
* email: z.string().email(),
|
|
34
|
+
* })
|
|
35
|
+
* );
|
|
36
|
+
*
|
|
37
|
+
* type UserRegistered = typeof UserRegistered;
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export declare function defineDomainEvent<Name extends string, Payload extends StandardSchema>(name: Name, payload: Payload): DomainEventDef<Name, Payload>;
|
|
41
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/domain/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG7E;;GAEG;AACH,MAAM,MAAM,cAAc,CACxB,IAAI,SAAS,MAAM,GAAG,MAAM,EAC5B,OAAO,SAAS,cAAc,GAAG,cAAc,IAC7C,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAE5B;;;;;;;;;;;;;;;;GAgBG;AACH,YAAY,EAAE,iBAAiB,EAAE,CAAC;AAElC;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,SAAS,MAAM,EACnB,OAAO,SAAS,cAAc,EAC9B,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,GAAG,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAE7D"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { defineEvent } from "../events";
|
|
2
|
+
/**
|
|
3
|
+
* Create a new Domain Event definition.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```ts
|
|
7
|
+
* const UserRegistered = defineDomainEvent(
|
|
8
|
+
* "user.registered",
|
|
9
|
+
* z.object({
|
|
10
|
+
* userId: z.string(),
|
|
11
|
+
* email: z.string().email(),
|
|
12
|
+
* })
|
|
13
|
+
* );
|
|
14
|
+
*
|
|
15
|
+
* type UserRegistered = typeof UserRegistered;
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export function defineDomainEvent(name, payload) {
|
|
19
|
+
return defineEvent(name, { payload });
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/domain/events.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AA6BxC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,iBAAiB,CAG/B,IAAU,EAAE,OAAgB;IAC5B,OAAO,WAAW,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @beignet/core/domain
|
|
3
|
+
*
|
|
4
|
+
* Domain modeling helpers for Beignet - value objects, entities, and domain events.
|
|
5
|
+
*
|
|
6
|
+
* This package provides small, framework-agnostic helpers for domain modeling:
|
|
7
|
+
* - A Value Object builder (defineValueObject)
|
|
8
|
+
* - An Entity/Aggregate builder (defineEntity)
|
|
9
|
+
* - A Domain Event helper (defineDomainEvent)
|
|
10
|
+
*/
|
|
11
|
+
export { defineEntity, type EntityDef, type EntityInstance } from "./entity";
|
|
12
|
+
export { type DomainEventDef, defineDomainEvent, type InferEventPayload, } from "./events";
|
|
13
|
+
export { defineValueObject, type ValueObjectDef } from "./value-object";
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/domain/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,KAAK,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC;AAC7E,OAAO,EACL,KAAK,cAAc,EACnB,iBAAiB,EACjB,KAAK,iBAAiB,GACvB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,iBAAiB,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @beignet/core/domain
|
|
3
|
+
*
|
|
4
|
+
* Domain modeling helpers for Beignet - value objects, entities, and domain events.
|
|
5
|
+
*
|
|
6
|
+
* This package provides small, framework-agnostic helpers for domain modeling:
|
|
7
|
+
* - A Value Object builder (defineValueObject)
|
|
8
|
+
* - An Entity/Aggregate builder (defineEntity)
|
|
9
|
+
* - A Domain Event helper (defineDomainEvent)
|
|
10
|
+
*/
|
|
11
|
+
export { defineEntity } from "./entity";
|
|
12
|
+
export { defineDomainEvent, } from "./events";
|
|
13
|
+
export { defineValueObject } from "./value-object";
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/domain/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAuC,MAAM,UAAU,CAAC;AAC7E,OAAO,EAEL,iBAAiB,GAElB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,iBAAiB,EAAuB,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { StandardSchemaV1 } from "@standard-schema/spec";
|
|
2
|
+
/**
|
|
3
|
+
* Any Standard Schema validator type
|
|
4
|
+
*/
|
|
5
|
+
export type StandardSchema = StandardSchemaV1<unknown, unknown>;
|
|
6
|
+
/**
|
|
7
|
+
* Infer the output type from a Standard Schema
|
|
8
|
+
*/
|
|
9
|
+
export type InferOutput<T extends StandardSchemaV1> = StandardSchemaV1.InferOutput<T>;
|
|
10
|
+
/**
|
|
11
|
+
* Represents a defined Value Object with validation and type information.
|
|
12
|
+
*/
|
|
13
|
+
export interface ValueObjectDef<Name extends string, Schema extends StandardSchema> {
|
|
14
|
+
/** The name of this value object (for debugging/introspection) */
|
|
15
|
+
name: Name;
|
|
16
|
+
/** The schema used for validation (any Standard Schema compatible) */
|
|
17
|
+
schema: Schema;
|
|
18
|
+
/** Create a validated value object from unknown input (async due to Standard Schema) */
|
|
19
|
+
create(input: unknown): Promise<InferOutput<Schema>>;
|
|
20
|
+
/** Type guard to check if an input is valid for this value object (async due to Standard Schema) */
|
|
21
|
+
isValid(input: unknown): Promise<boolean>;
|
|
22
|
+
/** Type alias for the inferred TypeScript type */
|
|
23
|
+
Type: InferOutput<Schema>;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Builder class for creating Value Objects.
|
|
27
|
+
*/
|
|
28
|
+
declare class ValueObjectBuilder<Name extends string, Schema extends StandardSchema> {
|
|
29
|
+
private readonly cfg;
|
|
30
|
+
constructor(cfg: {
|
|
31
|
+
name: Name;
|
|
32
|
+
schema?: Schema;
|
|
33
|
+
});
|
|
34
|
+
/**
|
|
35
|
+
* Set the schema for this value object.
|
|
36
|
+
*/
|
|
37
|
+
schema<S extends StandardSchema>(s: S): ValueObjectBuilder<Name, S>;
|
|
38
|
+
/**
|
|
39
|
+
* Finalize the value object definition.
|
|
40
|
+
*/
|
|
41
|
+
build(): ValueObjectDef<Name, Schema>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Create a new Value Object builder.
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```ts
|
|
48
|
+
* const Email = defineValueObject("Email")
|
|
49
|
+
* .schema(z.string().email())
|
|
50
|
+
* .build();
|
|
51
|
+
*
|
|
52
|
+
* type Email = typeof Email.Type;
|
|
53
|
+
*
|
|
54
|
+
* const email = await Email.create("test@example.com"); // OK
|
|
55
|
+
* const isValid = await Email.isValid("test@example.com"); // true
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export declare function defineValueObject<Name extends string>(name: Name): ValueObjectBuilder<Name, never>;
|
|
59
|
+
export {};
|
|
60
|
+
//# sourceMappingURL=value-object.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"value-object.d.ts","sourceRoot":"","sources":["../../src/domain/value-object.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;AAyClC;;GAEG;AACH,MAAM,WAAW,cAAc,CAC7B,IAAI,SAAS,MAAM,EACnB,MAAM,SAAS,cAAc;IAE7B,kEAAkE;IAClE,IAAI,EAAE,IAAI,CAAC;IACX,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAC;IACf,wFAAwF;IACxF,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IACrD,oGAAoG;IACpG,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,kDAAkD;IAClD,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC3B;AAED;;GAEG;AACH,cAAM,kBAAkB,CAAC,IAAI,SAAS,MAAM,EAAE,MAAM,SAAS,cAAc;IAEvE,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE;QACpB,IAAI,EAAE,IAAI,CAAC;QACX,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB;IAGH;;OAEG;IACH,MAAM,CAAC,CAAC,SAAS,cAAc,EAAE,CAAC,EAAE,CAAC,GAAG,kBAAkB,CAAC,IAAI,EAAE,CAAC,CAAC;IAInE;;OAEG;IACH,KAAK,IAAI,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC;CAsBtC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,SAAS,MAAM,EAAE,IAAI,EAAE,IAAI,mCAGhE"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validate data using a Standard Schema validator
|
|
3
|
+
*/
|
|
4
|
+
async function validateSchema(schema, data) {
|
|
5
|
+
const result = await schema["~standard"].validate(data);
|
|
6
|
+
if (result.issues?.length) {
|
|
7
|
+
const message = result.issues
|
|
8
|
+
.map((issue) => {
|
|
9
|
+
const path = issue.path !== undefined
|
|
10
|
+
? Array.isArray(issue.path)
|
|
11
|
+
? issue.path.join(".")
|
|
12
|
+
: String(issue.path)
|
|
13
|
+
: "";
|
|
14
|
+
return path ? `${path}: ${issue.message}` : issue.message;
|
|
15
|
+
})
|
|
16
|
+
.join("; ");
|
|
17
|
+
throw new Error(`Validation failed: ${message}`);
|
|
18
|
+
}
|
|
19
|
+
if ("value" in result) {
|
|
20
|
+
return result.value;
|
|
21
|
+
}
|
|
22
|
+
throw new Error("Invalid Standard Schema result: missing value");
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Check if data is valid according to a Standard Schema
|
|
26
|
+
*/
|
|
27
|
+
async function isValid(schema, data) {
|
|
28
|
+
const result = await schema["~standard"].validate(data);
|
|
29
|
+
return !result.issues?.length && "value" in result;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Builder class for creating Value Objects.
|
|
33
|
+
*/
|
|
34
|
+
class ValueObjectBuilder {
|
|
35
|
+
cfg;
|
|
36
|
+
constructor(cfg) {
|
|
37
|
+
this.cfg = cfg;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Set the schema for this value object.
|
|
41
|
+
*/
|
|
42
|
+
schema(s) {
|
|
43
|
+
return new ValueObjectBuilder({ ...this.cfg, schema: s });
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Finalize the value object definition.
|
|
47
|
+
*/
|
|
48
|
+
build() {
|
|
49
|
+
if (!this.cfg.schema) {
|
|
50
|
+
throw new Error(`Value object "${this.cfg.name}" is missing a schema`);
|
|
51
|
+
}
|
|
52
|
+
const schemaToUse = this.cfg.schema;
|
|
53
|
+
const def = {
|
|
54
|
+
name: this.cfg.name,
|
|
55
|
+
schema: schemaToUse,
|
|
56
|
+
async create(input) {
|
|
57
|
+
return validateSchema(schemaToUse, input);
|
|
58
|
+
},
|
|
59
|
+
async isValid(input) {
|
|
60
|
+
return isValid(schemaToUse, input);
|
|
61
|
+
},
|
|
62
|
+
// Type is undefined at runtime - used only for TypeScript type inference via `typeof ValueObject.Type`
|
|
63
|
+
Type: undefined,
|
|
64
|
+
};
|
|
65
|
+
return def;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Create a new Value Object builder.
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```ts
|
|
73
|
+
* const Email = defineValueObject("Email")
|
|
74
|
+
* .schema(z.string().email())
|
|
75
|
+
* .build();
|
|
76
|
+
*
|
|
77
|
+
* type Email = typeof Email.Type;
|
|
78
|
+
*
|
|
79
|
+
* const email = await Email.create("test@example.com"); // OK
|
|
80
|
+
* const isValid = await Email.isValid("test@example.com"); // true
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
export function defineValueObject(name) {
|
|
84
|
+
// biome-ignore lint/suspicious/noExplicitAny: Initial schema type is never, will be set via .schema()
|
|
85
|
+
return new ValueObjectBuilder({ name });
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=value-object.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"value-object.js","sourceRoot":"","sources":["../../src/domain/value-object.ts"],"names":[],"mappings":"AAaA;;GAEG;AACH,KAAK,UAAU,cAAc,CAC3B,MAAoC,EACpC,IAAa;IAEb,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACxD,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM;aAC1B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACb,MAAM,IAAI,GACR,KAAK,CAAC,IAAI,KAAK,SAAS;gBACtB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;oBACzB,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;oBACtB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;gBACtB,CAAC,CAAC,EAAE,CAAC;YACT,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;QAC5D,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;QACtB,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;AACnE,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,OAAO,CACpB,MAAoC,EACpC,IAAa;IAEb,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACxD,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,OAAO,IAAI,MAAM,CAAC;AACrD,CAAC;AAqBD;;GAEG;AACH,MAAM,kBAAkB;IAEH;IADnB,YACmB,GAGhB;QAHgB,QAAG,GAAH,GAAG,CAGnB;IACA,CAAC;IAEJ;;OAEG;IACH,MAAM,CAA2B,CAAI;QACnC,OAAO,IAAI,kBAAkB,CAAU,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IACrE,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,CAAC,GAAG,CAAC,IAAI,uBAAuB,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;QAEpC,MAAM,GAAG,GAAiC;YACxC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI;YACnB,MAAM,EAAE,WAAW;YACnB,KAAK,CAAC,MAAM,CAAC,KAAc;gBACzB,OAAO,cAAc,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YAC5C,CAAC;YACD,KAAK,CAAC,OAAO,CAAC,KAAc;gBAC1B,OAAO,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YACrC,CAAC;YACD,uGAAuG;YACvG,IAAI,EAAE,SAA2C;SAClD,CAAC;QAEF,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,iBAAiB,CAAsB,IAAU;IAC/D,sGAAsG;IACtG,OAAO,IAAI,kBAAkB,CAAc,EAAE,IAAI,EAAS,CAAC,CAAC;AAC9D,CAAC"}
|