@exabugs/dynamodb-client 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.
- package/CHANGELOG.md +41 -0
- package/LICENSE +21 -0
- package/README.md +283 -0
- package/dist/client/Collection.d.ts +57 -0
- package/dist/client/Collection.d.ts.map +1 -0
- package/dist/client/Collection.js +174 -0
- package/dist/client/Collection.js.map +1 -0
- package/dist/client/Database.d.ts +35 -0
- package/dist/client/Database.d.ts.map +1 -0
- package/dist/client/Database.js +48 -0
- package/dist/client/Database.js.map +1 -0
- package/dist/client/DynamoClient.d.ts +43 -0
- package/dist/client/DynamoClient.d.ts.map +1 -0
- package/dist/client/DynamoClient.js +62 -0
- package/dist/client/DynamoClient.js.map +1 -0
- package/dist/client/FindCursor.d.ts +174 -0
- package/dist/client/FindCursor.d.ts.map +1 -0
- package/dist/client/FindCursor.js +256 -0
- package/dist/client/FindCursor.js.map +1 -0
- package/dist/client/aws-sigv4.d.ts +10 -0
- package/dist/client/aws-sigv4.d.ts.map +1 -0
- package/dist/client/aws-sigv4.js +54 -0
- package/dist/client/aws-sigv4.js.map +1 -0
- package/dist/client/index.cognito.d.ts +34 -0
- package/dist/client/index.cognito.d.ts.map +1 -0
- package/dist/client/index.cognito.js +30 -0
- package/dist/client/index.cognito.js.map +1 -0
- package/dist/client/index.d.ts +12 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.iam.d.ts +34 -0
- package/dist/client/index.iam.d.ts.map +1 -0
- package/dist/client/index.iam.js +28 -0
- package/dist/client/index.iam.js.map +1 -0
- package/dist/client/index.js +12 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/index.token.d.ts +33 -0
- package/dist/client/index.token.d.ts.map +1 -0
- package/dist/client/index.token.js +28 -0
- package/dist/client/index.token.js.map +1 -0
- package/dist/dynamodb.d.ts +20 -0
- package/dist/dynamodb.d.ts.map +1 -0
- package/dist/dynamodb.js +31 -0
- package/dist/dynamodb.js.map +1 -0
- package/dist/errors.d.ts +100 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +146 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/react-admin/dataProvider.d.ts +59 -0
- package/dist/integrations/react-admin/dataProvider.d.ts.map +1 -0
- package/dist/integrations/react-admin/dataProvider.js +364 -0
- package/dist/integrations/react-admin/dataProvider.js.map +1 -0
- package/dist/integrations/react-admin/index.d.ts +24 -0
- package/dist/integrations/react-admin/index.d.ts.map +1 -0
- package/dist/integrations/react-admin/index.js +23 -0
- package/dist/integrations/react-admin/index.js.map +1 -0
- package/dist/integrations/react-admin/types.d.ts +47 -0
- package/dist/integrations/react-admin/types.d.ts.map +1 -0
- package/dist/integrations/react-admin/types.js +5 -0
- package/dist/integrations/react-admin/types.js.map +1 -0
- package/dist/logger.d.ts +61 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +87 -0
- package/dist/logger.js.map +1 -0
- package/dist/scripts/repair-shadows.d.ts +3 -0
- package/dist/scripts/repair-shadows.d.ts.map +1 -0
- package/dist/scripts/repair-shadows.js +190 -0
- package/dist/scripts/repair-shadows.js.map +1 -0
- package/dist/server/handler.cjs +31378 -0
- package/dist/server/handler.cjs.map +7 -0
- package/dist/server/handler.d.ts +18 -0
- package/dist/server/handler.d.ts.map +1 -0
- package/dist/server/handler.js +435 -0
- package/dist/server/handler.js.map +1 -0
- package/dist/server/handler.zip +0 -0
- package/dist/server/index.d.ts +8 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +8 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/operations/deleteMany.d.ts +18 -0
- package/dist/server/operations/deleteMany.d.ts.map +1 -0
- package/dist/server/operations/deleteMany.js +222 -0
- package/dist/server/operations/deleteMany.js.map +1 -0
- package/dist/server/operations/deleteOne.d.ts +17 -0
- package/dist/server/operations/deleteOne.d.ts.map +1 -0
- package/dist/server/operations/deleteOne.js +87 -0
- package/dist/server/operations/deleteOne.js.map +1 -0
- package/dist/server/operations/find.d.ts +18 -0
- package/dist/server/operations/find.d.ts.map +1 -0
- package/dist/server/operations/find.js +382 -0
- package/dist/server/operations/find.js.map +1 -0
- package/dist/server/operations/findMany.d.ts +13 -0
- package/dist/server/operations/findMany.d.ts.map +1 -0
- package/dist/server/operations/findMany.js +61 -0
- package/dist/server/operations/findMany.js.map +1 -0
- package/dist/server/operations/findManyReference.d.ts +18 -0
- package/dist/server/operations/findManyReference.d.ts.map +1 -0
- package/dist/server/operations/findManyReference.js +150 -0
- package/dist/server/operations/findManyReference.js.map +1 -0
- package/dist/server/operations/findOne.d.ts +14 -0
- package/dist/server/operations/findOne.d.ts.map +1 -0
- package/dist/server/operations/findOne.js +56 -0
- package/dist/server/operations/findOne.js.map +1 -0
- package/dist/server/operations/insertMany.d.ts +19 -0
- package/dist/server/operations/insertMany.d.ts.map +1 -0
- package/dist/server/operations/insertMany.js +243 -0
- package/dist/server/operations/insertMany.js.map +1 -0
- package/dist/server/operations/insertOne.d.ts +18 -0
- package/dist/server/operations/insertOne.d.ts.map +1 -0
- package/dist/server/operations/insertOne.js +85 -0
- package/dist/server/operations/insertOne.js.map +1 -0
- package/dist/server/operations/updateMany.d.ts +20 -0
- package/dist/server/operations/updateMany.d.ts.map +1 -0
- package/dist/server/operations/updateMany.js +316 -0
- package/dist/server/operations/updateMany.js.map +1 -0
- package/dist/server/operations/updateOne.d.ts +20 -0
- package/dist/server/operations/updateOne.d.ts.map +1 -0
- package/dist/server/operations/updateOne.js +159 -0
- package/dist/server/operations/updateOne.js.map +1 -0
- package/dist/server/query/converter.d.ts +85 -0
- package/dist/server/query/converter.d.ts.map +1 -0
- package/dist/server/query/converter.js +161 -0
- package/dist/server/query/converter.js.map +1 -0
- package/dist/server/query/index.d.ts +5 -0
- package/dist/server/query/index.d.ts.map +1 -0
- package/dist/server/query/index.js +5 -0
- package/dist/server/query/index.js.map +1 -0
- package/dist/server/shadow/config.d.ts +147 -0
- package/dist/server/shadow/config.d.ts.map +1 -0
- package/dist/server/shadow/config.js +162 -0
- package/dist/server/shadow/config.js.map +1 -0
- package/dist/server/shadow/differ.d.ts +42 -0
- package/dist/server/shadow/differ.d.ts.map +1 -0
- package/dist/server/shadow/differ.js +66 -0
- package/dist/server/shadow/differ.js.map +1 -0
- package/dist/server/shadow/generator.d.ts +104 -0
- package/dist/server/shadow/generator.d.ts.map +1 -0
- package/dist/server/shadow/generator.js +148 -0
- package/dist/server/shadow/generator.js.map +1 -0
- package/dist/server/shadow/index.d.ts +11 -0
- package/dist/server/shadow/index.d.ts.map +1 -0
- package/dist/server/shadow/index.js +11 -0
- package/dist/server/shadow/index.js.map +1 -0
- package/dist/server/shadow/types.d.ts +44 -0
- package/dist/server/shadow/types.d.ts.map +1 -0
- package/dist/server/shadow/types.js +2 -0
- package/dist/server/shadow/types.js.map +1 -0
- package/dist/server/types.d.ts +295 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +7 -0
- package/dist/server/types.js.map +1 -0
- package/dist/server/utils/auth.d.ts +43 -0
- package/dist/server/utils/auth.d.ts.map +1 -0
- package/dist/server/utils/auth.js +123 -0
- package/dist/server/utils/auth.js.map +1 -0
- package/dist/server/utils/bulkOperations.d.ts +81 -0
- package/dist/server/utils/bulkOperations.d.ts.map +1 -0
- package/dist/server/utils/bulkOperations.js +147 -0
- package/dist/server/utils/bulkOperations.js.map +1 -0
- package/dist/server/utils/chunking.d.ts +96 -0
- package/dist/server/utils/chunking.d.ts.map +1 -0
- package/dist/server/utils/chunking.js +225 -0
- package/dist/server/utils/chunking.js.map +1 -0
- package/dist/server/utils/dynamodb.d.ts +41 -0
- package/dist/server/utils/dynamodb.d.ts.map +1 -0
- package/dist/server/utils/dynamodb.js +83 -0
- package/dist/server/utils/dynamodb.js.map +1 -0
- package/dist/server/utils/filter.d.ts +152 -0
- package/dist/server/utils/filter.d.ts.map +1 -0
- package/dist/server/utils/filter.js +270 -0
- package/dist/server/utils/filter.js.map +1 -0
- package/dist/server/utils/pagination.d.ts +27 -0
- package/dist/server/utils/pagination.d.ts.map +1 -0
- package/dist/server/utils/pagination.js +56 -0
- package/dist/server/utils/pagination.js.map +1 -0
- package/dist/server/utils/timestamps.d.ts +31 -0
- package/dist/server/utils/timestamps.d.ts.map +1 -0
- package/dist/server/utils/timestamps.js +84 -0
- package/dist/server/utils/timestamps.js.map +1 -0
- package/dist/server/utils/ttl.d.ts +17 -0
- package/dist/server/utils/ttl.d.ts.map +1 -0
- package/dist/server/utils/ttl.js +62 -0
- package/dist/server/utils/ttl.js.map +1 -0
- package/dist/server/utils/validation.d.ts +40 -0
- package/dist/server/utils/validation.d.ts.map +1 -0
- package/dist/server/utils/validation.js +54 -0
- package/dist/server/utils/validation.js.map +1 -0
- package/dist/shadows/config.d.ts +54 -0
- package/dist/shadows/config.d.ts.map +1 -0
- package/dist/shadows/config.js +95 -0
- package/dist/shadows/config.js.map +1 -0
- package/dist/shadows/differ.d.ts +42 -0
- package/dist/shadows/differ.d.ts.map +1 -0
- package/dist/shadows/differ.js +66 -0
- package/dist/shadows/differ.js.map +1 -0
- package/dist/shadows/generator.d.ts +63 -0
- package/dist/shadows/generator.d.ts.map +1 -0
- package/dist/shadows/generator.js +107 -0
- package/dist/shadows/generator.js.map +1 -0
- package/dist/shadows/index.d.ts +15 -0
- package/dist/shadows/index.d.ts.map +1 -0
- package/dist/shadows/index.js +17 -0
- package/dist/shadows/index.js.map +1 -0
- package/dist/shadows/types.d.ts +44 -0
- package/dist/shadows/types.d.ts.map +1 -0
- package/dist/shadows/types.js +2 -0
- package/dist/shadows/types.js.map +1 -0
- package/dist/types.d.ts +165 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/ulid.d.ts +46 -0
- package/dist/ulid.d.ts.map +1 -0
- package/dist/ulid.js +66 -0
- package/dist/ulid.js.map +1 -0
- package/package.json +136 -0
- package/terraform/README.md +222 -0
- package/terraform/examples/advanced/README.md +129 -0
- package/terraform/examples/advanced/main.tf +158 -0
- package/terraform/examples/advanced/shadow.config.json +35 -0
- package/terraform/examples/advanced/variables.tf +28 -0
- package/terraform/examples/basic/README.md +53 -0
- package/terraform/examples/basic/main.tf +99 -0
- package/terraform/examples/basic/variables.tf +17 -0
- package/terraform/main.tf +159 -0
- package/terraform/outputs.tf +56 -0
- package/terraform/variables.tf +59 -0
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FilterをDynamoDB形式に変換する
|
|
3
|
+
*
|
|
4
|
+
* MongoDB風のFilter構文をDynamoDBのFilterExpression用の条件配列に変換します。
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* // 単純な等価条件
|
|
9
|
+
* const filter: Filter<Product> = { status: 'active' };
|
|
10
|
+
* const query = convertFilterToDynamo('products', filter);
|
|
11
|
+
* // => { pk: 'products', conditions: [{ field: 'status', operator: 'eq', value: 'active' }] }
|
|
12
|
+
*
|
|
13
|
+
* // 演算子を使用した条件
|
|
14
|
+
* const filter: Filter<Product> = {
|
|
15
|
+
* price: { gte: 1000, lte: 5000 },
|
|
16
|
+
* status: { in: ['active', 'pending'] }
|
|
17
|
+
* };
|
|
18
|
+
* const query = convertFilterToDynamo('products', filter);
|
|
19
|
+
* // => {
|
|
20
|
+
* // pk: 'products',
|
|
21
|
+
* // conditions: [
|
|
22
|
+
* // { field: 'price', operator: 'gte', value: 1000 },
|
|
23
|
+
* // { field: 'price', operator: 'lte', value: 5000 },
|
|
24
|
+
* // { field: 'status', operator: 'in', value: ['active', 'pending'] }
|
|
25
|
+
* // ]
|
|
26
|
+
* // }
|
|
27
|
+
*
|
|
28
|
+
* // OR条件
|
|
29
|
+
* const filter: Filter<Product> = {
|
|
30
|
+
* or: [
|
|
31
|
+
* { status: 'active' },
|
|
32
|
+
* { priority: { gte: 5 } }
|
|
33
|
+
* ]
|
|
34
|
+
* };
|
|
35
|
+
* const query = convertFilterToDynamo('products', filter);
|
|
36
|
+
* // => {
|
|
37
|
+
* // pk: 'products',
|
|
38
|
+
* // conditions: [
|
|
39
|
+
* // { field: 'status', operator: 'eq', value: 'active' },
|
|
40
|
+
* // { field: 'priority', operator: 'gte', value: 5 }
|
|
41
|
+
* // ],
|
|
42
|
+
* // logicalOperator: 'OR'
|
|
43
|
+
* // }
|
|
44
|
+
* ```
|
|
45
|
+
*
|
|
46
|
+
* @param collection - コレクション名(リソース名)
|
|
47
|
+
* @param filter - MongoDB風のフィルタ条件
|
|
48
|
+
* @returns DynamoDBクエリ
|
|
49
|
+
*/
|
|
50
|
+
export function convertFilterToDynamo(collection, filter) {
|
|
51
|
+
const conditions = [];
|
|
52
|
+
let logicalOperator = 'AND';
|
|
53
|
+
// フィルタが空の場合
|
|
54
|
+
if (!filter || Object.keys(filter).length === 0) {
|
|
55
|
+
return { pk: collection, conditions };
|
|
56
|
+
}
|
|
57
|
+
// 論理演算子の処理
|
|
58
|
+
if ('and' in filter && Array.isArray(filter.and)) {
|
|
59
|
+
// AND条件: 各フィルタを再帰的に変換して結合
|
|
60
|
+
for (const subFilter of filter.and) {
|
|
61
|
+
const subQuery = convertFilterToDynamo(collection, subFilter);
|
|
62
|
+
conditions.push(...subQuery.conditions);
|
|
63
|
+
}
|
|
64
|
+
logicalOperator = 'AND';
|
|
65
|
+
}
|
|
66
|
+
else if ('or' in filter && Array.isArray(filter.or)) {
|
|
67
|
+
// OR条件: 各フィルタを再帰的に変換して結合
|
|
68
|
+
for (const subFilter of filter.or) {
|
|
69
|
+
const subQuery = convertFilterToDynamo(collection, subFilter);
|
|
70
|
+
conditions.push(...subQuery.conditions);
|
|
71
|
+
}
|
|
72
|
+
logicalOperator = 'OR';
|
|
73
|
+
}
|
|
74
|
+
// 通常のフィールド条件を処理
|
|
75
|
+
for (const [key, value] of Object.entries(filter)) {
|
|
76
|
+
// 論理演算子はスキップ
|
|
77
|
+
if (key === 'and' || key === 'or') {
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
// 値がnullまたはundefinedの場合はスキップ
|
|
81
|
+
if (value === null || value === undefined) {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
// FilterOperatorsオブジェクトかどうかをチェック
|
|
85
|
+
if (isFilterOperators(value)) {
|
|
86
|
+
// 演算子を使用した条件
|
|
87
|
+
for (const [op, opValue] of Object.entries(value)) {
|
|
88
|
+
if (opValue === undefined)
|
|
89
|
+
continue;
|
|
90
|
+
const operator = mapOperatorToDynamo(op);
|
|
91
|
+
conditions.push({
|
|
92
|
+
field: key,
|
|
93
|
+
operator,
|
|
94
|
+
value: opValue,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
// 直接値を指定した場合は等価条件として扱う
|
|
100
|
+
conditions.push({
|
|
101
|
+
field: key,
|
|
102
|
+
operator: 'eq',
|
|
103
|
+
value,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
pk: collection,
|
|
109
|
+
conditions,
|
|
110
|
+
...(logicalOperator === 'OR' && { logicalOperator }),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* 値がFilterOperatorsオブジェクトかどうかをチェックする
|
|
115
|
+
*
|
|
116
|
+
* @param value - チェック対象の値
|
|
117
|
+
* @returns FilterOperatorsオブジェクトの場合true
|
|
118
|
+
*/
|
|
119
|
+
function isFilterOperators(value) {
|
|
120
|
+
if (typeof value !== 'object' || value === null) {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
const validOperators = ['eq', 'ne', 'gt', 'gte', 'lt', 'lte', 'in', 'nin', 'exists', 'regex'];
|
|
124
|
+
const keys = Object.keys(value);
|
|
125
|
+
// 少なくとも1つの有効な演算子キーを持つ場合はFilterOperatorsとみなす
|
|
126
|
+
return keys.some((key) => validOperators.includes(key));
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* MongoDB風の演算子をDynamoDB演算子にマッピングする
|
|
130
|
+
*
|
|
131
|
+
* @param operator - MongoDB風の演算子
|
|
132
|
+
* @returns DynamoDB演算子
|
|
133
|
+
*/
|
|
134
|
+
function mapOperatorToDynamo(operator) {
|
|
135
|
+
switch (operator) {
|
|
136
|
+
case 'eq':
|
|
137
|
+
return 'eq';
|
|
138
|
+
case 'ne':
|
|
139
|
+
return 'ne';
|
|
140
|
+
case 'gt':
|
|
141
|
+
return 'gt';
|
|
142
|
+
case 'gte':
|
|
143
|
+
return 'gte';
|
|
144
|
+
case 'lt':
|
|
145
|
+
return 'lt';
|
|
146
|
+
case 'lte':
|
|
147
|
+
return 'lte';
|
|
148
|
+
case 'in':
|
|
149
|
+
return 'in';
|
|
150
|
+
case 'nin':
|
|
151
|
+
return 'nin';
|
|
152
|
+
case 'exists':
|
|
153
|
+
return 'exists';
|
|
154
|
+
case 'regex':
|
|
155
|
+
// 正規表現は部分一致(contains)として扱う(簡易実装)
|
|
156
|
+
return 'contains';
|
|
157
|
+
default:
|
|
158
|
+
return 'eq';
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=converter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"converter.js","sourceRoot":"","sources":["../../../src/server/query/converter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/query/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,qBAAqB,EACrB,KAAK,wBAAwB,EAC7B,KAAK,eAAe,EACpB,KAAK,WAAW,GACjB,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/query/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,qBAAqB,GAItB,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* サーバーサイドシャドウ設定管理
|
|
3
|
+
*
|
|
4
|
+
* シャドー設定を環境変数から読み込み、グローバル変数にキャッシュします。
|
|
5
|
+
* 設定はTerraformデプロイ時に環境変数として埋め込まれるため、
|
|
6
|
+
* 実行時のI/Oが不要で、最も高速かつシンプルです。
|
|
7
|
+
*
|
|
8
|
+
* キャッシュの動作:
|
|
9
|
+
* - 初回呼び出し時: 環境変数からパースしてキャッシュ
|
|
10
|
+
* - 2回目以降: キャッシュから即座に取得
|
|
11
|
+
* - キャッシュ有効期間: Lambda実行環境が存在する間(通常15分〜数時間)
|
|
12
|
+
*
|
|
13
|
+
* 設定変更の反映:
|
|
14
|
+
* - config/shadow.config.jsonを変更
|
|
15
|
+
* - Terraformで再度apply(環境変数が更新される)
|
|
16
|
+
* - Lambda関数が自動的に再デプロイされ、新しい設定が反映される
|
|
17
|
+
*
|
|
18
|
+
* 要件: 8.7
|
|
19
|
+
*/
|
|
20
|
+
import type { ShadowSchema } from './generator.js';
|
|
21
|
+
import type { ShadowFieldConfig } from './types.js';
|
|
22
|
+
/**
|
|
23
|
+
* シャドー設定の全体構造
|
|
24
|
+
*/
|
|
25
|
+
export interface ShadowConfig {
|
|
26
|
+
/** スキーマバージョン */
|
|
27
|
+
$schemaVersion: string;
|
|
28
|
+
/** 生成日時 */
|
|
29
|
+
$generatedAt?: string;
|
|
30
|
+
/** 生成元ファイル */
|
|
31
|
+
$generatedFrom?: string;
|
|
32
|
+
/** データベース設定 */
|
|
33
|
+
database?: {
|
|
34
|
+
name: string;
|
|
35
|
+
timestamps?: {
|
|
36
|
+
createdAt: string;
|
|
37
|
+
updatedAt: string;
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
/** リソースごとの設定 */
|
|
41
|
+
resources: {
|
|
42
|
+
[resourceName: string]: {
|
|
43
|
+
/** ソート可能なフィールド定義 */
|
|
44
|
+
shadows: {
|
|
45
|
+
[fieldName: string]: {
|
|
46
|
+
/** フィールドの型 */
|
|
47
|
+
type: 'string' | 'number' | 'datetime' | 'boolean';
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
/** デフォルトソート設定 */
|
|
51
|
+
sortDefaults: {
|
|
52
|
+
field: string;
|
|
53
|
+
order: 'ASC' | 'DESC';
|
|
54
|
+
};
|
|
55
|
+
/** TTL設定(オプション) */
|
|
56
|
+
ttl?: {
|
|
57
|
+
days: number;
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* シャドー設定を取得(キャッシュ付き)
|
|
64
|
+
*
|
|
65
|
+
* 環境変数SHADOW_CONFIGからbase64エンコードされたJSON文字列をデコードしてパースして取得。
|
|
66
|
+
* 初回呼び出し時のみパース処理を行い、以降はキャッシュを使用。
|
|
67
|
+
*
|
|
68
|
+
* @returns シャドー設定
|
|
69
|
+
* @throws 環境変数が未設定、または不正な形式の場合
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```typescript
|
|
73
|
+
* const config = getShadowConfig();
|
|
74
|
+
* const articleSchema = getResourceSchema(config, 'articles');
|
|
75
|
+
* const shadows = generateShadowRecords(record, articleSchema);
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
export declare function getShadowConfig(): ShadowConfig;
|
|
79
|
+
/**
|
|
80
|
+
* 特定のリソースのシャドースキーマを取得する
|
|
81
|
+
*
|
|
82
|
+
* @param config - シャドー設定全体
|
|
83
|
+
* @param resourceName - リソース名(例: 'articles', 'tasks')
|
|
84
|
+
* @returns シャドースキーマ
|
|
85
|
+
* @throws リソースが設定に存在しない場合
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* ```typescript
|
|
89
|
+
* const config = getShadowConfig();
|
|
90
|
+
* const schema = getResourceSchema(config, 'articles');
|
|
91
|
+
* // => { resource: 'articles', sortableFields: { name: { type: 'string' }, ... } }
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
export declare function getResourceSchema(config: ShadowConfig, resourceName: string): ShadowSchema;
|
|
95
|
+
/**
|
|
96
|
+
* 設定ハッシュを取得
|
|
97
|
+
*
|
|
98
|
+
* レコード作成時にメタデータとして保存するために使用。
|
|
99
|
+
* SHADOW_CONFIG環境変数(base64エンコードされたJSON)からSHA-256ハッシュを生成する。
|
|
100
|
+
*
|
|
101
|
+
* @returns 設定ハッシュ(SHA-256)
|
|
102
|
+
*/
|
|
103
|
+
export declare function getShadowConfigHash(): string;
|
|
104
|
+
/**
|
|
105
|
+
* スキーマバージョンを取得
|
|
106
|
+
*
|
|
107
|
+
* レコード作成時にメタデータとして保存するために使用。
|
|
108
|
+
*
|
|
109
|
+
* @returns スキーマバージョン
|
|
110
|
+
*/
|
|
111
|
+
export declare function getSchemaVersion(): string;
|
|
112
|
+
/**
|
|
113
|
+
* キャッシュをクリアする(テスト用)
|
|
114
|
+
*
|
|
115
|
+
* 本番環境では使用しないこと。
|
|
116
|
+
* テスト環境でのみ、テスト間でキャッシュをクリアするために使用。
|
|
117
|
+
*/
|
|
118
|
+
export declare function clearShadowConfigCache(): void;
|
|
119
|
+
/**
|
|
120
|
+
* リソースの全シャドーフィールドを取得する
|
|
121
|
+
*
|
|
122
|
+
* @param config - シャドー設定全体
|
|
123
|
+
* @param resourceName - リソース名
|
|
124
|
+
* @returns 全シャドーフィールドの設定
|
|
125
|
+
*/
|
|
126
|
+
export declare function getAllShadowFields(config: ShadowConfig, resourceName: string): Record<string, ShadowFieldConfig>;
|
|
127
|
+
/**
|
|
128
|
+
* 指定されたフィールドが有効なシャドーフィールドかどうかを検証する
|
|
129
|
+
*
|
|
130
|
+
* @param config - シャドー設定全体
|
|
131
|
+
* @param resourceName - リソース名
|
|
132
|
+
* @param fieldName - 検証するフィールド名
|
|
133
|
+
* @returns フィールドが有効な場合true
|
|
134
|
+
*/
|
|
135
|
+
export declare function isValidShadowField(config: ShadowConfig, resourceName: string, fieldName: string): boolean;
|
|
136
|
+
/**
|
|
137
|
+
* リソースのデフォルトソート設定を取得する
|
|
138
|
+
*
|
|
139
|
+
* @param config - シャドー設定全体
|
|
140
|
+
* @param resourceName - リソース名
|
|
141
|
+
* @returns デフォルトソート設定
|
|
142
|
+
*/
|
|
143
|
+
export declare function getDefaultSort(config: ShadowConfig, resourceName: string): {
|
|
144
|
+
field: string;
|
|
145
|
+
order: 'ASC' | 'DESC';
|
|
146
|
+
};
|
|
147
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/server/shadow/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,gBAAgB;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW;IACX,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe;IACf,QAAQ,CAAC,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,CAAC,EAAE;YACX,SAAS,EAAE,MAAM,CAAC;YAClB,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC;KACH,CAAC;IACF,gBAAgB;IAChB,SAAS,EAAE;QACT,CAAC,YAAY,EAAE,MAAM,GAAG;YACtB,oBAAoB;YACpB,OAAO,EAAE;gBACP,CAAC,SAAS,EAAE,MAAM,GAAG;oBACnB,cAAc;oBACd,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;iBACpD,CAAC;aACH,CAAC;YACF,iBAAiB;YACjB,YAAY,EAAE;gBACZ,KAAK,EAAE,MAAM,CAAC;gBACd,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC;aACvB,CAAC;YACF,mBAAmB;YACnB,GAAG,CAAC,EAAE;gBACJ,IAAI,EAAE,MAAM,CAAC;aACd,CAAC;SACH,CAAC;KACH,CAAC;CACH;AAOD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,IAAI,YAAY,CA8B9C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,GAAG,YAAY,CAW1F;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAiB5C;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAGzC;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,MAAM,GACnB,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAQnC;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAChB,OAAO,CAOT;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,MAAM,GACnB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAAA;CAAE,CAQ1C"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* グローバル変数にキャッシュ(Lambda実行環境で再利用)
|
|
3
|
+
*/
|
|
4
|
+
let cachedShadowConfig = null;
|
|
5
|
+
/**
|
|
6
|
+
* シャドー設定を取得(キャッシュ付き)
|
|
7
|
+
*
|
|
8
|
+
* 環境変数SHADOW_CONFIGからbase64エンコードされたJSON文字列をデコードしてパースして取得。
|
|
9
|
+
* 初回呼び出し時のみパース処理を行い、以降はキャッシュを使用。
|
|
10
|
+
*
|
|
11
|
+
* @returns シャドー設定
|
|
12
|
+
* @throws 環境変数が未設定、または不正な形式の場合
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* const config = getShadowConfig();
|
|
17
|
+
* const articleSchema = getResourceSchema(config, 'articles');
|
|
18
|
+
* const shadows = generateShadowRecords(record, articleSchema);
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export function getShadowConfig() {
|
|
22
|
+
if (!cachedShadowConfig) {
|
|
23
|
+
const configBase64 = process.env.SHADOW_CONFIG;
|
|
24
|
+
if (!configBase64) {
|
|
25
|
+
throw new Error('SHADOW_CONFIG environment variable is not set');
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
// Base64デコード
|
|
29
|
+
const configJson = Buffer.from(configBase64, 'base64').toString('utf-8');
|
|
30
|
+
cachedShadowConfig = JSON.parse(configJson);
|
|
31
|
+
// 基本的なバリデーション
|
|
32
|
+
if (!cachedShadowConfig.$schemaVersion) {
|
|
33
|
+
throw new Error('Missing $schemaVersion in shadow config');
|
|
34
|
+
}
|
|
35
|
+
if (!cachedShadowConfig.resources || typeof cachedShadowConfig.resources !== 'object') {
|
|
36
|
+
throw new Error('Missing or invalid resources in shadow config');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
if (error instanceof SyntaxError) {
|
|
41
|
+
throw new Error(`Invalid JSON in SHADOW_CONFIG environment variable: ${error.message}`);
|
|
42
|
+
}
|
|
43
|
+
throw error;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return cachedShadowConfig;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 特定のリソースのシャドースキーマを取得する
|
|
50
|
+
*
|
|
51
|
+
* @param config - シャドー設定全体
|
|
52
|
+
* @param resourceName - リソース名(例: 'articles', 'tasks')
|
|
53
|
+
* @returns シャドースキーマ
|
|
54
|
+
* @throws リソースが設定に存在しない場合
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```typescript
|
|
58
|
+
* const config = getShadowConfig();
|
|
59
|
+
* const schema = getResourceSchema(config, 'articles');
|
|
60
|
+
* // => { resource: 'articles', sortableFields: { name: { type: 'string' }, ... } }
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export function getResourceSchema(config, resourceName) {
|
|
64
|
+
const resourceConfig = config.resources[resourceName];
|
|
65
|
+
if (!resourceConfig) {
|
|
66
|
+
throw new Error(`Resource '${resourceName}' not found in shadow config`);
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
resource: resourceName,
|
|
70
|
+
sortableFields: resourceConfig.shadows,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* 設定ハッシュを取得
|
|
75
|
+
*
|
|
76
|
+
* レコード作成時にメタデータとして保存するために使用。
|
|
77
|
+
* SHADOW_CONFIG環境変数(base64エンコードされたJSON)からSHA-256ハッシュを生成する。
|
|
78
|
+
*
|
|
79
|
+
* @returns 設定ハッシュ(SHA-256)
|
|
80
|
+
*/
|
|
81
|
+
export function getShadowConfigHash() {
|
|
82
|
+
// 設定をロード(キャッシュされていなければロードされる)
|
|
83
|
+
getShadowConfig();
|
|
84
|
+
// 環境変数 SHADOW_CONFIG は Terraform により base64 エンコードされた JSON として設定される
|
|
85
|
+
// この値をハッシュ化することで、設定の変更を検知できる
|
|
86
|
+
const configBase64 = process.env.SHADOW_CONFIG;
|
|
87
|
+
if (!configBase64) {
|
|
88
|
+
throw new Error('SHADOW_CONFIG environment variable is not set');
|
|
89
|
+
}
|
|
90
|
+
// Node.js の crypto モジュールを使用してハッシュを計算
|
|
91
|
+
// Lambda 環境では crypto は標準モジュール
|
|
92
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
93
|
+
const crypto = require('crypto');
|
|
94
|
+
const hash = crypto.createHash('sha256').update(configBase64).digest('hex');
|
|
95
|
+
return hash;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* スキーマバージョンを取得
|
|
99
|
+
*
|
|
100
|
+
* レコード作成時にメタデータとして保存するために使用。
|
|
101
|
+
*
|
|
102
|
+
* @returns スキーマバージョン
|
|
103
|
+
*/
|
|
104
|
+
export function getSchemaVersion() {
|
|
105
|
+
const config = getShadowConfig();
|
|
106
|
+
return config.$schemaVersion;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* キャッシュをクリアする(テスト用)
|
|
110
|
+
*
|
|
111
|
+
* 本番環境では使用しないこと。
|
|
112
|
+
* テスト環境でのみ、テスト間でキャッシュをクリアするために使用。
|
|
113
|
+
*/
|
|
114
|
+
export function clearShadowConfigCache() {
|
|
115
|
+
cachedShadowConfig = null;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* リソースの全シャドーフィールドを取得する
|
|
119
|
+
*
|
|
120
|
+
* @param config - シャドー設定全体
|
|
121
|
+
* @param resourceName - リソース名
|
|
122
|
+
* @returns 全シャドーフィールドの設定
|
|
123
|
+
*/
|
|
124
|
+
export function getAllShadowFields(config, resourceName) {
|
|
125
|
+
const resourceConfig = config.resources[resourceName];
|
|
126
|
+
if (!resourceConfig) {
|
|
127
|
+
throw new Error(`Resource '${resourceName}' not found in shadow config`);
|
|
128
|
+
}
|
|
129
|
+
return resourceConfig.shadows;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* 指定されたフィールドが有効なシャドーフィールドかどうかを検証する
|
|
133
|
+
*
|
|
134
|
+
* @param config - シャドー設定全体
|
|
135
|
+
* @param resourceName - リソース名
|
|
136
|
+
* @param fieldName - 検証するフィールド名
|
|
137
|
+
* @returns フィールドが有効な場合true
|
|
138
|
+
*/
|
|
139
|
+
export function isValidShadowField(config, resourceName, fieldName) {
|
|
140
|
+
try {
|
|
141
|
+
const allFields = getAllShadowFields(config, resourceName);
|
|
142
|
+
return fieldName in allFields;
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* リソースのデフォルトソート設定を取得する
|
|
150
|
+
*
|
|
151
|
+
* @param config - シャドー設定全体
|
|
152
|
+
* @param resourceName - リソース名
|
|
153
|
+
* @returns デフォルトソート設定
|
|
154
|
+
*/
|
|
155
|
+
export function getDefaultSort(config, resourceName) {
|
|
156
|
+
const resourceConfig = config.resources[resourceName];
|
|
157
|
+
if (!resourceConfig) {
|
|
158
|
+
throw new Error(`Resource '${resourceName}' not found in shadow config`);
|
|
159
|
+
}
|
|
160
|
+
return resourceConfig.sortDefaults;
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/server/shadow/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { ShadowDiff } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* 旧シャドーキーと新シャドーキーの差分を計算する
|
|
4
|
+
*
|
|
5
|
+
* この関数は、レコード更新時に既存のシャドーレコードと新しく生成すべき
|
|
6
|
+
* シャドーレコードを比較し、削除すべきものと追加すべきものを特定します。
|
|
7
|
+
*
|
|
8
|
+
* @param oldShadowKeys - 既存のシャドーSKの配列
|
|
9
|
+
* @param newShadowKeys - 新しく生成されたシャドーSKの配列
|
|
10
|
+
* @returns 削除すべきSKと追加すべきSKのリスト
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* const oldKeys = [
|
|
14
|
+
* 'name#Old#Name#id#01HZXY123',
|
|
15
|
+
* 'priority#00000000000000000010#id#01HZXY123'
|
|
16
|
+
* ];
|
|
17
|
+
* const newKeys = [
|
|
18
|
+
* 'name#New#Name#id#01HZXY123',
|
|
19
|
+
* 'priority#00000000000000000010#id#01HZXY123'
|
|
20
|
+
* ];
|
|
21
|
+
* const diff = calculateShadowDiff(oldKeys, newKeys);
|
|
22
|
+
* // => {
|
|
23
|
+
* // toDelete: ['name#Old#Name#id#01HZXY123'],
|
|
24
|
+
* // toAdd: ['name#New#Name#id#01HZXY123']
|
|
25
|
+
* // }
|
|
26
|
+
*/
|
|
27
|
+
export declare function calculateShadowDiff(oldShadowKeys: string[], newShadowKeys: string[]): ShadowDiff;
|
|
28
|
+
/**
|
|
29
|
+
* シャドー差分が空かどうかを判定する
|
|
30
|
+
*
|
|
31
|
+
* @param diff - シャドー差分オブジェクト
|
|
32
|
+
* @returns 差分が空の場合true
|
|
33
|
+
*/
|
|
34
|
+
export declare function isDiffEmpty(diff: ShadowDiff): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* 複数のシャドー差分をマージする
|
|
37
|
+
*
|
|
38
|
+
* @param diffs - マージするシャドー差分の配列
|
|
39
|
+
* @returns マージされたシャドー差分
|
|
40
|
+
*/
|
|
41
|
+
export declare function mergeShadowDiffs(diffs: ShadowDiff[]): ShadowDiff;
|
|
42
|
+
//# sourceMappingURL=differ.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"differ.d.ts","sourceRoot":"","sources":["../../../src/server/shadow/differ.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,UAAU,CAehG;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAErD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,UAAU,CAahE"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 旧シャドーキーと新シャドーキーの差分を計算する
|
|
3
|
+
*
|
|
4
|
+
* この関数は、レコード更新時に既存のシャドーレコードと新しく生成すべき
|
|
5
|
+
* シャドーレコードを比較し、削除すべきものと追加すべきものを特定します。
|
|
6
|
+
*
|
|
7
|
+
* @param oldShadowKeys - 既存のシャドーSKの配列
|
|
8
|
+
* @param newShadowKeys - 新しく生成されたシャドーSKの配列
|
|
9
|
+
* @returns 削除すべきSKと追加すべきSKのリスト
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* const oldKeys = [
|
|
13
|
+
* 'name#Old#Name#id#01HZXY123',
|
|
14
|
+
* 'priority#00000000000000000010#id#01HZXY123'
|
|
15
|
+
* ];
|
|
16
|
+
* const newKeys = [
|
|
17
|
+
* 'name#New#Name#id#01HZXY123',
|
|
18
|
+
* 'priority#00000000000000000010#id#01HZXY123'
|
|
19
|
+
* ];
|
|
20
|
+
* const diff = calculateShadowDiff(oldKeys, newKeys);
|
|
21
|
+
* // => {
|
|
22
|
+
* // toDelete: ['name#Old#Name#id#01HZXY123'],
|
|
23
|
+
* // toAdd: ['name#New#Name#id#01HZXY123']
|
|
24
|
+
* // }
|
|
25
|
+
*/
|
|
26
|
+
export function calculateShadowDiff(oldShadowKeys, newShadowKeys) {
|
|
27
|
+
// Set を使用して効率的な差分計算を行う
|
|
28
|
+
const oldSet = new Set(oldShadowKeys);
|
|
29
|
+
const newSet = new Set(newShadowKeys);
|
|
30
|
+
// 削除すべきキー: 旧キーに存在するが新キーに存在しない
|
|
31
|
+
const toDelete = oldShadowKeys.filter((key) => !newSet.has(key));
|
|
32
|
+
// 追加すべきキー: 新キーに存在するが旧キーに存在しない
|
|
33
|
+
const toAdd = newShadowKeys.filter((key) => !oldSet.has(key));
|
|
34
|
+
return {
|
|
35
|
+
toDelete,
|
|
36
|
+
toAdd,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* シャドー差分が空かどうかを判定する
|
|
41
|
+
*
|
|
42
|
+
* @param diff - シャドー差分オブジェクト
|
|
43
|
+
* @returns 差分が空の場合true
|
|
44
|
+
*/
|
|
45
|
+
export function isDiffEmpty(diff) {
|
|
46
|
+
return diff.toDelete.length === 0 && diff.toAdd.length === 0;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 複数のシャドー差分をマージする
|
|
50
|
+
*
|
|
51
|
+
* @param diffs - マージするシャドー差分の配列
|
|
52
|
+
* @returns マージされたシャドー差分
|
|
53
|
+
*/
|
|
54
|
+
export function mergeShadowDiffs(diffs) {
|
|
55
|
+
const allToDelete = new Set();
|
|
56
|
+
const allToAdd = new Set();
|
|
57
|
+
for (const diff of diffs) {
|
|
58
|
+
diff.toDelete.forEach((key) => allToDelete.add(key));
|
|
59
|
+
diff.toAdd.forEach((key) => allToAdd.add(key));
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
toDelete: Array.from(allToDelete),
|
|
63
|
+
toAdd: Array.from(allToAdd),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=differ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"differ.js","sourceRoot":"","sources":["../../../src/server/shadow/differ.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,mBAAmB,CAAC,aAAuB,EAAE,aAAuB;IAClF,uBAAuB;IACvB,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;IAEtC,8BAA8B;IAC9B,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAEjE,8BAA8B;IAC9B,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAE9D,OAAO;QACL,QAAQ;QACR,KAAK;KACN,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,IAAgB;IAC1C,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;AAC/D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAmB;IAClD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IAEnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;QACjC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;KAC5B,CAAC;AACJ,CAAC"}
|