@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,95 @@
1
+ import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';
2
+ import { Construct } from 'constructs';
3
+ import { BaseChaimBinder } from './base-chaim-binder';
4
+ import { BaseBinderProps } from '../types/base-binder-props';
5
+ import { DynamoDBMetadata } from '../types/data-store-metadata';
6
+ /**
7
+ * Properties for ChaimDynamoDBBinder construct.
8
+ */
9
+ export interface ChaimDynamoDBBinderProps extends BaseBinderProps {
10
+ /** DynamoDB table to bind with the schema */
11
+ table: dynamodb.ITable;
12
+ }
13
+ /**
14
+ * CDK construct for binding a .bprint schema to a DynamoDB table.
15
+ *
16
+ * Publishes schema and table metadata to Chaim SaaS platform via
17
+ * S3 presigned upload and snapshot-ref commit.
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * import { ChaimDynamoDBBinder, ChaimCredentials, FailureMode } from '@chaim-tools/cdk-lib';
22
+ *
23
+ * const table = new dynamodb.Table(this, 'UsersTable', {
24
+ * partitionKey: { name: 'userId', type: dynamodb.AttributeType.STRING },
25
+ * });
26
+ *
27
+ * // failureMode defaults to BEST_EFFORT
28
+ * new ChaimDynamoDBBinder(this, 'UserSchema', {
29
+ * schemaPath: './schemas/user.bprint',
30
+ * table,
31
+ * appId: 'my-app',
32
+ * credentials: ChaimCredentials.fromSecretsManager('chaim/api-credentials'),
33
+ * failureMode: FailureMode.STRICT, // Optional - rolls back on failure
34
+ * });
35
+ * ```
36
+ */
37
+ export declare class ChaimDynamoDBBinder extends BaseChaimBinder {
38
+ /** The DynamoDB table being bound */
39
+ readonly table: dynamodb.ITable;
40
+ /** DynamoDB-specific metadata */
41
+ readonly dynamoDBMetadata: DynamoDBMetadata;
42
+ private readonly dynamoDBProps;
43
+ constructor(scope: Construct, id: string, props: ChaimDynamoDBBinderProps);
44
+ /**
45
+ * Override to resolve the actual table name when possible.
46
+ *
47
+ * Uses stack.resolve() to convert CDK tokens to actual values for explicit table names
48
+ * (e.g., 'acme-product-catalog') and dynamic names (e.g., `${stack.stackName}-orders`).
49
+ * Falls back to construct node ID for auto-generated names or cross-stack references.
50
+ *
51
+ * Note: This is called from BaseChaimBinder constructor before this.table is set,
52
+ * so we access the table from baseProps instead.
53
+ */
54
+ protected getResourceName(): string;
55
+ /**
56
+ * Extract DynamoDB table metadata.
57
+ */
58
+ protected extractMetadata(): DynamoDBMetadata;
59
+ /**
60
+ * Validate that the table is a concrete DynamoDB Table construct.
61
+ *
62
+ * Note: We use duck typing for instanceof check to handle cross-package
63
+ * type compatibility issues in monorepo setups (e.g., pnpm with isolated node_modules).
64
+ */
65
+ private validateTable;
66
+ /**
67
+ * Get the underlying CloudFormation table resource.
68
+ * Uses duck typing for cross-package compatibility.
69
+ */
70
+ private getCfnTable;
71
+ /**
72
+ * Extract partition key and sort key from key schema.
73
+ */
74
+ private extractKeySchema;
75
+ /**
76
+ * Extract Global Secondary Index metadata.
77
+ */
78
+ private extractGSIs;
79
+ /**
80
+ * Extract Local Secondary Index metadata.
81
+ */
82
+ private extractLSIs;
83
+ /**
84
+ * Extract TTL attribute name.
85
+ */
86
+ private extractTTL;
87
+ /**
88
+ * Extract stream configuration.
89
+ */
90
+ private extractStreamInfo;
91
+ /**
92
+ * Extract billing mode.
93
+ */
94
+ private extractBillingMode;
95
+ }
@@ -0,0 +1,292 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.ChaimDynamoDBBinder = void 0;
27
+ const cdk = __importStar(require("aws-cdk-lib"));
28
+ const dynamodb = __importStar(require("aws-cdk-lib/aws-dynamodb"));
29
+ const base_chaim_binder_1 = require("./base-chaim-binder");
30
+ /**
31
+ * CDK construct for binding a .bprint schema to a DynamoDB table.
32
+ *
33
+ * Publishes schema and table metadata to Chaim SaaS platform via
34
+ * S3 presigned upload and snapshot-ref commit.
35
+ *
36
+ * @example
37
+ * ```typescript
38
+ * import { ChaimDynamoDBBinder, ChaimCredentials, FailureMode } from '@chaim-tools/cdk-lib';
39
+ *
40
+ * const table = new dynamodb.Table(this, 'UsersTable', {
41
+ * partitionKey: { name: 'userId', type: dynamodb.AttributeType.STRING },
42
+ * });
43
+ *
44
+ * // failureMode defaults to BEST_EFFORT
45
+ * new ChaimDynamoDBBinder(this, 'UserSchema', {
46
+ * schemaPath: './schemas/user.bprint',
47
+ * table,
48
+ * appId: 'my-app',
49
+ * credentials: ChaimCredentials.fromSecretsManager('chaim/api-credentials'),
50
+ * failureMode: FailureMode.STRICT, // Optional - rolls back on failure
51
+ * });
52
+ * ```
53
+ */
54
+ class ChaimDynamoDBBinder extends base_chaim_binder_1.BaseChaimBinder {
55
+ /** The DynamoDB table being bound */
56
+ table;
57
+ /** DynamoDB-specific metadata */
58
+ dynamoDBMetadata;
59
+ dynamoDBProps;
60
+ constructor(scope, id, props) {
61
+ // Store props before calling super (which calls extractMetadata)
62
+ super(scope, id, props);
63
+ this.dynamoDBProps = props;
64
+ this.table = props.table;
65
+ this.dynamoDBMetadata = this.dataStoreMetadata;
66
+ }
67
+ /**
68
+ * Override to resolve the actual table name when possible.
69
+ *
70
+ * Uses stack.resolve() to convert CDK tokens to actual values for explicit table names
71
+ * (e.g., 'acme-product-catalog') and dynamic names (e.g., `${stack.stackName}-orders`).
72
+ * Falls back to construct node ID for auto-generated names or cross-stack references.
73
+ *
74
+ * Note: This is called from BaseChaimBinder constructor before this.table is set,
75
+ * so we access the table from baseProps instead.
76
+ */
77
+ getResourceName() {
78
+ const props = this.baseProps;
79
+ const cfnTable = props.table.node.defaultChild;
80
+ const stack = cdk.Stack.of(this);
81
+ // Try to resolve the table name token
82
+ // This works for explicit names like 'acme-product-catalog'
83
+ // and dynamic names like `${stack.stackName}-orders`
84
+ const resolvedName = stack.resolve(cfnTable.tableName);
85
+ // Check if it's still an unresolved token
86
+ if (!resolvedName || cdk.Token.isUnresolved(resolvedName)) {
87
+ // Fallback to construct ID for auto-generated names
88
+ return props.table.node.id;
89
+ }
90
+ // Return the actual resolved table name
91
+ return resolvedName;
92
+ }
93
+ /**
94
+ * Extract DynamoDB table metadata.
95
+ */
96
+ extractMetadata() {
97
+ const props = this.baseProps;
98
+ const table = props.table;
99
+ const stack = cdk.Stack.of(this);
100
+ // Validate table
101
+ this.validateTable(table);
102
+ // Get CloudFormation resource for detailed metadata
103
+ const cfnTable = this.getCfnTable(table);
104
+ // Extract key schema
105
+ const { partitionKey, sortKey } = this.extractKeySchema(cfnTable);
106
+ // Extract indexes
107
+ const globalSecondaryIndexes = this.extractGSIs(cfnTable);
108
+ const localSecondaryIndexes = this.extractLSIs(cfnTable);
109
+ // Extract TTL
110
+ const ttlAttribute = this.extractTTL(cfnTable);
111
+ // Extract stream info
112
+ const { streamEnabled, streamViewType } = this.extractStreamInfo(cfnTable);
113
+ // Extract billing mode
114
+ const billingMode = this.extractBillingMode(cfnTable);
115
+ // Resolve table name from token (same logic as getResourceName)
116
+ const resolvedTableName = stack.resolve(cfnTable.tableName);
117
+ const tableName = (!resolvedTableName || cdk.Token.isUnresolved(resolvedTableName))
118
+ ? table.tableName // Keep token if can't resolve
119
+ : resolvedTableName;
120
+ return {
121
+ type: 'dynamodb',
122
+ // Removed duplicate fields in v1.1:
123
+ // - arn (use tableArn instead)
124
+ // - name (use tableName instead)
125
+ // - account (use top-level accountId instead)
126
+ tableName,
127
+ tableArn: table.tableArn,
128
+ region: stack.region,
129
+ partitionKey,
130
+ sortKey,
131
+ globalSecondaryIndexes,
132
+ localSecondaryIndexes,
133
+ ttlAttribute,
134
+ streamEnabled,
135
+ streamViewType,
136
+ billingMode,
137
+ encryptionKeyArn: table.encryptionKey?.keyArn,
138
+ };
139
+ }
140
+ /**
141
+ * Validate that the table is a concrete DynamoDB Table construct.
142
+ *
143
+ * Note: We use duck typing for instanceof check to handle cross-package
144
+ * type compatibility issues in monorepo setups (e.g., pnpm with isolated node_modules).
145
+ */
146
+ validateTable(table) {
147
+ if (!table) {
148
+ throw new Error('DynamoDB table is required');
149
+ }
150
+ // Duck typing check: a concrete Table has node.defaultChild (CfnTable)
151
+ // This handles cross-package type compatibility in monorepos
152
+ const isConcreteTable = table instanceof dynamodb.Table ||
153
+ (table.node && table.node.defaultChild &&
154
+ table.node.defaultChild.cfnResourceType === 'AWS::DynamoDB::Table');
155
+ if (!isConcreteTable) {
156
+ throw new Error('Table must be a concrete DynamoDB Table construct. Imported tables are not supported.');
157
+ }
158
+ if (!table.tableName) {
159
+ throw new Error('Table must have a valid table name');
160
+ }
161
+ if (!table.tableArn) {
162
+ throw new Error('Table must have a valid table ARN');
163
+ }
164
+ }
165
+ /**
166
+ * Get the underlying CloudFormation table resource.
167
+ * Uses duck typing for cross-package compatibility.
168
+ */
169
+ getCfnTable(table) {
170
+ // Use duck typing check for cross-package compatibility
171
+ const cfnTable = table.node?.defaultChild;
172
+ if (!cfnTable || cfnTable.cfnResourceType !== 'AWS::DynamoDB::Table') {
173
+ throw new Error('Cannot access CloudFormation resource for imported table');
174
+ }
175
+ return cfnTable;
176
+ }
177
+ /**
178
+ * Extract partition key and sort key from key schema.
179
+ */
180
+ extractKeySchema(cfnTable) {
181
+ const keySchema = cfnTable.keySchema;
182
+ if (!keySchema || !Array.isArray(keySchema) || keySchema.length === 0) {
183
+ throw new Error('Table must have a key schema');
184
+ }
185
+ let partitionKey;
186
+ let sortKey;
187
+ for (const key of keySchema) {
188
+ if (typeof key === 'object' && 'attributeName' in key && 'keyType' in key) {
189
+ if (key.keyType === 'HASH') {
190
+ partitionKey = key.attributeName;
191
+ }
192
+ else if (key.keyType === 'RANGE') {
193
+ sortKey = key.attributeName;
194
+ }
195
+ }
196
+ }
197
+ if (!partitionKey) {
198
+ throw new Error('Cannot extract partition key from table key schema');
199
+ }
200
+ return { partitionKey, sortKey };
201
+ }
202
+ /**
203
+ * Extract Global Secondary Index metadata.
204
+ */
205
+ extractGSIs(cfnTable) {
206
+ const gsis = cfnTable.globalSecondaryIndexes;
207
+ if (!gsis || !Array.isArray(gsis) || gsis.length === 0) {
208
+ return undefined;
209
+ }
210
+ return gsis.map((gsi) => {
211
+ const keySchema = gsi.keySchema || [];
212
+ let partitionKey = '';
213
+ let sortKey;
214
+ for (const key of keySchema) {
215
+ if (key.keyType === 'HASH') {
216
+ partitionKey = key.attributeName;
217
+ }
218
+ else if (key.keyType === 'RANGE') {
219
+ sortKey = key.attributeName;
220
+ }
221
+ }
222
+ return {
223
+ indexName: gsi.indexName,
224
+ partitionKey,
225
+ sortKey,
226
+ projectionType: gsi.projection?.projectionType || 'ALL',
227
+ nonKeyAttributes: gsi.projection?.nonKeyAttributes,
228
+ };
229
+ });
230
+ }
231
+ /**
232
+ * Extract Local Secondary Index metadata.
233
+ */
234
+ extractLSIs(cfnTable) {
235
+ const lsis = cfnTable.localSecondaryIndexes;
236
+ if (!lsis || !Array.isArray(lsis) || lsis.length === 0) {
237
+ return undefined;
238
+ }
239
+ return lsis.map((lsi) => {
240
+ const keySchema = lsi.keySchema || [];
241
+ let sortKey = '';
242
+ for (const key of keySchema) {
243
+ if (key.keyType === 'RANGE') {
244
+ sortKey = key.attributeName;
245
+ }
246
+ }
247
+ return {
248
+ indexName: lsi.indexName,
249
+ sortKey,
250
+ projectionType: lsi.projection?.projectionType || 'ALL',
251
+ nonKeyAttributes: lsi.projection?.nonKeyAttributes,
252
+ };
253
+ });
254
+ }
255
+ /**
256
+ * Extract TTL attribute name.
257
+ */
258
+ extractTTL(cfnTable) {
259
+ const ttlSpec = cfnTable.timeToLiveSpecification;
260
+ if (ttlSpec && typeof ttlSpec === 'object' && 'enabled' in ttlSpec) {
261
+ if (ttlSpec.enabled && 'attributeName' in ttlSpec) {
262
+ return ttlSpec.attributeName;
263
+ }
264
+ }
265
+ return undefined;
266
+ }
267
+ /**
268
+ * Extract stream configuration.
269
+ */
270
+ extractStreamInfo(cfnTable) {
271
+ const streamSpec = cfnTable.streamSpecification;
272
+ if (streamSpec && typeof streamSpec === 'object' && 'streamViewType' in streamSpec) {
273
+ return {
274
+ streamEnabled: true,
275
+ streamViewType: streamSpec.streamViewType,
276
+ };
277
+ }
278
+ return { streamEnabled: false };
279
+ }
280
+ /**
281
+ * Extract billing mode.
282
+ */
283
+ extractBillingMode(cfnTable) {
284
+ const billingMode = cfnTable.billingMode;
285
+ if (billingMode === 'PAY_PER_REQUEST' || billingMode === 'PROVISIONED') {
286
+ return billingMode;
287
+ }
288
+ return undefined;
289
+ }
290
+ }
291
+ exports.ChaimDynamoDBBinder = ChaimDynamoDBBinder;
292
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhaW0tZHluYW1vZGItYmluZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2JpbmRlcnMvY2hhaW0tZHluYW1vZGItYmluZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsaURBQW1DO0FBQ25DLG1FQUFxRDtBQUdyRCwyREFBc0Q7QUFnQnREOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRztBQUNILE1BQWEsbUJBQW9CLFNBQVEsbUNBQWU7SUFDdEQscUNBQXFDO0lBQ3JCLEtBQUssQ0FBa0I7SUFFdkMsaUNBQWlDO0lBQ2pCLGdCQUFnQixDQUFtQjtJQUVsQyxhQUFhLENBQTJCO0lBRXpELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBK0I7UUFDdkUsaUVBQWlFO1FBQ2pFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXhCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGlCQUFxQyxDQUFDO0lBQ3JFLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDTyxlQUFlO1FBQ3ZCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFxQyxDQUFDO1FBQ3pELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQWlDLENBQUM7UUFDcEUsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFakMsc0NBQXNDO1FBQ3RDLDREQUE0RDtRQUM1RCxxREFBcUQ7UUFDckQsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFdkQsMENBQTBDO1FBQzFDLElBQUksQ0FBQyxZQUFZLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDekQsb0RBQW9EO1lBQ3BELE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1NBQzVCO1FBRUQsd0NBQXdDO1FBQ3hDLE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7T0FFRztJQUNPLGVBQWU7UUFDdkIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQXFDLENBQUM7UUFDekQsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUMxQixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVqQyxpQkFBaUI7UUFDakIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUxQixvREFBb0Q7UUFDcEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV6QyxxQkFBcUI7UUFDckIsTUFBTSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFbEUsa0JBQWtCO1FBQ2xCLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxRCxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFekQsY0FBYztRQUNkLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFL0Msc0JBQXNCO1FBQ3RCLE1BQU0sRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTNFLHVCQUF1QjtRQUN2QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFdEQsZ0VBQWdFO1FBQ2hFLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDNUQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDLGlCQUFpQixJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDakYsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUUsOEJBQThCO1lBQ2pELENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztRQUV0QixPQUFPO1lBQ0wsSUFBSSxFQUFFLFVBQVU7WUFDaEIsb0NBQW9DO1lBQ3BDLCtCQUErQjtZQUMvQixpQ0FBaUM7WUFDakMsOENBQThDO1lBQzlDLFNBQVM7WUFDVCxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7WUFDeEIsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO1lBQ3BCLFlBQVk7WUFDWixPQUFPO1lBQ1Asc0JBQXNCO1lBQ3RCLHFCQUFxQjtZQUNyQixZQUFZO1lBQ1osYUFBYTtZQUNiLGNBQWM7WUFDZCxXQUFXO1lBQ1gsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGFBQWEsRUFBRSxNQUFNO1NBQzlDLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxhQUFhLENBQUMsS0FBc0I7UUFDMUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztTQUMvQztRQUVELHVFQUF1RTtRQUN2RSw2REFBNkQ7UUFDN0QsTUFBTSxlQUFlLEdBQUcsS0FBSyxZQUFZLFFBQVEsQ0FBQyxLQUFLO1lBQ3JELENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVk7Z0JBQ3BDLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBb0IsQ0FBQyxlQUFlLEtBQUssc0JBQXNCLENBQUMsQ0FBQztRQUVoRixJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQ2IsdUZBQXVGLENBQ3hGLENBQUM7U0FDSDtRQUVELElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFO1lBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztTQUN2RDtRQUVELElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFO1lBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztTQUN0RDtJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSyxXQUFXLENBQUMsS0FBc0I7UUFDeEMsd0RBQXdEO1FBQ3hELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsWUFBNkMsQ0FBQztRQUUzRSxJQUFJLENBQUMsUUFBUSxJQUFLLFFBQWdCLENBQUMsZUFBZSxLQUFLLHNCQUFzQixFQUFFO1lBQzdFLE1BQU0sSUFBSSxLQUFLLENBQUMsMERBQTBELENBQUMsQ0FBQztTQUM3RTtRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7T0FFRztJQUNLLGdCQUFnQixDQUFDLFFBQTJCO1FBSWxELE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUM7UUFFckMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDckUsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1NBQ2pEO1FBRUQsSUFBSSxZQUFnQyxDQUFDO1FBQ3JDLElBQUksT0FBMkIsQ0FBQztRQUVoQyxLQUFLLE1BQU0sR0FBRyxJQUFJLFNBQVMsRUFBRTtZQUMzQixJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxlQUFlLElBQUksR0FBRyxJQUFJLFNBQVMsSUFBSSxHQUFHLEVBQUU7Z0JBQ3pFLElBQUksR0FBRyxDQUFDLE9BQU8sS0FBSyxNQUFNLEVBQUU7b0JBQzFCLFlBQVksR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDO2lCQUNsQztxQkFBTSxJQUFJLEdBQUcsQ0FBQyxPQUFPLEtBQUssT0FBTyxFQUFFO29CQUNsQyxPQUFPLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQztpQkFDN0I7YUFDRjtTQUNGO1FBRUQsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7U0FDdkU7UUFFRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFRDs7T0FFRztJQUNLLFdBQVcsQ0FBQyxRQUEyQjtRQUM3QyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsc0JBQXNCLENBQUM7UUFDN0MsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDdEQsT0FBTyxTQUFTLENBQUM7U0FDbEI7UUFFRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUMzQixNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztZQUN0QyxJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7WUFDdEIsSUFBSSxPQUEyQixDQUFDO1lBRWhDLEtBQUssTUFBTSxHQUFHLElBQUksU0FBUyxFQUFFO2dCQUMzQixJQUFJLEdBQUcsQ0FBQyxPQUFPLEtBQUssTUFBTSxFQUFFO29CQUMxQixZQUFZLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQztpQkFDbEM7cUJBQU0sSUFBSSxHQUFHLENBQUMsT0FBTyxLQUFLLE9BQU8sRUFBRTtvQkFDbEMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUM7aUJBQzdCO2FBQ0Y7WUFFRCxPQUFPO2dCQUNMLFNBQVMsRUFBRSxHQUFHLENBQUMsU0FBUztnQkFDeEIsWUFBWTtnQkFDWixPQUFPO2dCQUNQLGNBQWMsRUFBRSxHQUFHLENBQUMsVUFBVSxFQUFFLGNBQWMsSUFBSSxLQUFLO2dCQUN2RCxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsVUFBVSxFQUFFLGdCQUFnQjthQUNuRCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxXQUFXLENBQUMsUUFBMkI7UUFDN0MsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLHFCQUFxQixDQUFDO1FBQzVDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3RELE9BQU8sU0FBUyxDQUFDO1NBQ2xCO1FBRUQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDM0IsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7WUFDdEMsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBRWpCLEtBQUssTUFBTSxHQUFHLElBQUksU0FBUyxFQUFFO2dCQUMzQixJQUFJLEdBQUcsQ0FBQyxPQUFPLEtBQUssT0FBTyxFQUFFO29CQUMzQixPQUFPLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQztpQkFDN0I7YUFDRjtZQUVELE9BQU87Z0JBQ0wsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFTO2dCQUN4QixPQUFPO2dCQUNQLGNBQWMsRUFBRSxHQUFHLENBQUMsVUFBVSxFQUFFLGNBQWMsSUFBSSxLQUFLO2dCQUN2RCxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsVUFBVSxFQUFFLGdCQUFnQjthQUNuRCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxVQUFVLENBQUMsUUFBMkI7UUFDNUMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLHVCQUF1QixDQUFDO1FBQ2pELElBQUksT0FBTyxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsSUFBSSxTQUFTLElBQUksT0FBTyxFQUFFO1lBQ2xFLElBQUksT0FBTyxDQUFDLE9BQU8sSUFBSSxlQUFlLElBQUksT0FBTyxFQUFFO2dCQUNqRCxPQUFPLE9BQU8sQ0FBQyxhQUF1QixDQUFDO2FBQ3hDO1NBQ0Y7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxpQkFBaUIsQ0FBQyxRQUEyQjtRQUluRCxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsbUJBQW1CLENBQUM7UUFDaEQsSUFBSSxVQUFVLElBQUksT0FBTyxVQUFVLEtBQUssUUFBUSxJQUFJLGdCQUFnQixJQUFJLFVBQVUsRUFBRTtZQUNsRixPQUFPO2dCQUNMLGFBQWEsRUFBRSxJQUFJO2dCQUNuQixjQUFjLEVBQUUsVUFBVSxDQUFDLGNBQXdCO2FBQ3BELENBQUM7U0FDSDtRQUNELE9BQU8sRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ssa0JBQWtCLENBQUMsUUFBMkI7UUFDcEQsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUN6QyxJQUFJLFdBQVcsS0FBSyxpQkFBaUIsSUFBSSxXQUFXLEtBQUssYUFBYSxFQUFFO1lBQ3RFLE9BQU8sV0FBVyxDQUFDO1NBQ3BCO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztDQUNGO0FBN1JELGtEQTZSQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBkeW5hbW9kYiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZHluYW1vZGInO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbmltcG9ydCB7IEJhc2VDaGFpbUJpbmRlciB9IGZyb20gJy4vYmFzZS1jaGFpbS1iaW5kZXInO1xuaW1wb3J0IHsgQmFzZUJpbmRlclByb3BzIH0gZnJvbSAnLi4vdHlwZXMvYmFzZS1iaW5kZXItcHJvcHMnO1xuaW1wb3J0IHtcbiAgRHluYW1vREJNZXRhZGF0YSxcbiAgR1NJTWV0YWRhdGEsXG4gIExTSU1ldGFkYXRhLFxufSBmcm9tICcuLi90eXBlcy9kYXRhLXN0b3JlLW1ldGFkYXRhJztcblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBDaGFpbUR5bmFtb0RCQmluZGVyIGNvbnN0cnVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGFpbUR5bmFtb0RCQmluZGVyUHJvcHMgZXh0ZW5kcyBCYXNlQmluZGVyUHJvcHMge1xuICAvKiogRHluYW1vREIgdGFibGUgdG8gYmluZCB3aXRoIHRoZSBzY2hlbWEgKi9cbiAgdGFibGU6IGR5bmFtb2RiLklUYWJsZTtcbn1cblxuLyoqXG4gKiBDREsgY29uc3RydWN0IGZvciBiaW5kaW5nIGEgLmJwcmludCBzY2hlbWEgdG8gYSBEeW5hbW9EQiB0YWJsZS5cbiAqXG4gKiBQdWJsaXNoZXMgc2NoZW1hIGFuZCB0YWJsZSBtZXRhZGF0YSB0byBDaGFpbSBTYWFTIHBsYXRmb3JtIHZpYVxuICogUzMgcHJlc2lnbmVkIHVwbG9hZCBhbmQgc25hcHNob3QtcmVmIGNvbW1pdC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgQ2hhaW1EeW5hbW9EQkJpbmRlciwgQ2hhaW1DcmVkZW50aWFscywgRmFpbHVyZU1vZGUgfSBmcm9tICdAY2hhaW0tdG9vbHMvY2RrLWxpYic7XG4gKlxuICogY29uc3QgdGFibGUgPSBuZXcgZHluYW1vZGIuVGFibGUodGhpcywgJ1VzZXJzVGFibGUnLCB7XG4gKiAgIHBhcnRpdGlvbktleTogeyBuYW1lOiAndXNlcklkJywgdHlwZTogZHluYW1vZGIuQXR0cmlidXRlVHlwZS5TVFJJTkcgfSxcbiAqIH0pO1xuICpcbiAqIC8vIGZhaWx1cmVNb2RlIGRlZmF1bHRzIHRvIEJFU1RfRUZGT1JUXG4gKiBuZXcgQ2hhaW1EeW5hbW9EQkJpbmRlcih0aGlzLCAnVXNlclNjaGVtYScsIHtcbiAqICAgc2NoZW1hUGF0aDogJy4vc2NoZW1hcy91c2VyLmJwcmludCcsXG4gKiAgIHRhYmxlLFxuICogICBhcHBJZDogJ215LWFwcCcsXG4gKiAgIGNyZWRlbnRpYWxzOiBDaGFpbUNyZWRlbnRpYWxzLmZyb21TZWNyZXRzTWFuYWdlcignY2hhaW0vYXBpLWNyZWRlbnRpYWxzJyksXG4gKiAgIGZhaWx1cmVNb2RlOiBGYWlsdXJlTW9kZS5TVFJJQ1QsICAvLyBPcHRpb25hbCAtIHJvbGxzIGJhY2sgb24gZmFpbHVyZVxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIENoYWltRHluYW1vREJCaW5kZXIgZXh0ZW5kcyBCYXNlQ2hhaW1CaW5kZXIge1xuICAvKiogVGhlIER5bmFtb0RCIHRhYmxlIGJlaW5nIGJvdW5kICovXG4gIHB1YmxpYyByZWFkb25seSB0YWJsZTogZHluYW1vZGIuSVRhYmxlO1xuXG4gIC8qKiBEeW5hbW9EQi1zcGVjaWZpYyBtZXRhZGF0YSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZHluYW1vREJNZXRhZGF0YTogRHluYW1vREJNZXRhZGF0YTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGR5bmFtb0RCUHJvcHM6IENoYWltRHluYW1vREJCaW5kZXJQcm9wcztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQ2hhaW1EeW5hbW9EQkJpbmRlclByb3BzKSB7XG4gICAgLy8gU3RvcmUgcHJvcHMgYmVmb3JlIGNhbGxpbmcgc3VwZXIgKHdoaWNoIGNhbGxzIGV4dHJhY3RNZXRhZGF0YSlcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIHRoaXMuZHluYW1vREJQcm9wcyA9IHByb3BzO1xuICAgIHRoaXMudGFibGUgPSBwcm9wcy50YWJsZTtcbiAgICB0aGlzLmR5bmFtb0RCTWV0YWRhdGEgPSB0aGlzLmRhdGFTdG9yZU1ldGFkYXRhIGFzIER5bmFtb0RCTWV0YWRhdGE7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgdG8gcmVzb2x2ZSB0aGUgYWN0dWFsIHRhYmxlIG5hbWUgd2hlbiBwb3NzaWJsZS5cbiAgICogXG4gICAqIFVzZXMgc3RhY2sucmVzb2x2ZSgpIHRvIGNvbnZlcnQgQ0RLIHRva2VucyB0byBhY3R1YWwgdmFsdWVzIGZvciBleHBsaWNpdCB0YWJsZSBuYW1lc1xuICAgKiAoZS5nLiwgJ2FjbWUtcHJvZHVjdC1jYXRhbG9nJykgYW5kIGR5bmFtaWMgbmFtZXMgKGUuZy4sIGAke3N0YWNrLnN0YWNrTmFtZX0tb3JkZXJzYCkuXG4gICAqIEZhbGxzIGJhY2sgdG8gY29uc3RydWN0IG5vZGUgSUQgZm9yIGF1dG8tZ2VuZXJhdGVkIG5hbWVzIG9yIGNyb3NzLXN0YWNrIHJlZmVyZW5jZXMuXG4gICAqIFxuICAgKiBOb3RlOiBUaGlzIGlzIGNhbGxlZCBmcm9tIEJhc2VDaGFpbUJpbmRlciBjb25zdHJ1Y3RvciBiZWZvcmUgdGhpcy50YWJsZSBpcyBzZXQsXG4gICAqIHNvIHdlIGFjY2VzcyB0aGUgdGFibGUgZnJvbSBiYXNlUHJvcHMgaW5zdGVhZC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXRSZXNvdXJjZU5hbWUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBwcm9wcyA9IHRoaXMuYmFzZVByb3BzIGFzIENoYWltRHluYW1vREJCaW5kZXJQcm9wcztcbiAgICBjb25zdCBjZm5UYWJsZSA9IHByb3BzLnRhYmxlLm5vZGUuZGVmYXVsdENoaWxkIGFzIGR5bmFtb2RiLkNmblRhYmxlO1xuICAgIGNvbnN0IHN0YWNrID0gY2RrLlN0YWNrLm9mKHRoaXMpO1xuICAgIFxuICAgIC8vIFRyeSB0byByZXNvbHZlIHRoZSB0YWJsZSBuYW1lIHRva2VuXG4gICAgLy8gVGhpcyB3b3JrcyBmb3IgZXhwbGljaXQgbmFtZXMgbGlrZSAnYWNtZS1wcm9kdWN0LWNhdGFsb2cnXG4gICAgLy8gYW5kIGR5bmFtaWMgbmFtZXMgbGlrZSBgJHtzdGFjay5zdGFja05hbWV9LW9yZGVyc2BcbiAgICBjb25zdCByZXNvbHZlZE5hbWUgPSBzdGFjay5yZXNvbHZlKGNmblRhYmxlLnRhYmxlTmFtZSk7XG4gICAgXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBzdGlsbCBhbiB1bnJlc29sdmVkIHRva2VuXG4gICAgaWYgKCFyZXNvbHZlZE5hbWUgfHwgY2RrLlRva2VuLmlzVW5yZXNvbHZlZChyZXNvbHZlZE5hbWUpKSB7XG4gICAgICAvLyBGYWxsYmFjayB0byBjb25zdHJ1Y3QgSUQgZm9yIGF1dG8tZ2VuZXJhdGVkIG5hbWVzXG4gICAgICByZXR1cm4gcHJvcHMudGFibGUubm9kZS5pZDtcbiAgICB9XG4gICAgXG4gICAgLy8gUmV0dXJuIHRoZSBhY3R1YWwgcmVzb2x2ZWQgdGFibGUgbmFtZVxuICAgIHJldHVybiByZXNvbHZlZE5hbWU7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBEeW5hbW9EQiB0YWJsZSBtZXRhZGF0YS5cbiAgICovXG4gIHByb3RlY3RlZCBleHRyYWN0TWV0YWRhdGEoKTogRHluYW1vREJNZXRhZGF0YSB7XG4gICAgY29uc3QgcHJvcHMgPSB0aGlzLmJhc2VQcm9wcyBhcyBDaGFpbUR5bmFtb0RCQmluZGVyUHJvcHM7XG4gICAgY29uc3QgdGFibGUgPSBwcm9wcy50YWJsZTtcbiAgICBjb25zdCBzdGFjayA9IGNkay5TdGFjay5vZih0aGlzKTtcblxuICAgIC8vIFZhbGlkYXRlIHRhYmxlXG4gICAgdGhpcy52YWxpZGF0ZVRhYmxlKHRhYmxlKTtcblxuICAgIC8vIEdldCBDbG91ZEZvcm1hdGlvbiByZXNvdXJjZSBmb3IgZGV0YWlsZWQgbWV0YWRhdGFcbiAgICBjb25zdCBjZm5UYWJsZSA9IHRoaXMuZ2V0Q2ZuVGFibGUodGFibGUpO1xuXG4gICAgLy8gRXh0cmFjdCBrZXkgc2NoZW1hXG4gICAgY29uc3QgeyBwYXJ0aXRpb25LZXksIHNvcnRLZXkgfSA9IHRoaXMuZXh0cmFjdEtleVNjaGVtYShjZm5UYWJsZSk7XG5cbiAgICAvLyBFeHRyYWN0IGluZGV4ZXNcbiAgICBjb25zdCBnbG9iYWxTZWNvbmRhcnlJbmRleGVzID0gdGhpcy5leHRyYWN0R1NJcyhjZm5UYWJsZSk7XG4gICAgY29uc3QgbG9jYWxTZWNvbmRhcnlJbmRleGVzID0gdGhpcy5leHRyYWN0TFNJcyhjZm5UYWJsZSk7XG5cbiAgICAvLyBFeHRyYWN0IFRUTFxuICAgIGNvbnN0IHR0bEF0dHJpYnV0ZSA9IHRoaXMuZXh0cmFjdFRUTChjZm5UYWJsZSk7XG5cbiAgICAvLyBFeHRyYWN0IHN0cmVhbSBpbmZvXG4gICAgY29uc3QgeyBzdHJlYW1FbmFibGVkLCBzdHJlYW1WaWV3VHlwZSB9ID0gdGhpcy5leHRyYWN0U3RyZWFtSW5mbyhjZm5UYWJsZSk7XG5cbiAgICAvLyBFeHRyYWN0IGJpbGxpbmcgbW9kZVxuICAgIGNvbnN0IGJpbGxpbmdNb2RlID0gdGhpcy5leHRyYWN0QmlsbGluZ01vZGUoY2ZuVGFibGUpO1xuXG4gICAgLy8gUmVzb2x2ZSB0YWJsZSBuYW1lIGZyb20gdG9rZW4gKHNhbWUgbG9naWMgYXMgZ2V0UmVzb3VyY2VOYW1lKVxuICAgIGNvbnN0IHJlc29sdmVkVGFibGVOYW1lID0gc3RhY2sucmVzb2x2ZShjZm5UYWJsZS50YWJsZU5hbWUpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9ICghcmVzb2x2ZWRUYWJsZU5hbWUgfHwgY2RrLlRva2VuLmlzVW5yZXNvbHZlZChyZXNvbHZlZFRhYmxlTmFtZSkpIFxuICAgICAgPyB0YWJsZS50YWJsZU5hbWUgIC8vIEtlZXAgdG9rZW4gaWYgY2FuJ3QgcmVzb2x2ZVxuICAgICAgOiByZXNvbHZlZFRhYmxlTmFtZTtcblxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZHluYW1vZGInLFxuICAgICAgLy8gUmVtb3ZlZCBkdXBsaWNhdGUgZmllbGRzIGluIHYxLjE6XG4gICAgICAvLyAtIGFybiAodXNlIHRhYmxlQXJuIGluc3RlYWQpXG4gICAgICAvLyAtIG5hbWUgKHVzZSB0YWJsZU5hbWUgaW5zdGVhZClcbiAgICAgIC8vIC0gYWNjb3VudCAodXNlIHRvcC1sZXZlbCBhY2NvdW50SWQgaW5zdGVhZClcbiAgICAgIHRhYmxlTmFtZSxcbiAgICAgIHRhYmxlQXJuOiB0YWJsZS50YWJsZUFybixcbiAgICAgIHJlZ2lvbjogc3RhY2sucmVnaW9uLFxuICAgICAgcGFydGl0aW9uS2V5LFxuICAgICAgc29ydEtleSxcbiAgICAgIGdsb2JhbFNlY29uZGFyeUluZGV4ZXMsXG4gICAgICBsb2NhbFNlY29uZGFyeUluZGV4ZXMsXG4gICAgICB0dGxBdHRyaWJ1dGUsXG4gICAgICBzdHJlYW1FbmFibGVkLFxuICAgICAgc3RyZWFtVmlld1R5cGUsXG4gICAgICBiaWxsaW5nTW9kZSxcbiAgICAgIGVuY3J5cHRpb25LZXlBcm46IHRhYmxlLmVuY3J5cHRpb25LZXk/LmtleUFybixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoYXQgdGhlIHRhYmxlIGlzIGEgY29uY3JldGUgRHluYW1vREIgVGFibGUgY29uc3RydWN0LlxuICAgKiBcbiAgICogTm90ZTogV2UgdXNlIGR1Y2sgdHlwaW5nIGZvciBpbnN0YW5jZW9mIGNoZWNrIHRvIGhhbmRsZSBjcm9zcy1wYWNrYWdlXG4gICAqIHR5cGUgY29tcGF0aWJpbGl0eSBpc3N1ZXMgaW4gbW9ub3JlcG8gc2V0dXBzIChlLmcuLCBwbnBtIHdpdGggaXNvbGF0ZWQgbm9kZV9tb2R1bGVzKS5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVUYWJsZSh0YWJsZTogZHluYW1vZGIuSVRhYmxlKTogdm9pZCB7XG4gICAgaWYgKCF0YWJsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEeW5hbW9EQiB0YWJsZSBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIC8vIER1Y2sgdHlwaW5nIGNoZWNrOiBhIGNvbmNyZXRlIFRhYmxlIGhhcyBub2RlLmRlZmF1bHRDaGlsZCAoQ2ZuVGFibGUpXG4gICAgLy8gVGhpcyBoYW5kbGVzIGNyb3NzLXBhY2thZ2UgdHlwZSBjb21wYXRpYmlsaXR5IGluIG1vbm9yZXBvc1xuICAgIGNvbnN0IGlzQ29uY3JldGVUYWJsZSA9IHRhYmxlIGluc3RhbmNlb2YgZHluYW1vZGIuVGFibGUgfHwgXG4gICAgICAodGFibGUubm9kZSAmJiB0YWJsZS5ub2RlLmRlZmF1bHRDaGlsZCAmJiBcbiAgICAgICAodGFibGUubm9kZS5kZWZhdWx0Q2hpbGQgYXMgYW55KS5jZm5SZXNvdXJjZVR5cGUgPT09ICdBV1M6OkR5bmFtb0RCOjpUYWJsZScpO1xuXG4gICAgaWYgKCFpc0NvbmNyZXRlVGFibGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1RhYmxlIG11c3QgYmUgYSBjb25jcmV0ZSBEeW5hbW9EQiBUYWJsZSBjb25zdHJ1Y3QuIEltcG9ydGVkIHRhYmxlcyBhcmUgbm90IHN1cHBvcnRlZC4nXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghdGFibGUudGFibGVOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhYmxlIG11c3QgaGF2ZSBhIHZhbGlkIHRhYmxlIG5hbWUnKTtcbiAgICB9XG5cbiAgICBpZiAoIXRhYmxlLnRhYmxlQXJuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhYmxlIG11c3QgaGF2ZSBhIHZhbGlkIHRhYmxlIEFSTicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHVuZGVybHlpbmcgQ2xvdWRGb3JtYXRpb24gdGFibGUgcmVzb3VyY2UuXG4gICAqIFVzZXMgZHVjayB0eXBpbmcgZm9yIGNyb3NzLXBhY2thZ2UgY29tcGF0aWJpbGl0eS5cbiAgICovXG4gIHByaXZhdGUgZ2V0Q2ZuVGFibGUodGFibGU6IGR5bmFtb2RiLklUYWJsZSk6IGR5bmFtb2RiLkNmblRhYmxlIHtcbiAgICAvLyBVc2UgZHVjayB0eXBpbmcgY2hlY2sgZm9yIGNyb3NzLXBhY2thZ2UgY29tcGF0aWJpbGl0eVxuICAgIGNvbnN0IGNmblRhYmxlID0gdGFibGUubm9kZT8uZGVmYXVsdENoaWxkIGFzIGR5bmFtb2RiLkNmblRhYmxlIHwgdW5kZWZpbmVkO1xuICAgIFxuICAgIGlmICghY2ZuVGFibGUgfHwgKGNmblRhYmxlIGFzIGFueSkuY2ZuUmVzb3VyY2VUeXBlICE9PSAnQVdTOjpEeW5hbW9EQjo6VGFibGUnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhY2Nlc3MgQ2xvdWRGb3JtYXRpb24gcmVzb3VyY2UgZm9yIGltcG9ydGVkIHRhYmxlJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNmblRhYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgcGFydGl0aW9uIGtleSBhbmQgc29ydCBrZXkgZnJvbSBrZXkgc2NoZW1hLlxuICAgKi9cbiAgcHJpdmF0ZSBleHRyYWN0S2V5U2NoZW1hKGNmblRhYmxlOiBkeW5hbW9kYi5DZm5UYWJsZSk6IHtcbiAgICBwYXJ0aXRpb25LZXk6IHN0cmluZztcbiAgICBzb3J0S2V5Pzogc3RyaW5nO1xuICB9IHtcbiAgICBjb25zdCBrZXlTY2hlbWEgPSBjZm5UYWJsZS5rZXlTY2hlbWE7XG5cbiAgICBpZiAoIWtleVNjaGVtYSB8fCAhQXJyYXkuaXNBcnJheShrZXlTY2hlbWEpIHx8IGtleVNjaGVtYS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGFibGUgbXVzdCBoYXZlIGEga2V5IHNjaGVtYScpO1xuICAgIH1cblxuICAgIGxldCBwYXJ0aXRpb25LZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgc29ydEtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5U2NoZW1hKSB7XG4gICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ29iamVjdCcgJiYgJ2F0dHJpYnV0ZU5hbWUnIGluIGtleSAmJiAna2V5VHlwZScgaW4ga2V5KSB7XG4gICAgICAgIGlmIChrZXkua2V5VHlwZSA9PT0gJ0hBU0gnKSB7XG4gICAgICAgICAgcGFydGl0aW9uS2V5ID0ga2V5LmF0dHJpYnV0ZU5hbWU7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5LmtleVR5cGUgPT09ICdSQU5HRScpIHtcbiAgICAgICAgICBzb3J0S2V5ID0ga2V5LmF0dHJpYnV0ZU5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXBhcnRpdGlvbktleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZXh0cmFjdCBwYXJ0aXRpb24ga2V5IGZyb20gdGFibGUga2V5IHNjaGVtYScpO1xuICAgIH1cblxuICAgIHJldHVybiB7IHBhcnRpdGlvbktleSwgc29ydEtleSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgR2xvYmFsIFNlY29uZGFyeSBJbmRleCBtZXRhZGF0YS5cbiAgICovXG4gIHByaXZhdGUgZXh0cmFjdEdTSXMoY2ZuVGFibGU6IGR5bmFtb2RiLkNmblRhYmxlKTogR1NJTWV0YWRhdGFbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZ3NpcyA9IGNmblRhYmxlLmdsb2JhbFNlY29uZGFyeUluZGV4ZXM7XG4gICAgaWYgKCFnc2lzIHx8ICFBcnJheS5pc0FycmF5KGdzaXMpIHx8IGdzaXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiBnc2lzLm1hcCgoZ3NpOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGtleVNjaGVtYSA9IGdzaS5rZXlTY2hlbWEgfHwgW107XG4gICAgICBsZXQgcGFydGl0aW9uS2V5ID0gJyc7XG4gICAgICBsZXQgc29ydEtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlTY2hlbWEpIHtcbiAgICAgICAgaWYgKGtleS5rZXlUeXBlID09PSAnSEFTSCcpIHtcbiAgICAgICAgICBwYXJ0aXRpb25LZXkgPSBrZXkuYXR0cmlidXRlTmFtZTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkua2V5VHlwZSA9PT0gJ1JBTkdFJykge1xuICAgICAgICAgIHNvcnRLZXkgPSBrZXkuYXR0cmlidXRlTmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpbmRleE5hbWU6IGdzaS5pbmRleE5hbWUsXG4gICAgICAgIHBhcnRpdGlvbktleSxcbiAgICAgICAgc29ydEtleSxcbiAgICAgICAgcHJvamVjdGlvblR5cGU6IGdzaS5wcm9qZWN0aW9uPy5wcm9qZWN0aW9uVHlwZSB8fCAnQUxMJyxcbiAgICAgICAgbm9uS2V5QXR0cmlidXRlczogZ3NpLnByb2plY3Rpb24/Lm5vbktleUF0dHJpYnV0ZXMsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgTG9jYWwgU2Vjb25kYXJ5IEluZGV4IG1ldGFkYXRhLlxuICAgKi9cbiAgcHJpdmF0ZSBleHRyYWN0TFNJcyhjZm5UYWJsZTogZHluYW1vZGIuQ2ZuVGFibGUpOiBMU0lNZXRhZGF0YVtdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBsc2lzID0gY2ZuVGFibGUubG9jYWxTZWNvbmRhcnlJbmRleGVzO1xuICAgIGlmICghbHNpcyB8fCAhQXJyYXkuaXNBcnJheShsc2lzKSB8fCBsc2lzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gbHNpcy5tYXAoKGxzaTogYW55KSA9PiB7XG4gICAgICBjb25zdCBrZXlTY2hlbWEgPSBsc2kua2V5U2NoZW1hIHx8IFtdO1xuICAgICAgbGV0IHNvcnRLZXkgPSAnJztcblxuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5U2NoZW1hKSB7XG4gICAgICAgIGlmIChrZXkua2V5VHlwZSA9PT0gJ1JBTkdFJykge1xuICAgICAgICAgIHNvcnRLZXkgPSBrZXkuYXR0cmlidXRlTmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpbmRleE5hbWU6IGxzaS5pbmRleE5hbWUsXG4gICAgICAgIHNvcnRLZXksXG4gICAgICAgIHByb2plY3Rpb25UeXBlOiBsc2kucHJvamVjdGlvbj8ucHJvamVjdGlvblR5cGUgfHwgJ0FMTCcsXG4gICAgICAgIG5vbktleUF0dHJpYnV0ZXM6IGxzaS5wcm9qZWN0aW9uPy5ub25LZXlBdHRyaWJ1dGVzLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IFRUTCBhdHRyaWJ1dGUgbmFtZS5cbiAgICovXG4gIHByaXZhdGUgZXh0cmFjdFRUTChjZm5UYWJsZTogZHluYW1vZGIuQ2ZuVGFibGUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHR0bFNwZWMgPSBjZm5UYWJsZS50aW1lVG9MaXZlU3BlY2lmaWNhdGlvbjtcbiAgICBpZiAodHRsU3BlYyAmJiB0eXBlb2YgdHRsU3BlYyA9PT0gJ29iamVjdCcgJiYgJ2VuYWJsZWQnIGluIHR0bFNwZWMpIHtcbiAgICAgIGlmICh0dGxTcGVjLmVuYWJsZWQgJiYgJ2F0dHJpYnV0ZU5hbWUnIGluIHR0bFNwZWMpIHtcbiAgICAgICAgcmV0dXJuIHR0bFNwZWMuYXR0cmlidXRlTmFtZSBhcyBzdHJpbmc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBzdHJlYW0gY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgZXh0cmFjdFN0cmVhbUluZm8oY2ZuVGFibGU6IGR5bmFtb2RiLkNmblRhYmxlKToge1xuICAgIHN0cmVhbUVuYWJsZWQ/OiBib29sZWFuO1xuICAgIHN0cmVhbVZpZXdUeXBlPzogc3RyaW5nO1xuICB9IHtcbiAgICBjb25zdCBzdHJlYW1TcGVjID0gY2ZuVGFibGUuc3RyZWFtU3BlY2lmaWNhdGlvbjtcbiAgICBpZiAoc3RyZWFtU3BlYyAmJiB0eXBlb2Ygc3RyZWFtU3BlYyA9PT0gJ29iamVjdCcgJiYgJ3N0cmVhbVZpZXdUeXBlJyBpbiBzdHJlYW1TcGVjKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHJlYW1FbmFibGVkOiB0cnVlLFxuICAgICAgICBzdHJlYW1WaWV3VHlwZTogc3RyZWFtU3BlYy5zdHJlYW1WaWV3VHlwZSBhcyBzdHJpbmcsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4geyBzdHJlYW1FbmFibGVkOiBmYWxzZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgYmlsbGluZyBtb2RlLlxuICAgKi9cbiAgcHJpdmF0ZSBleHRyYWN0QmlsbGluZ01vZGUoY2ZuVGFibGU6IGR5bmFtb2RiLkNmblRhYmxlKTogJ1BBWV9QRVJfUkVRVUVTVCcgfCAnUFJPVklTSU9ORUQnIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBiaWxsaW5nTW9kZSA9IGNmblRhYmxlLmJpbGxpbmdNb2RlO1xuICAgIGlmIChiaWxsaW5nTW9kZSA9PT0gJ1BBWV9QRVJfUkVRVUVTVCcgfHwgYmlsbGluZ01vZGUgPT09ICdQUk9WSVNJT05FRCcpIHtcbiAgICAgIHJldHVybiBiaWxsaW5nTW9kZTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuIl19
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Chaim API endpoint configuration.
3
+ *
4
+ * This is the single source of truth for all Chaim API URLs.
5
+ */
6
+ /**
7
+ * Default Chaim API base URL.
8
+ * Can be overridden via:
9
+ * - CDK context: `chaimApiBaseUrl`
10
+ * - Environment variable: `CHAIM_API_BASE_URL`
11
+ */
12
+ export declare const DEFAULT_CHAIM_API_BASE_URL = "https://api.chaim.co";
13
+ /**
14
+ * Chaim ingestion API endpoints (relative paths).
15
+ */
16
+ export declare const CHAIM_ENDPOINTS: {
17
+ /** Request presigned S3 upload URL with HMAC authentication */
18
+ readonly PRESIGN: "/ingest/presign";
19
+ };
20
+ /**
21
+ * Default request timeout in milliseconds.
22
+ */
23
+ export declare const DEFAULT_REQUEST_TIMEOUT_MS = 30000;
24
+ /**
25
+ * Default maximum snapshot size in bytes (10MB).
26
+ */
27
+ export declare const DEFAULT_MAX_SNAPSHOT_BYTES: number;
28
+ /**
29
+ * Current schema version for snapshot payloads.
30
+ * Increment when making changes to LocalSnapshotPayload.
31
+ *
32
+ * Version history:
33
+ * - 1.0: Initial schema
34
+ * - 1.1: Added operation identity, normalized identity fields (bindingId, tableId, entityId),
35
+ * enhanced DELETE metadata (reason, scope), content hashing (contentHash, schemaHash),
36
+ * producer metadata (component, version, runtime, mode), and removed duplicate
37
+ * dataStore fields (arn, name, account)
38
+ * - 2.0: BREAKING - Removed redundant top-level fields (appId, stackName, datastoreType, tableId, entityId),
39
+ * made identity object required, all binding metadata now in identity object only
40
+ * - 3.0: BREAKING - Complete restructuring into logical sections: providerIdentity (cloud/infra metadata),
41
+ * identity (binding metadata with moved stableResourceKey/resourceId/entityId), operation (event tracking),
42
+ * resolution (token status), resource (simplified, provider-focused, renamed from dataStore),
43
+ * producer (explicit component tracking). Renamed schemaVersion to snapshotVersion.
44
+ *
45
+ * @see LocalSnapshotPayload.snapshotVersion
46
+ */
47
+ export declare const SNAPSHOT_SCHEMA_VERSION: "3.0";
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ /**
3
+ * Chaim API endpoint configuration.
4
+ *
5
+ * This is the single source of truth for all Chaim API URLs.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.SNAPSHOT_SCHEMA_VERSION = exports.DEFAULT_MAX_SNAPSHOT_BYTES = exports.DEFAULT_REQUEST_TIMEOUT_MS = exports.CHAIM_ENDPOINTS = exports.DEFAULT_CHAIM_API_BASE_URL = void 0;
9
+ /**
10
+ * Default Chaim API base URL.
11
+ * Can be overridden via:
12
+ * - CDK context: `chaimApiBaseUrl`
13
+ * - Environment variable: `CHAIM_API_BASE_URL`
14
+ */
15
+ exports.DEFAULT_CHAIM_API_BASE_URL = 'https://api.chaim.co';
16
+ /**
17
+ * Chaim ingestion API endpoints (relative paths).
18
+ */
19
+ exports.CHAIM_ENDPOINTS = {
20
+ /** Request presigned S3 upload URL with HMAC authentication */
21
+ PRESIGN: '/ingest/presign',
22
+ };
23
+ /**
24
+ * Default request timeout in milliseconds.
25
+ */
26
+ exports.DEFAULT_REQUEST_TIMEOUT_MS = 30000;
27
+ /**
28
+ * Default maximum snapshot size in bytes (10MB).
29
+ */
30
+ exports.DEFAULT_MAX_SNAPSHOT_BYTES = 10 * 1024 * 1024;
31
+ /**
32
+ * Current schema version for snapshot payloads.
33
+ * Increment when making changes to LocalSnapshotPayload.
34
+ *
35
+ * Version history:
36
+ * - 1.0: Initial schema
37
+ * - 1.1: Added operation identity, normalized identity fields (bindingId, tableId, entityId),
38
+ * enhanced DELETE metadata (reason, scope), content hashing (contentHash, schemaHash),
39
+ * producer metadata (component, version, runtime, mode), and removed duplicate
40
+ * dataStore fields (arn, name, account)
41
+ * - 2.0: BREAKING - Removed redundant top-level fields (appId, stackName, datastoreType, tableId, entityId),
42
+ * made identity object required, all binding metadata now in identity object only
43
+ * - 3.0: BREAKING - Complete restructuring into logical sections: providerIdentity (cloud/infra metadata),
44
+ * identity (binding metadata with moved stableResourceKey/resourceId/entityId), operation (event tracking),
45
+ * resolution (token status), resource (simplified, provider-focused, renamed from dataStore),
46
+ * producer (explicit component tracking). Renamed schemaVersion to snapshotVersion.
47
+ *
48
+ * @see LocalSnapshotPayload.snapshotVersion
49
+ */
50
+ exports.SNAPSHOT_SCHEMA_VERSION = '3.0';
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhaW0tZW5kcG9pbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy9jaGFpbS1lbmRwb2ludHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0dBSUc7OztBQUVIOzs7OztHQUtHO0FBQ1UsUUFBQSwwQkFBMEIsR0FBRyxzQkFBc0IsQ0FBQztBQUVqRTs7R0FFRztBQUNVLFFBQUEsZUFBZSxHQUFHO0lBQzdCLCtEQUErRDtJQUMvRCxPQUFPLEVBQUUsaUJBQWlCO0NBQ2xCLENBQUM7QUFFWDs7R0FFRztBQUNVLFFBQUEsMEJBQTBCLEdBQUcsS0FBSyxDQUFDO0FBRWhEOztHQUVHO0FBQ1UsUUFBQSwwQkFBMEIsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUUzRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ1UsUUFBQSx1QkFBdUIsR0FBRyxLQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENoYWltIEFQSSBlbmRwb2ludCBjb25maWd1cmF0aW9uLlxuICogXG4gKiBUaGlzIGlzIHRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciBhbGwgQ2hhaW0gQVBJIFVSTHMuXG4gKi9cblxuLyoqXG4gKiBEZWZhdWx0IENoYWltIEFQSSBiYXNlIFVSTC5cbiAqIENhbiBiZSBvdmVycmlkZGVuIHZpYTpcbiAqIC0gQ0RLIGNvbnRleHQ6IGBjaGFpbUFwaUJhc2VVcmxgXG4gKiAtIEVudmlyb25tZW50IHZhcmlhYmxlOiBgQ0hBSU1fQVBJX0JBU0VfVVJMYFxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9DSEFJTV9BUElfQkFTRV9VUkwgPSAnaHR0cHM6Ly9hcGkuY2hhaW0uY28nO1xuXG4vKipcbiAqIENoYWltIGluZ2VzdGlvbiBBUEkgZW5kcG9pbnRzIChyZWxhdGl2ZSBwYXRocykuXG4gKi9cbmV4cG9ydCBjb25zdCBDSEFJTV9FTkRQT0lOVFMgPSB7XG4gIC8qKiBSZXF1ZXN0IHByZXNpZ25lZCBTMyB1cGxvYWQgVVJMIHdpdGggSE1BQyBhdXRoZW50aWNhdGlvbiAqL1xuICBQUkVTSUdOOiAnL2luZ2VzdC9wcmVzaWduJyxcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogRGVmYXVsdCByZXF1ZXN0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9SRVFVRVNUX1RJTUVPVVRfTVMgPSAzMDAwMDtcblxuLyoqXG4gKiBEZWZhdWx0IG1heGltdW0gc25hcHNob3Qgc2l6ZSBpbiBieXRlcyAoMTBNQikuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX01BWF9TTkFQU0hPVF9CWVRFUyA9IDEwICogMTAyNCAqIDEwMjQ7XG5cbi8qKlxuICogQ3VycmVudCBzY2hlbWEgdmVyc2lvbiBmb3Igc25hcHNob3QgcGF5bG9hZHMuXG4gKiBJbmNyZW1lbnQgd2hlbiBtYWtpbmcgY2hhbmdlcyB0byBMb2NhbFNuYXBzaG90UGF5bG9hZC5cbiAqIFxuICogVmVyc2lvbiBoaXN0b3J5OlxuICogLSAxLjA6IEluaXRpYWwgc2NoZW1hXG4gKiAtIDEuMTogQWRkZWQgb3BlcmF0aW9uIGlkZW50aXR5LCBub3JtYWxpemVkIGlkZW50aXR5IGZpZWxkcyAoYmluZGluZ0lkLCB0YWJsZUlkLCBlbnRpdHlJZCksXG4gKiAgICAgICAgZW5oYW5jZWQgREVMRVRFIG1ldGFkYXRhIChyZWFzb24sIHNjb3BlKSwgY29udGVudCBoYXNoaW5nIChjb250ZW50SGFzaCwgc2NoZW1hSGFzaCksXG4gKiAgICAgICAgcHJvZHVjZXIgbWV0YWRhdGEgKGNvbXBvbmVudCwgdmVyc2lvbiwgcnVudGltZSwgbW9kZSksIGFuZCByZW1vdmVkIGR1cGxpY2F0ZVxuICogICAgICAgIGRhdGFTdG9yZSBmaWVsZHMgKGFybiwgbmFtZSwgYWNjb3VudClcbiAqIC0gMi4wOiBCUkVBS0lORyAtIFJlbW92ZWQgcmVkdW5kYW50IHRvcC1sZXZlbCBmaWVsZHMgKGFwcElkLCBzdGFja05hbWUsIGRhdGFzdG9yZVR5cGUsIHRhYmxlSWQsIGVudGl0eUlkKSxcbiAqICAgICAgICBtYWRlIGlkZW50aXR5IG9iamVjdCByZXF1aXJlZCwgYWxsIGJpbmRpbmcgbWV0YWRhdGEgbm93IGluIGlkZW50aXR5IG9iamVjdCBvbmx5XG4gKiAtIDMuMDogQlJFQUtJTkcgLSBDb21wbGV0ZSByZXN0cnVjdHVyaW5nIGludG8gbG9naWNhbCBzZWN0aW9uczogcHJvdmlkZXJJZGVudGl0eSAoY2xvdWQvaW5mcmEgbWV0YWRhdGEpLFxuICogICAgICAgIGlkZW50aXR5IChiaW5kaW5nIG1ldGFkYXRhIHdpdGggbW92ZWQgc3RhYmxlUmVzb3VyY2VLZXkvcmVzb3VyY2VJZC9lbnRpdHlJZCksIG9wZXJhdGlvbiAoZXZlbnQgdHJhY2tpbmcpLFxuICogICAgICAgIHJlc29sdXRpb24gKHRva2VuIHN0YXR1cyksIHJlc291cmNlIChzaW1wbGlmaWVkLCBwcm92aWRlci1mb2N1c2VkLCByZW5hbWVkIGZyb20gZGF0YVN0b3JlKSxcbiAqICAgICAgICBwcm9kdWNlciAoZXhwbGljaXQgY29tcG9uZW50IHRyYWNraW5nKS4gUmVuYW1lZCBzY2hlbWFWZXJzaW9uIHRvIHNuYXBzaG90VmVyc2lvbi5cbiAqIFxuICogQHNlZSBMb2NhbFNuYXBzaG90UGF5bG9hZC5zbmFwc2hvdFZlcnNpb25cbiAqL1xuZXhwb3J0IGNvbnN0IFNOQVBTSE9UX1NDSEVNQV9WRVJTSU9OID0gJzMuMCcgYXMgY29uc3Q7Il19
package/lib/index.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ export { ChaimDynamoDBBinder, ChaimDynamoDBBinderProps } from './binders/chaim-dynamodb-binder';
2
+ export { BaseChaimBinder } from './binders/base-chaim-binder';
3
+ export { ChaimCredentials, IChaimCredentials, } from './types/credentials';
4
+ export { FailureMode } from './types/failure-mode';
5
+ export { BaseBinderProps, validateBinderProps, } from './types/base-binder-props';
6
+ export { TableBindingConfig } from './types/table-binding-config';
7
+ export { BaseDataStoreMetadata, DynamoDBMetadata, GSIMetadata, LSIMetadata, DataStoreMetadata, } from './types/data-store-metadata';
8
+ export { LocalSnapshotPayload, PublishedSnapshotPayload, ProviderIdentity, BindingIdentity, OperationMetadata, ResolutionMetadata, DeleteMetadata, HashMetadata, ResourceMetadata, ProducerMetadata, IngestResponse, CustomResourceResponseData, } from './types/snapshot-payload';
9
+ export { SnapshotAction, UploadUrlRequest, UploadUrlResponse, SnapshotRefUpsertRequest, SnapshotRefDeleteRequest, SnapshotRefRequest, SnapshotRefResponse, CloudFormationRequestType, } from './types/ingest-contract';
10
+ export { DEFAULT_CHAIM_API_BASE_URL, CHAIM_ENDPOINTS, DEFAULT_REQUEST_TIMEOUT_MS, DEFAULT_MAX_SNAPSHOT_BYTES, SNAPSHOT_SCHEMA_VERSION, } from './config/chaim-endpoints';
11
+ export { SchemaService } from './services/schema-service';
12
+ export { IngestionService, IngestionConfig, INGESTION_ENDPOINTS, DEFAULT_INGESTION_CONFIG, } from './services/ingestion-service';
13
+ export { pruneStackSnapshots, pruneOldSnapshots, CleanupOptions, TTLCleanupOptions, CleanupResult, } from './services/snapshot-cleanup';
14
+ export { SnapshotCachePolicy, DEFAULT_SNAPSHOT_CACHE_POLICY, SNAPSHOT_CACHE_POLICY_CONTEXT_KEY, } from './types/snapshot-cache-policy';
15
+ export { SchemaData, Field, PrimaryKey } from '@chaim-tools/chaim-bprint-spec';
package/lib/index.js ADDED
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SNAPSHOT_CACHE_POLICY_CONTEXT_KEY = exports.DEFAULT_SNAPSHOT_CACHE_POLICY = exports.SnapshotCachePolicy = exports.pruneOldSnapshots = exports.pruneStackSnapshots = exports.DEFAULT_INGESTION_CONFIG = exports.INGESTION_ENDPOINTS = exports.IngestionService = exports.SchemaService = exports.SNAPSHOT_SCHEMA_VERSION = exports.DEFAULT_MAX_SNAPSHOT_BYTES = exports.DEFAULT_REQUEST_TIMEOUT_MS = exports.CHAIM_ENDPOINTS = exports.DEFAULT_CHAIM_API_BASE_URL = exports.TableBindingConfig = exports.validateBinderProps = exports.FailureMode = exports.ChaimCredentials = exports.BaseChaimBinder = exports.ChaimDynamoDBBinder = void 0;
4
+ // Main construct exports
5
+ var chaim_dynamodb_binder_1 = require("./binders/chaim-dynamodb-binder");
6
+ Object.defineProperty(exports, "ChaimDynamoDBBinder", { enumerable: true, get: function () { return chaim_dynamodb_binder_1.ChaimDynamoDBBinder; } });
7
+ // Base class export (for extension by future data store binders)
8
+ var base_chaim_binder_1 = require("./binders/base-chaim-binder");
9
+ Object.defineProperty(exports, "BaseChaimBinder", { enumerable: true, get: function () { return base_chaim_binder_1.BaseChaimBinder; } });
10
+ // Credentials factory
11
+ var credentials_1 = require("./types/credentials");
12
+ Object.defineProperty(exports, "ChaimCredentials", { enumerable: true, get: function () { return credentials_1.ChaimCredentials; } });
13
+ // Failure mode enum
14
+ var failure_mode_1 = require("./types/failure-mode");
15
+ Object.defineProperty(exports, "FailureMode", { enumerable: true, get: function () { return failure_mode_1.FailureMode; } });
16
+ // Type exports
17
+ var base_binder_props_1 = require("./types/base-binder-props");
18
+ Object.defineProperty(exports, "validateBinderProps", { enumerable: true, get: function () { return base_binder_props_1.validateBinderProps; } });
19
+ // Binding configuration
20
+ var table_binding_config_1 = require("./types/table-binding-config");
21
+ Object.defineProperty(exports, "TableBindingConfig", { enumerable: true, get: function () { return table_binding_config_1.TableBindingConfig; } });
22
+ // Config exports
23
+ var chaim_endpoints_1 = require("./config/chaim-endpoints");
24
+ Object.defineProperty(exports, "DEFAULT_CHAIM_API_BASE_URL", { enumerable: true, get: function () { return chaim_endpoints_1.DEFAULT_CHAIM_API_BASE_URL; } });
25
+ Object.defineProperty(exports, "CHAIM_ENDPOINTS", { enumerable: true, get: function () { return chaim_endpoints_1.CHAIM_ENDPOINTS; } });
26
+ Object.defineProperty(exports, "DEFAULT_REQUEST_TIMEOUT_MS", { enumerable: true, get: function () { return chaim_endpoints_1.DEFAULT_REQUEST_TIMEOUT_MS; } });
27
+ Object.defineProperty(exports, "DEFAULT_MAX_SNAPSHOT_BYTES", { enumerable: true, get: function () { return chaim_endpoints_1.DEFAULT_MAX_SNAPSHOT_BYTES; } });
28
+ Object.defineProperty(exports, "SNAPSHOT_SCHEMA_VERSION", { enumerable: true, get: function () { return chaim_endpoints_1.SNAPSHOT_SCHEMA_VERSION; } });
29
+ // Service exports
30
+ var schema_service_1 = require("./services/schema-service");
31
+ Object.defineProperty(exports, "SchemaService", { enumerable: true, get: function () { return schema_service_1.SchemaService; } });
32
+ var ingestion_service_1 = require("./services/ingestion-service");
33
+ Object.defineProperty(exports, "IngestionService", { enumerable: true, get: function () { return ingestion_service_1.IngestionService; } });
34
+ Object.defineProperty(exports, "INGESTION_ENDPOINTS", { enumerable: true, get: function () { return ingestion_service_1.INGESTION_ENDPOINTS; } });
35
+ Object.defineProperty(exports, "DEFAULT_INGESTION_CONFIG", { enumerable: true, get: function () { return ingestion_service_1.DEFAULT_INGESTION_CONFIG; } });
36
+ var snapshot_cleanup_1 = require("./services/snapshot-cleanup");
37
+ Object.defineProperty(exports, "pruneStackSnapshots", { enumerable: true, get: function () { return snapshot_cleanup_1.pruneStackSnapshots; } });
38
+ Object.defineProperty(exports, "pruneOldSnapshots", { enumerable: true, get: function () { return snapshot_cleanup_1.pruneOldSnapshots; } });
39
+ var snapshot_cache_policy_1 = require("./types/snapshot-cache-policy");
40
+ Object.defineProperty(exports, "SnapshotCachePolicy", { enumerable: true, get: function () { return snapshot_cache_policy_1.SnapshotCachePolicy; } });
41
+ Object.defineProperty(exports, "DEFAULT_SNAPSHOT_CACHE_POLICY", { enumerable: true, get: function () { return snapshot_cache_policy_1.DEFAULT_SNAPSHOT_CACHE_POLICY; } });
42
+ Object.defineProperty(exports, "SNAPSHOT_CACHE_POLICY_CONTEXT_KEY", { enumerable: true, get: function () { return snapshot_cache_policy_1.SNAPSHOT_CACHE_POLICY_CONTEXT_KEY; } });
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUJBQXlCO0FBQ3pCLHlFQUFnRztBQUF2Riw0SEFBQSxtQkFBbUIsT0FBQTtBQUU1QixpRUFBaUU7QUFDakUsaUVBQThEO0FBQXJELG9IQUFBLGVBQWUsT0FBQTtBQUV4QixzQkFBc0I7QUFDdEIsbURBRzZCO0FBRjNCLCtHQUFBLGdCQUFnQixPQUFBO0FBSWxCLG9CQUFvQjtBQUNwQixxREFBbUQ7QUFBMUMsMkdBQUEsV0FBVyxPQUFBO0FBRXBCLGVBQWU7QUFDZiwrREFHbUM7QUFEakMsd0hBQUEsbUJBQW1CLE9BQUE7QUFHckIsd0JBQXdCO0FBQ3hCLHFFQUFrRTtBQUF6RCwwSEFBQSxrQkFBa0IsT0FBQTtBQXNDM0IsaUJBQWlCO0FBQ2pCLDREQU1rQztBQUxoQyw2SEFBQSwwQkFBMEIsT0FBQTtBQUMxQixrSEFBQSxlQUFlLE9BQUE7QUFDZiw2SEFBQSwwQkFBMEIsT0FBQTtBQUMxQiw2SEFBQSwwQkFBMEIsT0FBQTtBQUMxQiwwSEFBQSx1QkFBdUIsT0FBQTtBQUd6QixrQkFBa0I7QUFDbEIsNERBQTBEO0FBQWpELCtHQUFBLGFBQWEsT0FBQTtBQUN0QixrRUFLc0M7QUFKcEMscUhBQUEsZ0JBQWdCLE9BQUE7QUFFaEIsd0hBQUEsbUJBQW1CLE9BQUE7QUFDbkIsNkhBQUEsd0JBQXdCLE9BQUE7QUFFMUIsZ0VBTXFDO0FBTG5DLHVIQUFBLG1CQUFtQixPQUFBO0FBQ25CLHFIQUFBLGlCQUFpQixPQUFBO0FBS25CLHVFQUl1QztBQUhyQyw0SEFBQSxtQkFBbUIsT0FBQTtBQUNuQixzSUFBQSw2QkFBNkIsT0FBQTtBQUM3QiwwSUFBQSxpQ0FBaUMsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIE1haW4gY29uc3RydWN0IGV4cG9ydHNcbmV4cG9ydCB7IENoYWltRHluYW1vREJCaW5kZXIsIENoYWltRHluYW1vREJCaW5kZXJQcm9wcyB9IGZyb20gJy4vYmluZGVycy9jaGFpbS1keW5hbW9kYi1iaW5kZXInO1xuXG4vLyBCYXNlIGNsYXNzIGV4cG9ydCAoZm9yIGV4dGVuc2lvbiBieSBmdXR1cmUgZGF0YSBzdG9yZSBiaW5kZXJzKVxuZXhwb3J0IHsgQmFzZUNoYWltQmluZGVyIH0gZnJvbSAnLi9iaW5kZXJzL2Jhc2UtY2hhaW0tYmluZGVyJztcblxuLy8gQ3JlZGVudGlhbHMgZmFjdG9yeVxuZXhwb3J0IHtcbiAgQ2hhaW1DcmVkZW50aWFscyxcbiAgSUNoYWltQ3JlZGVudGlhbHMsXG59IGZyb20gJy4vdHlwZXMvY3JlZGVudGlhbHMnO1xuXG4vLyBGYWlsdXJlIG1vZGUgZW51bVxuZXhwb3J0IHsgRmFpbHVyZU1vZGUgfSBmcm9tICcuL3R5cGVzL2ZhaWx1cmUtbW9kZSc7XG5cbi8vIFR5cGUgZXhwb3J0c1xuZXhwb3J0IHtcbiAgQmFzZUJpbmRlclByb3BzLFxuICB2YWxpZGF0ZUJpbmRlclByb3BzLFxufSBmcm9tICcuL3R5cGVzL2Jhc2UtYmluZGVyLXByb3BzJztcblxuLy8gQmluZGluZyBjb25maWd1cmF0aW9uXG5leHBvcnQgeyBUYWJsZUJpbmRpbmdDb25maWcgfSBmcm9tICcuL3R5cGVzL3RhYmxlLWJpbmRpbmctY29uZmlnJztcblxuZXhwb3J0IHtcbiAgQmFzZURhdGFTdG9yZU1ldGFkYXRhLFxuICBEeW5hbW9EQk1ldGFkYXRhLFxuICBHU0lNZXRhZGF0YSxcbiAgTFNJTWV0YWRhdGEsXG4gIERhdGFTdG9yZU1ldGFkYXRhLFxufSBmcm9tICcuL3R5cGVzL2RhdGEtc3RvcmUtbWV0YWRhdGEnO1xuXG4vLyBTbmFwc2hvdCBwYXlsb2FkIHR5cGVzXG5leHBvcnQge1xuICBMb2NhbFNuYXBzaG90UGF5bG9hZCxcbiAgUHVibGlzaGVkU25hcHNob3RQYXlsb2FkLFxuICBQcm92aWRlcklkZW50aXR5LFxuICBCaW5kaW5nSWRlbnRpdHksXG4gIE9wZXJhdGlvbk1ldGFkYXRhLFxuICBSZXNvbHV0aW9uTWV0YWRhdGEsXG4gIERlbGV0ZU1ldGFkYXRhLFxuICBIYXNoTWV0YWRhdGEsXG4gIFJlc291cmNlTWV0YWRhdGEsXG4gIFByb2R1Y2VyTWV0YWRhdGEsXG4gIEluZ2VzdFJlc3BvbnNlLFxuICBDdXN0b21SZXNvdXJjZVJlc3BvbnNlRGF0YSxcbn0gZnJvbSAnLi90eXBlcy9zbmFwc2hvdC1wYXlsb2FkJztcblxuLy8gSW5nZXN0IGNvbnRyYWN0IHR5cGVzXG5leHBvcnQge1xuICBTbmFwc2hvdEFjdGlvbixcbiAgVXBsb2FkVXJsUmVxdWVzdCxcbiAgVXBsb2FkVXJsUmVzcG9uc2UsXG4gIFNuYXBzaG90UmVmVXBzZXJ0UmVxdWVzdCxcbiAgU25hcHNob3RSZWZEZWxldGVSZXF1ZXN0LFxuICBTbmFwc2hvdFJlZlJlcXVlc3QsXG4gIFNuYXBzaG90UmVmUmVzcG9uc2UsXG4gIENsb3VkRm9ybWF0aW9uUmVxdWVzdFR5cGUsXG59IGZyb20gJy4vdHlwZXMvaW5nZXN0LWNvbnRyYWN0JztcblxuLy8gQ29uZmlnIGV4cG9ydHNcbmV4cG9ydCB7XG4gIERFRkFVTFRfQ0hBSU1fQVBJX0JBU0VfVVJMLFxuICBDSEFJTV9FTkRQT0lOVFMsXG4gIERFRkFVTFRfUkVRVUVTVF9USU1FT1VUX01TLFxuICBERUZBVUxUX01BWF9TTkFQU0hPVF9CWVRFUyxcbiAgU05BUFNIT1RfU0NIRU1BX1ZFUlNJT04sXG59IGZyb20gJy4vY29uZmlnL2NoYWltLWVuZHBvaW50cyc7XG5cbi8vIFNlcnZpY2UgZXhwb3J0c1xuZXhwb3J0IHsgU2NoZW1hU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvc2NoZW1hLXNlcnZpY2UnO1xuZXhwb3J0IHtcbiAgSW5nZXN0aW9uU2VydmljZSxcbiAgSW5nZXN0aW9uQ29uZmlnLFxuICBJTkdFU1RJT05fRU5EUE9JTlRTLFxuICBERUZBVUxUX0lOR0VTVElPTl9DT05GSUcsXG59IGZyb20gJy4vc2VydmljZXMvaW5nZXN0aW9uLXNlcnZpY2UnO1xuZXhwb3J0IHtcbiAgcHJ1bmVTdGFja1NuYXBzaG90cyxcbiAgcHJ1bmVPbGRTbmFwc2hvdHMsXG4gIENsZWFudXBPcHRpb25zLFxuICBUVExDbGVhbnVwT3B0aW9ucyxcbiAgQ2xlYW51cFJlc3VsdCxcbn0gZnJvbSAnLi9zZXJ2aWNlcy9zbmFwc2hvdC1jbGVhbnVwJztcbmV4cG9ydCB7XG4gIFNuYXBzaG90Q2FjaGVQb2xpY3ksXG4gIERFRkFVTFRfU05BUFNIT1RfQ0FDSEVfUE9MSUNZLFxuICBTTkFQU0hPVF9DQUNIRV9QT0xJQ1lfQ09OVEVYVF9LRVksXG59IGZyb20gJy4vdHlwZXMvc25hcHNob3QtY2FjaGUtcG9saWN5JztcblxuLy8gUmUtZXhwb3J0IHNjaGVtYSB0eXBlcyBmcm9tIGJwcmludC1zcGVjIGZvciBjb252ZW5pZW5jZVxuZXhwb3J0IHsgU2NoZW1hRGF0YSwgRmllbGQsIFByaW1hcnlLZXkgfSBmcm9tICdAY2hhaW0tdG9vbHMvY2hhaW0tYnByaW50LXNwZWMnO1xuIl19
@@ -0,0 +1 @@
1
+ {"provider":"aws","accountId":"123456789012","region":"us-east-1","stackName":"TestStack","datastoreType":"dynamodb","resourceName":"TestTable","resourceId":"TestTable__User","appId":"test-app","schema":{"schemaVersion":"1.0","namespace":"test"},"dataStore":{"type":"dynamodb","arn":"arn:aws:dynamodb:us-east-1:123456789012:table/TestTable","name":"TestTable"},"context":{"account":"123456789012","region":"us-east-1"},"capturedAt":"2024-01-01T00:00:00.000Z"}