@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,74 @@
|
|
|
1
|
+
import { redactValue } from "./redaction";
|
|
2
|
+
export function createAnonymousActor(options = {}) {
|
|
3
|
+
return { type: "anonymous", ...options };
|
|
4
|
+
}
|
|
5
|
+
export function createServiceActor(id, options = {}) {
|
|
6
|
+
return { type: "service", id, ...options };
|
|
7
|
+
}
|
|
8
|
+
export function createSystemActor(id = "system", options = {}) {
|
|
9
|
+
return { type: "system", id, ...options };
|
|
10
|
+
}
|
|
11
|
+
export function createUserActor(id, options = {}) {
|
|
12
|
+
return { type: "user", id, ...options };
|
|
13
|
+
}
|
|
14
|
+
export function createTenant(id, options = {}) {
|
|
15
|
+
return { id, ...options };
|
|
16
|
+
}
|
|
17
|
+
export function normalizeAuditLogEntry(entry) {
|
|
18
|
+
return {
|
|
19
|
+
...entry,
|
|
20
|
+
occurredAt: entry.occurredAt ?? new Date(),
|
|
21
|
+
outcome: entry.outcome ?? "success",
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export function redactAuditLogEntry(entry) {
|
|
25
|
+
return {
|
|
26
|
+
...entry,
|
|
27
|
+
actor: {
|
|
28
|
+
...entry.actor,
|
|
29
|
+
metadata: entry.actor.metadata
|
|
30
|
+
? redactValue(entry.actor.metadata)
|
|
31
|
+
: entry.actor.metadata,
|
|
32
|
+
},
|
|
33
|
+
tenant: entry.tenant
|
|
34
|
+
? {
|
|
35
|
+
...entry.tenant,
|
|
36
|
+
metadata: entry.tenant.metadata
|
|
37
|
+
? redactValue(entry.tenant.metadata)
|
|
38
|
+
: entry.tenant.metadata,
|
|
39
|
+
}
|
|
40
|
+
: entry.tenant,
|
|
41
|
+
resource: entry.resource
|
|
42
|
+
? {
|
|
43
|
+
...entry.resource,
|
|
44
|
+
metadata: entry.resource.metadata
|
|
45
|
+
? redactValue(entry.resource.metadata)
|
|
46
|
+
: entry.resource.metadata,
|
|
47
|
+
}
|
|
48
|
+
: entry.resource,
|
|
49
|
+
metadata: entry.metadata ? redactValue(entry.metadata) : entry.metadata,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export function createRedactedAuditLog(audit, options = {}) {
|
|
53
|
+
return {
|
|
54
|
+
record(entry) {
|
|
55
|
+
const normalized = normalizeAuditLogEntry(entry);
|
|
56
|
+
const redacted = options.redact
|
|
57
|
+
? options.redact(redactAuditLogEntry(normalized))
|
|
58
|
+
: redactAuditLogEntry(normalized);
|
|
59
|
+
return audit.record(redacted);
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
export function createMemoryAuditLog(entries = [], options = {}) {
|
|
64
|
+
return {
|
|
65
|
+
entries,
|
|
66
|
+
record(entry) {
|
|
67
|
+
const normalized = normalizeAuditLogEntry(entry);
|
|
68
|
+
entries.push(options.redact
|
|
69
|
+
? options.redact(redactAuditLogEntry(normalized))
|
|
70
|
+
: redactAuditLogEntry(normalized));
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/ports/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface AuthRequestLike {
|
|
2
|
+
headers: Headers;
|
|
3
|
+
raw?: Request;
|
|
4
|
+
}
|
|
5
|
+
export interface AuthSession<User = unknown, Session = unknown> {
|
|
6
|
+
user: User;
|
|
7
|
+
session?: Session;
|
|
8
|
+
}
|
|
9
|
+
export declare class AuthUnauthorizedError extends Error {
|
|
10
|
+
readonly code = "UNAUTHORIZED";
|
|
11
|
+
constructor(message?: string);
|
|
12
|
+
}
|
|
13
|
+
export interface AuthPort<User = unknown, Session = unknown, RequestLike extends AuthRequestLike = AuthRequestLike> {
|
|
14
|
+
getSession(req: RequestLike): Promise<AuthSession<User, Session> | null>;
|
|
15
|
+
getUser(req: RequestLike): Promise<User | null>;
|
|
16
|
+
requireUser(req: RequestLike): Promise<User>;
|
|
17
|
+
}
|
|
18
|
+
type MaybePromise<T> = T | Promise<T>;
|
|
19
|
+
export type StaticAuthSessionFactory<User, Session, RequestLike extends AuthRequestLike> = (req: RequestLike) => MaybePromise<AuthSession<User, Session> | null>;
|
|
20
|
+
export declare function createStaticAuth<User, Session = unknown, RequestLike extends AuthRequestLike = AuthRequestLike>(session: AuthSession<User, Session> | null | StaticAuthSessionFactory<User, Session, RequestLike>): AuthPort<User, Session, RequestLike>;
|
|
21
|
+
export declare function createAnonymousAuth<User = unknown, Session = unknown, RequestLike extends AuthRequestLike = AuthRequestLike>(): AuthPort<User, Session, RequestLike>;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/ports/auth.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,WAAW,CAAC,IAAI,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO;IAC5D,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,IAAI,kBAAkB;gBAEnB,OAAO,SAAiB;CAIrC;AAED,MAAM,WAAW,QAAQ,CACvB,IAAI,GAAG,OAAO,EACd,OAAO,GAAG,OAAO,EACjB,WAAW,SAAS,eAAe,GAAG,eAAe;IAErD,UAAU,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAChD,WAAW,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9C;AAED,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAEtC,MAAM,MAAM,wBAAwB,CAClC,IAAI,EACJ,OAAO,EACP,WAAW,SAAS,eAAe,IACjC,CAAC,GAAG,EAAE,WAAW,KAAK,YAAY,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;AAE1E,wBAAgB,gBAAgB,CAC9B,IAAI,EACJ,OAAO,GAAG,OAAO,EACjB,WAAW,SAAS,eAAe,GAAG,eAAe,EAErD,OAAO,EACH,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,GAC1B,IAAI,GACJ,wBAAwB,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,GACvD,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,CAqBtC;AAED,wBAAgB,mBAAmB,CACjC,IAAI,GAAG,OAAO,EACd,OAAO,GAAG,OAAO,EACjB,WAAW,SAAS,eAAe,GAAG,eAAe,KAClD,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,CAExC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export class AuthUnauthorizedError extends Error {
|
|
2
|
+
code = "UNAUTHORIZED";
|
|
3
|
+
constructor(message = "Unauthorized") {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = "AuthUnauthorizedError";
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export function createStaticAuth(session) {
|
|
9
|
+
async function resolveSession(req) {
|
|
10
|
+
return typeof session === "function" ? session(req) : session;
|
|
11
|
+
}
|
|
12
|
+
return {
|
|
13
|
+
async getSession(req) {
|
|
14
|
+
return resolveSession(req);
|
|
15
|
+
},
|
|
16
|
+
async getUser(req) {
|
|
17
|
+
return (await resolveSession(req))?.user ?? null;
|
|
18
|
+
},
|
|
19
|
+
async requireUser(req) {
|
|
20
|
+
const user = (await resolveSession(req))?.user ?? null;
|
|
21
|
+
if (!user) {
|
|
22
|
+
throw new AuthUnauthorizedError();
|
|
23
|
+
}
|
|
24
|
+
return user;
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export function createAnonymousAuth() {
|
|
29
|
+
return createStaticAuth(null);
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/ports/auth.ts"],"names":[],"mappings":"AAUA,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IACrC,IAAI,GAAG,cAAc,CAAC;IAE/B,YAAY,OAAO,GAAG,cAAc;QAClC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAoBD,MAAM,UAAU,gBAAgB,CAK9B,OAGwD;IAExD,KAAK,UAAU,cAAc,CAAC,GAAgB;QAC5C,OAAO,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAChE,CAAC;IAED,OAAO;QACL,KAAK,CAAC,UAAU,CAAC,GAAG;YAClB,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,GAAG;YACf,OAAO,CAAC,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC;QACnD,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,GAAG;YACnB,MAAM,IAAI,GAAG,CAAC,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC;YACvD,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,qBAAqB,EAAE,CAAC;YACpC,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB;IAKjC,OAAO,gBAAgB,CAA6B,IAAI,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PortsBuilder - Mutable builder for composing ports during app initialization
|
|
3
|
+
*
|
|
4
|
+
* This builder is a small composition helper for tests and custom bootstrapping
|
|
5
|
+
* code that wants to assemble ports incrementally.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* A mutable builder around a ports object.
|
|
9
|
+
* Used during app composition and provider registration.
|
|
10
|
+
*/
|
|
11
|
+
export interface PortsBuilder<Ports> {
|
|
12
|
+
/**
|
|
13
|
+
* The current ports object being built.
|
|
14
|
+
* This is mutated internally when extend/replace are called.
|
|
15
|
+
*/
|
|
16
|
+
ports: Ports;
|
|
17
|
+
/**
|
|
18
|
+
* Extend ports with a new key. If the key already exists, it's overwritten.
|
|
19
|
+
*
|
|
20
|
+
* Returns the same builder instance with an extended type:
|
|
21
|
+
* Ports & { [K in key]: Value }
|
|
22
|
+
*/
|
|
23
|
+
extend<K extends string, V>(key: K, value: V): PortsBuilder<Ports & {
|
|
24
|
+
[P in K]: V;
|
|
25
|
+
}>;
|
|
26
|
+
/**
|
|
27
|
+
* Replace an existing key. Does not change the type, but updates the runtime value.
|
|
28
|
+
* Returns the same builder instance.
|
|
29
|
+
*/
|
|
30
|
+
replace<K extends keyof Ports>(key: K, value: Ports[K]): PortsBuilder<Ports>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Create a new PortsBuilder from an initial ports object.
|
|
34
|
+
*
|
|
35
|
+
* The builder wraps a mutable object internally and provides type-safe methods
|
|
36
|
+
* to extend or replace ports. This is used during application composition
|
|
37
|
+
* helpers that want to modify ports before passing them to a server.
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```ts
|
|
41
|
+
* const initialPorts = definePorts({ db: dbAdapter });
|
|
42
|
+
* const builder = createPortsBuilder(initialPorts);
|
|
43
|
+
*
|
|
44
|
+
* // Provider extends with cache
|
|
45
|
+
* builder.extend("cache", cacheAdapter);
|
|
46
|
+
*
|
|
47
|
+
* // Final ports includes both db and cache
|
|
48
|
+
* const finalPorts = builder.ports;
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export declare function createPortsBuilder<Ports>(initialPorts: Ports): PortsBuilder<Ports>;
|
|
52
|
+
/**
|
|
53
|
+
* Extract the Ports type from a PortsBuilder
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```ts
|
|
57
|
+
* type MyPorts = PortsOf<typeof builder>;
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export type PortsOf<PB> = PB extends PortsBuilder<infer P> ? P : never;
|
|
61
|
+
//# sourceMappingURL=builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/ports/builder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,WAAW,YAAY,CAAC,KAAK;IACjC;;;OAGG;IACH,KAAK,EAAE,KAAK,CAAC;IAEb;;;;;OAKG;IACH,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,EACxB,GAAG,EAAE,CAAC,EACN,KAAK,EAAE,CAAC,GACP,YAAY,CAAC,KAAK,GAAG;SAAG,CAAC,IAAI,CAAC,GAAG,CAAC;KAAE,CAAC,CAAC;IAEzC;;;OAGG;IACH,OAAO,CAAC,CAAC,SAAS,MAAM,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;CAC9E;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EACtC,YAAY,EAAE,KAAK,GAClB,YAAY,CAAC,KAAK,CAAC,CA6BrB;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PortsBuilder - Mutable builder for composing ports during app initialization
|
|
3
|
+
*
|
|
4
|
+
* This builder is a small composition helper for tests and custom bootstrapping
|
|
5
|
+
* code that wants to assemble ports incrementally.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Create a new PortsBuilder from an initial ports object.
|
|
9
|
+
*
|
|
10
|
+
* The builder wraps a mutable object internally and provides type-safe methods
|
|
11
|
+
* to extend or replace ports. This is used during application composition
|
|
12
|
+
* helpers that want to modify ports before passing them to a server.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* const initialPorts = definePorts({ db: dbAdapter });
|
|
17
|
+
* const builder = createPortsBuilder(initialPorts);
|
|
18
|
+
*
|
|
19
|
+
* // Provider extends with cache
|
|
20
|
+
* builder.extend("cache", cacheAdapter);
|
|
21
|
+
*
|
|
22
|
+
* // Final ports includes both db and cache
|
|
23
|
+
* const finalPorts = builder.ports;
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export function createPortsBuilder(initialPorts) {
|
|
27
|
+
// Keep a mutable object internally
|
|
28
|
+
// biome-ignore lint/suspicious/noExplicitAny: internal mutable state needs any to accept arbitrary port extensions
|
|
29
|
+
const state = {
|
|
30
|
+
ports: { ...initialPorts },
|
|
31
|
+
};
|
|
32
|
+
const builder = {
|
|
33
|
+
get ports() {
|
|
34
|
+
// Could freeze in dev, but keep simple
|
|
35
|
+
return state.ports;
|
|
36
|
+
},
|
|
37
|
+
extend(key, value) {
|
|
38
|
+
state.ports[key] = value;
|
|
39
|
+
return builder;
|
|
40
|
+
},
|
|
41
|
+
replace(key, value) {
|
|
42
|
+
state.ports[key] = value;
|
|
43
|
+
return builder;
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
return builder;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/ports/builder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA+BH;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,kBAAkB,CAChC,YAAmB;IAEnB,mCAAmC;IACnC,mHAAmH;IACnH,MAAM,KAAK,GAAmB;QAC5B,KAAK,EAAE,EAAE,GAAG,YAAY,EAAE;KAC3B,CAAC;IAEF,MAAM,OAAO,GAAwB;QACnC,IAAI,KAAK;YACP,uCAAuC;YACvC,OAAO,KAAK,CAAC,KAAc,CAAC;QAC9B,CAAC;QACD,MAAM,CACJ,GAAM,EACN,KAAQ;YAER,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACzB,OAAO,OAA2D,CAAC;QACrE,CAAC;QACD,OAAO,CACL,GAAM,EACN,KAAe;YAEf,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACzB,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface CacheSetOptions {
|
|
2
|
+
/**
|
|
3
|
+
* Time-to-live in seconds. Omit this for a value that does not expire.
|
|
4
|
+
*/
|
|
5
|
+
ttlSeconds?: number;
|
|
6
|
+
}
|
|
7
|
+
export interface CachePort {
|
|
8
|
+
get(key: string): Promise<string | null>;
|
|
9
|
+
set(key: string, value: string, options?: CacheSetOptions): Promise<void>;
|
|
10
|
+
delete(key: string): Promise<boolean>;
|
|
11
|
+
has(key: string): Promise<boolean>;
|
|
12
|
+
remember(key: string, factory: () => Promise<string>, options?: CacheSetOptions): Promise<string>;
|
|
13
|
+
}
|
|
14
|
+
export declare function createMemoryCache(initialValues?: Record<string, string>): CachePort;
|
|
15
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/ports/cache.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,QAAQ,CACN,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,EAC9B,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,MAAM,CAAC,CAAC;CACpB;AAuBD,wBAAgB,iBAAiB,CAC/B,aAAa,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACzC,SAAS,CAmDX"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
function resolveExpiresAt(options) {
|
|
2
|
+
if (options?.ttlSeconds == null) {
|
|
3
|
+
return null;
|
|
4
|
+
}
|
|
5
|
+
if (options.ttlSeconds <= 0) {
|
|
6
|
+
return Date.now();
|
|
7
|
+
}
|
|
8
|
+
return Date.now() + options.ttlSeconds * 1000;
|
|
9
|
+
}
|
|
10
|
+
function isExpired(entry) {
|
|
11
|
+
return entry.expiresAt != null && entry.expiresAt <= Date.now();
|
|
12
|
+
}
|
|
13
|
+
export function createMemoryCache(initialValues = {}) {
|
|
14
|
+
const values = new Map(Object.entries(initialValues).map(([key, value]) => [
|
|
15
|
+
key,
|
|
16
|
+
{ value, expiresAt: null },
|
|
17
|
+
]));
|
|
18
|
+
async function getFreshEntry(key) {
|
|
19
|
+
const entry = values.get(key);
|
|
20
|
+
if (!entry) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
if (isExpired(entry)) {
|
|
24
|
+
values.delete(key);
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
return entry;
|
|
28
|
+
}
|
|
29
|
+
const cache = {
|
|
30
|
+
async get(key) {
|
|
31
|
+
return (await getFreshEntry(key))?.value ?? null;
|
|
32
|
+
},
|
|
33
|
+
async set(key, value, options) {
|
|
34
|
+
values.set(key, {
|
|
35
|
+
value,
|
|
36
|
+
expiresAt: resolveExpiresAt(options),
|
|
37
|
+
});
|
|
38
|
+
},
|
|
39
|
+
async delete(key) {
|
|
40
|
+
return values.delete(key);
|
|
41
|
+
},
|
|
42
|
+
async has(key) {
|
|
43
|
+
return (await getFreshEntry(key)) != null;
|
|
44
|
+
},
|
|
45
|
+
async remember(key, factory, options) {
|
|
46
|
+
const cached = await cache.get(key);
|
|
47
|
+
if (cached != null) {
|
|
48
|
+
return cached;
|
|
49
|
+
}
|
|
50
|
+
const value = await factory();
|
|
51
|
+
await cache.set(key, value, options);
|
|
52
|
+
return value;
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
return cache;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/ports/cache.ts"],"names":[],"mappings":"AAwBA,SAAS,gBAAgB,CAAC,OAAoC;IAC5D,IAAI,OAAO,EAAE,UAAU,IAAI,IAAI,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,OAAO,CAAC,UAAU,IAAI,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC;IACpB,CAAC;IAED,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;AAChD,CAAC;AAED,SAAS,SAAS,CAAC,KAAuB;IACxC,OAAO,KAAK,CAAC,SAAS,IAAI,IAAI,IAAI,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,gBAAwC,EAAE;IAE1C,MAAM,MAAM,GAAG,IAAI,GAAG,CACpB,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;QAClD,GAAG;QACH,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE;KAC3B,CAAC,CACH,CAAC;IAEF,KAAK,UAAU,aAAa,CAAC,GAAW;QACtC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACnB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,KAAK,GAAc;QACvB,KAAK,CAAC,GAAG,CAAC,GAAG;YACX,OAAO,CAAC,MAAM,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC;QACnD,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO;YAC3B,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE;gBACd,KAAK;gBACL,SAAS,EAAE,gBAAgB,CAAC,OAAO,CAAC;aACrC,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,GAAG;YACd,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,GAAG;YACX,OAAO,CAAC,MAAM,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;QAC5C,CAAC;QACD,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO;YAClC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACpC,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBACnB,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,OAAO,EAAE,CAAC;YAC9B,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YACrC,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;IAEF,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface ClockPort {
|
|
2
|
+
now(): Date;
|
|
3
|
+
}
|
|
4
|
+
export interface FrozenClockPort extends ClockPort {
|
|
5
|
+
setNow(value: Date | string | number): void;
|
|
6
|
+
advance(milliseconds: number): void;
|
|
7
|
+
}
|
|
8
|
+
export declare function createSystemClock(): ClockPort;
|
|
9
|
+
export declare function createFrozenClock(initial?: Date | string | number): FrozenClockPort;
|
|
10
|
+
//# sourceMappingURL=clock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clock.d.ts","sourceRoot":"","sources":["../../src/ports/clock.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,GAAG,IAAI,IAAI,CAAC;CACb;AAED,MAAM,WAAW,eAAgB,SAAQ,SAAS;IAChD,MAAM,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC5C,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAMD,wBAAgB,iBAAiB,IAAI,SAAS,CAI7C;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,GAAE,IAAI,GAAG,MAAM,GAAG,MAAoB,GAC5C,eAAe,CAYjB"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
function toDate(value) {
|
|
2
|
+
return value instanceof Date ? new Date(value.getTime()) : new Date(value);
|
|
3
|
+
}
|
|
4
|
+
export function createSystemClock() {
|
|
5
|
+
return {
|
|
6
|
+
now: () => new Date(),
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export function createFrozenClock(initial = new Date(0)) {
|
|
10
|
+
let current = toDate(initial);
|
|
11
|
+
return {
|
|
12
|
+
now: () => new Date(current.getTime()),
|
|
13
|
+
setNow: (value) => {
|
|
14
|
+
current = toDate(value);
|
|
15
|
+
},
|
|
16
|
+
advance: (milliseconds) => {
|
|
17
|
+
current = new Date(current.getTime() + milliseconds);
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=clock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clock.js","sourceRoot":"","sources":["../../src/ports/clock.ts"],"names":[],"mappings":"AASA,SAAS,MAAM,CAAC,KAA6B;IAC3C,OAAO,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO;QACL,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE;KACtB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,UAAkC,IAAI,IAAI,CAAC,CAAC,CAAC;IAE7C,IAAI,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAE9B,OAAO;QACL,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACtC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YAChB,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;QACD,OAAO,EAAE,CAAC,YAAY,EAAE,EAAE;YACxB,OAAO,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,YAAY,CAAC,CAAC;QACvD,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { EventPayloadDef, InferEventPayload as InferContractEventPayload, StandardSchema } from "../events";
|
|
2
|
+
import type { JobDef as ContractJobDef, InferJobPayload as InferContractJobPayload } from "../jobs";
|
|
3
|
+
/**
|
|
4
|
+
* Represents a defined Domain Event with name and payload schema.
|
|
5
|
+
* This is a minimal interface that ports need - implementations can use
|
|
6
|
+
* the full DomainEventDef from @beignet/core/domain if desired.
|
|
7
|
+
*/
|
|
8
|
+
export interface DomainEventDef<Name extends string = string, Payload extends StandardSchema = StandardSchema> extends EventPayloadDef<Name, Payload> {
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Infer the payload type from a DomainEventDef.
|
|
12
|
+
*/
|
|
13
|
+
export type InferEventPayload<E extends DomainEventDef> = InferContractEventPayload<E>;
|
|
14
|
+
/**
|
|
15
|
+
* Represents a job definition with a typed payload schema.
|
|
16
|
+
*
|
|
17
|
+
* Job dispatchers use Beignet's first-class job definitions. Inline
|
|
18
|
+
* dispatchers can run the handler directly;
|
|
19
|
+
* durable dispatchers can ignore it and enqueue the job name plus parsed
|
|
20
|
+
* payload.
|
|
21
|
+
*/
|
|
22
|
+
export type JobDef<Name extends string = string, Payload extends StandardSchema = StandardSchema, Ctx = unknown> = ContractJobDef<Name, Payload, Ctx>;
|
|
23
|
+
/**
|
|
24
|
+
* Infer the payload type from a JobDef.
|
|
25
|
+
*/
|
|
26
|
+
export type InferJobPayload<J extends JobDef> = InferContractJobPayload<J>;
|
|
27
|
+
/**
|
|
28
|
+
* An EventBus port for publishing and subscribing to domain events.
|
|
29
|
+
*
|
|
30
|
+
* This interface defines a framework-agnostic contract for event-driven
|
|
31
|
+
* communication within your application.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```ts
|
|
35
|
+
* import { createInMemoryEventBus } from "@beignet/provider-event-bus-memory";
|
|
36
|
+
*
|
|
37
|
+
* const eventBus = createInMemoryEventBus();
|
|
38
|
+
*
|
|
39
|
+
* // Subscribe to an event
|
|
40
|
+
* const unsubscribe = eventBus.subscribe(UserRegistered, (payload) => {
|
|
41
|
+
* console.log(`User registered: ${payload.email}`);
|
|
42
|
+
* });
|
|
43
|
+
*
|
|
44
|
+
* // Publish an event
|
|
45
|
+
* await eventBus.publish(UserRegistered, { userId: "123", email: "test@example.com" });
|
|
46
|
+
*
|
|
47
|
+
* // Unsubscribe when done
|
|
48
|
+
* unsubscribe();
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export interface EventBusPort {
|
|
52
|
+
/**
|
|
53
|
+
* Publish a domain event with a typed payload.
|
|
54
|
+
*/
|
|
55
|
+
publish<E extends DomainEventDef>(event: E, payload: InferEventPayload<E>): Promise<void> | void;
|
|
56
|
+
/**
|
|
57
|
+
* Subscribe to a domain event. Returns an unsubscribe function.
|
|
58
|
+
*/
|
|
59
|
+
subscribe<E extends DomainEventDef>(event: E, handler: (payload: InferEventPayload<E>) => Promise<void> | void): () => void;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* A port for dispatching explicit background jobs.
|
|
63
|
+
*
|
|
64
|
+
* Jobs represent work to do, not facts that happened. Implementations may run
|
|
65
|
+
* inline in tests, enqueue into a durable worker, or call an external job
|
|
66
|
+
* system.
|
|
67
|
+
*/
|
|
68
|
+
export interface JobDispatcherPort {
|
|
69
|
+
dispatch<J extends JobDef>(job: J, payload: InferJobPayload<J>): Promise<void> | void;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/ports/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,IAAI,yBAAyB,EAC9C,cAAc,EACf,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EACV,MAAM,IAAI,cAAc,EACxB,eAAe,IAAI,uBAAuB,EAC3C,MAAM,SAAS,CAAC;AAEjB;;;;GAIG;AACH,MAAM,WAAW,cAAc,CAC7B,IAAI,SAAS,MAAM,GAAG,MAAM,EAC5B,OAAO,SAAS,cAAc,GAAG,cAAc,CAC/C,SAAQ,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC;CAAG;AAE3C;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,cAAc,IACpD,yBAAyB,CAAC,CAAC,CAAC,CAAC;AAE/B;;;;;;;GAOG;AACH,MAAM,MAAM,MAAM,CAChB,IAAI,SAAS,MAAM,GAAG,MAAM,EAC5B,OAAO,SAAS,cAAc,GAAG,cAAc,EAC/C,GAAG,GAAG,OAAO,IACX,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;AAEvC;;GAEG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,MAAM,IAAI,uBAAuB,CAAC,CAAC,CAAC,CAAC;AAE3E;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,OAAO,CAAC,CAAC,SAAS,cAAc,EAC9B,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAExB;;OAEG;IACH,SAAS,CAAC,CAAC,SAAS,cAAc,EAChC,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAC/D,MAAM,IAAI,CAAC;CACf;AAED;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,CAAC,SAAS,MAAM,EACvB,GAAG,EAAE,CAAC,EACN,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,GAC1B,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/ports/events.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface IdGeneratorPort {
|
|
2
|
+
nextId(): string;
|
|
3
|
+
}
|
|
4
|
+
export interface SequenceIdGeneratorPort extends IdGeneratorPort {
|
|
5
|
+
reset(next?: number): void;
|
|
6
|
+
}
|
|
7
|
+
export declare function createUuidIdGenerator(): IdGeneratorPort;
|
|
8
|
+
export declare function createSequenceIdGenerator(options?: {
|
|
9
|
+
prefix?: string;
|
|
10
|
+
start?: number;
|
|
11
|
+
}): SequenceIdGeneratorPort;
|
|
12
|
+
//# sourceMappingURL=id-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id-generator.d.ts","sourceRoot":"","sources":["../../src/ports/id-generator.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,MAAM,IAAI,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,uBAAwB,SAAQ,eAAe;IAC9D,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,wBAAgB,qBAAqB,IAAI,eAAe,CAYvD;AAED,wBAAgB,yBAAyB,CACvC,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAChD,uBAAuB,CAWzB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export function createUuidIdGenerator() {
|
|
2
|
+
return {
|
|
3
|
+
nextId: () => {
|
|
4
|
+
if (typeof globalThis.crypto?.randomUUID !== "function") {
|
|
5
|
+
throw new Error("createUuidIdGenerator requires globalThis.crypto.randomUUID(). Provide a custom IdGeneratorPort in this runtime.");
|
|
6
|
+
}
|
|
7
|
+
return globalThis.crypto.randomUUID();
|
|
8
|
+
},
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export function createSequenceIdGenerator(options = {}) {
|
|
12
|
+
const prefix = options.prefix ?? "id";
|
|
13
|
+
const start = options.start ?? 1;
|
|
14
|
+
let next = start;
|
|
15
|
+
return {
|
|
16
|
+
nextId: () => `${prefix}_${next++}`,
|
|
17
|
+
reset: (value = start) => {
|
|
18
|
+
next = value;
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=id-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id-generator.js","sourceRoot":"","sources":["../../src/ports/id-generator.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,MAAM,EAAE,GAAG,EAAE;YACX,IAAI,OAAO,UAAU,CAAC,MAAM,EAAE,UAAU,KAAK,UAAU,EAAE,CAAC;gBACxD,MAAM,IAAI,KAAK,CACb,kHAAkH,CACnH,CAAC;YACJ,CAAC;YAED,OAAO,UAAU,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACxC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,UAA+C,EAAE;IAEjD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC;IACtC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;IACjC,IAAI,IAAI,GAAG,KAAK,CAAC;IAEjB,OAAO;QACL,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,IAAI,IAAI,EAAE,EAAE;QACnC,KAAK,EAAE,CAAC,KAAK,GAAG,KAAK,EAAE,EAAE;YACvB,IAAI,GAAG,KAAK,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @beignet/core/ports
|
|
3
|
+
*
|
|
4
|
+
* A tiny, framework-agnostic subpath that standardizes how apps define and
|
|
5
|
+
* type their "ports" (outbound dependencies like db, cache, event bus).
|
|
6
|
+
*
|
|
7
|
+
* This subpath provides:
|
|
8
|
+
* - `definePorts` – helper to define a typed ports object
|
|
9
|
+
* - `PortsContext` – a generic type that describes ctx objects that carry ports
|
|
10
|
+
* - `EventBusPort` – interface for event bus implementations
|
|
11
|
+
* - `JobDispatcherPort` – interface for job dispatch implementations
|
|
12
|
+
* - `UnitOfWorkPort` – interface for app-owned transaction boundaries
|
|
13
|
+
* - `AuthPort` – interface for request authentication implementations
|
|
14
|
+
* - `AuditLogPort` – interface for audit/activity log implementations
|
|
15
|
+
* - `ClockPort` – interface for deterministic time
|
|
16
|
+
* - `IdGeneratorPort` – interface for deterministic id generation
|
|
17
|
+
* - `LoggerPort` – interface for structured application logging
|
|
18
|
+
* - `GatePort` – interface for application authorization policies
|
|
19
|
+
* - `RateLimitPort` – interface for rate limiting implementations
|
|
20
|
+
* - `CachePort` – interface for cache implementations
|
|
21
|
+
* - `StoragePort` – interface for object/file storage implementations
|
|
22
|
+
*
|
|
23
|
+
* Dedicated framework areas own their capability-specific APIs:
|
|
24
|
+
* - `@beignet/core/mail` owns `MailerPort` and mail test adapters
|
|
25
|
+
* - `@beignet/core/schedules` owns scheduled task definitions and runners
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
28
|
+
* A generic map of named "ports" (outbound dependencies) that your
|
|
29
|
+
* application depends on: db, mailer, cache, event bus, etc.
|
|
30
|
+
*
|
|
31
|
+
* This is intentionally very loose: users define the exact shape via
|
|
32
|
+
* `definePorts(...)`.
|
|
33
|
+
*/
|
|
34
|
+
export type AnyPorts = Record<string, unknown>;
|
|
35
|
+
/**
|
|
36
|
+
* Define the set of ports (outbound dependencies) for your application.
|
|
37
|
+
*
|
|
38
|
+
* This is essentially a typed identity function. It:
|
|
39
|
+
* - captures the exact shape of the provided `ports` object
|
|
40
|
+
* - allows you to export `type AppPorts = typeof appPorts` in your app
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```ts
|
|
44
|
+
* const appPorts = definePorts({
|
|
45
|
+
* db: dbAdapter,
|
|
46
|
+
* mailer: mailerAdapter,
|
|
47
|
+
* });
|
|
48
|
+
*
|
|
49
|
+
* export type AppPorts = typeof appPorts;
|
|
50
|
+
* ```
|
|
51
|
+
*
|
|
52
|
+
* @param ports - The ports object to define
|
|
53
|
+
* @returns The same ports object, unchanged
|
|
54
|
+
*/
|
|
55
|
+
export declare function definePorts<P extends AnyPorts>(ports: P): P;
|
|
56
|
+
/**
|
|
57
|
+
* A small helper type describing a context object that carries `ports`.
|
|
58
|
+
*
|
|
59
|
+
* You typically use this to define your application context:
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* ```ts
|
|
63
|
+
* import type { PortsContext } from "@beignet/core/ports";
|
|
64
|
+
* import type { AppPorts } from "./core/ports";
|
|
65
|
+
*
|
|
66
|
+
* export interface AppCtx extends PortsContext<AppPorts> {
|
|
67
|
+
* user: { id: string } | null;
|
|
68
|
+
* now: () => Date;
|
|
69
|
+
* appError: AppErrorCreator<typeof errors>;
|
|
70
|
+
* }
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
export interface PortsContext<P extends AnyPorts = AnyPorts> {
|
|
74
|
+
ports: P;
|
|
75
|
+
}
|
|
76
|
+
export type { ActivityActor, ActivityActorType, ActivityMetadata, ActivityMetadataValue, ActivityResource, ActivityTenant, AuditLogEntry, AuditLogEntryInput, AuditLogOptions, AuditLogPort, AuditOutcome, MemoryAuditLogPort, } from "./audit";
|
|
77
|
+
export { createAnonymousActor, createMemoryAuditLog, createRedactedAuditLog, createServiceActor, createSystemActor, createTenant, createUserActor, normalizeAuditLogEntry, redactAuditLogEntry, } from "./audit";
|
|
78
|
+
export type { AuthPort, AuthRequestLike, AuthSession, StaticAuthSessionFactory, } from "./auth";
|
|
79
|
+
export { AuthUnauthorizedError, createAnonymousAuth, createStaticAuth, } from "./auth";
|
|
80
|
+
export { createPortsBuilder, type PortsBuilder, type PortsOf, } from "./builder";
|
|
81
|
+
export type { CachePort, CacheSetOptions } from "./cache";
|
|
82
|
+
export { createMemoryCache } from "./cache";
|
|
83
|
+
export type { ClockPort, FrozenClockPort } from "./clock";
|
|
84
|
+
export { createFrozenClock, createSystemClock } from "./clock";
|
|
85
|
+
export type { DomainEventDef, EventBusPort, InferEventPayload, InferJobPayload, JobDef, JobDispatcherPort, } from "./events";
|
|
86
|
+
export type { IdGeneratorPort, SequenceIdGeneratorPort } from "./id-generator";
|
|
87
|
+
export { createSequenceIdGenerator, createUuidIdGenerator, } from "./id-generator";
|
|
88
|
+
export type { LoggerPort, LogLevel, MemoryLogEntry, MemoryLoggerPort, } from "./logger";
|
|
89
|
+
export { createMemoryLogger, createNoopLogger } from "./logger";
|
|
90
|
+
export type { BoundGate, CreateGateOptions, GateAllowedDecision, GateDecision, GateDeniedDecision, GateDenyHandler, GatePolicyResult, GatePort, PolicyContextFromDefinitions, PolicyDefinition, PolicyMapFromDefinitions, PolicyResolver, PolicySubjectArgs, } from "./policy";
|
|
91
|
+
export { allow, createGate, definePolicy, deny, GateAuthorizationError, } from "./policy";
|
|
92
|
+
export type { RateLimitHitOptions, RateLimitPort, RateLimitResult, } from "./rate-limit";
|
|
93
|
+
export { createMemoryRateLimiter } from "./rate-limit";
|
|
94
|
+
export { createRedactor, DEFAULT_CIRCULAR_VALUE, DEFAULT_REDACTED_VALUE, DEFAULT_SENSITIVE_KEY_TERMS, DEFAULT_SENSITIVE_KEYS, DEFAULT_TRUNCATED_VALUE, isSensitiveKey, type RedactableHeaders, type RedactionDecisionContext, type RedactionOptions, type Redactor, redactHeaders, redactValue, } from "./redaction";
|
|
95
|
+
export type { MemoryStorageOptions, StorageBody, StorageMetadata, StorageObject, StorageObjectBody, StoragePort, StoragePutOptions, StorageVisibility, } from "./storage";
|
|
96
|
+
export { createMemoryStorage } from "./storage";
|
|
97
|
+
export { type BufferedDomainEventRecorder, createDomainEventRecorder, createNoopUnitOfWork, type DomainEventRecorderPort, type NoopUnitOfWorkOptions, type RecordedDomainEvent, type UnitOfWorkCallback, type UnitOfWorkPort, } from "./unit-of-work";
|
|
98
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ports/index.ts"],"names":[],"mappings":"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"}
|