@empire-builder-kit/runtime 1.0.0-beta.8 → 1.0.0-rc.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.
Files changed (218) hide show
  1. package/NOTICE +6 -0
  2. package/package.json +93 -3
  3. package/src/api-contract/artifacts.d.ts +67 -0
  4. package/src/api-contract/artifacts.js +349 -0
  5. package/src/api-contract/artifacts.js.map +1 -0
  6. package/src/api-contract/client.d.ts +79 -0
  7. package/src/api-contract/client.js +561 -0
  8. package/src/api-contract/client.js.map +1 -0
  9. package/src/api-contract/errors.d.ts +7 -0
  10. package/src/api-contract/errors.js +11 -0
  11. package/src/api-contract/errors.js.map +1 -0
  12. package/src/api-contract/index.d.ts +9 -0
  13. package/src/api-contract/index.js +10 -0
  14. package/src/api-contract/index.js.map +1 -0
  15. package/src/api-contract/operation.d.ts +118 -0
  16. package/src/api-contract/operation.js +609 -0
  17. package/src/api-contract/operation.js.map +1 -0
  18. package/src/api-contract/schema.d.ts +81 -0
  19. package/src/api-contract/schema.js +313 -0
  20. package/src/api-contract/schema.js.map +1 -0
  21. package/src/api-contract/server.d.ts +77 -0
  22. package/src/api-contract/server.js +466 -0
  23. package/src/api-contract/server.js.map +1 -0
  24. package/src/async-work/contract.d.ts +17 -0
  25. package/src/async-work/contract.js +105 -0
  26. package/src/async-work/contract.js.map +1 -0
  27. package/src/async-work/idempotency.d.ts +123 -0
  28. package/src/async-work/idempotency.js +167 -0
  29. package/src/async-work/idempotency.js.map +1 -0
  30. package/src/async-work/index.d.ts +8 -0
  31. package/src/async-work/index.js +9 -0
  32. package/src/async-work/index.js.map +1 -0
  33. package/src/async-work/provider.d.ts +90 -0
  34. package/src/async-work/provider.js +155 -0
  35. package/src/async-work/provider.js.map +1 -0
  36. package/src/async-work/recovery.d.ts +103 -0
  37. package/src/async-work/recovery.js +291 -0
  38. package/src/async-work/recovery.js.map +1 -0
  39. package/src/async-work/schedule.d.ts +117 -0
  40. package/src/async-work/schedule.js +279 -0
  41. package/src/async-work/schedule.js.map +1 -0
  42. package/src/async-work/sqs.d.ts +133 -0
  43. package/src/async-work/sqs.js +280 -0
  44. package/src/async-work/sqs.js.map +1 -0
  45. package/src/async-work/webhook.d.ts +60 -0
  46. package/src/async-work/webhook.js +178 -0
  47. package/src/async-work/webhook.js.map +1 -0
  48. package/src/async-work/workflow.d.ts +98 -0
  49. package/src/async-work/workflow.js +225 -0
  50. package/src/async-work/workflow.js.map +1 -0
  51. package/src/auth-backend.d.ts +12 -2
  52. package/src/auth-backend.js +30 -18
  53. package/src/auth-backend.js.map +1 -1
  54. package/src/authorization/admission.d.ts +30 -0
  55. package/src/authorization/admission.js +87 -0
  56. package/src/authorization/admission.js.map +1 -0
  57. package/src/authorization/approval.d.ts +99 -0
  58. package/src/authorization/approval.js +249 -0
  59. package/src/authorization/approval.js.map +1 -0
  60. package/src/authorization/audit.d.ts +35 -0
  61. package/src/authorization/audit.js +35 -0
  62. package/src/authorization/audit.js.map +1 -0
  63. package/src/authorization/delegation.d.ts +149 -0
  64. package/src/authorization/delegation.js +401 -0
  65. package/src/authorization/delegation.js.map +1 -0
  66. package/src/authorization/errors.d.ts +32 -0
  67. package/src/authorization/errors.js +153 -0
  68. package/src/authorization/errors.js.map +1 -0
  69. package/src/authorization/evaluator.d.ts +39 -0
  70. package/src/authorization/evaluator.js +199 -0
  71. package/src/authorization/evaluator.js.map +1 -0
  72. package/src/authorization/index.d.ts +14 -0
  73. package/src/authorization/index.js +15 -0
  74. package/src/authorization/index.js.map +1 -0
  75. package/src/authorization/machine-token.d.ts +87 -0
  76. package/src/authorization/machine-token.js +201 -0
  77. package/src/authorization/machine-token.js.map +1 -0
  78. package/src/authorization/machine.d.ts +32 -0
  79. package/src/authorization/machine.js +41 -0
  80. package/src/authorization/machine.js.map +1 -0
  81. package/src/authorization/model.d.ts +112 -0
  82. package/src/authorization/model.js +112 -0
  83. package/src/authorization/model.js.map +1 -0
  84. package/src/canonical-json.cjs +157 -0
  85. package/src/canonical-json.d.cts +26 -0
  86. package/src/canonical-json.d.ts +18 -0
  87. package/src/canonical-json.js +125 -0
  88. package/src/canonical-json.js.map +1 -0
  89. package/src/configuration/contract.d.ts +107 -0
  90. package/src/configuration/contract.js +461 -0
  91. package/src/configuration/contract.js.map +1 -0
  92. package/src/configuration/index.d.ts +3 -0
  93. package/src/configuration/index.js +4 -0
  94. package/src/configuration/index.js.map +1 -0
  95. package/src/configuration/provider.d.ts +59 -0
  96. package/src/configuration/provider.js +198 -0
  97. package/src/configuration/provider.js.map +1 -0
  98. package/src/configuration/rollout-evaluator.cjs +54 -0
  99. package/src/configuration/rollout-evaluator.d.cts +26 -0
  100. package/src/configuration/rollout-evaluator.d.ts +18 -0
  101. package/src/configuration/rollout-evaluator.js +38 -0
  102. package/src/configuration/rollout-evaluator.js.map +1 -0
  103. package/src/configuration/rollout-key.cjs +38 -0
  104. package/src/configuration/rollout-key.d.cts +14 -0
  105. package/src/configuration/rollout-key.d.ts +10 -0
  106. package/src/configuration/rollout-key.js +26 -0
  107. package/src/configuration/rollout-key.js.map +1 -0
  108. package/src/configuration/rollout.d.ts +60 -0
  109. package/src/configuration/rollout.js +42 -0
  110. package/src/configuration/rollout.js.map +1 -0
  111. package/src/data-lifecycle/contract.d.ts +33 -0
  112. package/src/data-lifecycle/contract.js +118 -0
  113. package/src/data-lifecycle/contract.js.map +1 -0
  114. package/src/data-lifecycle/event.d.ts +28 -0
  115. package/src/data-lifecycle/event.js +76 -0
  116. package/src/data-lifecycle/event.js.map +1 -0
  117. package/src/data-lifecycle/evidence.d.ts +65 -0
  118. package/src/data-lifecycle/evidence.js +162 -0
  119. package/src/data-lifecycle/evidence.js.map +1 -0
  120. package/src/data-lifecycle/holds.d.ts +29 -0
  121. package/src/data-lifecycle/holds.js +124 -0
  122. package/src/data-lifecycle/holds.js.map +1 -0
  123. package/src/data-lifecycle/index.d.ts +8 -0
  124. package/src/data-lifecycle/index.js +9 -0
  125. package/src/data-lifecycle/index.js.map +1 -0
  126. package/src/data-lifecycle/policy.d.ts +16 -0
  127. package/src/data-lifecycle/policy.js +79 -0
  128. package/src/data-lifecycle/policy.js.map +1 -0
  129. package/src/data-lifecycle/restore.d.ts +90 -0
  130. package/src/data-lifecycle/restore.js +336 -0
  131. package/src/data-lifecycle/restore.js.map +1 -0
  132. package/src/data-lifecycle/retention.d.ts +57 -0
  133. package/src/data-lifecycle/retention.js +232 -0
  134. package/src/data-lifecycle/retention.js.map +1 -0
  135. package/src/data-lifecycle/rights.d.ts +171 -0
  136. package/src/data-lifecycle/rights.js +533 -0
  137. package/src/data-lifecycle/rights.js.map +1 -0
  138. package/src/database.d.ts +36 -0
  139. package/src/database.js +119 -0
  140. package/src/database.js.map +1 -0
  141. package/src/deterministic-order.cjs +16 -0
  142. package/src/deterministic-order.d.cts +9 -0
  143. package/src/deterministic-order.d.ts +7 -0
  144. package/src/deterministic-order.js +10 -0
  145. package/src/deterministic-order.js.map +1 -0
  146. package/src/events.d.ts +28 -19
  147. package/src/events.js +171 -66
  148. package/src/events.js.map +1 -1
  149. package/src/index.d.ts +7 -1
  150. package/src/index.js +24 -0
  151. package/src/index.js.map +1 -1
  152. package/src/lambda.d.ts +8 -2
  153. package/src/lambda.js +100 -39
  154. package/src/lambda.js.map +1 -1
  155. package/src/logging.d.ts +95 -36
  156. package/src/logging.js +460 -62
  157. package/src/logging.js.map +1 -1
  158. package/src/observability.d.ts +80 -18
  159. package/src/observability.js +252 -61
  160. package/src/observability.js.map +1 -1
  161. package/src/performance/index.d.ts +1 -0
  162. package/src/performance/index.js +2 -0
  163. package/src/performance/index.js.map +1 -0
  164. package/src/performance/protected-load-endpoint.d.ts +140 -0
  165. package/src/performance/protected-load-endpoint.js +462 -0
  166. package/src/performance/protected-load-endpoint.js.map +1 -0
  167. package/src/rds-global-ca-bundle.d.ts +1 -0
  168. package/src/rds-global-ca-bundle.js +2742 -0
  169. package/src/rds-global-ca-bundle.js.map +1 -0
  170. package/src/reliability/burn.d.ts +39 -0
  171. package/src/reliability/burn.js +102 -0
  172. package/src/reliability/burn.js.map +1 -0
  173. package/src/reliability/contract.d.ts +5 -0
  174. package/src/reliability/contract.js +317 -0
  175. package/src/reliability/contract.js.map +1 -0
  176. package/src/reliability/incident.d.ts +16 -0
  177. package/src/reliability/incident.js +562 -0
  178. package/src/reliability/incident.js.map +1 -0
  179. package/src/reliability/index.d.ts +5 -0
  180. package/src/reliability/index.js +6 -0
  181. package/src/reliability/index.js.map +1 -0
  182. package/src/reliability/model.d.ts +191 -0
  183. package/src/reliability/model.fixtures.d.ts +2 -0
  184. package/src/reliability/model.fixtures.js +57 -0
  185. package/src/reliability/model.fixtures.js.map +1 -0
  186. package/src/reliability/model.js +2 -0
  187. package/src/reliability/model.js.map +1 -0
  188. package/src/reliability/slo.d.ts +9 -0
  189. package/src/reliability/slo.js +74 -0
  190. package/src/reliability/slo.js.map +1 -0
  191. package/src/request-context.d.ts +57 -15
  192. package/src/request-context.js +116 -36
  193. package/src/request-context.js.map +1 -1
  194. package/src/safe-reference.cjs +57 -0
  195. package/src/safe-reference.d.cts +25 -0
  196. package/src/safe-reference.d.ts +11 -0
  197. package/src/safe-reference.js +46 -0
  198. package/src/safe-reference.js.map +1 -0
  199. package/src/secrets/contract.d.ts +99 -0
  200. package/src/secrets/contract.js +238 -0
  201. package/src/secrets/contract.js.map +1 -0
  202. package/src/secrets/index.d.ts +4 -0
  203. package/src/secrets/index.js +5 -0
  204. package/src/secrets/index.js.map +1 -0
  205. package/src/secrets/observability.d.ts +14 -0
  206. package/src/secrets/observability.js +100 -0
  207. package/src/secrets/observability.js.map +1 -0
  208. package/src/secrets/personal.d.ts +48 -0
  209. package/src/secrets/personal.js +332 -0
  210. package/src/secrets/personal.js.map +1 -0
  211. package/src/secrets/resolver.d.ts +125 -0
  212. package/src/secrets/resolver.js +602 -0
  213. package/src/secrets/resolver.js.map +1 -0
  214. package/src/secrets/sensitive-patterns.cjs +84 -0
  215. package/src/secrets/sensitive-patterns.d.cts +62 -0
  216. package/src/secrets/sensitive-patterns.d.ts +40 -0
  217. package/src/secrets/sensitive-patterns.js +60 -0
  218. package/src/secrets/sensitive-patterns.js.map +1 -0
@@ -0,0 +1,81 @@
1
+ export declare const JSON_SCHEMA_2020_12_DIALECT: "https://json-schema.org/draft/2020-12/schema";
2
+ export declare const API_HTTP_HEADER_VALUE_FORMAT: "ebk-http-header-value";
3
+ export declare const API_HTTP_HEADER_VALUE_MAX_LENGTH: number;
4
+ export declare const API_HTTP_HEADER_VALUE_PATTERN: "^[!-~](?:[ -~]*[!-~])?(?![\\s\\S])";
5
+ export declare function isCanonicalApiHttpHeaderValue(value: string): boolean;
6
+ export type JsonSchemaPrimitiveType = 'array' | 'boolean' | 'integer' | 'null' | 'number' | 'object' | 'string';
7
+ export interface JsonSchema202012 {
8
+ $ref?: string;
9
+ $schema?: typeof JSON_SCHEMA_2020_12_DIALECT;
10
+ additionalProperties?: boolean | JsonSchema202012;
11
+ const?: boolean | null | number | string;
12
+ description?: string;
13
+ enum?: readonly (boolean | null | number | string)[];
14
+ format?: string;
15
+ items?: JsonSchema202012;
16
+ maxItems?: number;
17
+ maxLength?: number;
18
+ maximum?: number;
19
+ minItems?: number;
20
+ minLength?: number;
21
+ minimum?: number;
22
+ oneOf?: readonly JsonSchema202012[];
23
+ pattern?: string;
24
+ properties?: Readonly<Record<string, JsonSchema202012>>;
25
+ required?: readonly string[];
26
+ type?: JsonSchemaPrimitiveType | readonly JsonSchemaPrimitiveType[];
27
+ }
28
+ export interface ApiSchema<T> {
29
+ readonly jsonSchema: JsonSchema202012;
30
+ /**
31
+ * Parses untrusted request input and rejects undeclared object fields.
32
+ */
33
+ parse(value: unknown, path?: string): T;
34
+ /**
35
+ * Parses a response received by a client while ignoring additive object
36
+ * fields that an older compatible client does not know.
37
+ */
38
+ parseResponse(value: unknown, path?: string): T;
39
+ /**
40
+ * Validates a producer response and projects only declared fields.
41
+ */
42
+ project(value: unknown, path?: string): T;
43
+ }
44
+ export interface OptionalApiSchema<T> {
45
+ readonly optional: true;
46
+ readonly schema: ApiSchema<T>;
47
+ }
48
+ type InferSchema<T> = T extends ApiSchema<infer V> ? V : T extends OptionalApiSchema<infer V> ? V : never;
49
+ type ObjectProperty = ApiSchema<unknown> | OptionalApiSchema<unknown>;
50
+ type RequiredKeys<T extends Record<string, ObjectProperty>> = {
51
+ [K in keyof T]: T[K] extends OptionalApiSchema<unknown> ? never : K;
52
+ }[keyof T];
53
+ type OptionalKeys<T extends Record<string, ObjectProperty>> = {
54
+ [K in keyof T]: T[K] extends OptionalApiSchema<unknown> ? K : never;
55
+ }[keyof T];
56
+ export type InferObjectSchema<T extends Record<string, ObjectProperty>> = {
57
+ [K in RequiredKeys<T>]: InferSchema<T[K]>;
58
+ } & {
59
+ [K in OptionalKeys<T>]?: InferSchema<T[K]>;
60
+ };
61
+ export declare function apiString(inputOptions?: {
62
+ enum?: readonly string[];
63
+ format?: 'uuid' | typeof API_HTTP_HEADER_VALUE_FORMAT;
64
+ maxLength?: number;
65
+ minLength?: number;
66
+ }): ApiSchema<string>;
67
+ export declare function apiNumber(inputOptions?: {
68
+ integer?: boolean;
69
+ maximum?: number;
70
+ minimum?: number;
71
+ }): ApiSchema<number>;
72
+ export declare function apiBoolean(): ApiSchema<boolean>;
73
+ export declare function apiLiteral<const T extends boolean | number | string>(literal: T): ApiSchema<T>;
74
+ export declare function apiArray<T>(item: ApiSchema<T>, inputOptions?: {
75
+ maxItems?: number;
76
+ minItems?: number;
77
+ }): ApiSchema<T[]>;
78
+ export declare function apiOptional<T>(value: ApiSchema<T>): OptionalApiSchema<T>;
79
+ export declare function apiNullable<T>(value: ApiSchema<T>): ApiSchema<T | null>;
80
+ export declare function apiObject<const T extends Record<string, ApiSchema<unknown> | OptionalApiSchema<unknown>>>(properties: T): ApiSchema<InferObjectSchema<T>>;
81
+ export {};
@@ -0,0 +1,313 @@
1
+ import { ApiContractError } from './errors.js';
2
+ export const JSON_SCHEMA_2020_12_DIALECT = 'https://json-schema.org/draft/2020-12/schema';
3
+ export const API_HTTP_HEADER_VALUE_FORMAT = 'ebk-http-header-value';
4
+ export const API_HTTP_HEADER_VALUE_MAX_LENGTH = 8 * 1024;
5
+ export const API_HTTP_HEADER_VALUE_PATTERN = '^[!-~](?:[ -~]*[!-~])?(?![\\s\\S])';
6
+ export function isCanonicalApiHttpHeaderValue(value) {
7
+ if (value.length < 1 || value.length > API_HTTP_HEADER_VALUE_MAX_LENGTH) {
8
+ return false;
9
+ }
10
+ for (let index = 0; index < value.length; index += 1) {
11
+ const code = value.charCodeAt(index);
12
+ if (code < (index === 0 || index === value.length - 1 ? 0x21 : 0x20) ||
13
+ code > 0x7e) {
14
+ return false;
15
+ }
16
+ }
17
+ return true;
18
+ }
19
+ const apiSchemaRuntimeBrand = Symbol.for('@empire-builder-kit/runtime/api-schema-v1');
20
+ const reservedObjectPropertyNames = new Set([
21
+ '__proto__',
22
+ 'constructor',
23
+ 'prototype',
24
+ ]);
25
+ function freezeJsonSchema(value) {
26
+ for (const entry of Object.values(value)) {
27
+ if (Array.isArray(entry)) {
28
+ for (const member of entry) {
29
+ if (member && typeof member === 'object') {
30
+ freezeJsonSchema(member);
31
+ }
32
+ }
33
+ Object.freeze(entry);
34
+ }
35
+ else if (entry && typeof entry === 'object') {
36
+ freezeJsonSchema(entry);
37
+ }
38
+ }
39
+ return Object.freeze(value);
40
+ }
41
+ function fail(path, message) {
42
+ throw new ApiContractError('api-schema-validation-failed', `${path} ${message}`);
43
+ }
44
+ function schema(jsonSchema, parseMode, project) {
45
+ const apiSchema = {
46
+ jsonSchema: freezeJsonSchema(jsonSchema),
47
+ parse: (value, path = 'value') => parseMode(value, path, 'request'),
48
+ parseMode,
49
+ parseResponse: (value, path = 'value') => parseMode(value, path, 'response'),
50
+ project: project !== null && project !== void 0 ? project : ((value, path = 'value') => parseMode(value, path, 'request')),
51
+ };
52
+ Object.defineProperty(apiSchema, apiSchemaRuntimeBrand, {
53
+ enumerable: false,
54
+ value: true,
55
+ });
56
+ return Object.freeze(apiSchema);
57
+ }
58
+ function internal(value) {
59
+ const candidate = value;
60
+ if (!value ||
61
+ typeof value !== 'object' ||
62
+ candidate[apiSchemaRuntimeBrand] !== true ||
63
+ typeof candidate.parseMode !== 'function') {
64
+ throw new ApiContractError('api-contract-invalid', 'API schema composition accepts only EBK API schemas.');
65
+ }
66
+ return candidate;
67
+ }
68
+ function validateLengthOption(minimum, maximum, label) {
69
+ if ((minimum !== undefined &&
70
+ (!Number.isSafeInteger(minimum) || minimum < 0)) ||
71
+ (maximum !== undefined &&
72
+ (!Number.isSafeInteger(maximum) || maximum < 0)) ||
73
+ (minimum !== undefined && maximum !== undefined && minimum > maximum)) {
74
+ throw new ApiContractError('api-contract-invalid', `${label} bounds must be ordered non-negative safe integers.`);
75
+ }
76
+ }
77
+ export function apiString(inputOptions = {}) {
78
+ var _a, _b, _c, _d;
79
+ if (!inputOptions ||
80
+ typeof inputOptions !== 'object' ||
81
+ Array.isArray(inputOptions)) {
82
+ throw new ApiContractError('api-contract-invalid', 'String schema options must be a plain record.');
83
+ }
84
+ const inputRecord = inputOptions;
85
+ const inputPrototype = Object.getPrototypeOf(inputOptions);
86
+ const allowedOptionKeys = new Set([
87
+ 'enum',
88
+ 'format',
89
+ 'maxLength',
90
+ 'minLength',
91
+ ]);
92
+ if (inputPrototype !== Object.prototype && inputPrototype !== null) {
93
+ throw new ApiContractError('api-contract-invalid', 'String schema options must use a plain or null prototype.');
94
+ }
95
+ for (const key of Reflect.ownKeys(inputRecord)) {
96
+ const descriptor = Object.getOwnPropertyDescriptor(inputRecord, key);
97
+ if (typeof key !== 'string' ||
98
+ !allowedOptionKeys.has(key) ||
99
+ !(descriptor === null || descriptor === void 0 ? void 0 : descriptor.enumerable) ||
100
+ !Object.prototype.hasOwnProperty.call(descriptor, 'value')) {
101
+ throw new ApiContractError('api-contract-invalid', 'String schema options contain an unsupported field.');
102
+ }
103
+ }
104
+ const options = Object.freeze(Object.assign(Object.assign({}, inputOptions), (inputOptions.enum
105
+ ? { enum: Object.freeze([...inputOptions.enum]) }
106
+ : {})));
107
+ validateLengthOption(options.minLength, options.maxLength, 'String');
108
+ if (((_a = options.enum) === null || _a === void 0 ? void 0 : _a.length) === 0 ||
109
+ (options.enum &&
110
+ (new Set(options.enum).size !== options.enum.length ||
111
+ options.enum.some((value) => typeof value !== 'string'))) ||
112
+ (options.format !== undefined &&
113
+ !['uuid', API_HTTP_HEADER_VALUE_FORMAT].includes(options.format))) {
114
+ throw new ApiContractError('api-contract-invalid', 'String schema options must be bounded, normalized, and unique.');
115
+ }
116
+ const httpHeaderValue = options.format === API_HTTP_HEADER_VALUE_FORMAT;
117
+ if (httpHeaderValue &&
118
+ ((options.minLength !== undefined && options.minLength < 1) ||
119
+ (options.maxLength !== undefined &&
120
+ options.maxLength > API_HTTP_HEADER_VALUE_MAX_LENGTH) ||
121
+ ((_b = options.enum) === null || _b === void 0 ? void 0 : _b.some((value) => !isCanonicalApiHttpHeaderValue(value))))) {
122
+ throw new ApiContractError('api-contract-invalid', 'HTTP header strings must use canonical visible ASCII without surrounding whitespace and stay within 8 KiB.');
123
+ }
124
+ const minLength = httpHeaderValue
125
+ ? ((_c = options.minLength) !== null && _c !== void 0 ? _c : 1)
126
+ : options.minLength;
127
+ const maxLength = httpHeaderValue
128
+ ? ((_d = options.maxLength) !== null && _d !== void 0 ? _d : API_HTTP_HEADER_VALUE_MAX_LENGTH)
129
+ : options.maxLength;
130
+ return schema(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ $schema: JSON_SCHEMA_2020_12_DIALECT }, (options.enum ? { enum: [...options.enum] } : {})), (options.format ? { format: options.format } : {})), (maxLength === undefined ? {} : { maxLength })), (minLength === undefined ? {} : { minLength })), (httpHeaderValue ? { pattern: API_HTTP_HEADER_VALUE_PATTERN } : {})), { type: 'string' }), (value, path) => {
131
+ if (typeof value !== 'string') {
132
+ return fail(path, 'does not satisfy the declared string schema.');
133
+ }
134
+ const length = [...value].length;
135
+ if ((minLength !== undefined && length < minLength) ||
136
+ (maxLength !== undefined && length > maxLength) ||
137
+ (options.enum && !options.enum.includes(value)) ||
138
+ (options.format === 'uuid' &&
139
+ !/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value)) ||
140
+ (httpHeaderValue && !isCanonicalApiHttpHeaderValue(value))) {
141
+ return fail(path, 'does not satisfy the declared string schema.');
142
+ }
143
+ return value;
144
+ });
145
+ }
146
+ export function apiNumber(inputOptions = {}) {
147
+ var _a, _b;
148
+ const options = Object.freeze(Object.assign({}, inputOptions));
149
+ if ((options.minimum !== undefined && !Number.isFinite(options.minimum)) ||
150
+ (options.maximum !== undefined && !Number.isFinite(options.maximum)) ||
151
+ (options.minimum !== undefined &&
152
+ options.maximum !== undefined &&
153
+ options.minimum > options.maximum)) {
154
+ throw new ApiContractError('api-contract-invalid', 'Numeric bounds must be ordered finite numbers.');
155
+ }
156
+ const minimum = options.integer
157
+ ? Math.max((_a = options.minimum) !== null && _a !== void 0 ? _a : Number.MIN_SAFE_INTEGER, Number.MIN_SAFE_INTEGER)
158
+ : options.minimum;
159
+ const maximum = options.integer
160
+ ? Math.min((_b = options.maximum) !== null && _b !== void 0 ? _b : Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER)
161
+ : options.maximum;
162
+ if (minimum !== undefined && maximum !== undefined && minimum > maximum) {
163
+ throw new ApiContractError('api-contract-invalid', 'Integer bounds must overlap the JavaScript safe-integer domain.');
164
+ }
165
+ return schema(Object.assign(Object.assign(Object.assign({ $schema: JSON_SCHEMA_2020_12_DIALECT }, (maximum === undefined ? {} : { maximum })), (minimum === undefined ? {} : { minimum })), { type: options.integer ? 'integer' : 'number' }), (value, path) => {
166
+ if (typeof value !== 'number' ||
167
+ !Number.isFinite(value) ||
168
+ (options.integer && !Number.isSafeInteger(value)) ||
169
+ (minimum !== undefined && value < minimum) ||
170
+ (maximum !== undefined && value > maximum)) {
171
+ return fail(path, 'does not satisfy the declared numeric schema.');
172
+ }
173
+ return value;
174
+ });
175
+ }
176
+ export function apiBoolean() {
177
+ return schema({ $schema: JSON_SCHEMA_2020_12_DIALECT, type: 'boolean' }, (value, path) => typeof value === 'boolean' ? value : fail(path, 'must be a boolean.'));
178
+ }
179
+ export function apiLiteral(literal) {
180
+ if (typeof literal === 'number' && !Number.isFinite(literal)) {
181
+ throw new ApiContractError('api-contract-invalid', 'A numeric literal must be finite.');
182
+ }
183
+ return schema({
184
+ $schema: JSON_SCHEMA_2020_12_DIALECT,
185
+ const: literal,
186
+ type: typeof literal,
187
+ }, (value, path) => value === literal
188
+ ? literal
189
+ : fail(path, `must equal ${String(literal)}.`));
190
+ }
191
+ export function apiArray(item, inputOptions = {}) {
192
+ const options = Object.freeze(Object.assign({}, inputOptions));
193
+ const itemSchema = internal(item);
194
+ validateLengthOption(options.minItems, options.maxItems, 'Array');
195
+ const parseArray = (value, path, mode) => {
196
+ if (!Array.isArray(value) ||
197
+ (options.minItems !== undefined && value.length < options.minItems) ||
198
+ (options.maxItems !== undefined && value.length > options.maxItems)) {
199
+ return fail(path, 'does not satisfy the declared array schema.');
200
+ }
201
+ return value.map((entry, index) => itemSchema.parseMode(entry, `${path}[${index}]`, mode));
202
+ };
203
+ return schema(Object.assign(Object.assign(Object.assign({ $schema: JSON_SCHEMA_2020_12_DIALECT, items: itemSchema.jsonSchema }, (options.maxItems === undefined ? {} : { maxItems: options.maxItems })), (options.minItems === undefined ? {} : { minItems: options.minItems })), { type: 'array' }), parseArray, (value, path = 'value') => {
204
+ if (!Array.isArray(value) ||
205
+ (options.minItems !== undefined && value.length < options.minItems) ||
206
+ (options.maxItems !== undefined && value.length > options.maxItems)) {
207
+ return fail(path, 'does not satisfy the declared array schema.');
208
+ }
209
+ return value.map((entry, index) => itemSchema.project(entry, `${path}[${index}]`));
210
+ });
211
+ }
212
+ export function apiOptional(value) {
213
+ return Object.freeze({ optional: true, schema: internal(value) });
214
+ }
215
+ export function apiNullable(value) {
216
+ var _a;
217
+ const valueSchema = internal(value);
218
+ if (valueSchema.jsonSchema.type === 'null' ||
219
+ ((_a = valueSchema.jsonSchema.oneOf) === null || _a === void 0 ? void 0 : _a.some((entry) => entry.type === 'null'))) {
220
+ throw new ApiContractError('api-contract-invalid', 'Nullable schemas cannot wrap an already-nullable schema.');
221
+ }
222
+ return schema({
223
+ $schema: JSON_SCHEMA_2020_12_DIALECT,
224
+ oneOf: [valueSchema.jsonSchema, { type: 'null' }],
225
+ }, (input, path, mode) => input === null ? null : valueSchema.parseMode(input, path, mode), (input, path = 'value') => input === null ? null : valueSchema.project(input, path));
226
+ }
227
+ export function apiObject(properties) {
228
+ const definitions = Object.freeze(Object.assign(Object.create(null), properties));
229
+ const names = Object.keys(definitions).sort();
230
+ if (names.some((name) => reservedObjectPropertyNames.has(name) ||
231
+ !/^[A-Za-z_][A-Za-z0-9_.-]{0,127}$/.test(name) ||
232
+ !definitions[name])) {
233
+ throw new ApiContractError('api-contract-invalid', 'Object schema property names must be safe bounded machine-readable tokens.');
234
+ }
235
+ for (const name of names) {
236
+ const property = definitions[name];
237
+ if (!property || typeof property !== 'object') {
238
+ throw new ApiContractError('api-contract-invalid', 'Object schema properties must use EBK API schemas.');
239
+ }
240
+ if ('optional' in property) {
241
+ if (property.optional !== true) {
242
+ throw new ApiContractError('api-contract-invalid', 'Optional API schema properties are malformed.');
243
+ }
244
+ internal(property.schema);
245
+ }
246
+ else {
247
+ internal(property);
248
+ }
249
+ }
250
+ const required = names.filter((name) => !('optional' in definitions[name]));
251
+ const propertySchemas = Object.assign(Object.create(null), Object.fromEntries(names.map((name) => {
252
+ const property = definitions[name];
253
+ return [
254
+ name,
255
+ 'optional' in property
256
+ ? property.schema.jsonSchema
257
+ : property.jsonSchema,
258
+ ];
259
+ })));
260
+ const requireRecord = (value, path) => {
261
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
262
+ return fail(path, 'must be an object.');
263
+ }
264
+ return value;
265
+ };
266
+ const parseObject = (value, path, mode) => {
267
+ const record = requireRecord(value, path);
268
+ if (mode === 'request') {
269
+ const unknown = Object.keys(record)
270
+ .filter((name) => !Object.prototype.hasOwnProperty.call(definitions, name))
271
+ .sort();
272
+ if (unknown.length > 0) {
273
+ return fail(path, `contains undeclared fields: ${unknown.join(', ')}.`);
274
+ }
275
+ }
276
+ const result = Object.create(null);
277
+ for (const name of names) {
278
+ const property = definitions[name];
279
+ const optional = 'optional' in property;
280
+ if (!Object.prototype.hasOwnProperty.call(record, name)) {
281
+ if (!optional) {
282
+ return fail(`${path}.${name}`, 'is required.');
283
+ }
284
+ continue;
285
+ }
286
+ result[name] = internal(optional ? property.schema : property).parseMode(record[name], `${path}.${name}`, mode);
287
+ }
288
+ return result;
289
+ };
290
+ return schema({
291
+ $schema: JSON_SCHEMA_2020_12_DIALECT,
292
+ additionalProperties: false,
293
+ properties: propertySchemas,
294
+ required,
295
+ type: 'object',
296
+ }, parseObject, (value, path = 'value') => {
297
+ const record = requireRecord(value, path);
298
+ const result = Object.create(null);
299
+ for (const name of names) {
300
+ const property = definitions[name];
301
+ const optional = 'optional' in property;
302
+ if (!Object.prototype.hasOwnProperty.call(record, name)) {
303
+ if (!optional) {
304
+ return fail(`${path}.${name}`, 'is required.');
305
+ }
306
+ continue;
307
+ }
308
+ result[name] = (optional ? property.schema : property).project(record[name], `${path}.${name}`);
309
+ }
310
+ return result;
311
+ });
312
+ }
313
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../../../packages/runtime/src/api-contract/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import { type RuntimeHttpEvent, type RuntimeHttpJsonHandler } from '../lambda.js';
2
+ import type { Logger } from '../logging.js';
3
+ import type { RequestContext } from '../request-context.js';
4
+ import { type ApiOperationDefinition, type ApiIdempotencyContract, type ApiRequestValue, type ApiResponseValue } from './operation.js';
5
+ export interface ApiAuthorizationInput<Operation extends ApiOperationDefinition, Event extends RuntimeHttpEvent> {
6
+ context: RequestContext;
7
+ event: Event;
8
+ logger: Logger;
9
+ operation: Operation;
10
+ request: ApiRequestValue<Operation>;
11
+ semantics: ApiRequestSemantics;
12
+ }
13
+ export interface ApiRequestSemantics {
14
+ idempotencyKey?: string;
15
+ ifMatch?: string;
16
+ }
17
+ export interface ApiServerHandlerInput<Operation extends ApiOperationDefinition, Principal> {
18
+ context: RequestContext;
19
+ logger: Logger;
20
+ operation: Operation;
21
+ principal: Principal;
22
+ request: ApiRequestValue<Operation>;
23
+ semantics: ApiRequestSemantics;
24
+ }
25
+ export interface ApiServerRepresentation<Operation extends ApiOperationDefinition> {
26
+ etag?: string;
27
+ response: ApiResponseValue<Operation>;
28
+ }
29
+ export interface ApiServerConditionalWriteInput<Operation extends ApiOperationDefinition, Principal> extends ApiServerHandlerInput<Operation, Principal> {
30
+ contract: NonNullable<Operation['conditionalWrite']>;
31
+ }
32
+ export interface ApiServerConditionalWriteAdapter<Operation extends ApiOperationDefinition, Principal> {
33
+ execute(input: ApiServerConditionalWriteInput<Operation, Principal>, execute: () => Promise<ApiResponseValue<Operation>>): Promise<ApiServerRepresentation<Operation>>;
34
+ }
35
+ export interface ApiServerIdempotencyInput<Operation extends ApiOperationDefinition, Principal> extends ApiServerHandlerInput<Operation, Principal> {
36
+ contract: ApiIdempotencyContract;
37
+ fingerprint: string;
38
+ key: string;
39
+ scope: string;
40
+ }
41
+ export interface ApiServerIdempotencyAdapter<Operation extends ApiOperationDefinition, Principal> {
42
+ execute(input: ApiServerIdempotencyInput<Operation, Principal>, execute: () => Promise<ApiServerRepresentation<Operation>>): Promise<ApiServerRepresentation<Operation>>;
43
+ principalScope(input: ApiServerHandlerInput<Operation, Principal>): Promise<string> | string;
44
+ }
45
+ interface ContractHandlerBaseOptions<Operation extends ApiOperationDefinition, Principal> {
46
+ component: string;
47
+ handle(input: ApiServerHandlerInput<Operation, Principal>): ApiResponseValue<Operation> | Promise<ApiResponseValue<Operation>>;
48
+ logger?: Logger;
49
+ operation: Operation;
50
+ stage?: string;
51
+ workspace: string;
52
+ }
53
+ type ConditionalWriteOptions<Operation extends ApiOperationDefinition, Principal> = Operation['conditionalWrite'] extends {
54
+ kind: 'etag';
55
+ } ? {
56
+ conditionalWrite: ApiServerConditionalWriteAdapter<Operation, Principal>;
57
+ } : {
58
+ conditionalWrite?: never;
59
+ };
60
+ type IdempotencyOptions<Operation extends ApiOperationDefinition, Principal> = Operation['idempotency'] extends ApiIdempotencyContract ? {
61
+ idempotency: ApiServerIdempotencyAdapter<Operation, Principal>;
62
+ } : {
63
+ idempotency?: never;
64
+ };
65
+ export type CreateContractHttpJsonHandlerOptions<Operation extends ApiOperationDefinition, Event extends RuntimeHttpEvent = RuntimeHttpEvent, Principal = undefined> = Operation['authentication'] extends 'anonymous' ? ContractHandlerBaseOptions<Operation, Principal> & {
66
+ authorize?: never;
67
+ } & ConditionalWriteOptions<Operation, Principal> & IdempotencyOptions<Operation, Principal> : ContractHandlerBaseOptions<Operation, Principal> & {
68
+ authorize(input: ApiAuthorizationInput<Operation, Event>): Principal | Promise<Principal>;
69
+ } & ConditionalWriteOptions<Operation, Principal> & IdempotencyOptions<Operation, Principal>;
70
+ export declare const apiServerRuntime: {
71
+ readonly exportPath: "@empire-builder-kit/runtime/api-server";
72
+ readonly packageName: "@empire-builder-kit/runtime";
73
+ readonly responseProfile: "ebk-app-v1";
74
+ };
75
+ export declare function createApiRequestFingerprint(request: unknown): string;
76
+ export declare function createContractHttpJsonHandler<Operation extends ApiOperationDefinition, Event extends RuntimeHttpEvent = RuntimeHttpEvent, Principal = undefined>(options: CreateContractHttpJsonHandlerOptions<Operation, Event, Principal>): RuntimeHttpJsonHandler<Event>;
77
+ export {};