@kravc/dos-dynamodb 1.0.0-alpha.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 (136) hide show
  1. package/README.md +30 -0
  2. package/bin/table.js +88 -0
  3. package/config/default.yaml +36 -0
  4. package/config/test.yaml +0 -0
  5. package/dist/example/Activity.d.ts +34 -0
  6. package/dist/example/Activity.d.ts.map +1 -0
  7. package/dist/example/Activity.js +66 -0
  8. package/dist/example/Activity.js.map +1 -0
  9. package/dist/example/ActivityAttributes.d.ts +23 -0
  10. package/dist/example/ActivityAttributes.d.ts.map +1 -0
  11. package/dist/example/ActivityAttributes.js +54 -0
  12. package/dist/example/ActivityAttributes.js.map +1 -0
  13. package/dist/example/Asset.d.ts +36 -0
  14. package/dist/example/Asset.d.ts.map +1 -0
  15. package/dist/example/Asset.js +56 -0
  16. package/dist/example/Asset.js.map +1 -0
  17. package/dist/example/AssetAttributes.d.ts +28 -0
  18. package/dist/example/AssetAttributes.d.ts.map +1 -0
  19. package/dist/example/AssetAttributes.js +72 -0
  20. package/dist/example/AssetAttributes.js.map +1 -0
  21. package/dist/example/Organization.d.ts +19 -0
  22. package/dist/example/Organization.d.ts.map +1 -0
  23. package/dist/example/Organization.js +42 -0
  24. package/dist/example/Organization.js.map +1 -0
  25. package/dist/example/OrganizationAttributes.d.ts +13 -0
  26. package/dist/example/OrganizationAttributes.d.ts.map +1 -0
  27. package/dist/example/OrganizationAttributes.js +24 -0
  28. package/dist/example/OrganizationAttributes.js.map +1 -0
  29. package/dist/example/index.d.ts +5 -0
  30. package/dist/example/index.d.ts.map +1 -0
  31. package/dist/example/index.js +13 -0
  32. package/dist/example/index.js.map +1 -0
  33. package/dist/src/Document/Document.d.ts +67 -0
  34. package/dist/src/Document/Document.d.ts.map +1 -0
  35. package/dist/src/Document/Document.js +216 -0
  36. package/dist/src/Document/Document.js.map +1 -0
  37. package/dist/src/Document/DocumentWithHashId.d.ts +22 -0
  38. package/dist/src/Document/DocumentWithHashId.d.ts.map +1 -0
  39. package/dist/src/Document/DocumentWithHashId.js +73 -0
  40. package/dist/src/Document/DocumentWithHashId.js.map +1 -0
  41. package/dist/src/Document/__tests__/__helpers.d.ts +21 -0
  42. package/dist/src/Document/__tests__/__helpers.d.ts.map +1 -0
  43. package/dist/src/Document/__tests__/__helpers.js +92 -0
  44. package/dist/src/Document/__tests__/__helpers.js.map +1 -0
  45. package/dist/src/Document/helpers/composeIndexKeys.d.ts +11 -0
  46. package/dist/src/Document/helpers/composeIndexKeys.d.ts.map +1 -0
  47. package/dist/src/Document/helpers/composeIndexKeys.js +81 -0
  48. package/dist/src/Document/helpers/composeIndexKeys.js.map +1 -0
  49. package/dist/src/Document/helpers/index.d.ts +3 -0
  50. package/dist/src/Document/helpers/index.d.ts.map +1 -0
  51. package/dist/src/Document/helpers/index.js +9 -0
  52. package/dist/src/Document/helpers/index.js.map +1 -0
  53. package/dist/src/Table/Table.d.ts +56 -0
  54. package/dist/src/Table/Table.d.ts.map +1 -0
  55. package/dist/src/Table/Table.js +228 -0
  56. package/dist/src/Table/Table.js.map +1 -0
  57. package/dist/src/Table/helpers/buildConditionExpression.d.ts +22 -0
  58. package/dist/src/Table/helpers/buildConditionExpression.d.ts.map +1 -0
  59. package/dist/src/Table/helpers/buildConditionExpression.js +128 -0
  60. package/dist/src/Table/helpers/buildConditionExpression.js.map +1 -0
  61. package/dist/src/Table/helpers/buildQueryCommandInput.d.ts +12 -0
  62. package/dist/src/Table/helpers/buildQueryCommandInput.d.ts.map +1 -0
  63. package/dist/src/Table/helpers/buildQueryCommandInput.js +60 -0
  64. package/dist/src/Table/helpers/buildQueryCommandInput.js.map +1 -0
  65. package/dist/src/Table/helpers/buildQueryConditionExpression.d.ts +17 -0
  66. package/dist/src/Table/helpers/buildQueryConditionExpression.d.ts.map +1 -0
  67. package/dist/src/Table/helpers/buildQueryConditionExpression.js +77 -0
  68. package/dist/src/Table/helpers/buildQueryConditionExpression.js.map +1 -0
  69. package/dist/src/Table/helpers/buildTableSchema.d.ts +6 -0
  70. package/dist/src/Table/helpers/buildTableSchema.d.ts.map +1 -0
  71. package/dist/src/Table/helpers/buildTableSchema.js +100 -0
  72. package/dist/src/Table/helpers/buildTableSchema.js.map +1 -0
  73. package/dist/src/Table/helpers/buildUpdateExpression.d.ts +10 -0
  74. package/dist/src/Table/helpers/buildUpdateExpression.d.ts.map +1 -0
  75. package/dist/src/Table/helpers/buildUpdateExpression.js +69 -0
  76. package/dist/src/Table/helpers/buildUpdateExpression.js.map +1 -0
  77. package/dist/src/Table/helpers/filterConditionExpression.d.ts +5 -0
  78. package/dist/src/Table/helpers/filterConditionExpression.d.ts.map +1 -0
  79. package/dist/src/Table/helpers/filterConditionExpression.js +68 -0
  80. package/dist/src/Table/helpers/filterConditionExpression.js.map +1 -0
  81. package/dist/src/Table/helpers/getRawClientConfig.d.ts +5 -0
  82. package/dist/src/Table/helpers/getRawClientConfig.d.ts.map +1 -0
  83. package/dist/src/Table/helpers/getRawClientConfig.js +29 -0
  84. package/dist/src/Table/helpers/getRawClientConfig.js.map +1 -0
  85. package/dist/src/Table/helpers/getTableOptions.d.ts +51 -0
  86. package/dist/src/Table/helpers/getTableOptions.d.ts.map +1 -0
  87. package/dist/src/Table/helpers/getTableOptions.js +144 -0
  88. package/dist/src/Table/helpers/getTableOptions.js.map +1 -0
  89. package/dist/src/Table/helpers/index.d.ts +10 -0
  90. package/dist/src/Table/helpers/index.d.ts.map +1 -0
  91. package/dist/src/Table/helpers/index.js +21 -0
  92. package/dist/src/Table/helpers/index.js.map +1 -0
  93. package/dist/src/Table/index.d.ts +8 -0
  94. package/dist/src/Table/index.d.ts.map +1 -0
  95. package/dist/src/Table/index.js +13 -0
  96. package/dist/src/Table/index.js.map +1 -0
  97. package/dist/src/index.d.ts +7 -0
  98. package/dist/src/index.d.ts.map +1 -0
  99. package/dist/src/index.js +14 -0
  100. package/dist/src/index.js.map +1 -0
  101. package/docker-compose.yaml +10 -0
  102. package/eslint.config.mjs +35 -0
  103. package/example/Activity.ts +123 -0
  104. package/example/ActivityAttributes.ts +72 -0
  105. package/example/Asset.ts +78 -0
  106. package/example/AssetAttributes.ts +87 -0
  107. package/example/Organization.ts +61 -0
  108. package/example/OrganizationAttributes.ts +28 -0
  109. package/example/index.ts +9 -0
  110. package/jest.config.mjs +10 -0
  111. package/package.json +50 -0
  112. package/src/Document/DefaultAttributes.d.ts +16 -0
  113. package/src/Document/Document.ts +257 -0
  114. package/src/Document/DocumentWithHashId.ts +85 -0
  115. package/src/Document/__tests__/Document.test.ts +596 -0
  116. package/src/Document/__tests__/DocumentWithHashId.test.ts +81 -0
  117. package/src/Document/__tests__/__helpers.ts +115 -0
  118. package/src/Document/helpers/__tests__/composeIndexKeys.test.ts +40 -0
  119. package/src/Document/helpers/composeIndexKeys.ts +137 -0
  120. package/src/Document/helpers/index.ts +5 -0
  121. package/src/Table/Table.ts +354 -0
  122. package/src/Table/__tests__/Table.test.ts +64 -0
  123. package/src/Table/helpers/__tests__/buildQueryCommandInput.test.ts +14 -0
  124. package/src/Table/helpers/__tests__/buildTableSchema.test.ts +19 -0
  125. package/src/Table/helpers/buildConditionExpression.ts +151 -0
  126. package/src/Table/helpers/buildQueryCommandInput.ts +113 -0
  127. package/src/Table/helpers/buildQueryConditionExpression.ts +109 -0
  128. package/src/Table/helpers/buildTableSchema.ts +151 -0
  129. package/src/Table/helpers/buildUpdateExpression.ts +95 -0
  130. package/src/Table/helpers/filterConditionExpression.ts +87 -0
  131. package/src/Table/helpers/getRawClientConfig.ts +35 -0
  132. package/src/Table/helpers/getTableOptions.ts +228 -0
  133. package/src/Table/helpers/index.ts +21 -0
  134. package/src/Table/index.ts +18 -0
  135. package/src/index.ts +15 -0
  136. package/tsconfig.json +26 -0
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const dos_1 = require("@kravc/dos");
7
+ const buildQueryConditionExpression_1 = __importDefault(require("./buildQueryConditionExpression"));
8
+ const QUERY_ERROR_TEMPLATE = 'Query parameter "$PATH" is required';
9
+ const SORT_ASC = 'asc';
10
+ /** Returns partitionKey and sortKey for a query. */
11
+ const getKeys = (tableOptions, indexName) => {
12
+ const { primaryKey, localSecondaryIndexes, globalSecondaryIndexes } = tableOptions;
13
+ if (!indexName) {
14
+ return { ...primaryKey, isGlobalSecondaryIndex: false };
15
+ }
16
+ const lsi = localSecondaryIndexes.find(({ name }) => name === indexName);
17
+ if (lsi) {
18
+ const { sortKey } = lsi;
19
+ return { ...primaryKey, sortKey, isGlobalSecondaryIndex: false };
20
+ }
21
+ const gsi = globalSecondaryIndexes.find(({ name }) => name === indexName);
22
+ if (gsi) {
23
+ const { partitionKey, sortKey } = gsi;
24
+ return { partitionKey, sortKey, isGlobalSecondaryIndex: true };
25
+ }
26
+ const indexesJson = JSON.stringify({ localSecondaryIndexes, globalSecondaryIndexes }, null, 2);
27
+ throw new Error(`Index "${indexName}" is not defined, indexes: ${indexesJson}`);
28
+ };
29
+ /** Builds query command input. */
30
+ const buildQueryCommandInput = (tableOptions, query, options) => {
31
+ const { name: TableName } = tableOptions;
32
+ const { sort, limit, indexName, exclusiveStartKey } = options;
33
+ const { sortKey, partitionKey, isGlobalSecondaryIndex } = getKeys(tableOptions, indexName);
34
+ (0, dos_1.got)(query, partitionKey, QUERY_ERROR_TEMPLATE);
35
+ const { ConditionExpression, KeyConditionExpression, ExpressionAttributeNames, ExpressionAttributeValues } = (0, buildQueryConditionExpression_1.default)(query, partitionKey, sortKey);
36
+ const Limit = limit;
37
+ const ConsistentRead = !isGlobalSecondaryIndex;
38
+ const ScanIndexForward = sort === SORT_ASC;
39
+ const input = {
40
+ TableName,
41
+ Limit,
42
+ ConsistentRead,
43
+ ScanIndexForward,
44
+ KeyConditionExpression,
45
+ ExpressionAttributeNames,
46
+ ExpressionAttributeValues
47
+ };
48
+ if (indexName) {
49
+ input.IndexName = indexName;
50
+ }
51
+ if (ConditionExpression) {
52
+ input.FilterExpression = ConditionExpression;
53
+ }
54
+ if (exclusiveStartKey) {
55
+ input.ExclusiveStartKey = JSON.parse(decodeURIComponent(exclusiveStartKey));
56
+ }
57
+ return input;
58
+ };
59
+ exports.default = buildQueryCommandInput;
60
+ //# sourceMappingURL=buildQueryCommandInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildQueryCommandInput.js","sourceRoot":"","sources":["../../../../src/Table/helpers/buildQueryCommandInput.ts"],"names":[],"mappings":";;;;;AACA,oCAAgD;AAEhD,oGAA4E;AAE5E,MAAM,oBAAoB,GAAG,qCAAqC,CAAC;AAEnE,MAAM,QAAQ,GAAG,KAAK,CAAC;AAEvB,oDAAoD;AACpD,MAAM,OAAO,GAAG,CACd,YAA0B,EAC1B,SAAkB,EAKlB,EAAE;IACF,MAAM,EACJ,UAAU,EACV,qBAAqB,EACrB,sBAAsB,EACvB,GAAG,YAAY,CAAC;IAEjB,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,GAAG,UAAU,EAAE,sBAAsB,EAAE,KAAK,EAAE,CAAC;IAC1D,CAAC;IAED,MAAM,GAAG,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAEzE,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC;QAExB,OAAO,EAAE,GAAG,UAAU,EAAE,OAAO,EAAE,sBAAsB,EAAE,KAAK,EAAE,CAAC;IACnE,CAAC;IAED,MAAM,GAAG,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAE1E,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC;QAEtC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,sBAAsB,EAAE,IAAI,EAAE,CAAC;IACjE,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC/F,MAAM,IAAI,KAAK,CAAC,UAAU,SAAS,8BAA8B,WAAW,EAAE,CAAC,CAAC;AAClF,CAAC,CAAC;AAEF,kCAAkC;AAClC,MAAM,sBAAsB,GAAG,CAC7B,YAA0B,EAC1B,KAAe,EACf,OAKC,EACD,EAAE;IACF,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,YAAY,CAAC;IAEzC,MAAM,EACJ,IAAI,EACJ,KAAK,EACL,SAAS,EACT,iBAAiB,EAClB,GAAG,OAAO,CAAC;IAEZ,MAAM,EACJ,OAAO,EACP,YAAY,EACZ,sBAAsB,EACvB,GAAG,OAAO,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IAErC,IAAA,SAAG,EAAC,KAAK,EAAE,YAAY,EAAE,oBAAoB,CAAC,CAAC;IAE/C,MAAM,EACJ,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,EACxB,yBAAyB,EAC1B,GAAG,IAAA,uCAA6B,EAAC,KAAK,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAEhE,MAAM,KAAK,GAAG,KAAK,CAAC;IACpB,MAAM,cAAc,GAAG,CAAC,sBAAsB,CAAC;IAC/C,MAAM,gBAAgB,GAAG,IAAI,KAAK,QAAQ,CAAC;IAE3C,MAAM,KAAK,GAAG;QACZ,SAAS;QACT,KAAK;QACL,cAAc;QACd,gBAAgB;QAChB,sBAAsB;QACtB,wBAAwB;QACxB,yBAAyB;KACL,CAAC;IAEvB,IAAI,SAAS,EAAE,CAAC;QACd,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;IAC9B,CAAC;IAED,IAAI,mBAAmB,EAAE,CAAC;QACxB,KAAK,CAAC,gBAAgB,GAAG,mBAAmB,CAAC;IAC/C,CAAC;IAED,IAAI,iBAAiB,EAAE,CAAC;QACtB,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,kBAAe,sBAAsB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { QueryMap } from '@kravc/dos';
2
+ export declare enum SortExpressionKey {
3
+ BW = "bw",
4
+ LT = "lt",
5
+ LE = "le",
6
+ GT = "gt",
7
+ GE = "ge"
8
+ }
9
+ /** Builds condition expression for a table query. */
10
+ declare const buildQueryConditionExpression: (query: QueryMap, partitionKey: string, sortKey: string) => {
11
+ ConditionExpression: string | undefined;
12
+ KeyConditionExpression: string;
13
+ ExpressionAttributeNames: Record<string, string>;
14
+ ExpressionAttributeValues: Record<string, unknown>;
15
+ };
16
+ export default buildQueryConditionExpression;
17
+ //# sourceMappingURL=buildQueryConditionExpression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildQueryConditionExpression.d.ts","sourceRoot":"","sources":["../../../../src/Table/helpers/buildQueryConditionExpression.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG3C,oBAAY,iBAAiB;IAC3B,EAAE,OAAO;IACT,EAAE,OAAO;IACT,EAAE,OAAO;IACT,EAAE,OAAO;IACT,EAAE,OAAO;CACV;AAED,qDAAqD;AACrD,QAAA,MAAM,6BAA6B,GACjC,OAAO,QAAQ,EACf,cAAc,MAAM,EACpB,SAAS,MAAM;;;;;CA2FhB,CAAC;AAEF,eAAe,6BAA6B,CAAC"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SortExpressionKey = void 0;
7
+ const buildConditionExpression_1 = __importDefault(require("./buildConditionExpression"));
8
+ var SortExpressionKey;
9
+ (function (SortExpressionKey) {
10
+ SortExpressionKey["BW"] = "bw";
11
+ SortExpressionKey["LT"] = "lt";
12
+ SortExpressionKey["LE"] = "le";
13
+ SortExpressionKey["GT"] = "gt";
14
+ SortExpressionKey["GE"] = "ge";
15
+ })(SortExpressionKey || (exports.SortExpressionKey = SortExpressionKey = {}));
16
+ ;
17
+ /** Builds condition expression for a table query. */
18
+ const buildQueryConditionExpression = (query, partitionKey, sortKey) => {
19
+ const { [partitionKey]: partitionKeyValue, [sortKey]: sortKeyValue, [`${sortKey}:${SortExpressionKey.BW}`]: sortKeyBeginsWithValue, [`${sortKey}:${SortExpressionKey.LT}`]: sortKeyLowerThanValue, [`${sortKey}:${SortExpressionKey.LE}`]: sortKeyLowerThanOrEqualValue, [`${sortKey}:${SortExpressionKey.GT}`]: sortKeyGreaterThanValue, [`${sortKey}:${SortExpressionKey.GE}`]: sortKeyGreaterThanOrEqualValue, ...conditionQuery } = query;
20
+ const { ConditionExpression, ExpressionAttributeNames, ExpressionAttributeValues, } = (0, buildConditionExpression_1.default)(conditionQuery);
21
+ ExpressionAttributeNames[`#${partitionKey}`] = partitionKey;
22
+ ExpressionAttributeValues[`:${partitionKey}`] = partitionKeyValue;
23
+ const KeyConditionExpression = `#${partitionKey} = :${partitionKey}`;
24
+ const result = {
25
+ ConditionExpression,
26
+ KeyConditionExpression,
27
+ ExpressionAttributeNames,
28
+ ExpressionAttributeValues
29
+ };
30
+ const isBetweenValues = !!sortKeyLowerThanValue && !!sortKeyGreaterThanValue;
31
+ if (isBetweenValues) {
32
+ result.KeyConditionExpression += ` AND #${sortKey} BETWEEN :${sortKey}_gt AND :${sortKey}_lt`;
33
+ result.ExpressionAttributeNames[`#${sortKey}`] = sortKey;
34
+ result.ExpressionAttributeValues[`:${sortKey}_lt`] = sortKeyLowerThanValue;
35
+ result.ExpressionAttributeValues[`:${sortKey}_gt`] = sortKeyGreaterThanValue;
36
+ return result;
37
+ }
38
+ if (sortKeyLowerThanValue) {
39
+ result.KeyConditionExpression += ` AND #${sortKey} < :${sortKey}_lt`;
40
+ result.ExpressionAttributeNames[`#${sortKey}`] = sortKey;
41
+ result.ExpressionAttributeValues[`:${sortKey}_lt`] = sortKeyLowerThanValue;
42
+ return result;
43
+ }
44
+ if (sortKeyLowerThanOrEqualValue) {
45
+ result.KeyConditionExpression += ` AND #${sortKey} <= :${sortKey}_le`;
46
+ result.ExpressionAttributeNames[`#${sortKey}`] = sortKey;
47
+ result.ExpressionAttributeValues[`:${sortKey}_le`] = sortKeyLowerThanOrEqualValue;
48
+ return result;
49
+ }
50
+ if (sortKeyGreaterThanValue) {
51
+ result.KeyConditionExpression += ` AND #${sortKey} > :${sortKey}_gt`;
52
+ result.ExpressionAttributeNames[`#${sortKey}`] = sortKey;
53
+ result.ExpressionAttributeValues[`:${sortKey}_gt`] = sortKeyGreaterThanValue;
54
+ return result;
55
+ }
56
+ if (sortKeyGreaterThanOrEqualValue) {
57
+ result.KeyConditionExpression += ` AND #${sortKey} >= :${sortKey}_ge`;
58
+ result.ExpressionAttributeNames[`#${sortKey}`] = sortKey;
59
+ result.ExpressionAttributeValues[`:${sortKey}_ge`] = sortKeyGreaterThanOrEqualValue;
60
+ return result;
61
+ }
62
+ if (sortKeyBeginsWithValue) {
63
+ result.KeyConditionExpression += ` AND begins_with(#${sortKey}, :${sortKey})`;
64
+ result.ExpressionAttributeNames[`#${sortKey}`] = sortKey;
65
+ result.ExpressionAttributeValues[`:${sortKey}`] = sortKeyBeginsWithValue;
66
+ return result;
67
+ }
68
+ if (sortKeyValue) {
69
+ result.KeyConditionExpression += ` AND #${sortKey} = :${sortKey}`;
70
+ result.ExpressionAttributeNames[`#${sortKey}`] = sortKey;
71
+ result.ExpressionAttributeValues[`:${sortKey}`] = sortKeyValue;
72
+ return result;
73
+ }
74
+ return result;
75
+ };
76
+ exports.default = buildQueryConditionExpression;
77
+ //# sourceMappingURL=buildQueryConditionExpression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildQueryConditionExpression.js","sourceRoot":"","sources":["../../../../src/Table/helpers/buildQueryConditionExpression.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { TableOptions } from './getTableOptions';
2
+ import { type CreateTableInput } from '@aws-sdk/client-dynamodb';
3
+ /** Returns schema for a table from table options. */
4
+ declare const buildTableSchema: ({ name: TableName, primaryKey, isLocalhost, localSecondaryIndexes, globalSecondaryIndexes, }: TableOptions) => CreateTableInput;
5
+ export default buildTableSchema;
6
+ //# sourceMappingURL=buildTableSchema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildTableSchema.d.ts","sourceRoot":"","sources":["../../../../src/Table/helpers/buildTableSchema.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAwB,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EACL,KAAK,gBAAgB,EAGtB,MAAM,0BAA0B,CAAC;AAyGlC,qDAAqD;AACrD,QAAA,MAAM,gBAAgB,GAAI,8FAMvB,YAAY,KAAG,gBA8BjB,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const lodash_1 = require("lodash");
4
+ const ProvisionedThroughput = {
5
+ ReadCapacityUnits: 1,
6
+ WriteCapacityUnits: 1,
7
+ };
8
+ const Projection = {
9
+ ProjectionType: 'ALL'
10
+ };
11
+ /** Returns attribute definitions for table schema. */
12
+ const getAttributeDefinitions = (primaryKey, localSecondaryIndexes, globalSecondaryIndexes) => {
13
+ const { partitionKey, sortKey } = primaryKey;
14
+ let attributes = [partitionKey, sortKey];
15
+ for (const localIndexKey in localSecondaryIndexes) {
16
+ const { sortKey } = localSecondaryIndexes[localIndexKey];
17
+ attributes.push(sortKey);
18
+ }
19
+ for (const globalIndexKey in globalSecondaryIndexes) {
20
+ const { partitionKey, sortKey } = globalSecondaryIndexes[globalIndexKey];
21
+ attributes.push(partitionKey);
22
+ if (sortKey) {
23
+ attributes.push(sortKey);
24
+ }
25
+ }
26
+ attributes = (0, lodash_1.uniq)(attributes);
27
+ const AttributeDefinitions = attributes
28
+ .map(AttributeName => ({
29
+ // NOTE: Only composite keys are supported, no numbers.
30
+ AttributeType: 'S',
31
+ AttributeName,
32
+ }));
33
+ return AttributeDefinitions;
34
+ };
35
+ /** Returns secondary index. */
36
+ const getSecondaryIndex = (IndexName, partitionKey, sortKey) => {
37
+ const KeySchema = [
38
+ {
39
+ KeyType: 'HASH',
40
+ AttributeName: partitionKey
41
+ },
42
+ ];
43
+ if (sortKey) {
44
+ KeySchema.push({
45
+ KeyType: 'RANGE',
46
+ AttributeName: sortKey
47
+ });
48
+ }
49
+ const index = {
50
+ IndexName,
51
+ KeySchema,
52
+ Projection,
53
+ };
54
+ return index;
55
+ };
56
+ /** Returns schemas for local secondary indexes. */
57
+ const getLocalSecondaryIndexes = (partitionKey, localSecondaryIndexes) => {
58
+ const indexes = localSecondaryIndexes
59
+ .map(({ name, sortKey }) => getSecondaryIndex(name, partitionKey, sortKey));
60
+ return indexes;
61
+ };
62
+ /** Returns schemas for global secondary indexes. */
63
+ const getGlobalSecondaryIndexes = (globalSecondaryIndexes, isLocalhost) => {
64
+ const indexes = globalSecondaryIndexes
65
+ .map(({ name, partitionKey, sortKey }) => getSecondaryIndex(name, partitionKey, sortKey));
66
+ /* istanbul ignore next */
67
+ if (!isLocalhost) {
68
+ return indexes;
69
+ }
70
+ indexes.forEach(index => index.ProvisionedThroughput = ProvisionedThroughput);
71
+ return indexes;
72
+ };
73
+ /** Returns schema for a table from table options. */
74
+ const buildTableSchema = ({ name: TableName, primaryKey, isLocalhost, localSecondaryIndexes, globalSecondaryIndexes, }) => {
75
+ const { partitionKey, sortKey } = primaryKey;
76
+ const AttributeDefinitions = getAttributeDefinitions(primaryKey, localSecondaryIndexes, globalSecondaryIndexes);
77
+ const LocalSecondaryIndexes = getLocalSecondaryIndexes(partitionKey, localSecondaryIndexes);
78
+ const GlobalSecondaryIndexes = getGlobalSecondaryIndexes(globalSecondaryIndexes, isLocalhost);
79
+ const KeySchema = [
80
+ { KeyType: 'HASH', AttributeName: partitionKey },
81
+ { KeyType: 'RANGE', AttributeName: sortKey }
82
+ ];
83
+ const schema = {
84
+ TableName,
85
+ KeySchema,
86
+ AttributeDefinitions,
87
+ LocalSecondaryIndexes,
88
+ GlobalSecondaryIndexes,
89
+ };
90
+ /* istanbul ignore else */
91
+ if (isLocalhost) {
92
+ schema.ProvisionedThroughput = ProvisionedThroughput;
93
+ }
94
+ else {
95
+ schema.BillingMode = 'PAY_PER_REQUEST';
96
+ }
97
+ return schema;
98
+ };
99
+ exports.default = buildTableSchema;
100
+ //# sourceMappingURL=buildTableSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildTableSchema.js","sourceRoot":"","sources":["../../../../src/Table/helpers/buildTableSchema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { QueryMap, MutationMap } from '@kravc/dos';
2
+ /** Builds update expression from a query for a table item update method. */
3
+ declare const buildUpdateExpression: (query: QueryMap, mutation: MutationMap) => {
4
+ UpdateExpression: string;
5
+ ConditionExpression: string | undefined;
6
+ ExpressionAttributeNames: Record<string, string>;
7
+ ExpressionAttributeValues: Record<string, unknown>;
8
+ };
9
+ export default buildUpdateExpression;
10
+ //# sourceMappingURL=buildUpdateExpression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildUpdateExpression.d.ts","sourceRoot":"","sources":["../../../../src/Table/helpers/buildUpdateExpression.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGxD,4EAA4E;AAC5E,QAAA,MAAM,qBAAqB,GAAI,OAAO,QAAQ,EAAE,UAAU,WAAW;;;;;CAwFpE,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const buildConditionExpression_1 = __importDefault(require("./buildConditionExpression"));
7
+ /** Builds update expression from a query for a table item update method. */
8
+ const buildUpdateExpression = (query, mutation) => {
9
+ const UpdateExpressions = [];
10
+ const RemoveExpressions = [];
11
+ const { ConditionExpression: _ConditionExpression, ExpressionAttributeNames, ExpressionAttributeValues, } = (0, buildConditionExpression_1.default)(query);
12
+ let ConditionExpression = _ConditionExpression;
13
+ for (let name in mutation) {
14
+ const expressionValue = mutation[name];
15
+ const arrayItemIndex = name.match(/\[\d+\]/g);
16
+ name = name.replace(/\[\d+\]/g, '');
17
+ let path = '#' + name.replace(/\./g, '.#');
18
+ const valueKey = name.replace(/\.|:/g, '_');
19
+ const isAppend = name.endsWith(':append');
20
+ const isPrepend = name.endsWith(':prepend');
21
+ name = name.replace(/:append/, '');
22
+ name = name.replace(/:prepend/, '');
23
+ const pathKeys = name.split('.');
24
+ for (const pathKey of pathKeys) {
25
+ ExpressionAttributeNames[`#${pathKey}`] = pathKey;
26
+ }
27
+ const shouldRemoveAttribute = expressionValue === null;
28
+ if (shouldRemoveAttribute) {
29
+ RemoveExpressions.push(`${path}`);
30
+ continue;
31
+ }
32
+ if (isAppend || isPrepend) {
33
+ path = path.replace(/:append/, '');
34
+ path = path.replace(/:prepend/, '');
35
+ ExpressionAttributeValues[`:${valueKey}`] = [expressionValue];
36
+ ExpressionAttributeValues[`:${valueKey}_item`] = expressionValue;
37
+ ConditionExpression += ` AND not contains (${path}, :${valueKey}_item)`;
38
+ if (isAppend) {
39
+ UpdateExpressions.push(`${path} = list_append(#${name}, :${valueKey})`);
40
+ }
41
+ else {
42
+ UpdateExpressions.push(`${path} = list_append(:${valueKey}, #${name})`);
43
+ }
44
+ }
45
+ else {
46
+ ExpressionAttributeValues[`:${valueKey}`] = expressionValue;
47
+ path = `${path}${arrayItemIndex ? arrayItemIndex : ''}`;
48
+ UpdateExpressions.push(`${path} = :${valueKey}`);
49
+ }
50
+ }
51
+ const UpdatedExpressions = [];
52
+ const hasUpdateExpressions = UpdateExpressions.length > 0;
53
+ if (hasUpdateExpressions) {
54
+ UpdatedExpressions.push(`SET ${UpdateExpressions.join(', ')}`);
55
+ }
56
+ const hasRemoveAttributes = RemoveExpressions.length > 0;
57
+ if (hasRemoveAttributes) {
58
+ UpdatedExpressions.push(`REMOVE ${RemoveExpressions.join(', ')}`);
59
+ }
60
+ const UpdateExpression = UpdatedExpressions.join(' ');
61
+ return {
62
+ UpdateExpression,
63
+ ConditionExpression,
64
+ ExpressionAttributeNames,
65
+ ExpressionAttributeValues,
66
+ };
67
+ };
68
+ exports.default = buildUpdateExpression;
69
+ //# sourceMappingURL=buildUpdateExpression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildUpdateExpression.js","sourceRoot":"","sources":["../../../../src/Table/helpers/buildUpdateExpression.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { QueryMap } from '@kravc/dos';
2
+ /** Ensures item matches condition expression built from a query. */
3
+ declare function filterConditionExpression<T>(item: T, query: QueryMap): T | undefined;
4
+ export default filterConditionExpression;
5
+ //# sourceMappingURL=filterConditionExpression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filterConditionExpression.d.ts","sourceRoot":"","sources":["../../../../src/Table/helpers/filterConditionExpression.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG3C,oEAAoE;AACpE,iBAAS,yBAAyB,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,GAAG,CAAC,GAAG,SAAS,CA+E7E;AAED,eAAe,yBAAyB,CAAC"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const lodash_1 = require("lodash");
4
+ const buildConditionExpression_1 = require("./buildConditionExpression");
5
+ /** Ensures item matches condition expression built from a query. */
6
+ function filterConditionExpression(item, query) {
7
+ if (!item) {
8
+ return;
9
+ }
10
+ const conditionEntries = Object.entries(query);
11
+ for (const [key, value] of conditionEntries) {
12
+ const isNot = key.endsWith(`:${buildConditionExpression_1.ExpressionKey.NOT}`);
13
+ const isContains = key.endsWith(`:${buildConditionExpression_1.ExpressionKey.CONTAIN}`);
14
+ // const isLessThan = key.endsWith(':lt')
15
+ // const isGreaterThan = key.endsWith(':gt')
16
+ const isNotContains = key.endsWith(`:${buildConditionExpression_1.ExpressionKey.EXCLUDE}`);
17
+ const isFilterValueArray = Array.isArray(value);
18
+ const isFilterValueNull = value === null;
19
+ let path = key;
20
+ /** Checks items are equal. */
21
+ let match = (a, b) => a === b;
22
+ if (isNot) {
23
+ path = key.replace(/:not/g, '');
24
+ /** Checks items are not equal. */
25
+ match = (a, b) => a !== b;
26
+ }
27
+ if (isFilterValueNull) {
28
+ if (isNot) {
29
+ /** Checks item is not undefined. */
30
+ match = (a) => a !== undefined;
31
+ }
32
+ else {
33
+ /** Checks item is undefined. */
34
+ match = (a) => a === undefined;
35
+ }
36
+ }
37
+ if (isContains) {
38
+ path = key.replace(/:contains/g, '');
39
+ /** Checks item includes value. */
40
+ match = (a, b) => a.includes(b);
41
+ }
42
+ if (isNotContains) {
43
+ path = key.replace(/:not_contains/g, '');
44
+ /** Checks item does not include value. */
45
+ match = (a, b) => !a.includes(b);
46
+ }
47
+ if (isFilterValueArray) {
48
+ /** Checks item is included in the array. */
49
+ match = (a, b) => b.includes(a);
50
+ }
51
+ // if (isLessThan) {
52
+ // path = key.replace(/:lt/g, '')
53
+ // }
54
+ // if (isGreaterThan) {
55
+ // path = key.replace(/:gt/g, '')
56
+ // }
57
+ const itemValue = (0, lodash_1.get)(item, path);
58
+ const isMatched = match(itemValue, value);
59
+ if (isMatched) {
60
+ continue;
61
+ }
62
+ return;
63
+ }
64
+ return item;
65
+ }
66
+ ;
67
+ exports.default = filterConditionExpression;
68
+ //# sourceMappingURL=filterConditionExpression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filterConditionExpression.js","sourceRoot":"","sources":["../../../../src/Table/helpers/filterConditionExpression.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type DynamoDBClientConfig } from '@aws-sdk/client-dynamodb';
2
+ /** Returns config for DynamoDB raw client. */
3
+ declare const getRawClientConfig: (region: string, profile: string) => DynamoDBClientConfig;
4
+ export default getRawClientConfig;
5
+ //# sourceMappingURL=getRawClientConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getRawClientConfig.d.ts","sourceRoot":"","sources":["../../../../src/Table/helpers/getRawClientConfig.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAQrE,8CAA8C;AAC9C,QAAA,MAAM,kBAAkB,GAAI,QAAQ,MAAM,EAAE,SAAS,MAAM,KAAG,oBAmB7D,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const os_1 = require("os");
4
+ const credential_providers_1 = require("@aws-sdk/credential-providers");
5
+ const fs_1 = require("fs");
6
+ const getTableOptions_1 = require("./getTableOptions");
7
+ const HOME = (0, os_1.homedir)();
8
+ const hasAwsCredentials = (0, fs_1.existsSync)(`${HOME}/.aws/credentials`);
9
+ const LOCAL_ENDPOINT = 'http://0.0.0.0:8000';
10
+ const DEFAULT_MAX_ATTEMPTS = 10;
11
+ /** Returns config for DynamoDB raw client. */
12
+ const getRawClientConfig = (region, profile) => {
13
+ const config = {
14
+ maxAttempts: DEFAULT_MAX_ATTEMPTS,
15
+ region,
16
+ };
17
+ const isLocal = region === getTableOptions_1.LOCAL_REGION;
18
+ /* istanbul ignore else */
19
+ if (isLocal) {
20
+ config.endpoint = LOCAL_ENDPOINT;
21
+ }
22
+ /* istanbul ignore else */
23
+ if (hasAwsCredentials) {
24
+ config.credentials = (0, credential_providers_1.fromIni)({ profile });
25
+ }
26
+ return config;
27
+ };
28
+ exports.default = getRawClientConfig;
29
+ //# sourceMappingURL=getRawClientConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getRawClientConfig.js","sourceRoot":"","sources":["../../../../src/Table/helpers/getRawClientConfig.ts"],"names":[],"mappings":";;AAAA,2BAA6B;AAC7B,wEAAwD;AACxD,2BAAgC;AAChC,uDAAiD;AAGjD,MAAM,IAAI,GAAG,IAAA,YAAO,GAAE,CAAC;AACvB,MAAM,iBAAiB,GAAG,IAAA,eAAU,EAAC,GAAG,IAAI,mBAAmB,CAAC,CAAC;AAEjE,MAAM,cAAc,GAAG,qBAAqB,CAAC;AAC7C,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEhC,8CAA8C;AAC9C,MAAM,kBAAkB,GAAG,CAAC,MAAc,EAAE,OAAe,EAAwB,EAAE;IACnF,MAAM,MAAM,GAAG;QACb,WAAW,EAAE,oBAAoB;QACjC,MAAM;KACiB,CAAC;IAE1B,MAAM,OAAO,GAAG,MAAM,KAAK,8BAAY,CAAC;IAExC,0BAA0B;IAC1B,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,CAAC,QAAQ,GAAG,cAAc,CAAC;IACnC,CAAC;IAED,0BAA0B;IAC1B,IAAI,iBAAiB,EAAE,CAAC;QACtB,MAAM,CAAC,WAAW,GAAG,IAAA,8BAAO,EAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,kBAAe,kBAAkB,CAAC"}
@@ -0,0 +1,51 @@
1
+ export declare const LOCAL_REGION = "local";
2
+ export type LSI = {
3
+ name: string;
4
+ sortKey: string;
5
+ };
6
+ export type GSI = {
7
+ name: string;
8
+ partitionKey: string;
9
+ sortKey: string;
10
+ };
11
+ export type PrimaryKey = {
12
+ sortKey: string;
13
+ partitionKey: string;
14
+ };
15
+ export type LocalIndexKeyComposer = {
16
+ documentName: string;
17
+ sk: string;
18
+ };
19
+ export type GlobalIndexKeyComposer = {
20
+ pk: string;
21
+ sk?: string;
22
+ };
23
+ type LocalIndexProps = {
24
+ indexName: string;
25
+ sortKeyName: string;
26
+ };
27
+ type GlobalIndexProps = {
28
+ indexName: string;
29
+ sortKeyName: string;
30
+ partitionKeyName: string;
31
+ };
32
+ export type TableOptions = {
33
+ name: string;
34
+ region: string;
35
+ profile: string;
36
+ indexKeys: Record<string, LocalIndexKeyComposer | Record<string, GlobalIndexKeyComposer>>;
37
+ primaryKey: PrimaryKey;
38
+ isLocalhost: boolean;
39
+ localSecondaryIndexes: LSI[];
40
+ globalSecondaryIndexes: GSI[];
41
+ getLocalIndexSortKeyName: (indexName: string) => string;
42
+ getGlobalIndexPartitionKeyName: (indexName: string) => string;
43
+ getGlobalIndexSortKeyName: (indexName: string) => string;
44
+ isLocalSecondaryIndex: (indexName: string) => boolean;
45
+ getLocalIndexProps: (indexName: string) => LocalIndexProps;
46
+ getGlobalIndexProps: (indexName: string) => GlobalIndexProps;
47
+ };
48
+ /** Returns options for DynamoDB table creation. */
49
+ declare const getTableOptions: (partitionKey: string, sortKey: string) => TableOptions;
50
+ export default getTableOptions;
51
+ //# sourceMappingURL=getTableOptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getTableOptions.d.ts","sourceRoot":"","sources":["../../../../src/Table/helpers/getTableOptions.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,YAAY,UAAU,CAAC;AAGpC,MAAM,MAAM,GAAG,GAAG;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,GAAG,GAAG;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AACzE,MAAM,MAAM,sBAAsB,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjE,KAAK,eAAe,GAAG;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAAC;IAC1F,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,qBAAqB,EAAE,GAAG,EAAE,CAAC;IAC7B,sBAAsB,EAAE,GAAG,EAAE,CAAC;IAC9B,wBAAwB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;IACxD,8BAA8B,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9D,yBAAyB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;IACzD,qBAAqB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IACtD,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,eAAe,CAAC;IAC3D,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,gBAAgB,CAAC;CAC9D,CAAA;AAgBD,mDAAmD;AACnD,QAAA,MAAM,eAAe,GAAI,cAAc,MAAM,EAAE,SAAS,MAAM,KAAG,YA0JhE,CAAC;AAEF,eAAe,eAAe,CAAC"}