@empire-builder-kit/runtime 0.0.1-alpha.9 → 1.0.0-beta.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/LICENSE +201 -21
  2. package/NOTICE +5 -0
  3. package/README.md +14 -23
  4. package/package.json +58 -97
  5. package/src/auth-backend.d.ts +44 -0
  6. package/src/auth-backend.js +158 -0
  7. package/src/auth-backend.js.map +1 -0
  8. package/src/auth-session.d.ts +175 -0
  9. package/src/auth-session.js +181 -0
  10. package/src/auth-session.js.map +1 -0
  11. package/src/auth-web.d.ts +79 -0
  12. package/src/auth-web.js +153 -0
  13. package/src/auth-web.js.map +1 -0
  14. package/src/auth.d.ts +143 -0
  15. package/src/auth.js +233 -0
  16. package/src/auth.js.map +1 -0
  17. package/{dist → src}/config.d.ts +0 -1
  18. package/{dist → src}/config.js +9 -21
  19. package/src/config.js.map +1 -0
  20. package/src/database.d.ts +32 -0
  21. package/src/database.js +119 -0
  22. package/src/database.js.map +1 -0
  23. package/src/events.d.ts +74 -0
  24. package/src/events.js +149 -0
  25. package/src/events.js.map +1 -0
  26. package/{dist → src}/frontend.d.ts +1 -2
  27. package/src/frontend.js +62 -0
  28. package/src/frontend.js.map +1 -0
  29. package/src/hosts.d.ts +9 -0
  30. package/src/hosts.js +38 -0
  31. package/src/hosts.js.map +1 -0
  32. package/src/index.d.ts +15 -0
  33. package/src/index.js +31 -0
  34. package/src/index.js.map +1 -0
  35. package/src/lambda.d.ts +45 -0
  36. package/src/lambda.js +117 -0
  37. package/src/lambda.js.map +1 -0
  38. package/{dist → src}/logging.d.ts +0 -1
  39. package/src/logging.js +113 -0
  40. package/src/logging.js.map +1 -0
  41. package/{dist → src}/observability.d.ts +18 -1
  42. package/{dist → src}/observability.js +72 -62
  43. package/src/observability.js.map +1 -0
  44. package/src/rds-global-ca-bundle.d.ts +1 -0
  45. package/src/rds-global-ca-bundle.js +2742 -0
  46. package/src/rds-global-ca-bundle.js.map +1 -0
  47. package/{dist → src}/request-context.d.ts +12 -2
  48. package/src/request-context.js +68 -0
  49. package/src/request-context.js.map +1 -0
  50. package/{dist → src}/response.d.ts +0 -1
  51. package/src/response.js +66 -0
  52. package/src/response.js.map +1 -0
  53. package/dist/auth-backend.d.ts +0 -18
  54. package/dist/auth-backend.d.ts.map +0 -1
  55. package/dist/auth-backend.js +0 -57
  56. package/dist/auth-web.d.ts +0 -18
  57. package/dist/auth-web.d.ts.map +0 -1
  58. package/dist/auth-web.js +0 -32
  59. package/dist/auth.d.ts +0 -68
  60. package/dist/auth.d.ts.map +0 -1
  61. package/dist/auth.js +0 -107
  62. package/dist/config.d.ts.map +0 -1
  63. package/dist/frontend.d.ts.map +0 -1
  64. package/dist/frontend.js +0 -64
  65. package/dist/index.d.ts +0 -12
  66. package/dist/index.d.ts.map +0 -1
  67. package/dist/index.js +0 -23
  68. package/dist/logging.d.ts.map +0 -1
  69. package/dist/logging.js +0 -129
  70. package/dist/observability.d.ts.map +0 -1
  71. package/dist/request-context.d.ts.map +0 -1
  72. package/dist/request-context.js +0 -58
  73. package/dist/response.d.ts.map +0 -1
  74. package/dist/response.js +0 -66
@@ -0,0 +1,32 @@
1
+ export interface DatabaseCredential {
2
+ database: string;
3
+ host: string;
4
+ password: string;
5
+ port: number;
6
+ username: string;
7
+ }
8
+ export interface LocalDatabaseResource extends DatabaseCredential {
9
+ provider: 'local';
10
+ }
11
+ export interface SecretsManagerDatabaseResource {
12
+ database: string;
13
+ host: string;
14
+ port: number;
15
+ provider: 'aws-secrets-manager';
16
+ secretArn: string;
17
+ username: string;
18
+ }
19
+ export type LinkedDatabaseResource = LocalDatabaseResource | SecretsManagerDatabaseResource;
20
+ export interface DatabaseTlsOptions {
21
+ ca: string;
22
+ rejectUnauthorized: true;
23
+ }
24
+ export interface ResolveDatabaseCredentialOptions {
25
+ cacheTtlMs?: number;
26
+ loadSecret?: (secretArn: string) => Promise<string>;
27
+ now?: () => number;
28
+ }
29
+ export declare function databaseTlsOptions(resource: LinkedDatabaseResource): false | DatabaseTlsOptions;
30
+ export declare function resolveDatabaseCredential(resource: LinkedDatabaseResource, options?: ResolveDatabaseCredentialOptions): Promise<DatabaseCredential>;
31
+ export declare function invalidateDatabaseCredential(resource: SecretsManagerDatabaseResource | string): void;
32
+ export { RDS_GLOBAL_CA_BUNDLE } from './rds-global-ca-bundle.js';
@@ -0,0 +1,119 @@
1
+ import { __awaiter } from "tslib";
2
+ import { GetSecretValueCommand, SecretsManagerClient, } from '@aws-sdk/client-secrets-manager';
3
+ import { RDS_GLOBAL_CA_BUNDLE } from './rds-global-ca-bundle.js';
4
+ export function databaseTlsOptions(resource) {
5
+ if (resource.provider === 'local')
6
+ return false;
7
+ if (resource.provider === 'aws-secrets-manager') {
8
+ return {
9
+ ca: RDS_GLOBAL_CA_BUNDLE,
10
+ rejectUnauthorized: true,
11
+ };
12
+ }
13
+ throw new Error('Unsupported linked database credential provider.');
14
+ }
15
+ const credentialCache = new Map();
16
+ let secretsManagerClient;
17
+ function requireString(value, field) {
18
+ if (typeof value !== 'string' || value.trim() === '') {
19
+ throw new Error(`Database credential ${field} must be a non-empty string.`);
20
+ }
21
+ return value;
22
+ }
23
+ function requirePort(value) {
24
+ if (typeof value !== 'number' ||
25
+ !Number.isSafeInteger(value) ||
26
+ value < 1 ||
27
+ value > 65535) {
28
+ throw new Error('Database credential port must be from 1 through 65535.');
29
+ }
30
+ return value;
31
+ }
32
+ function requireSecretArn(value) {
33
+ if (typeof value !== 'string' || value.trim() === '') {
34
+ throw new Error('Linked database credential secretArn must be a non-empty string.');
35
+ }
36
+ return value;
37
+ }
38
+ function parseCredential(value) {
39
+ let parsed;
40
+ try {
41
+ parsed = JSON.parse(value);
42
+ }
43
+ catch (_a) {
44
+ throw new Error('Database credential secret must contain valid JSON.');
45
+ }
46
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
47
+ throw new Error('Database credential secret must contain a JSON object.');
48
+ }
49
+ const fields = parsed;
50
+ return {
51
+ database: requireString(fields['database'], 'database'),
52
+ host: requireString(fields['host'], 'host'),
53
+ password: requireString(fields['password'], 'password'),
54
+ port: requirePort(fields['port']),
55
+ username: requireString(fields['username'], 'username'),
56
+ };
57
+ }
58
+ function loadSecretFromAws(secretArn) {
59
+ return __awaiter(this, void 0, void 0, function* () {
60
+ secretsManagerClient !== null && secretsManagerClient !== void 0 ? secretsManagerClient : (secretsManagerClient = new SecretsManagerClient({}));
61
+ const result = yield secretsManagerClient.send(new GetSecretValueCommand({ SecretId: secretArn }));
62
+ if (!result.SecretString) {
63
+ throw new Error('Database credential secret must use a JSON SecretString value.');
64
+ }
65
+ return result.SecretString;
66
+ });
67
+ }
68
+ function assertReferenceMatches(resource, credential) {
69
+ for (const field of ['database', 'host', 'port', 'username']) {
70
+ if (credential[field] !== resource[field]) {
71
+ throw new Error(`Database credential ${field} does not match its linked reference.`);
72
+ }
73
+ }
74
+ }
75
+ export function resolveDatabaseCredential(resource_1) {
76
+ return __awaiter(this, arguments, void 0, function* (resource, options = {}) {
77
+ var _a, _b, _c, _d;
78
+ if (resource.provider === 'local') {
79
+ return {
80
+ database: requireString(resource.database, 'database'),
81
+ host: requireString(resource.host, 'host'),
82
+ password: requireString(resource.password, 'password'),
83
+ port: requirePort(resource.port),
84
+ username: requireString(resource.username, 'username'),
85
+ };
86
+ }
87
+ if (resource.provider !== 'aws-secrets-manager') {
88
+ throw new Error('Unsupported linked database credential provider.');
89
+ }
90
+ const secretArn = requireSecretArn(resource.secretArn);
91
+ const now = (_b = (_a = options.now) === null || _a === void 0 ? void 0 : _a.call(options)) !== null && _b !== void 0 ? _b : Date.now();
92
+ const cacheTtlMs = (_c = options.cacheTtlMs) !== null && _c !== void 0 ? _c : 60000;
93
+ if (!Number.isSafeInteger(cacheTtlMs) ||
94
+ cacheTtlMs < 0 ||
95
+ cacheTtlMs > 15 * 60000) {
96
+ throw new Error('Database credential cacheTtlMs must be from 0 through 900000.');
97
+ }
98
+ const cached = credentialCache.get(secretArn);
99
+ if (cached && cached.expiresAt > now) {
100
+ assertReferenceMatches(resource, cached.value);
101
+ return cached.value;
102
+ }
103
+ const secret = yield ((_d = options.loadSecret) !== null && _d !== void 0 ? _d : loadSecretFromAws)(secretArn);
104
+ const credential = parseCredential(secret);
105
+ assertReferenceMatches(resource, credential);
106
+ if (cacheTtlMs > 0) {
107
+ credentialCache.set(secretArn, {
108
+ expiresAt: now + cacheTtlMs,
109
+ value: credential,
110
+ });
111
+ }
112
+ return credential;
113
+ });
114
+ }
115
+ export function invalidateDatabaseCredential(resource) {
116
+ credentialCache.delete(typeof resource === 'string' ? resource : resource.secretArn);
117
+ }
118
+ export { RDS_GLOBAL_CA_BUNDLE } from './rds-global-ca-bundle.js';
119
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../../../packages/runtime/src/database.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ import type { RequestActor, RequestContext } from './request-context.js';
2
+ export interface EventContractRef {
3
+ readonly source: string;
4
+ readonly detailType: string;
5
+ readonly schemaVersion: number;
6
+ }
7
+ export interface EventEnvelopeMeta {
8
+ eventId: string;
9
+ schemaVersion: number;
10
+ occurredAt: string;
11
+ app: string;
12
+ stage: string;
13
+ correlationId: string;
14
+ causationId?: string;
15
+ actor?: RequestActor;
16
+ tenantId?: string;
17
+ traceParent?: string;
18
+ traceState?: string;
19
+ }
20
+ export interface EventEnvelope<TData = unknown> {
21
+ meta: EventEnvelopeMeta;
22
+ data: TData;
23
+ }
24
+ export interface PublishableEventEntry {
25
+ eventBusName: string;
26
+ source: string;
27
+ detailType: string;
28
+ detail: string;
29
+ }
30
+ export interface BuildEventEntryOptions {
31
+ busName: string;
32
+ stage: string;
33
+ context?: Pick<RequestContext, 'actor' | 'correlationId' | 'requestId' | 'tenantId' | 'traceParent' | 'traceState'>;
34
+ actor?: RequestActor;
35
+ eventId?: string;
36
+ occurredAt?: string;
37
+ }
38
+ export interface BuiltEventEntry<TData = unknown> {
39
+ entry: PublishableEventEntry;
40
+ envelope: EventEnvelope<TData>;
41
+ }
42
+ export declare function buildEventEntry<TData>(contract: EventContractRef, data: TData, options: BuildEventEntryOptions): BuiltEventEntry<TData>;
43
+ export interface EventPublisherOptions {
44
+ busName: string;
45
+ stage: string;
46
+ send: (entry: PublishableEventEntry) => Promise<unknown>;
47
+ }
48
+ export interface PublishEventOptions {
49
+ context?: Pick<RequestContext, 'actor' | 'correlationId' | 'requestId' | 'tenantId' | 'traceParent' | 'traceState'>;
50
+ actor?: RequestActor;
51
+ }
52
+ export type EventPublisher = <TData>(contract: EventContractRef, data: TData, options?: PublishEventOptions) => Promise<EventEnvelope<TData>>;
53
+ export declare function createEventPublisher(options: EventPublisherOptions): EventPublisher;
54
+ export declare function parseEventEnvelope<TData = unknown>(detail: unknown): EventEnvelope<TData>;
55
+ export interface SqsRecordLike {
56
+ messageId?: string;
57
+ body: string;
58
+ }
59
+ export interface ParsedEventRecord<TData = unknown> {
60
+ messageId?: string;
61
+ source: string;
62
+ detailType: string;
63
+ envelope: EventEnvelope<TData>;
64
+ }
65
+ export interface FailedEventRecord {
66
+ messageId?: string;
67
+ error: string;
68
+ }
69
+ export interface ParsedEventBatch<TData = unknown> {
70
+ events: ParsedEventRecord<TData>[];
71
+ failures: FailedEventRecord[];
72
+ }
73
+ export declare function parseSqsEventBridgeRecords<TData = unknown>(records: readonly SqsRecordLike[]): ParsedEventBatch<TData>;
74
+ export declare function toEventLogMetadata(meta: EventEnvelopeMeta): Record<string, string | number>;
package/src/events.js ADDED
@@ -0,0 +1,149 @@
1
+ import { __awaiter } from "tslib";
2
+ import { randomUUID } from 'node:crypto';
3
+ // EventBridge caps a PutEvents entry at 256 KB. We guard below the hard limit
4
+ // so envelope overhead never turns a passing payload into a runtime failure.
5
+ const MAX_EVENT_ENTRY_BYTES = 256 * 1024;
6
+ function assertContract(contract) {
7
+ var _a, _b;
8
+ if (!((_a = contract.source) === null || _a === void 0 ? void 0 : _a.trim())) {
9
+ throw new Error('[runtime/events] Event contract is missing a non-empty `source` (the publishing app group).');
10
+ }
11
+ if (!((_b = contract.detailType) === null || _b === void 0 ? void 0 : _b.trim())) {
12
+ throw new Error('[runtime/events] Event contract is missing a non-empty `detailType`.');
13
+ }
14
+ if (!Number.isInteger(contract.schemaVersion) || contract.schemaVersion < 1) {
15
+ throw new Error('[runtime/events] Event contract `schemaVersion` must be a positive integer.');
16
+ }
17
+ }
18
+ // Builds a validated envelope + PutEvents entry for the shared core bus.
19
+ // Pure — no AWS calls — so publishers and tests share the exact same path.
20
+ export function buildEventEntry(contract, data, options) {
21
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
22
+ assertContract(contract);
23
+ if (!((_a = options.stage) === null || _a === void 0 ? void 0 : _a.trim())) {
24
+ throw new Error('[runtime/events] `stage` is required — consumers filter on meta.stage to isolate shared-bus traffic.');
25
+ }
26
+ const eventId = (_b = options.eventId) !== null && _b !== void 0 ? _b : randomUUID();
27
+ const envelope = {
28
+ meta: Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ eventId, schemaVersion: contract.schemaVersion, occurredAt: (_c = options.occurredAt) !== null && _c !== void 0 ? _c : new Date().toISOString(), app: contract.source, stage: options.stage, correlationId: (_e = (_d = options.context) === null || _d === void 0 ? void 0 : _d.correlationId) !== null && _e !== void 0 ? _e : eventId }, (((_f = options.context) === null || _f === void 0 ? void 0 : _f.requestId)
29
+ ? { causationId: options.context.requestId }
30
+ : {})), { actor: (_g = options.actor) !== null && _g !== void 0 ? _g : (_h = options.context) === null || _h === void 0 ? void 0 : _h.actor }), (((_j = options.context) === null || _j === void 0 ? void 0 : _j.tenantId)
31
+ ? { tenantId: options.context.tenantId }
32
+ : {})), (((_k = options.context) === null || _k === void 0 ? void 0 : _k.traceParent)
33
+ ? { traceParent: options.context.traceParent }
34
+ : {})), (((_l = options.context) === null || _l === void 0 ? void 0 : _l.traceState)
35
+ ? { traceState: options.context.traceState }
36
+ : {})),
37
+ data,
38
+ };
39
+ const detail = JSON.stringify(envelope);
40
+ const bytes = Buffer.byteLength(detail, 'utf8');
41
+ if (bytes > MAX_EVENT_ENTRY_BYTES) {
42
+ throw new Error(`[runtime/events] Event ${contract.source}/${contract.detailType} detail is ${bytes} bytes, ` +
43
+ `over the ${MAX_EVENT_ENTRY_BYTES}-byte EventBridge entry limit. ` +
44
+ 'Store the payload (e.g. S3) and publish a claim-check reference instead.');
45
+ }
46
+ return {
47
+ entry: {
48
+ eventBusName: options.busName,
49
+ source: contract.source,
50
+ detailType: contract.detailType,
51
+ detail,
52
+ },
53
+ envelope,
54
+ };
55
+ }
56
+ export function createEventPublisher(options) {
57
+ var _a, _b;
58
+ if (!((_a = options.busName) === null || _a === void 0 ? void 0 : _a.trim())) {
59
+ throw new Error('[runtime/events] `busName` is required.');
60
+ }
61
+ if (!((_b = options.stage) === null || _b === void 0 ? void 0 : _b.trim())) {
62
+ throw new Error('[runtime/events] `stage` is required.');
63
+ }
64
+ return (contract_1, data_1, ...args_1) => __awaiter(this, [contract_1, data_1, ...args_1], void 0, function* (contract, data, publishOptions = {}) {
65
+ const { entry, envelope } = buildEventEntry(contract, data, {
66
+ busName: options.busName,
67
+ stage: options.stage,
68
+ context: publishOptions.context,
69
+ actor: publishOptions.actor,
70
+ });
71
+ yield options.send(entry);
72
+ return envelope;
73
+ });
74
+ }
75
+ // --- Consumer-side parsing -------------------------------------------------
76
+ export function parseEventEnvelope(detail) {
77
+ var _a;
78
+ if (!detail || typeof detail !== 'object') {
79
+ throw new Error('[runtime/events] Event detail is not an object envelope.');
80
+ }
81
+ const candidate = detail;
82
+ if (!candidate.meta || typeof candidate.meta !== 'object') {
83
+ throw new Error('[runtime/events] Event detail is missing the `meta` envelope block.');
84
+ }
85
+ const meta = candidate.meta;
86
+ for (const field of [
87
+ 'eventId',
88
+ 'occurredAt',
89
+ 'app',
90
+ 'stage',
91
+ 'correlationId',
92
+ ]) {
93
+ if (typeof meta[field] !== 'string' || !meta[field]) {
94
+ throw new Error(`[runtime/events] Event envelope meta.${field} is missing or not a string.`);
95
+ }
96
+ }
97
+ if (!Number.isInteger(meta.schemaVersion) || ((_a = meta.schemaVersion) !== null && _a !== void 0 ? _a : 0) < 1) {
98
+ throw new Error('[runtime/events] Event envelope meta.schemaVersion is missing or not a positive integer.');
99
+ }
100
+ for (const field of [
101
+ 'causationId',
102
+ 'tenantId',
103
+ 'traceParent',
104
+ 'traceState',
105
+ ]) {
106
+ if (meta[field] !== undefined && typeof meta[field] !== 'string') {
107
+ throw new Error(`[runtime/events] Event envelope meta.${field} must be a string when present.`);
108
+ }
109
+ }
110
+ return {
111
+ meta: meta,
112
+ data: candidate.data,
113
+ };
114
+ }
115
+ // Consumers receive EventBridge events wrapped in SQS bodies (the buffer
116
+ // queue between the bus rule and the handler). Each body is the EventBridge
117
+ // event JSON: { id, source, "detail-type", detail, ... }.
118
+ export function parseSqsEventBridgeRecords(records) {
119
+ const events = [];
120
+ const failures = [];
121
+ for (const record of records) {
122
+ try {
123
+ const raw = JSON.parse(record.body);
124
+ if (typeof raw.source !== 'string' || !raw.source) {
125
+ throw new Error('EventBridge record is missing `source`.');
126
+ }
127
+ if (typeof raw['detail-type'] !== 'string' || !raw['detail-type']) {
128
+ throw new Error('EventBridge record is missing `detail-type`.');
129
+ }
130
+ events.push({
131
+ messageId: record.messageId,
132
+ source: raw.source,
133
+ detailType: raw['detail-type'],
134
+ envelope: parseEventEnvelope(raw.detail),
135
+ });
136
+ }
137
+ catch (err) {
138
+ failures.push({
139
+ messageId: record.messageId,
140
+ error: err instanceof Error ? err.message : String(err),
141
+ });
142
+ }
143
+ }
144
+ return { events, failures };
145
+ }
146
+ export function toEventLogMetadata(meta) {
147
+ return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ app: meta.app }, (meta.causationId ? { causationId: meta.causationId } : {})), { correlationId: meta.correlationId, eventId: meta.eventId, occurredAt: meta.occurredAt, schemaVersion: meta.schemaVersion, stage: meta.stage }), (meta.tenantId ? { tenantId: meta.tenantId } : {})), (meta.traceParent ? { traceParent: meta.traceParent } : {})), (meta.traceState ? { traceState: meta.traceState } : {}));
148
+ }
149
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../../../packages/runtime/src/events.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIzC,8EAA8E;AAC9E,6EAA6E;AAC7E,MAAM,qBAAqB,GAAG,GAAG,GAAG,IAAI,CAAC;AA8EzC,SAAS,cAAc,CAAC,QAA0B;;IAChD,IAAI,CAAC,CAAA,MAAA,QAAQ,CAAC,MAAM,0CAAE,IAAI,EAAE,CAAA,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,6FAA6F,CAC9F,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,CAAA,MAAA,QAAQ,CAAC,UAAU,0CAAE,IAAI,EAAE,CAAA,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,sEAAsE,CACvE,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,QAAQ,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAC;IACJ,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,2EAA2E;AAC3E,MAAM,UAAU,eAAe,CAC7B,QAA0B,EAC1B,IAAW,EACX,OAA+B;;IAE/B,cAAc,CAAC,QAAQ,CAAC,CAAC;IAEzB,IAAI,CAAC,CAAA,MAAA,OAAO,CAAC,KAAK,0CAAE,IAAI,EAAE,CAAA,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACb,sGAAsG,CACvG,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,MAAA,OAAO,CAAC,OAAO,mCAAI,UAAU,EAAE,CAAC;IAChD,MAAM,QAAQ,GAAyB;QACrC,IAAI,0EACF,OAAO,EACP,aAAa,EAAE,QAAQ,CAAC,aAAa,EACrC,UAAU,EAAE,MAAA,OAAO,CAAC,UAAU,mCAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAC1D,GAAG,EAAE,QAAQ,CAAC,MAAM,EACpB,KAAK,EAAE,OAAO,CAAC,KAAK,EACpB,aAAa,EAAE,MAAA,MAAA,OAAO,CAAC,OAAO,0CAAE,aAAa,mCAAI,OAAO,IACrD,CAAC,CAAA,MAAA,OAAO,CAAC,OAAO,0CAAE,SAAS;YAC5B,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE;YAC5C,CAAC,CAAC,EAAE,CAAC,KACP,KAAK,EAAE,MAAA,OAAO,CAAC,KAAK,mCAAI,MAAA,OAAO,CAAC,OAAO,0CAAE,KAAK,KAC3C,CAAC,CAAA,MAAA,OAAO,CAAC,OAAO,0CAAE,QAAQ;YAC3B,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE;YACxC,CAAC,CAAC,EAAE,CAAC,GACJ,CAAC,CAAA,MAAA,OAAO,CAAC,OAAO,0CAAE,WAAW;YAC9B,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE;YAC9C,CAAC,CAAC,EAAE,CAAC,GACJ,CAAC,CAAA,MAAA,OAAO,CAAC,OAAO,0CAAE,UAAU;YAC7B,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE;YAC5C,CAAC,CAAC,EAAE,CAAC,CACR;QACD,IAAI;KACL,CAAC;IAEF,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD,IAAI,KAAK,GAAG,qBAAqB,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CACb,0BAA0B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,cAAc,KAAK,UAAU;YAC3F,YAAY,qBAAqB,iCAAiC;YAClE,0EAA0E,CAC7E,CAAC;IACJ,CAAC;IAED,OAAO;QACL,KAAK,EAAE;YACL,YAAY,EAAE,OAAO,CAAC,OAAO;YAC7B,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,MAAM;SACP;QACD,QAAQ;KACT,CAAC;AACJ,CAAC;AA2CD,MAAM,UAAU,oBAAoB,CAClC,OAA8B;;IAE9B,IAAI,CAAC,CAAA,MAAA,OAAO,CAAC,OAAO,0CAAE,IAAI,EAAE,CAAA,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,CAAC,CAAA,MAAA,OAAO,CAAC,KAAK,0CAAE,IAAI,EAAE,CAAA,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,gCAA4C,EAAE,qEAAvC,QAAQ,EAAE,IAAI,EAAE,cAAc,GAAG,EAAE;QAC/C,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,eAAe,CAAC,QAAQ,EAAE,IAAI,EAAE;YAC1D,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,OAAO,EAAE,cAAc,CAAC,OAAO;YAC/B,KAAK,EAAE,cAAc,CAAC,KAAK;SAC5B,CAAC,CAAC;QAEH,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAA,CAAC;AACJ,CAAC;AAED,8EAA8E;AAE9E,MAAM,UAAU,kBAAkB,CAChC,MAAe;;IAEf,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,SAAS,GAAG,MAA4C,CAAC;IAC/D,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CACb,qEAAqE,CACtE,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,SAAS,CAAC,IAAkC,CAAC;IAC1D,KAAK,MAAM,KAAK,IAAI;QAClB,SAAS;QACT,YAAY;QACZ,KAAK;QACL,OAAO;QACP,eAAe;KACP,EAAE,CAAC;QACX,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CACb,wCAAwC,KAAK,8BAA8B,CAC5E,CAAC;QACJ,CAAC;IACH,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAA,IAAI,CAAC,aAAa,mCAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,KAAK,CACb,0FAA0F,CAC3F,CAAC;IACJ,CAAC;IACD,KAAK,MAAM,KAAK,IAAI;QAClB,aAAa;QACb,UAAU;QACV,aAAa;QACb,YAAY;KACJ,EAAE,CAAC;QACX,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC;YACjE,MAAM,IAAI,KAAK,CACb,wCAAwC,KAAK,iCAAiC,CAC/E,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE,IAAyB;QAC/B,IAAI,EAAE,SAAS,CAAC,IAAa;KAC9B,CAAC;AACJ,CAAC;AA2BD,yEAAyE;AACzE,4EAA4E;AAC5E,0DAA0D;AAC1D,MAAM,UAAU,0BAA0B,CACxC,OAAiC;IAEjC,MAAM,MAAM,GAA+B,EAAE,CAAC;IAC9C,MAAM,QAAQ,GAAwB,EAAE,CAAC;IAEzC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAIjC,CAAC;YACF,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;gBAClD,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;YAC7D,CAAC;YACD,IAAI,OAAO,GAAG,CAAC,aAAa,CAAC,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;gBAClE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAClE,CAAC;YAED,MAAM,CAAC,IAAI,CAAC;gBACV,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,UAAU,EAAE,GAAG,CAAC,aAAa,CAAC;gBAC9B,QAAQ,EAAE,kBAAkB,CAAQ,GAAG,CAAC,MAAM,CAAC;aAChD,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,IAAI,CAAC;gBACZ,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,IAAuB;IAEvB,+EACE,GAAG,EAAE,IAAI,CAAC,GAAG,IACV,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAC9D,aAAa,EAAE,IAAI,CAAC,aAAa,EACjC,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,UAAU,EAAE,IAAI,CAAC,UAAU,EAC3B,aAAa,EAAE,IAAI,CAAC,aAAa,EACjC,KAAK,EAAE,IAAI,CAAC,KAAK,KACd,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAClD,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAC3D,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAC3D;AACJ,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { AuthSessionStatus } from './auth';
1
+ import type { AuthSessionStatus } from './auth.js';
2
2
  export type FrontendRuntime = 'web' | 'mobile';
3
3
  export type FrontendDeploymentMode = 'opennext' | 'container' | 'static-export' | 'expo';
4
4
  export type FrontendSessionTransport = 'cookie' | 'bearer' | 'none';
@@ -39,4 +39,3 @@ export declare const frontendContract: {
39
39
  readonly packageName: "@empire-builder-kit/runtime";
40
40
  };
41
41
  export declare function createFrontendClientContract(input: FrontendClientContractInput): FrontendClientContract;
42
- //# sourceMappingURL=frontend.d.ts.map
@@ -0,0 +1,62 @@
1
+ export const frontendContract = {
2
+ exportPath: '@empire-builder-kit/runtime/frontend',
3
+ packageName: '@empire-builder-kit/runtime',
4
+ };
5
+ function trimOrFallback(value, fallback) {
6
+ const normalized = value === null || value === void 0 ? void 0 : value.trim();
7
+ return normalized && normalized.length > 0 ? normalized : fallback;
8
+ }
9
+ function defaultsForRuntime(runtime) {
10
+ if (runtime === 'mobile') {
11
+ return {
12
+ auth: {
13
+ initialStatus: 'anonymous',
14
+ storage: 'secure-store',
15
+ transport: 'bearer',
16
+ },
17
+ deployment: {
18
+ mode: 'expo',
19
+ publicBaseUrlEnvVar: 'EXPO_PUBLIC_API_BASE_URL',
20
+ stageEnvVar: 'EXPO_PUBLIC_STAGE',
21
+ },
22
+ };
23
+ }
24
+ return {
25
+ auth: {
26
+ initialStatus: 'anonymous',
27
+ storage: 'server',
28
+ transport: 'cookie',
29
+ },
30
+ deployment: {
31
+ mode: 'opennext',
32
+ publicBaseUrlEnvVar: 'NEXT_PUBLIC_APP_URL',
33
+ stageEnvVar: 'NEXT_PUBLIC_STAGE',
34
+ },
35
+ };
36
+ }
37
+ export function createFrontendClientContract(input) {
38
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
39
+ const runtimeDefaults = defaultsForRuntime(input.runtime);
40
+ const app = trimOrFallback(input.app, 'app');
41
+ return {
42
+ api: {
43
+ sameScopeImportPrefix: trimOrFallback((_a = input.api) === null || _a === void 0 ? void 0 : _a.sameScopeImportPrefix, `@${app}/`),
44
+ sdkPackage: trimOrFallback((_b = input.api) === null || _b === void 0 ? void 0 : _b.sdkPackage, `@${app}/sdk/client`),
45
+ },
46
+ app,
47
+ auth: {
48
+ exportPath: '@empire-builder-kit/runtime/auth',
49
+ initialStatus: (_d = (_c = input.auth) === null || _c === void 0 ? void 0 : _c.initialStatus) !== null && _d !== void 0 ? _d : runtimeDefaults.auth.initialStatus,
50
+ storage: (_f = (_e = input.auth) === null || _e === void 0 ? void 0 : _e.storage) !== null && _f !== void 0 ? _f : runtimeDefaults.auth.storage,
51
+ transport: (_h = (_g = input.auth) === null || _g === void 0 ? void 0 : _g.transport) !== null && _h !== void 0 ? _h : runtimeDefaults.auth.transport,
52
+ },
53
+ client: trimOrFallback(input.client, `${app}-${input.runtime}`),
54
+ deployment: {
55
+ mode: (_k = (_j = input.deployment) === null || _j === void 0 ? void 0 : _j.mode) !== null && _k !== void 0 ? _k : runtimeDefaults.deployment.mode,
56
+ publicBaseUrlEnvVar: trimOrFallback((_l = input.deployment) === null || _l === void 0 ? void 0 : _l.publicBaseUrlEnvVar, runtimeDefaults.deployment.publicBaseUrlEnvVar),
57
+ stageEnvVar: trimOrFallback((_m = input.deployment) === null || _m === void 0 ? void 0 : _m.stageEnvVar, runtimeDefaults.deployment.stageEnvVar),
58
+ },
59
+ runtime: input.runtime,
60
+ };
61
+ }
62
+ //# sourceMappingURL=frontend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontend.js","sourceRoot":"","sources":["../../../../packages/runtime/src/frontend.ts"],"names":[],"mappings":"AA+CA,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,UAAU,EAAE,sCAAsC;IAClD,WAAW,EAAE,6BAA6B;CAClC,CAAC;AAEX,SAAS,cAAc,CAAC,KAAyB,EAAE,QAAgB;IACjE,MAAM,UAAU,GAAG,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,EAAE,CAAC;IAEjC,OAAO,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC;AACrE,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAwB;IAClD,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,OAAO;YACL,IAAI,EAAE;gBACJ,aAAa,EAAE,WAAoB;gBACnC,OAAO,EAAE,cAAuB;gBAChC,SAAS,EAAE,QAAiB;aAC7B;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,MAAe;gBACrB,mBAAmB,EAAE,0BAA0B;gBAC/C,WAAW,EAAE,mBAAmB;aACjC;SACF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE;YACJ,aAAa,EAAE,WAAoB;YACnC,OAAO,EAAE,QAAiB;YAC1B,SAAS,EAAE,QAAiB;SAC7B;QACD,UAAU,EAAE;YACV,IAAI,EAAE,UAAmB;YACzB,mBAAmB,EAAE,qBAAqB;YAC1C,WAAW,EAAE,mBAAmB;SACjC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,KAAkC;;IAElC,MAAM,eAAe,GAAG,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAE7C,OAAO;QACL,GAAG,EAAE;YACH,qBAAqB,EAAE,cAAc,CACnC,MAAA,KAAK,CAAC,GAAG,0CAAE,qBAAqB,EAChC,IAAI,GAAG,GAAG,CACX;YACD,UAAU,EAAE,cAAc,CAAC,MAAA,KAAK,CAAC,GAAG,0CAAE,UAAU,EAAE,IAAI,GAAG,aAAa,CAAC;SACxE;QACD,GAAG;QACH,IAAI,EAAE;YACJ,UAAU,EAAE,kCAAkC;YAC9C,aAAa,EACX,MAAA,MAAA,KAAK,CAAC,IAAI,0CAAE,aAAa,mCAAI,eAAe,CAAC,IAAI,CAAC,aAAa;YACjE,OAAO,EAAE,MAAA,MAAA,KAAK,CAAC,IAAI,0CAAE,OAAO,mCAAI,eAAe,CAAC,IAAI,CAAC,OAAO;YAC5D,SAAS,EAAE,MAAA,MAAA,KAAK,CAAC,IAAI,0CAAE,SAAS,mCAAI,eAAe,CAAC,IAAI,CAAC,SAAS;SACnE;QACD,MAAM,EAAE,cAAc,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAC/D,UAAU,EAAE;YACV,IAAI,EAAE,MAAA,MAAA,KAAK,CAAC,UAAU,0CAAE,IAAI,mCAAI,eAAe,CAAC,UAAU,CAAC,IAAI;YAC/D,mBAAmB,EAAE,cAAc,CACjC,MAAA,KAAK,CAAC,UAAU,0CAAE,mBAAmB,EACrC,eAAe,CAAC,UAAU,CAAC,mBAAmB,CAC/C;YACD,WAAW,EAAE,cAAc,CACzB,MAAA,KAAK,CAAC,UAAU,0CAAE,WAAW,EAC7B,eAAe,CAAC,UAAU,CAAC,WAAW,CACvC;SACF;QACD,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC;AACJ,CAAC"}
package/src/hosts.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ export interface CreateStageHostnameOptions {
2
+ readonly app: string;
3
+ readonly defaultStage?: string;
4
+ readonly rootDomain: string;
5
+ readonly stage: string;
6
+ }
7
+ export declare function normalizeDnsLabel(value: string, fieldName: string): string;
8
+ export declare function normalizeRootDomain(rootDomain: string): string;
9
+ export declare function createStageHostname({ app, defaultStage, rootDomain, stage, }: CreateStageHostnameOptions): string;
package/src/hosts.js ADDED
@@ -0,0 +1,38 @@
1
+ export function normalizeDnsLabel(value, fieldName) {
2
+ const label = value
3
+ .trim()
4
+ .toLowerCase()
5
+ .replace(/[^a-z0-9-]+/g, '-')
6
+ .replace(/-+/g, '-')
7
+ .replace(/^-|-$/g, '');
8
+ if (!label) {
9
+ throw new Error(`${fieldName} must contain at least one DNS-safe character`);
10
+ }
11
+ if (label.length > 63) {
12
+ throw new Error(`${fieldName} DNS label must be 63 characters or fewer`);
13
+ }
14
+ return label;
15
+ }
16
+ export function normalizeRootDomain(rootDomain) {
17
+ const normalized = rootDomain.trim().toLowerCase().replace(/\.$/, '');
18
+ if (!normalized) {
19
+ throw new Error('rootDomain is required');
20
+ }
21
+ if (normalized
22
+ .split('.')
23
+ .some((label) => normalizeDnsLabel(label, 'rootDomain label') !== label)) {
24
+ throw new Error(`rootDomain must be a valid DNS name: ${rootDomain}`);
25
+ }
26
+ return normalized;
27
+ }
28
+ export function createStageHostname({ app, defaultStage, rootDomain, stage, }) {
29
+ const appLabel = normalizeDnsLabel(app, 'app');
30
+ const stageLabel = normalizeDnsLabel(stage, 'stage');
31
+ const defaultStageLabel = normalizeDnsLabel(defaultStage !== null && defaultStage !== void 0 ? defaultStage : 'production', 'defaultStage');
32
+ const publicLabel = stageLabel === defaultStageLabel ? appLabel : `${appLabel}-${stageLabel}`;
33
+ if (publicLabel.length > 63) {
34
+ throw new Error('combined app and stage DNS label must be 63 characters or fewer');
35
+ }
36
+ return `${publicLabel}.${normalizeRootDomain(rootDomain)}`;
37
+ }
38
+ //# sourceMappingURL=hosts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hosts.js","sourceRoot":"","sources":["../../../../packages/runtime/src/hosts.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,iBAAiB,CAAC,KAAa,EAAE,SAAiB;IAChE,MAAM,KAAK,GAAG,KAAK;SAChB,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC;SAC5B,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAEzB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,GAAG,SAAS,+CAA+C,CAC5D,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,GAAG,SAAS,2CAA2C,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,UAAkB;IACpD,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAEtE,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IAED,IACE,UAAU;SACP,KAAK,CAAC,GAAG,CAAC;SACV,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,kBAAkB,CAAC,KAAK,KAAK,CAAC,EAC1E,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,wCAAwC,UAAU,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,EAClC,GAAG,EACH,YAAY,EACZ,UAAU,EACV,KAAK,GACsB;IAC3B,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACrD,MAAM,iBAAiB,GAAG,iBAAiB,CACzC,YAAY,aAAZ,YAAY,cAAZ,YAAY,GAAI,YAAY,EAC5B,cAAc,CACf,CAAC;IACF,MAAM,WAAW,GACf,UAAU,KAAK,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,UAAU,EAAE,CAAC;IAE5E,IAAI,WAAW,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,iEAAiE,CAClE,CAAC;IACJ,CAAC;IAED,OAAO,GAAG,WAAW,IAAI,mBAAmB,CAAC,UAAU,CAAC,EAAE,CAAC;AAC7D,CAAC"}
package/src/index.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ export * from './auth.js';
2
+ export * from './auth-session.js';
3
+ export * from './config.js';
4
+ export * from './events.js';
5
+ export * from './frontend.js';
6
+ export * from './hosts.js';
7
+ export * from './logging.js';
8
+ export * from './lambda.js';
9
+ export * from './observability.js';
10
+ export * from './request-context.js';
11
+ export * from './response.js';
12
+ export declare const runtimePackage: {
13
+ readonly exports: readonly ["@empire-builder-kit/runtime/auth", "@empire-builder-kit/runtime/auth-backend", "@empire-builder-kit/runtime/auth-web", "@empire-builder-kit/runtime/auth-session", "@empire-builder-kit/runtime/config", "@empire-builder-kit/runtime/database", "@empire-builder-kit/runtime/events", "@empire-builder-kit/runtime/frontend", "@empire-builder-kit/runtime/hosts", "@empire-builder-kit/runtime/request-context", "@empire-builder-kit/runtime/logging", "@empire-builder-kit/runtime/lambda", "@empire-builder-kit/runtime/observability", "@empire-builder-kit/runtime/response"];
14
+ readonly name: "@empire-builder-kit/runtime";
15
+ };
package/src/index.js ADDED
@@ -0,0 +1,31 @@
1
+ export * from './auth.js';
2
+ export * from './auth-session.js';
3
+ export * from './config.js';
4
+ export * from './events.js';
5
+ export * from './frontend.js';
6
+ export * from './hosts.js';
7
+ export * from './logging.js';
8
+ export * from './lambda.js';
9
+ export * from './observability.js';
10
+ export * from './request-context.js';
11
+ export * from './response.js';
12
+ export const runtimePackage = {
13
+ exports: [
14
+ '@empire-builder-kit/runtime/auth',
15
+ '@empire-builder-kit/runtime/auth-backend',
16
+ '@empire-builder-kit/runtime/auth-web',
17
+ '@empire-builder-kit/runtime/auth-session',
18
+ '@empire-builder-kit/runtime/config',
19
+ '@empire-builder-kit/runtime/database',
20
+ '@empire-builder-kit/runtime/events',
21
+ '@empire-builder-kit/runtime/frontend',
22
+ '@empire-builder-kit/runtime/hosts',
23
+ '@empire-builder-kit/runtime/request-context',
24
+ '@empire-builder-kit/runtime/logging',
25
+ '@empire-builder-kit/runtime/lambda',
26
+ '@empire-builder-kit/runtime/observability',
27
+ '@empire-builder-kit/runtime/response',
28
+ ],
29
+ name: '@empire-builder-kit/runtime',
30
+ };
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/runtime/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAE9B,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,OAAO,EAAE;QACP,kCAAkC;QAClC,0CAA0C;QAC1C,sCAAsC;QACtC,0CAA0C;QAC1C,oCAAoC;QACpC,sCAAsC;QACtC,oCAAoC;QACpC,sCAAsC;QACtC,mCAAmC;QACnC,6CAA6C;QAC7C,qCAAqC;QACrC,oCAAoC;QACpC,2CAA2C;QAC3C,sCAAsC;KACvC;IACD,IAAI,EAAE,6BAA6B;CAC3B,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { type Logger } from './logging.js';
2
+ import { type RequestContext } from './request-context.js';
3
+ import { type AppResponse } from './response.js';
4
+ export interface RuntimeHttpEvent {
5
+ body?: string | null;
6
+ headers?: Record<string, string | undefined> | null;
7
+ rawPath?: string;
8
+ requestContext?: {
9
+ http?: {
10
+ method?: string;
11
+ path?: string;
12
+ sourceIp?: string;
13
+ userAgent?: string;
14
+ };
15
+ requestId?: string;
16
+ };
17
+ }
18
+ export interface RuntimeHttpJsonResponse {
19
+ body: string;
20
+ headers: Record<string, string>;
21
+ statusCode: number;
22
+ }
23
+ export interface RuntimeHttpHandlerInput<E extends RuntimeHttpEvent = RuntimeHttpEvent> {
24
+ context: RequestContext;
25
+ event: E;
26
+ logger: Logger;
27
+ }
28
+ export interface CreateHttpJsonHandlerOptions<T, E extends RuntimeHttpEvent = RuntimeHttpEvent> {
29
+ app: string;
30
+ handle(input: RuntimeHttpHandlerInput<E>): Promise<T> | T;
31
+ includeErrorDetails?: boolean;
32
+ logger?: Logger;
33
+ operation: string;
34
+ service?: string;
35
+ stage?: string;
36
+ successStatus?: number;
37
+ }
38
+ export type RuntimeHttpJsonHandler<E extends RuntimeHttpEvent = RuntimeHttpEvent> = (event: E) => Promise<RuntimeHttpJsonResponse>;
39
+ export declare const lambdaContract: {
40
+ readonly defaultResponseFormat: "json";
41
+ readonly exportPath: "@empire-builder-kit/runtime/lambda";
42
+ readonly packageName: "@empire-builder-kit/runtime";
43
+ };
44
+ export declare function toHttpJsonResponse<T>(response: AppResponse<T>): RuntimeHttpJsonResponse;
45
+ export declare function createHttpJsonHandler<T, E extends RuntimeHttpEvent = RuntimeHttpEvent>(options: CreateHttpJsonHandlerOptions<T, E>): RuntimeHttpJsonHandler<E>;