@chaim-tools/cdk-lib 0.1.0

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 (39) hide show
  1. package/README.md +238 -0
  2. package/lib/binders/base-chaim-binder.d.ts +144 -0
  3. package/lib/binders/base-chaim-binder.js +532 -0
  4. package/lib/binders/chaim-dynamodb-binder.d.ts +95 -0
  5. package/lib/binders/chaim-dynamodb-binder.js +292 -0
  6. package/lib/config/chaim-endpoints.d.ts +47 -0
  7. package/lib/config/chaim-endpoints.js +51 -0
  8. package/lib/index.d.ts +15 -0
  9. package/lib/index.js +43 -0
  10. package/lib/lambda-handler/.test-temp/snapshot.json +1 -0
  11. package/lib/lambda-handler/handler.js +513 -0
  12. package/lib/lambda-handler/handler.test.ts +365 -0
  13. package/lib/lambda-handler/package-lock.json +1223 -0
  14. package/lib/lambda-handler/package.json +14 -0
  15. package/lib/services/ingestion-service.d.ts +50 -0
  16. package/lib/services/ingestion-service.js +81 -0
  17. package/lib/services/os-cache-paths.d.ts +52 -0
  18. package/lib/services/os-cache-paths.js +123 -0
  19. package/lib/services/schema-service.d.ts +11 -0
  20. package/lib/services/schema-service.js +67 -0
  21. package/lib/services/snapshot-cleanup.d.ts +78 -0
  22. package/lib/services/snapshot-cleanup.js +220 -0
  23. package/lib/types/base-binder-props.d.ts +32 -0
  24. package/lib/types/base-binder-props.js +17 -0
  25. package/lib/types/credentials.d.ts +57 -0
  26. package/lib/types/credentials.js +83 -0
  27. package/lib/types/data-store-metadata.d.ts +67 -0
  28. package/lib/types/data-store-metadata.js +4 -0
  29. package/lib/types/failure-mode.d.ts +16 -0
  30. package/lib/types/failure-mode.js +21 -0
  31. package/lib/types/ingest-contract.d.ts +110 -0
  32. package/lib/types/ingest-contract.js +12 -0
  33. package/lib/types/snapshot-cache-policy.d.ts +52 -0
  34. package/lib/types/snapshot-cache-policy.js +57 -0
  35. package/lib/types/snapshot-payload.d.ts +245 -0
  36. package/lib/types/snapshot-payload.js +3 -0
  37. package/lib/types/table-binding-config.d.ts +43 -0
  38. package/lib/types/table-binding-config.js +57 -0
  39. package/package.json +67 -0
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Chaim Ingestion API Contract Types
3
+ *
4
+ * This file defines the request/response types for the Chaim ingestion API.
5
+ * The ingestion flow is:
6
+ * 1. POST /ingest/upload-url → get presigned S3 URL
7
+ * 2. PUT snapshot bytes to presigned URL
8
+ * 3. POST /ingest/snapshot-ref → commit the snapshot reference
9
+ */
10
+ /**
11
+ * Action type for snapshot-ref endpoint.
12
+ */
13
+ export type SnapshotAction = 'UPSERT' | 'DELETE';
14
+ /**
15
+ * Request payload for POST /ingest/upload-url
16
+ */
17
+ export interface UploadUrlRequest {
18
+ /** Application ID */
19
+ readonly appId: string;
20
+ /** Unique event ID (UUID v4) */
21
+ readonly eventId: string;
22
+ /** SHA-256 hash of snapshot bytes (format: "sha256:<hex>") */
23
+ readonly contentHash: string;
24
+ }
25
+ /**
26
+ * Response from POST /ingest/upload-url
27
+ */
28
+ export interface UploadUrlResponse {
29
+ /** Presigned S3 URL for uploading snapshot */
30
+ readonly uploadUrl: string;
31
+ /** ISO 8601 timestamp when the URL expires */
32
+ readonly expiresAt: string;
33
+ }
34
+ /**
35
+ * Request payload for POST /ingest/snapshot-ref (UPSERT action)
36
+ */
37
+ export interface SnapshotRefUpsertRequest {
38
+ /** Action type */
39
+ readonly action: 'UPSERT';
40
+ /** Application ID */
41
+ readonly appId: string;
42
+ /** Unique event ID (UUID v4) */
43
+ readonly eventId: string;
44
+ /** SHA-256 hash of snapshot bytes */
45
+ readonly contentHash: string;
46
+ /** Data store type (e.g., 'dynamodb') */
47
+ readonly datastoreType: string;
48
+ /** Data store ARN */
49
+ readonly datastoreArn: string;
50
+ /** Resource ID for the binding */
51
+ readonly resourceId: string;
52
+ /** Stack name */
53
+ readonly stackName: string;
54
+ }
55
+ /**
56
+ * Request payload for POST /ingest/snapshot-ref (DELETE action)
57
+ */
58
+ export interface SnapshotRefDeleteRequest {
59
+ /** Action type */
60
+ readonly action: 'DELETE';
61
+ /** Application ID */
62
+ readonly appId: string;
63
+ /** Unique event ID (UUID v4) */
64
+ readonly eventId: string;
65
+ /** Resource ID for the binding */
66
+ readonly resourceId: string;
67
+ /** Stack name */
68
+ readonly stackName: string;
69
+ /** Data store type (e.g., 'dynamodb') */
70
+ readonly datastoreType: string;
71
+ }
72
+ /**
73
+ * Union type for snapshot-ref request
74
+ */
75
+ export type SnapshotRefRequest = SnapshotRefUpsertRequest | SnapshotRefDeleteRequest;
76
+ /**
77
+ * Response from POST /ingest/snapshot-ref
78
+ */
79
+ export interface SnapshotRefResponse {
80
+ /** Event ID echoed back */
81
+ readonly eventId: string;
82
+ /** Processing status */
83
+ readonly status: 'SUCCESS' | 'FAILED';
84
+ /** ISO 8601 timestamp when processed */
85
+ readonly processedAt: string;
86
+ /** Error message (if status is FAILED) */
87
+ readonly errorMessage?: string;
88
+ }
89
+ /**
90
+ * CloudFormation custom resource event types.
91
+ */
92
+ export type CloudFormationRequestType = 'Create' | 'Update' | 'Delete';
93
+ /**
94
+ * CloudFormation custom resource response data.
95
+ * Kept minimal - actual payload is in S3.
96
+ */
97
+ export interface CustomResourceResponseData {
98
+ /** Event ID for tracking */
99
+ readonly EventId: string;
100
+ /** Ingestion status */
101
+ readonly IngestStatus: 'SUCCESS' | 'FAILED';
102
+ /** Content hash (only for UPSERT) */
103
+ readonly ContentHash?: string;
104
+ /** Action performed */
105
+ readonly Action: SnapshotAction;
106
+ /** Timestamp */
107
+ readonly Timestamp: string;
108
+ /** Error message (if failed) */
109
+ readonly Error?: string;
110
+ }
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ /**
3
+ * Chaim Ingestion API Contract Types
4
+ *
5
+ * This file defines the request/response types for the Chaim ingestion API.
6
+ * The ingestion flow is:
7
+ * 1. POST /ingest/upload-url → get presigned S3 URL
8
+ * 2. PUT snapshot bytes to presigned URL
9
+ * 3. POST /ingest/snapshot-ref → commit the snapshot reference
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5nZXN0LWNvbnRyYWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R5cGVzL2luZ2VzdC1jb250cmFjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7O0dBUUciLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENoYWltIEluZ2VzdGlvbiBBUEkgQ29udHJhY3QgVHlwZXNcbiAqIFxuICogVGhpcyBmaWxlIGRlZmluZXMgdGhlIHJlcXVlc3QvcmVzcG9uc2UgdHlwZXMgZm9yIHRoZSBDaGFpbSBpbmdlc3Rpb24gQVBJLlxuICogVGhlIGluZ2VzdGlvbiBmbG93IGlzOlxuICogMS4gUE9TVCAvaW5nZXN0L3VwbG9hZC11cmwg4oaSIGdldCBwcmVzaWduZWQgUzMgVVJMXG4gKiAyLiBQVVQgc25hcHNob3QgYnl0ZXMgdG8gcHJlc2lnbmVkIFVSTFxuICogMy4gUE9TVCAvaW5nZXN0L3NuYXBzaG90LXJlZiDihpIgY29tbWl0IHRoZSBzbmFwc2hvdCByZWZlcmVuY2VcbiAqL1xuXG4vKipcbiAqIEFjdGlvbiB0eXBlIGZvciBzbmFwc2hvdC1yZWYgZW5kcG9pbnQuXG4gKi9cbmV4cG9ydCB0eXBlIFNuYXBzaG90QWN0aW9uID0gJ1VQU0VSVCcgfCAnREVMRVRFJztcblxuLyoqXG4gKiBSZXF1ZXN0IHBheWxvYWQgZm9yIFBPU1QgL2luZ2VzdC91cGxvYWQtdXJsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBsb2FkVXJsUmVxdWVzdCB7XG4gIC8qKiBBcHBsaWNhdGlvbiBJRCAqL1xuICByZWFkb25seSBhcHBJZDogc3RyaW5nO1xuICBcbiAgLyoqIFVuaXF1ZSBldmVudCBJRCAoVVVJRCB2NCkgKi9cbiAgcmVhZG9ubHkgZXZlbnRJZDogc3RyaW5nO1xuICBcbiAgLyoqIFNIQS0yNTYgaGFzaCBvZiBzbmFwc2hvdCBieXRlcyAoZm9ybWF0OiBcInNoYTI1Njo8aGV4PlwiKSAqL1xuICByZWFkb25seSBjb250ZW50SGFzaDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlc3BvbnNlIGZyb20gUE9TVCAvaW5nZXN0L3VwbG9hZC11cmxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGxvYWRVcmxSZXNwb25zZSB7XG4gIC8qKiBQcmVzaWduZWQgUzMgVVJMIGZvciB1cGxvYWRpbmcgc25hcHNob3QgKi9cbiAgcmVhZG9ubHkgdXBsb2FkVXJsOiBzdHJpbmc7XG4gIFxuICAvKiogSVNPIDg2MDEgdGltZXN0YW1wIHdoZW4gdGhlIFVSTCBleHBpcmVzICovXG4gIHJlYWRvbmx5IGV4cGlyZXNBdDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlcXVlc3QgcGF5bG9hZCBmb3IgUE9TVCAvaW5nZXN0L3NuYXBzaG90LXJlZiAoVVBTRVJUIGFjdGlvbilcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbmFwc2hvdFJlZlVwc2VydFJlcXVlc3Qge1xuICAvKiogQWN0aW9uIHR5cGUgKi9cbiAgcmVhZG9ubHkgYWN0aW9uOiAnVVBTRVJUJztcbiAgXG4gIC8qKiBBcHBsaWNhdGlvbiBJRCAqL1xuICByZWFkb25seSBhcHBJZDogc3RyaW5nO1xuICBcbiAgLyoqIFVuaXF1ZSBldmVudCBJRCAoVVVJRCB2NCkgKi9cbiAgcmVhZG9ubHkgZXZlbnRJZDogc3RyaW5nO1xuICBcbiAgLyoqIFNIQS0yNTYgaGFzaCBvZiBzbmFwc2hvdCBieXRlcyAqL1xuICByZWFkb25seSBjb250ZW50SGFzaDogc3RyaW5nO1xuICBcbiAgLyoqIERhdGEgc3RvcmUgdHlwZSAoZS5nLiwgJ2R5bmFtb2RiJykgKi9cbiAgcmVhZG9ubHkgZGF0YXN0b3JlVHlwZTogc3RyaW5nO1xuICBcbiAgLyoqIERhdGEgc3RvcmUgQVJOICovXG4gIHJlYWRvbmx5IGRhdGFzdG9yZUFybjogc3RyaW5nO1xuICBcbiAgLyoqIFJlc291cmNlIElEIGZvciB0aGUgYmluZGluZyAqL1xuICByZWFkb25seSByZXNvdXJjZUlkOiBzdHJpbmc7XG4gIFxuICAvKiogU3RhY2sgbmFtZSAqL1xuICByZWFkb25seSBzdGFja05hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXF1ZXN0IHBheWxvYWQgZm9yIFBPU1QgL2luZ2VzdC9zbmFwc2hvdC1yZWYgKERFTEVURSBhY3Rpb24pXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU25hcHNob3RSZWZEZWxldGVSZXF1ZXN0IHtcbiAgLyoqIEFjdGlvbiB0eXBlICovXG4gIHJlYWRvbmx5IGFjdGlvbjogJ0RFTEVURSc7XG4gIFxuICAvKiogQXBwbGljYXRpb24gSUQgKi9cbiAgcmVhZG9ubHkgYXBwSWQ6IHN0cmluZztcbiAgXG4gIC8qKiBVbmlxdWUgZXZlbnQgSUQgKFVVSUQgdjQpICovXG4gIHJlYWRvbmx5IGV2ZW50SWQ6IHN0cmluZztcbiAgXG4gIC8qKiBSZXNvdXJjZSBJRCBmb3IgdGhlIGJpbmRpbmcgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VJZDogc3RyaW5nO1xuICBcbiAgLyoqIFN0YWNrIG5hbWUgKi9cbiAgcmVhZG9ubHkgc3RhY2tOYW1lOiBzdHJpbmc7XG4gIFxuICAvKiogRGF0YSBzdG9yZSB0eXBlIChlLmcuLCAnZHluYW1vZGInKSAqL1xuICByZWFkb25seSBkYXRhc3RvcmVUeXBlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVW5pb24gdHlwZSBmb3Igc25hcHNob3QtcmVmIHJlcXVlc3RcbiAqL1xuZXhwb3J0IHR5cGUgU25hcHNob3RSZWZSZXF1ZXN0ID0gU25hcHNob3RSZWZVcHNlcnRSZXF1ZXN0IHwgU25hcHNob3RSZWZEZWxldGVSZXF1ZXN0O1xuXG4vKipcbiAqIFJlc3BvbnNlIGZyb20gUE9TVCAvaW5nZXN0L3NuYXBzaG90LXJlZlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNuYXBzaG90UmVmUmVzcG9uc2Uge1xuICAvKiogRXZlbnQgSUQgZWNob2VkIGJhY2sgKi9cbiAgcmVhZG9ubHkgZXZlbnRJZDogc3RyaW5nO1xuICBcbiAgLyoqIFByb2Nlc3Npbmcgc3RhdHVzICovXG4gIHJlYWRvbmx5IHN0YXR1czogJ1NVQ0NFU1MnIHwgJ0ZBSUxFRCc7XG4gIFxuICAvKiogSVNPIDg2MDEgdGltZXN0YW1wIHdoZW4gcHJvY2Vzc2VkICovXG4gIHJlYWRvbmx5IHByb2Nlc3NlZEF0OiBzdHJpbmc7XG4gIFxuICAvKiogRXJyb3IgbWVzc2FnZSAoaWYgc3RhdHVzIGlzIEZBSUxFRCkgKi9cbiAgcmVhZG9ubHkgZXJyb3JNZXNzYWdlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENsb3VkRm9ybWF0aW9uIGN1c3RvbSByZXNvdXJjZSBldmVudCB0eXBlcy5cbiAqL1xuZXhwb3J0IHR5cGUgQ2xvdWRGb3JtYXRpb25SZXF1ZXN0VHlwZSA9ICdDcmVhdGUnIHwgJ1VwZGF0ZScgfCAnRGVsZXRlJztcblxuLyoqXG4gKiBDbG91ZEZvcm1hdGlvbiBjdXN0b20gcmVzb3VyY2UgcmVzcG9uc2UgZGF0YS5cbiAqIEtlcHQgbWluaW1hbCAtIGFjdHVhbCBwYXlsb2FkIGlzIGluIFMzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEN1c3RvbVJlc291cmNlUmVzcG9uc2VEYXRhIHtcbiAgLyoqIEV2ZW50IElEIGZvciB0cmFja2luZyAqL1xuICByZWFkb25seSBFdmVudElkOiBzdHJpbmc7XG4gIFxuICAvKiogSW5nZXN0aW9uIHN0YXR1cyAqL1xuICByZWFkb25seSBJbmdlc3RTdGF0dXM6ICdTVUNDRVNTJyB8ICdGQUlMRUQnO1xuICBcbiAgLyoqIENvbnRlbnQgaGFzaCAob25seSBmb3IgVVBTRVJUKSAqL1xuICByZWFkb25seSBDb250ZW50SGFzaD86IHN0cmluZztcbiAgXG4gIC8qKiBBY3Rpb24gcGVyZm9ybWVkICovXG4gIHJlYWRvbmx5IEFjdGlvbjogU25hcHNob3RBY3Rpb247XG4gIFxuICAvKiogVGltZXN0YW1wICovXG4gIHJlYWRvbmx5IFRpbWVzdGFtcDogc3RyaW5nO1xuICBcbiAgLyoqIEVycm9yIG1lc3NhZ2UgKGlmIGZhaWxlZCkgKi9cbiAgcmVhZG9ubHkgRXJyb3I/OiBzdHJpbmc7XG59XG5cbiJdfQ==
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Policy for managing snapshot cache during CDK synthesis.
3
+ *
4
+ * The snapshot cache stores metadata used by chaim-cli for code generation.
5
+ * Over time, stale snapshots can accumulate and cause issues.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * // In cdk.json context
10
+ * {
11
+ * "context": {
12
+ * "chaimSnapshotCachePolicy": "PRUNE_STACK"
13
+ * }
14
+ * }
15
+ * ```
16
+ */
17
+ export declare enum SnapshotCachePolicy {
18
+ /**
19
+ * No automatic cleanup (default).
20
+ *
21
+ * Snapshots are written but never deleted automatically.
22
+ * Users must manually clean ~/.chaim/cache/snapshots.
23
+ *
24
+ * **Use when:** You want full control over snapshot lifecycle
25
+ * or are debugging snapshot generation.
26
+ */
27
+ NONE = "NONE",
28
+ /**
29
+ * Delete stack snapshots before synthesis (recommended).
30
+ *
31
+ * Clears only: ~/.chaim/cache/snapshots/{account}/{region}/{stackName}/
32
+ *
33
+ * This ensures:
34
+ * - No stale snapshots from previous synth runs
35
+ * - No corrupt snapshots from failed synth attempts
36
+ * - Generated code always matches current stack state
37
+ *
38
+ * Other stacks and accounts are preserved.
39
+ *
40
+ * **Use when:** You want clean, predictable snapshot state
41
+ * (recommended for most projects).
42
+ */
43
+ PRUNE_STACK = "PRUNE_STACK"
44
+ }
45
+ /**
46
+ * Default snapshot cache policy.
47
+ */
48
+ export declare const DEFAULT_SNAPSHOT_CACHE_POLICY = SnapshotCachePolicy.NONE;
49
+ /**
50
+ * CDK context key for snapshot cache policy.
51
+ */
52
+ export declare const SNAPSHOT_CACHE_POLICY_CONTEXT_KEY = "chaimSnapshotCachePolicy";
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SNAPSHOT_CACHE_POLICY_CONTEXT_KEY = exports.DEFAULT_SNAPSHOT_CACHE_POLICY = exports.SnapshotCachePolicy = void 0;
4
+ /**
5
+ * Policy for managing snapshot cache during CDK synthesis.
6
+ *
7
+ * The snapshot cache stores metadata used by chaim-cli for code generation.
8
+ * Over time, stale snapshots can accumulate and cause issues.
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * // In cdk.json context
13
+ * {
14
+ * "context": {
15
+ * "chaimSnapshotCachePolicy": "PRUNE_STACK"
16
+ * }
17
+ * }
18
+ * ```
19
+ */
20
+ var SnapshotCachePolicy;
21
+ (function (SnapshotCachePolicy) {
22
+ /**
23
+ * No automatic cleanup (default).
24
+ *
25
+ * Snapshots are written but never deleted automatically.
26
+ * Users must manually clean ~/.chaim/cache/snapshots.
27
+ *
28
+ * **Use when:** You want full control over snapshot lifecycle
29
+ * or are debugging snapshot generation.
30
+ */
31
+ SnapshotCachePolicy["NONE"] = "NONE";
32
+ /**
33
+ * Delete stack snapshots before synthesis (recommended).
34
+ *
35
+ * Clears only: ~/.chaim/cache/snapshots/{account}/{region}/{stackName}/
36
+ *
37
+ * This ensures:
38
+ * - No stale snapshots from previous synth runs
39
+ * - No corrupt snapshots from failed synth attempts
40
+ * - Generated code always matches current stack state
41
+ *
42
+ * Other stacks and accounts are preserved.
43
+ *
44
+ * **Use when:** You want clean, predictable snapshot state
45
+ * (recommended for most projects).
46
+ */
47
+ SnapshotCachePolicy["PRUNE_STACK"] = "PRUNE_STACK";
48
+ })(SnapshotCachePolicy = exports.SnapshotCachePolicy || (exports.SnapshotCachePolicy = {}));
49
+ /**
50
+ * Default snapshot cache policy.
51
+ */
52
+ exports.DEFAULT_SNAPSHOT_CACHE_POLICY = SnapshotCachePolicy.NONE;
53
+ /**
54
+ * CDK context key for snapshot cache policy.
55
+ */
56
+ exports.SNAPSHOT_CACHE_POLICY_CONTEXT_KEY = 'chaimSnapshotCachePolicy';
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcHNob3QtY2FjaGUtcG9saWN5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R5cGVzL3NuYXBzaG90LWNhY2hlLXBvbGljeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxJQUFZLG1CQTRCWDtBQTVCRCxXQUFZLG1CQUFtQjtJQUM3Qjs7Ozs7Ozs7T0FRRztJQUNILG9DQUFhLENBQUE7SUFFYjs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNILGtEQUEyQixDQUFBO0FBQzdCLENBQUMsRUE1QlcsbUJBQW1CLEdBQW5CLDJCQUFtQixLQUFuQiwyQkFBbUIsUUE0QjlCO0FBRUQ7O0dBRUc7QUFDVSxRQUFBLDZCQUE2QixHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQztBQUV0RTs7R0FFRztBQUNVLFFBQUEsaUNBQWlDLEdBQUcsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBvbGljeSBmb3IgbWFuYWdpbmcgc25hcHNob3QgY2FjaGUgZHVyaW5nIENESyBzeW50aGVzaXMuXG4gKiBcbiAqIFRoZSBzbmFwc2hvdCBjYWNoZSBzdG9yZXMgbWV0YWRhdGEgdXNlZCBieSBjaGFpbS1jbGkgZm9yIGNvZGUgZ2VuZXJhdGlvbi5cbiAqIE92ZXIgdGltZSwgc3RhbGUgc25hcHNob3RzIGNhbiBhY2N1bXVsYXRlIGFuZCBjYXVzZSBpc3N1ZXMuXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBJbiBjZGsuanNvbiBjb250ZXh0XG4gKiB7XG4gKiAgIFwiY29udGV4dFwiOiB7XG4gKiAgICAgXCJjaGFpbVNuYXBzaG90Q2FjaGVQb2xpY3lcIjogXCJQUlVORV9TVEFDS1wiXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZW51bSBTbmFwc2hvdENhY2hlUG9saWN5IHtcbiAgLyoqXG4gICAqIE5vIGF1dG9tYXRpYyBjbGVhbnVwIChkZWZhdWx0KS5cbiAgICogXG4gICAqIFNuYXBzaG90cyBhcmUgd3JpdHRlbiBidXQgbmV2ZXIgZGVsZXRlZCBhdXRvbWF0aWNhbGx5LlxuICAgKiBVc2VycyBtdXN0IG1hbnVhbGx5IGNsZWFuIH4vLmNoYWltL2NhY2hlL3NuYXBzaG90cy5cbiAgICogXG4gICAqICoqVXNlIHdoZW46KiogWW91IHdhbnQgZnVsbCBjb250cm9sIG92ZXIgc25hcHNob3QgbGlmZWN5Y2xlXG4gICAqIG9yIGFyZSBkZWJ1Z2dpbmcgc25hcHNob3QgZ2VuZXJhdGlvbi5cbiAgICovXG4gIE5PTkUgPSAnTk9ORScsXG5cbiAgLyoqXG4gICAqIERlbGV0ZSBzdGFjayBzbmFwc2hvdHMgYmVmb3JlIHN5bnRoZXNpcyAocmVjb21tZW5kZWQpLlxuICAgKiBcbiAgICogQ2xlYXJzIG9ubHk6IH4vLmNoYWltL2NhY2hlL3NuYXBzaG90cy97YWNjb3VudH0ve3JlZ2lvbn0ve3N0YWNrTmFtZX0vXG4gICAqIFxuICAgKiBUaGlzIGVuc3VyZXM6XG4gICAqIC0gTm8gc3RhbGUgc25hcHNob3RzIGZyb20gcHJldmlvdXMgc3ludGggcnVuc1xuICAgKiAtIE5vIGNvcnJ1cHQgc25hcHNob3RzIGZyb20gZmFpbGVkIHN5bnRoIGF0dGVtcHRzXG4gICAqIC0gR2VuZXJhdGVkIGNvZGUgYWx3YXlzIG1hdGNoZXMgY3VycmVudCBzdGFjayBzdGF0ZVxuICAgKiBcbiAgICogT3RoZXIgc3RhY2tzIGFuZCBhY2NvdW50cyBhcmUgcHJlc2VydmVkLlxuICAgKiBcbiAgICogKipVc2Ugd2hlbjoqKiBZb3Ugd2FudCBjbGVhbiwgcHJlZGljdGFibGUgc25hcHNob3Qgc3RhdGVcbiAgICogKHJlY29tbWVuZGVkIGZvciBtb3N0IHByb2plY3RzKS5cbiAgICovXG4gIFBSVU5FX1NUQUNLID0gJ1BSVU5FX1NUQUNLJyxcbn1cblxuLyoqXG4gKiBEZWZhdWx0IHNuYXBzaG90IGNhY2hlIHBvbGljeS5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfU05BUFNIT1RfQ0FDSEVfUE9MSUNZID0gU25hcHNob3RDYWNoZVBvbGljeS5OT05FO1xuXG4vKipcbiAqIENESyBjb250ZXh0IGtleSBmb3Igc25hcHNob3QgY2FjaGUgcG9saWN5LlxuICovXG5leHBvcnQgY29uc3QgU05BUFNIT1RfQ0FDSEVfUE9MSUNZX0NPTlRFWFRfS0VZID0gJ2NoYWltU25hcHNob3RDYWNoZVBvbGljeSc7XG4iXX0=
@@ -0,0 +1,245 @@
1
+ import { SchemaData } from '@chaim-tools/chaim-bprint-spec';
2
+ import { GSIMetadata, LSIMetadata } from './data-store-metadata';
3
+ /**
4
+ * Snapshot payload types for Chaim CDK.
5
+ *
6
+ * ⚠️ CONTRACT: These types define the structure of snapshot files consumed by:
7
+ * - chaim-ingest-service (Java): com.chaim.ingest.model.SnapshotPayload
8
+ *
9
+ * When modifying these types:
10
+ * 1. For additive/optional changes: bump minor version (3.0 → 3.1)
11
+ * 2. For breaking changes: bump major version (3.x → 4.0)
12
+ * 3. Coordinate with chaim-ingest-service to add version handling
13
+ */
14
+ /**
15
+ * Provider/cloud identity metadata.
16
+ * Contains AWS account, region, and deployment system information.
17
+ */
18
+ export interface ProviderIdentity {
19
+ /** Cloud provider (e.g., 'aws', 'gcp', 'azure') */
20
+ readonly cloud: 'aws';
21
+ /** AWS account ID */
22
+ readonly accountId: string;
23
+ /** AWS region */
24
+ readonly region: string;
25
+ /** Deployment system (CloudFormation, Terraform, etc.) */
26
+ readonly deploymentSystem: 'cloudformation';
27
+ /** CloudFormation stack ID/ARN (may be token in LOCAL mode) */
28
+ readonly deploymentId?: string;
29
+ /** CloudFormation request ID (deploy-time only) */
30
+ readonly requestId?: string;
31
+ }
32
+ /**
33
+ * Binding identity metadata.
34
+ * Contains all information needed to uniquely identify a binding.
35
+ */
36
+ export interface BindingIdentity {
37
+ /** Application ID */
38
+ readonly appId: string;
39
+ /** Entity name from schema */
40
+ readonly entityName: string;
41
+ /** Strategy used to generate stableResourceKey */
42
+ readonly stableResourceKeyStrategy: 'cdk-construct-path';
43
+ /** Stable resource key (e.g., dynamodb:path:StackName/TableName) */
44
+ readonly stableResourceKey: string;
45
+ /** Generated resource ID: {resourceName}__{entityName}[__N] */
46
+ readonly resourceId: string;
47
+ /** Entity identifier: {appId}:{entityName} */
48
+ readonly entityId: string;
49
+ /** Stable binding identifier: {appId}:{stableResourceKey}:{entityName} */
50
+ readonly bindingId: string;
51
+ }
52
+ /**
53
+ * Operation metadata for tracking this binding operation.
54
+ * Generated at synth-time, updated at deploy-time.
55
+ */
56
+ export interface OperationMetadata {
57
+ /** UUID for this operation (generated at synth-time) */
58
+ readonly eventId: string;
59
+ /** CloudFormation request type */
60
+ readonly requestType: 'Create' | 'Update' | 'Delete';
61
+ /** Failure handling mode */
62
+ readonly failureMode: 'BEST_EFFORT' | 'STRICT';
63
+ }
64
+ /**
65
+ * Resolution metadata indicating token resolution status.
66
+ */
67
+ export interface ResolutionMetadata {
68
+ /** Snapshot mode: LOCAL (synth-time) or PUBLISHED (deploy-time) */
69
+ readonly mode: 'LOCAL' | 'PUBLISHED';
70
+ /** Whether any CDK tokens remain unresolved */
71
+ readonly hasTokens: boolean;
72
+ }
73
+ /**
74
+ * Delete metadata for DELETE snapshots.
75
+ * Provides context about why and what scope was deleted.
76
+ */
77
+ export interface DeleteMetadata {
78
+ /**
79
+ * Why the resource was deleted (enum).
80
+ * - STACK_DELETED: Entire CloudFormation stack was deleted
81
+ * - BINDER_REMOVED: ChaimBinder construct removed from stack
82
+ * - ENTITY_REMOVED: Entity definition removed but binding may persist
83
+ * - UNKNOWN: Deletion reason could not be determined
84
+ */
85
+ readonly reason: 'STACK_DELETED' | 'BINDER_REMOVED' | 'ENTITY_REMOVED' | 'UNKNOWN';
86
+ /**
87
+ * What scope is being deleted (enum).
88
+ * - STACK: Entire stack and all bindings
89
+ * - BINDING: Specific entity binding to a data store
90
+ * - ENTITY: Entity definition across bindings
91
+ *
92
+ * Should align with reason:
93
+ * - STACK_DELETED -> STACK
94
+ * - BINDER_REMOVED -> BINDING
95
+ * - ENTITY_REMOVED -> ENTITY
96
+ * - UNKNOWN -> BINDING (default)
97
+ */
98
+ readonly scope: 'STACK' | 'BINDING' | 'ENTITY';
99
+ /** ISO 8601 timestamp of deletion */
100
+ readonly deletedAt: string;
101
+ }
102
+ /**
103
+ * Hash metadata for content integrity and deduplication.
104
+ */
105
+ export interface HashMetadata {
106
+ /** SHA-256 hash of schema section (with 'sha256:' prefix) */
107
+ readonly schemaHash: string;
108
+ /** SHA-256 hash of full snapshot content (with 'sha256:' prefix) */
109
+ readonly contentHash: string;
110
+ }
111
+ /**
112
+ * Resource metadata for the data store.
113
+ * Provider-focused, contains only infrastructure metadata.
114
+ */
115
+ export interface ResourceMetadata {
116
+ /** Provider type (e.g., 'dynamodb', 's3', 'postgres') */
117
+ readonly type: 'dynamodb';
118
+ /** Resource kind (e.g., 'table', 'bucket', 'database') */
119
+ readonly kind?: 'table';
120
+ /** Resource ARN or provider-specific ID */
121
+ readonly id: string;
122
+ /** Resource name */
123
+ readonly name: string;
124
+ /** AWS region */
125
+ readonly region: string;
126
+ readonly partitionKey: string;
127
+ readonly sortKey?: string;
128
+ readonly globalSecondaryIndexes?: GSIMetadata[];
129
+ readonly localSecondaryIndexes?: LSIMetadata[];
130
+ readonly ttlAttribute?: string;
131
+ readonly streamEnabled?: boolean;
132
+ readonly streamViewType?: string;
133
+ readonly billingMode?: 'PAY_PER_REQUEST' | 'PROVISIONED';
134
+ readonly encryptionKeyArn?: string;
135
+ }
136
+ /**
137
+ * Producer metadata for debugging and support.
138
+ * Identifies what component produced the snapshot.
139
+ */
140
+ export interface ProducerMetadata {
141
+ /** Component name */
142
+ readonly component: 'chaim-cdk';
143
+ /** Component version from package.json */
144
+ readonly version: string;
145
+ /** Lambda runtime (e.g., 'nodejs20.x') */
146
+ readonly runtime: string;
147
+ }
148
+ /**
149
+ * LOCAL snapshot payload written to OS cache during synthesis (v3.0).
150
+ *
151
+ * This is the primary snapshot type used for CLI code generation
152
+ * and Lambda bundling at synth-time.
153
+ *
154
+ * v3.0 restructures the payload into logical sections for better clarity
155
+ * and multi-provider support.
156
+ *
157
+ * @contract chaim-ingest-service: com.chaim.ingest.model.SnapshotPayload
158
+ */
159
+ export interface LocalSnapshotPayload {
160
+ /**
161
+ * Snapshot version for backward compatibility.
162
+ * The chaim-ingest-service uses this to parse different payload versions.
163
+ *
164
+ * Versioning strategy:
165
+ * - Minor bump (3.0 → 3.1): Additive, optional field changes
166
+ * - Major bump (3.x → 4.0): Breaking changes (removed/renamed/required fields)
167
+ *
168
+ * @contract chaim-ingest-service: com.chaim.ingest.model.SnapshotPayload
169
+ */
170
+ readonly snapshotVersion: '3.0';
171
+ /**
172
+ * Action type for this snapshot.
173
+ * - UPSERT: Create or update entity metadata
174
+ * - DELETE: Mark entity as deleted
175
+ */
176
+ readonly action: 'UPSERT' | 'DELETE';
177
+ /** ISO 8601 timestamp of snapshot creation */
178
+ readonly capturedAt: string;
179
+ /** Provider/cloud identity (AWS account, region, deployment system) */
180
+ readonly providerIdentity: ProviderIdentity;
181
+ /** Binding identity (appId, entityName, resourceId, bindingId, etc.) */
182
+ readonly identity: BindingIdentity;
183
+ /** Operation metadata (eventId, requestType, failureMode) */
184
+ readonly operation: OperationMetadata;
185
+ /** Resolution metadata (mode, hasTokens) */
186
+ readonly resolution: ResolutionMetadata;
187
+ /** Hash metadata (schemaHash, contentHash) */
188
+ readonly hashes: HashMetadata;
189
+ /** Validated .bprint schema data (null for DELETE actions) */
190
+ readonly schema: SchemaData | null;
191
+ /** Resource metadata (simplified, provider-focused) */
192
+ readonly resource: ResourceMetadata;
193
+ /** Producer metadata (component, version, runtime, mode) */
194
+ readonly producer: ProducerMetadata;
195
+ }
196
+ /**
197
+ * PUBLISHED snapshot payload enhanced by Lambda handler at deploy-time.
198
+ *
199
+ * This extends LocalSnapshotPayload with additional metadata added during deployment:
200
+ * - operation: eventId, cfRequestId, requestType, failureMode
201
+ * - hashes: contentHash, schemaHash
202
+ * - producer: component, version, runtime, mode
203
+ * - delete: (DELETE only) reason, scope, deletedAt
204
+ *
205
+ * This is the format uploaded to S3 and consumed by chaim-ingest-service.
206
+ */
207
+ export interface PublishedSnapshotPayload extends Omit<LocalSnapshotPayload, 'action' | '_schemaHash' | '_packageVersion'> {
208
+ /** Action is required for published snapshots */
209
+ readonly action: 'UPSERT' | 'DELETE';
210
+ /** Operation metadata (added at deploy-time) */
211
+ readonly operation: OperationMetadata;
212
+ /** Hash metadata (added at deploy-time) */
213
+ readonly hashes: HashMetadata;
214
+ /** Producer metadata (added at deploy-time) */
215
+ readonly producer: ProducerMetadata;
216
+ /** Delete metadata (only for DELETE actions) */
217
+ readonly delete?: DeleteMetadata;
218
+ }
219
+ /**
220
+ * Response from Chaim ingestion API after snapshot-ref commit.
221
+ */
222
+ export interface IngestResponse {
223
+ /** Event ID echoed back */
224
+ readonly eventId: string;
225
+ /** Ingestion status */
226
+ readonly status: 'SUCCESS' | 'FAILED';
227
+ /** Error message (if failed) */
228
+ readonly errorMessage?: string;
229
+ /** Timestamp when ingestion was processed */
230
+ readonly processedAt: string;
231
+ }
232
+ /**
233
+ * CloudFormation custom resource response data.
234
+ * Kept minimal - actual payload is in S3.
235
+ */
236
+ export interface CustomResourceResponseData {
237
+ /** Event ID for tracking */
238
+ readonly EventId: string;
239
+ /** Ingestion status */
240
+ readonly IngestStatus: 'SUCCESS' | 'FAILED';
241
+ /** Content hash for change detection */
242
+ readonly ContentHash: string;
243
+ /** Timestamp */
244
+ readonly Timestamp: string;
245
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcHNob3QtcGF5bG9hZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9zbmFwc2hvdC1wYXlsb2FkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTY2hlbWFEYXRhIH0gZnJvbSAnQGNoYWltLXRvb2xzL2NoYWltLWJwcmludC1zcGVjJztcbmltcG9ydCB7IEdTSU1ldGFkYXRhLCBMU0lNZXRhZGF0YSB9IGZyb20gJy4vZGF0YS1zdG9yZS1tZXRhZGF0YSc7XG5cbi8qKlxuICogU25hcHNob3QgcGF5bG9hZCB0eXBlcyBmb3IgQ2hhaW0gQ0RLLlxuICogXG4gKiDimqDvuI8gQ09OVFJBQ1Q6IFRoZXNlIHR5cGVzIGRlZmluZSB0aGUgc3RydWN0dXJlIG9mIHNuYXBzaG90IGZpbGVzIGNvbnN1bWVkIGJ5OlxuICogLSBjaGFpbS1pbmdlc3Qtc2VydmljZSAoSmF2YSk6IGNvbS5jaGFpbS5pbmdlc3QubW9kZWwuU25hcHNob3RQYXlsb2FkXG4gKiBcbiAqIFdoZW4gbW9kaWZ5aW5nIHRoZXNlIHR5cGVzOlxuICogMS4gRm9yIGFkZGl0aXZlL29wdGlvbmFsIGNoYW5nZXM6IGJ1bXAgbWlub3IgdmVyc2lvbiAoMy4wIOKGkiAzLjEpXG4gKiAyLiBGb3IgYnJlYWtpbmcgY2hhbmdlczogYnVtcCBtYWpvciB2ZXJzaW9uICgzLngg4oaSIDQuMClcbiAqIDMuIENvb3JkaW5hdGUgd2l0aCBjaGFpbS1pbmdlc3Qtc2VydmljZSB0byBhZGQgdmVyc2lvbiBoYW5kbGluZ1xuICovXG5cbi8qKlxuICogUHJvdmlkZXIvY2xvdWQgaWRlbnRpdHkgbWV0YWRhdGEuXG4gKiBDb250YWlucyBBV1MgYWNjb3VudCwgcmVnaW9uLCBhbmQgZGVwbG95bWVudCBzeXN0ZW0gaW5mb3JtYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdmlkZXJJZGVudGl0eSB7XG4gIC8qKiBDbG91ZCBwcm92aWRlciAoZS5nLiwgJ2F3cycsICdnY3AnLCAnYXp1cmUnKSAqL1xuICByZWFkb25seSBjbG91ZDogJ2F3cyc7XG4gIFxuICAvKiogQVdTIGFjY291bnQgSUQgKi9cbiAgcmVhZG9ubHkgYWNjb3VudElkOiBzdHJpbmc7XG4gIFxuICAvKiogQVdTIHJlZ2lvbiAqL1xuICByZWFkb25seSByZWdpb246IHN0cmluZztcbiAgXG4gIC8qKiBEZXBsb3ltZW50IHN5c3RlbSAoQ2xvdWRGb3JtYXRpb24sIFRlcnJhZm9ybSwgZXRjLikgKi9cbiAgcmVhZG9ubHkgZGVwbG95bWVudFN5c3RlbTogJ2Nsb3VkZm9ybWF0aW9uJztcbiAgXG4gIC8qKiBDbG91ZEZvcm1hdGlvbiBzdGFjayBJRC9BUk4gKG1heSBiZSB0b2tlbiBpbiBMT0NBTCBtb2RlKSAqL1xuICByZWFkb25seSBkZXBsb3ltZW50SWQ/OiBzdHJpbmc7XG4gIFxuICAvKiogQ2xvdWRGb3JtYXRpb24gcmVxdWVzdCBJRCAoZGVwbG95LXRpbWUgb25seSkgKi9cbiAgcmVhZG9ubHkgcmVxdWVzdElkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEJpbmRpbmcgaWRlbnRpdHkgbWV0YWRhdGEuXG4gKiBDb250YWlucyBhbGwgaW5mb3JtYXRpb24gbmVlZGVkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGEgYmluZGluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCaW5kaW5nSWRlbnRpdHkge1xuICAvKiogQXBwbGljYXRpb24gSUQgKi9cbiAgcmVhZG9ubHkgYXBwSWQ6IHN0cmluZztcbiAgXG4gIC8qKiBFbnRpdHkgbmFtZSBmcm9tIHNjaGVtYSAqL1xuICByZWFkb25seSBlbnRpdHlOYW1lOiBzdHJpbmc7XG4gIFxuICAvKiogU3RyYXRlZ3kgdXNlZCB0byBnZW5lcmF0ZSBzdGFibGVSZXNvdXJjZUtleSAqL1xuICByZWFkb25seSBzdGFibGVSZXNvdXJjZUtleVN0cmF0ZWd5OiAnY2RrLWNvbnN0cnVjdC1wYXRoJztcbiAgXG4gIC8qKiBTdGFibGUgcmVzb3VyY2Uga2V5IChlLmcuLCBkeW5hbW9kYjpwYXRoOlN0YWNrTmFtZS9UYWJsZU5hbWUpICovXG4gIHJlYWRvbmx5IHN0YWJsZVJlc291cmNlS2V5OiBzdHJpbmc7XG4gIFxuICAvKiogR2VuZXJhdGVkIHJlc291cmNlIElEOiB7cmVzb3VyY2VOYW1lfV9fe2VudGl0eU5hbWV9W19fTl0gKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VJZDogc3RyaW5nO1xuICBcbiAgLyoqIEVudGl0eSBpZGVudGlmaWVyOiB7YXBwSWR9OntlbnRpdHlOYW1lfSAqL1xuICByZWFkb25seSBlbnRpdHlJZDogc3RyaW5nO1xuICBcbiAgLyoqIFN0YWJsZSBiaW5kaW5nIGlkZW50aWZpZXI6IHthcHBJZH06e3N0YWJsZVJlc291cmNlS2V5fTp7ZW50aXR5TmFtZX0gKi9cbiAgcmVhZG9ubHkgYmluZGluZ0lkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3BlcmF0aW9uIG1ldGFkYXRhIGZvciB0cmFja2luZyB0aGlzIGJpbmRpbmcgb3BlcmF0aW9uLlxuICogR2VuZXJhdGVkIGF0IHN5bnRoLXRpbWUsIHVwZGF0ZWQgYXQgZGVwbG95LXRpbWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3BlcmF0aW9uTWV0YWRhdGEge1xuICAvKiogVVVJRCBmb3IgdGhpcyBvcGVyYXRpb24gKGdlbmVyYXRlZCBhdCBzeW50aC10aW1lKSAqL1xuICByZWFkb25seSBldmVudElkOiBzdHJpbmc7XG5cbiAgLyoqIENsb3VkRm9ybWF0aW9uIHJlcXVlc3QgdHlwZSAqL1xuICByZWFkb25seSByZXF1ZXN0VHlwZTogJ0NyZWF0ZScgfCAnVXBkYXRlJyB8ICdEZWxldGUnO1xuXG4gIC8qKiBGYWlsdXJlIGhhbmRsaW5nIG1vZGUgKi9cbiAgcmVhZG9ubHkgZmFpbHVyZU1vZGU6ICdCRVNUX0VGRk9SVCcgfCAnU1RSSUNUJztcbn1cblxuLyoqXG4gKiBSZXNvbHV0aW9uIG1ldGFkYXRhIGluZGljYXRpbmcgdG9rZW4gcmVzb2x1dGlvbiBzdGF0dXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x1dGlvbk1ldGFkYXRhIHtcbiAgLyoqIFNuYXBzaG90IG1vZGU6IExPQ0FMIChzeW50aC10aW1lKSBvciBQVUJMSVNIRUQgKGRlcGxveS10aW1lKSAqL1xuICByZWFkb25seSBtb2RlOiAnTE9DQUwnIHwgJ1BVQkxJU0hFRCc7XG4gIFxuICAvKiogV2hldGhlciBhbnkgQ0RLIHRva2VucyByZW1haW4gdW5yZXNvbHZlZCAqL1xuICByZWFkb25seSBoYXNUb2tlbnM6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRGVsZXRlIG1ldGFkYXRhIGZvciBERUxFVEUgc25hcHNob3RzLlxuICogUHJvdmlkZXMgY29udGV4dCBhYm91dCB3aHkgYW5kIHdoYXQgc2NvcGUgd2FzIGRlbGV0ZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVsZXRlTWV0YWRhdGEge1xuICAvKipcbiAgICogV2h5IHRoZSByZXNvdXJjZSB3YXMgZGVsZXRlZCAoZW51bSkuXG4gICAqIC0gU1RBQ0tfREVMRVRFRDogRW50aXJlIENsb3VkRm9ybWF0aW9uIHN0YWNrIHdhcyBkZWxldGVkXG4gICAqIC0gQklOREVSX1JFTU9WRUQ6IENoYWltQmluZGVyIGNvbnN0cnVjdCByZW1vdmVkIGZyb20gc3RhY2tcbiAgICogLSBFTlRJVFlfUkVNT1ZFRDogRW50aXR5IGRlZmluaXRpb24gcmVtb3ZlZCBidXQgYmluZGluZyBtYXkgcGVyc2lzdFxuICAgKiAtIFVOS05PV046IERlbGV0aW9uIHJlYXNvbiBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkgcmVhc29uOiAnU1RBQ0tfREVMRVRFRCcgfCAnQklOREVSX1JFTU9WRUQnIHwgJ0VOVElUWV9SRU1PVkVEJyB8ICdVTktOT1dOJztcblxuICAvKipcbiAgICogV2hhdCBzY29wZSBpcyBiZWluZyBkZWxldGVkIChlbnVtKS5cbiAgICogLSBTVEFDSzogRW50aXJlIHN0YWNrIGFuZCBhbGwgYmluZGluZ3NcbiAgICogLSBCSU5ESU5HOiBTcGVjaWZpYyBlbnRpdHkgYmluZGluZyB0byBhIGRhdGEgc3RvcmVcbiAgICogLSBFTlRJVFk6IEVudGl0eSBkZWZpbml0aW9uIGFjcm9zcyBiaW5kaW5nc1xuICAgKiBcbiAgICogU2hvdWxkIGFsaWduIHdpdGggcmVhc29uOlxuICAgKiAtIFNUQUNLX0RFTEVURUQgLT4gU1RBQ0tcbiAgICogLSBCSU5ERVJfUkVNT1ZFRCAtPiBCSU5ESU5HXG4gICAqIC0gRU5USVRZX1JFTU9WRUQgLT4gRU5USVRZXG4gICAqIC0gVU5LTk9XTiAtPiBCSU5ESU5HIChkZWZhdWx0KVxuICAgKi9cbiAgcmVhZG9ubHkgc2NvcGU6ICdTVEFDSycgfCAnQklORElORycgfCAnRU5USVRZJztcblxuICAvKiogSVNPIDg2MDEgdGltZXN0YW1wIG9mIGRlbGV0aW9uICovXG4gIHJlYWRvbmx5IGRlbGV0ZWRBdDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhhc2ggbWV0YWRhdGEgZm9yIGNvbnRlbnQgaW50ZWdyaXR5IGFuZCBkZWR1cGxpY2F0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhhc2hNZXRhZGF0YSB7XG4gIC8qKiBTSEEtMjU2IGhhc2ggb2Ygc2NoZW1hIHNlY3Rpb24gKHdpdGggJ3NoYTI1NjonIHByZWZpeCkgKi9cbiAgcmVhZG9ubHkgc2NoZW1hSGFzaDogc3RyaW5nO1xuXG4gIC8qKiBTSEEtMjU2IGhhc2ggb2YgZnVsbCBzbmFwc2hvdCBjb250ZW50ICh3aXRoICdzaGEyNTY6JyBwcmVmaXgpICovXG4gIHJlYWRvbmx5IGNvbnRlbnRIYXNoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVzb3VyY2UgbWV0YWRhdGEgZm9yIHRoZSBkYXRhIHN0b3JlLlxuICogUHJvdmlkZXItZm9jdXNlZCwgY29udGFpbnMgb25seSBpbmZyYXN0cnVjdHVyZSBtZXRhZGF0YS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZU1ldGFkYXRhIHtcbiAgLyoqIFByb3ZpZGVyIHR5cGUgKGUuZy4sICdkeW5hbW9kYicsICdzMycsICdwb3N0Z3JlcycpICovXG4gIHJlYWRvbmx5IHR5cGU6ICdkeW5hbW9kYic7XG4gIFxuICAvKiogUmVzb3VyY2Uga2luZCAoZS5nLiwgJ3RhYmxlJywgJ2J1Y2tldCcsICdkYXRhYmFzZScpICovXG4gIHJlYWRvbmx5IGtpbmQ/OiAndGFibGUnO1xuICBcbiAgLyoqIFJlc291cmNlIEFSTiBvciBwcm92aWRlci1zcGVjaWZpYyBJRCAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICBcbiAgLyoqIFJlc291cmNlIG5hbWUgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICBcbiAgLyoqIEFXUyByZWdpb24gKi9cbiAgcmVhZG9ubHkgcmVnaW9uOiBzdHJpbmc7XG4gIFxuICAvLyBEeW5hbW9EQi1zcGVjaWZpYyBtZXRhZGF0YVxuICByZWFkb25seSBwYXJ0aXRpb25LZXk6IHN0cmluZztcbiAgcmVhZG9ubHkgc29ydEtleT86IHN0cmluZztcbiAgcmVhZG9ubHkgZ2xvYmFsU2Vjb25kYXJ5SW5kZXhlcz86IEdTSU1ldGFkYXRhW107XG4gIHJlYWRvbmx5IGxvY2FsU2Vjb25kYXJ5SW5kZXhlcz86IExTSU1ldGFkYXRhW107XG4gIHJlYWRvbmx5IHR0bEF0dHJpYnV0ZT86IHN0cmluZztcbiAgcmVhZG9ubHkgc3RyZWFtRW5hYmxlZD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHN0cmVhbVZpZXdUeXBlPzogc3RyaW5nO1xuICByZWFkb25seSBiaWxsaW5nTW9kZT86ICdQQVlfUEVSX1JFUVVFU1QnIHwgJ1BST1ZJU0lPTkVEJztcbiAgcmVhZG9ubHkgZW5jcnlwdGlvbktleUFybj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQcm9kdWNlciBtZXRhZGF0YSBmb3IgZGVidWdnaW5nIGFuZCBzdXBwb3J0LlxuICogSWRlbnRpZmllcyB3aGF0IGNvbXBvbmVudCBwcm9kdWNlZCB0aGUgc25hcHNob3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZHVjZXJNZXRhZGF0YSB7XG4gIC8qKiBDb21wb25lbnQgbmFtZSAqL1xuICByZWFkb25seSBjb21wb25lbnQ6ICdjaGFpbS1jZGsnO1xuXG4gIC8qKiBDb21wb25lbnQgdmVyc2lvbiBmcm9tIHBhY2thZ2UuanNvbiAqL1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqIExhbWJkYSBydW50aW1lIChlLmcuLCAnbm9kZWpzMjAueCcpICovXG4gIHJlYWRvbmx5IHJ1bnRpbWU6IHN0cmluZztcblxufVxuXG4vKipcbiAqIExPQ0FMIHNuYXBzaG90IHBheWxvYWQgd3JpdHRlbiB0byBPUyBjYWNoZSBkdXJpbmcgc3ludGhlc2lzICh2My4wKS5cbiAqIFxuICogVGhpcyBpcyB0aGUgcHJpbWFyeSBzbmFwc2hvdCB0eXBlIHVzZWQgZm9yIENMSSBjb2RlIGdlbmVyYXRpb25cbiAqIGFuZCBMYW1iZGEgYnVuZGxpbmcgYXQgc3ludGgtdGltZS5cbiAqIFxuICogdjMuMCByZXN0cnVjdHVyZXMgdGhlIHBheWxvYWQgaW50byBsb2dpY2FsIHNlY3Rpb25zIGZvciBiZXR0ZXIgY2xhcml0eVxuICogYW5kIG11bHRpLXByb3ZpZGVyIHN1cHBvcnQuXG4gKiBcbiAqIEBjb250cmFjdCBjaGFpbS1pbmdlc3Qtc2VydmljZTogY29tLmNoYWltLmluZ2VzdC5tb2RlbC5TbmFwc2hvdFBheWxvYWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2NhbFNuYXBzaG90UGF5bG9hZCB7XG4gIC8qKlxuICAgKiBTbmFwc2hvdCB2ZXJzaW9uIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICAgKiBUaGUgY2hhaW0taW5nZXN0LXNlcnZpY2UgdXNlcyB0aGlzIHRvIHBhcnNlIGRpZmZlcmVudCBwYXlsb2FkIHZlcnNpb25zLlxuICAgKiBcbiAgICogVmVyc2lvbmluZyBzdHJhdGVneTpcbiAgICogLSBNaW5vciBidW1wICgzLjAg4oaSIDMuMSk6IEFkZGl0aXZlLCBvcHRpb25hbCBmaWVsZCBjaGFuZ2VzXG4gICAqIC0gTWFqb3IgYnVtcCAoMy54IOKGkiA0LjApOiBCcmVha2luZyBjaGFuZ2VzIChyZW1vdmVkL3JlbmFtZWQvcmVxdWlyZWQgZmllbGRzKVxuICAgKiBcbiAgICogQGNvbnRyYWN0IGNoYWltLWluZ2VzdC1zZXJ2aWNlOiBjb20uY2hhaW0uaW5nZXN0Lm1vZGVsLlNuYXBzaG90UGF5bG9hZFxuICAgKi9cbiAgcmVhZG9ubHkgc25hcHNob3RWZXJzaW9uOiAnMy4wJztcblxuICAvKipcbiAgICogQWN0aW9uIHR5cGUgZm9yIHRoaXMgc25hcHNob3QuXG4gICAqIC0gVVBTRVJUOiBDcmVhdGUgb3IgdXBkYXRlIGVudGl0eSBtZXRhZGF0YVxuICAgKiAtIERFTEVURTogTWFyayBlbnRpdHkgYXMgZGVsZXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgYWN0aW9uOiAnVVBTRVJUJyB8ICdERUxFVEUnO1xuXG4gIC8qKiBJU08gODYwMSB0aW1lc3RhbXAgb2Ygc25hcHNob3QgY3JlYXRpb24gKi9cbiAgcmVhZG9ubHkgY2FwdHVyZWRBdDogc3RyaW5nO1xuXG4gIC8qKiBQcm92aWRlci9jbG91ZCBpZGVudGl0eSAoQVdTIGFjY291bnQsIHJlZ2lvbiwgZGVwbG95bWVudCBzeXN0ZW0pICovXG4gIHJlYWRvbmx5IHByb3ZpZGVySWRlbnRpdHk6IFByb3ZpZGVySWRlbnRpdHk7XG5cbiAgLyoqIEJpbmRpbmcgaWRlbnRpdHkgKGFwcElkLCBlbnRpdHlOYW1lLCByZXNvdXJjZUlkLCBiaW5kaW5nSWQsIGV0Yy4pICovXG4gIHJlYWRvbmx5IGlkZW50aXR5OiBCaW5kaW5nSWRlbnRpdHk7XG5cbiAgLyoqIE9wZXJhdGlvbiBtZXRhZGF0YSAoZXZlbnRJZCwgcmVxdWVzdFR5cGUsIGZhaWx1cmVNb2RlKSAqL1xuICByZWFkb25seSBvcGVyYXRpb246IE9wZXJhdGlvbk1ldGFkYXRhO1xuXG4gIC8qKiBSZXNvbHV0aW9uIG1ldGFkYXRhIChtb2RlLCBoYXNUb2tlbnMpICovXG4gIHJlYWRvbmx5IHJlc29sdXRpb246IFJlc29sdXRpb25NZXRhZGF0YTtcblxuICAvKiogSGFzaCBtZXRhZGF0YSAoc2NoZW1hSGFzaCwgY29udGVudEhhc2gpICovXG4gIHJlYWRvbmx5IGhhc2hlczogSGFzaE1ldGFkYXRhO1xuXG4gIC8qKiBWYWxpZGF0ZWQgLmJwcmludCBzY2hlbWEgZGF0YSAobnVsbCBmb3IgREVMRVRFIGFjdGlvbnMpICovXG4gIHJlYWRvbmx5IHNjaGVtYTogU2NoZW1hRGF0YSB8IG51bGw7XG5cbiAgLyoqIFJlc291cmNlIG1ldGFkYXRhIChzaW1wbGlmaWVkLCBwcm92aWRlci1mb2N1c2VkKSAqL1xuICByZWFkb25seSByZXNvdXJjZTogUmVzb3VyY2VNZXRhZGF0YTtcblxuICAvKiogUHJvZHVjZXIgbWV0YWRhdGEgKGNvbXBvbmVudCwgdmVyc2lvbiwgcnVudGltZSwgbW9kZSkgKi9cbiAgcmVhZG9ubHkgcHJvZHVjZXI6IFByb2R1Y2VyTWV0YWRhdGE7XG59XG5cbi8qKlxuICogUFVCTElTSEVEIHNuYXBzaG90IHBheWxvYWQgZW5oYW5jZWQgYnkgTGFtYmRhIGhhbmRsZXIgYXQgZGVwbG95LXRpbWUuXG4gKiBcbiAqIFRoaXMgZXh0ZW5kcyBMb2NhbFNuYXBzaG90UGF5bG9hZCB3aXRoIGFkZGl0aW9uYWwgbWV0YWRhdGEgYWRkZWQgZHVyaW5nIGRlcGxveW1lbnQ6XG4gKiAtIG9wZXJhdGlvbjogZXZlbnRJZCwgY2ZSZXF1ZXN0SWQsIHJlcXVlc3RUeXBlLCBmYWlsdXJlTW9kZVxuICogLSBoYXNoZXM6IGNvbnRlbnRIYXNoLCBzY2hlbWFIYXNoXG4gKiAtIHByb2R1Y2VyOiBjb21wb25lbnQsIHZlcnNpb24sIHJ1bnRpbWUsIG1vZGVcbiAqIC0gZGVsZXRlOiAoREVMRVRFIG9ubHkpIHJlYXNvbiwgc2NvcGUsIGRlbGV0ZWRBdFxuICogXG4gKiBUaGlzIGlzIHRoZSBmb3JtYXQgdXBsb2FkZWQgdG8gUzMgYW5kIGNvbnN1bWVkIGJ5IGNoYWltLWluZ2VzdC1zZXJ2aWNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFB1Ymxpc2hlZFNuYXBzaG90UGF5bG9hZCBleHRlbmRzIE9taXQ8TG9jYWxTbmFwc2hvdFBheWxvYWQsICdhY3Rpb24nIHwgJ19zY2hlbWFIYXNoJyB8ICdfcGFja2FnZVZlcnNpb24nPiB7XG4gIC8qKiBBY3Rpb24gaXMgcmVxdWlyZWQgZm9yIHB1Ymxpc2hlZCBzbmFwc2hvdHMgKi9cbiAgcmVhZG9ubHkgYWN0aW9uOiAnVVBTRVJUJyB8ICdERUxFVEUnO1xuXG4gIC8qKiBPcGVyYXRpb24gbWV0YWRhdGEgKGFkZGVkIGF0IGRlcGxveS10aW1lKSAqL1xuICByZWFkb25seSBvcGVyYXRpb246IE9wZXJhdGlvbk1ldGFkYXRhO1xuXG4gIC8qKiBIYXNoIG1ldGFkYXRhIChhZGRlZCBhdCBkZXBsb3ktdGltZSkgKi9cbiAgcmVhZG9ubHkgaGFzaGVzOiBIYXNoTWV0YWRhdGE7XG5cbiAgLyoqIFByb2R1Y2VyIG1ldGFkYXRhIChhZGRlZCBhdCBkZXBsb3ktdGltZSkgKi9cbiAgcmVhZG9ubHkgcHJvZHVjZXI6IFByb2R1Y2VyTWV0YWRhdGE7XG5cbiAgLyoqIERlbGV0ZSBtZXRhZGF0YSAob25seSBmb3IgREVMRVRFIGFjdGlvbnMpICovXG4gIHJlYWRvbmx5IGRlbGV0ZT86IERlbGV0ZU1ldGFkYXRhO1xufVxuXG4vKipcbiAqIFJlc3BvbnNlIGZyb20gQ2hhaW0gaW5nZXN0aW9uIEFQSSBhZnRlciBzbmFwc2hvdC1yZWYgY29tbWl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluZ2VzdFJlc3BvbnNlIHtcbiAgLyoqIEV2ZW50IElEIGVjaG9lZCBiYWNrICovXG4gIHJlYWRvbmx5IGV2ZW50SWQ6IHN0cmluZztcblxuICAvKiogSW5nZXN0aW9uIHN0YXR1cyAqL1xuICByZWFkb25seSBzdGF0dXM6ICdTVUNDRVNTJyB8ICdGQUlMRUQnO1xuXG4gIC8qKiBFcnJvciBtZXNzYWdlIChpZiBmYWlsZWQpICovXG4gIHJlYWRvbmx5IGVycm9yTWVzc2FnZT86IHN0cmluZztcblxuICAvKiogVGltZXN0YW1wIHdoZW4gaW5nZXN0aW9uIHdhcyBwcm9jZXNzZWQgKi9cbiAgcmVhZG9ubHkgcHJvY2Vzc2VkQXQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDbG91ZEZvcm1hdGlvbiBjdXN0b20gcmVzb3VyY2UgcmVzcG9uc2UgZGF0YS5cbiAqIEtlcHQgbWluaW1hbCAtIGFjdHVhbCBwYXlsb2FkIGlzIGluIFMzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEN1c3RvbVJlc291cmNlUmVzcG9uc2VEYXRhIHtcbiAgLyoqIEV2ZW50IElEIGZvciB0cmFja2luZyAqL1xuICByZWFkb25seSBFdmVudElkOiBzdHJpbmc7XG5cbiAgLyoqIEluZ2VzdGlvbiBzdGF0dXMgKi9cbiAgcmVhZG9ubHkgSW5nZXN0U3RhdHVzOiAnU1VDQ0VTUycgfCAnRkFJTEVEJztcblxuICAvKiogQ29udGVudCBoYXNoIGZvciBjaGFuZ2UgZGV0ZWN0aW9uICovXG4gIHJlYWRvbmx5IENvbnRlbnRIYXNoOiBzdHJpbmc7XG5cbiAgLyoqIFRpbWVzdGFtcCAqL1xuICByZWFkb25seSBUaW1lc3RhbXA6IHN0cmluZztcbn1cbiJdfQ==
@@ -0,0 +1,43 @@
1
+ import { IChaimCredentials } from './credentials';
2
+ import { FailureMode } from './failure-mode';
3
+ /**
4
+ * Configuration for Chaim entity bindings.
5
+ *
6
+ * For single-table design with multiple entities, create one TableBindingConfig
7
+ * and share it across all bindings to ensure consistency.
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * // Create config once
12
+ * const config = new TableBindingConfig(
13
+ * 'my-app',
14
+ * ChaimCredentials.fromSecretsManager('chaim/api-credentials')
15
+ * );
16
+ *
17
+ * // Share across multiple entities
18
+ * new ChaimDynamoDBBinder(this, 'UserBinding', {
19
+ * schemaPath: './schemas/user.bprint',
20
+ * table: singleTable,
21
+ * config,
22
+ * });
23
+ *
24
+ * new ChaimDynamoDBBinder(this, 'OrderBinding', {
25
+ * schemaPath: './schemas/order.bprint',
26
+ * table: singleTable,
27
+ * config, // Same config ensures consistency
28
+ * });
29
+ * ```
30
+ */
31
+ export declare class TableBindingConfig {
32
+ readonly appId: string;
33
+ readonly credentials: IChaimCredentials;
34
+ readonly failureMode: FailureMode;
35
+ /**
36
+ * Create a binding configuration.
37
+ *
38
+ * @param appId - Application ID for the Chaim platform
39
+ * @param credentials - API credentials for Chaim ingestion
40
+ * @param failureMode - How to handle ingestion failures (default: BEST_EFFORT)
41
+ */
42
+ constructor(appId: string, credentials: IChaimCredentials, failureMode?: FailureMode);
43
+ }
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TableBindingConfig = void 0;
4
+ const failure_mode_1 = require("./failure-mode");
5
+ /**
6
+ * Configuration for Chaim entity bindings.
7
+ *
8
+ * For single-table design with multiple entities, create one TableBindingConfig
9
+ * and share it across all bindings to ensure consistency.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * // Create config once
14
+ * const config = new TableBindingConfig(
15
+ * 'my-app',
16
+ * ChaimCredentials.fromSecretsManager('chaim/api-credentials')
17
+ * );
18
+ *
19
+ * // Share across multiple entities
20
+ * new ChaimDynamoDBBinder(this, 'UserBinding', {
21
+ * schemaPath: './schemas/user.bprint',
22
+ * table: singleTable,
23
+ * config,
24
+ * });
25
+ *
26
+ * new ChaimDynamoDBBinder(this, 'OrderBinding', {
27
+ * schemaPath: './schemas/order.bprint',
28
+ * table: singleTable,
29
+ * config, // Same config ensures consistency
30
+ * });
31
+ * ```
32
+ */
33
+ class TableBindingConfig {
34
+ appId;
35
+ credentials;
36
+ failureMode;
37
+ /**
38
+ * Create a binding configuration.
39
+ *
40
+ * @param appId - Application ID for the Chaim platform
41
+ * @param credentials - API credentials for Chaim ingestion
42
+ * @param failureMode - How to handle ingestion failures (default: BEST_EFFORT)
43
+ */
44
+ constructor(appId, credentials, failureMode = failure_mode_1.FailureMode.BEST_EFFORT) {
45
+ this.appId = appId;
46
+ this.credentials = credentials;
47
+ this.failureMode = failureMode;
48
+ if (!appId || appId.trim() === '') {
49
+ throw new Error('TableBindingConfig: appId cannot be empty');
50
+ }
51
+ if (!credentials) {
52
+ throw new Error('TableBindingConfig: credentials are required');
53
+ }
54
+ }
55
+ }
56
+ exports.TableBindingConfig = TableBindingConfig;
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtYmluZGluZy1jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvdGFibGUtYmluZGluZy1jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsaURBQTZDO0FBRTdDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyQkc7QUFDSCxNQUFhLGtCQUFrQjtJQVNYO0lBQ0E7SUFDQTtJQVZsQjs7Ozs7O09BTUc7SUFDSCxZQUNrQixLQUFhLEVBQ2IsV0FBOEIsRUFDOUIsY0FBMkIsMEJBQVcsQ0FBQyxXQUFXO1FBRmxELFVBQUssR0FBTCxLQUFLLENBQVE7UUFDYixnQkFBVyxHQUFYLFdBQVcsQ0FBbUI7UUFDOUIsZ0JBQVcsR0FBWCxXQUFXLENBQXVDO1FBRWxFLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7U0FDOUQ7UUFDRCxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQztTQUNqRTtJQUNILENBQUM7Q0FDRjtBQXBCRCxnREFvQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJQ2hhaW1DcmVkZW50aWFscyB9IGZyb20gJy4vY3JlZGVudGlhbHMnO1xuaW1wb3J0IHsgRmFpbHVyZU1vZGUgfSBmcm9tICcuL2ZhaWx1cmUtbW9kZSc7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgQ2hhaW0gZW50aXR5IGJpbmRpbmdzLlxuICogXG4gKiBGb3Igc2luZ2xlLXRhYmxlIGRlc2lnbiB3aXRoIG11bHRpcGxlIGVudGl0aWVzLCBjcmVhdGUgb25lIFRhYmxlQmluZGluZ0NvbmZpZ1xuICogYW5kIHNoYXJlIGl0IGFjcm9zcyBhbGwgYmluZGluZ3MgdG8gZW5zdXJlIGNvbnNpc3RlbmN5LlxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGNvbmZpZyBvbmNlXG4gKiBjb25zdCBjb25maWcgPSBuZXcgVGFibGVCaW5kaW5nQ29uZmlnKFxuICogICAnbXktYXBwJyxcbiAqICAgQ2hhaW1DcmVkZW50aWFscy5mcm9tU2VjcmV0c01hbmFnZXIoJ2NoYWltL2FwaS1jcmVkZW50aWFscycpXG4gKiApO1xuICogXG4gKiAvLyBTaGFyZSBhY3Jvc3MgbXVsdGlwbGUgZW50aXRpZXNcbiAqIG5ldyBDaGFpbUR5bmFtb0RCQmluZGVyKHRoaXMsICdVc2VyQmluZGluZycsIHtcbiAqICAgc2NoZW1hUGF0aDogJy4vc2NoZW1hcy91c2VyLmJwcmludCcsXG4gKiAgIHRhYmxlOiBzaW5nbGVUYWJsZSxcbiAqICAgY29uZmlnLFxuICogfSk7XG4gKiBcbiAqIG5ldyBDaGFpbUR5bmFtb0RCQmluZGVyKHRoaXMsICdPcmRlckJpbmRpbmcnLCB7XG4gKiAgIHNjaGVtYVBhdGg6ICcuL3NjaGVtYXMvb3JkZXIuYnByaW50JyxcbiAqICAgdGFibGU6IHNpbmdsZVRhYmxlLFxuICogICBjb25maWcsIC8vIFNhbWUgY29uZmlnIGVuc3VyZXMgY29uc2lzdGVuY3lcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBUYWJsZUJpbmRpbmdDb25maWcge1xuICAvKipcbiAgICogQ3JlYXRlIGEgYmluZGluZyBjb25maWd1cmF0aW9uLlxuICAgKiBcbiAgICogQHBhcmFtIGFwcElkIC0gQXBwbGljYXRpb24gSUQgZm9yIHRoZSBDaGFpbSBwbGF0Zm9ybVxuICAgKiBAcGFyYW0gY3JlZGVudGlhbHMgLSBBUEkgY3JlZGVudGlhbHMgZm9yIENoYWltIGluZ2VzdGlvblxuICAgKiBAcGFyYW0gZmFpbHVyZU1vZGUgLSBIb3cgdG8gaGFuZGxlIGluZ2VzdGlvbiBmYWlsdXJlcyAoZGVmYXVsdDogQkVTVF9FRkZPUlQpXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgYXBwSWQ6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgY3JlZGVudGlhbHM6IElDaGFpbUNyZWRlbnRpYWxzLFxuICAgIHB1YmxpYyByZWFkb25seSBmYWlsdXJlTW9kZTogRmFpbHVyZU1vZGUgPSBGYWlsdXJlTW9kZS5CRVNUX0VGRk9SVFxuICApIHtcbiAgICBpZiAoIWFwcElkIHx8IGFwcElkLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGFibGVCaW5kaW5nQ29uZmlnOiBhcHBJZCBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICB9XG4gICAgaWYgKCFjcmVkZW50aWFscykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUYWJsZUJpbmRpbmdDb25maWc6IGNyZWRlbnRpYWxzIGFyZSByZXF1aXJlZCcpO1xuICAgIH1cbiAgfVxufVxuIl19