@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,364 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* react-admin データプロバイダー
|
|
3
|
+
* DynamoDB Client SDK を使用して Records Lambda Function URL と通信
|
|
4
|
+
* react-admin 完全準拠の10操作を実装
|
|
5
|
+
*
|
|
6
|
+
* MongoDB風のシンプルなAPIでDynamoDBを操作:
|
|
7
|
+
* - collection.find().sort().limit().toArray() でレコード取得
|
|
8
|
+
* - collection.insertOne() / insertMany() でレコード作成
|
|
9
|
+
* - collection.updateOne() / updateMany() でレコード更新
|
|
10
|
+
* - collection.deleteOne() / deleteMany() でレコード削除
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* import { createDataProvider } from '@exabugs/dynamodb-client/integrations/react-admin';
|
|
15
|
+
* import type { TokenProvider } from '@exabugs/dynamodb-client/integrations/react-admin';
|
|
16
|
+
*
|
|
17
|
+
* const tokenProvider: TokenProvider = {
|
|
18
|
+
* getToken: async () => {
|
|
19
|
+
* // 認証トークンを取得するロジック
|
|
20
|
+
* return 'your-auth-token';
|
|
21
|
+
* },
|
|
22
|
+
* };
|
|
23
|
+
*
|
|
24
|
+
* const dataProvider = createDataProvider({
|
|
25
|
+
* apiUrl: 'https://your-lambda-url.amazonaws.com',
|
|
26
|
+
* databaseName: 'your-database',
|
|
27
|
+
* tokenProvider,
|
|
28
|
+
* defaultPerPage: 25,
|
|
29
|
+
* defaultSortField: 'updatedAt',
|
|
30
|
+
* defaultSortOrder: 'DESC',
|
|
31
|
+
* });
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
import { DynamoClient } from '../../client/index.cognito.js';
|
|
35
|
+
/**
|
|
36
|
+
* react-adminのフィルタをDynamoDB Client SDKのFilter型に変換
|
|
37
|
+
*
|
|
38
|
+
* @param filter - react-adminのフィルタオブジェクト
|
|
39
|
+
* @returns DynamoDB Client SDKのFilter型
|
|
40
|
+
*/
|
|
41
|
+
function convertFilter(filter) {
|
|
42
|
+
const converted = {};
|
|
43
|
+
for (const [key, value] of Object.entries(filter)) {
|
|
44
|
+
// 値がオブジェクトの場合、演算子として扱う
|
|
45
|
+
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
46
|
+
converted[key] = value;
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
// 単純な値の場合、等価比較として扱う
|
|
50
|
+
converted[key] = value;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return converted;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* react-adminのソート順をDynamoDB Client SDKの形式に変換
|
|
57
|
+
*
|
|
58
|
+
* @param field - ソートフィールド
|
|
59
|
+
* @param order - ソート順('ASC' | 'DESC')
|
|
60
|
+
* @returns DynamoDB Client SDKのソート形式
|
|
61
|
+
*/
|
|
62
|
+
function convertSort(field, order) {
|
|
63
|
+
return {
|
|
64
|
+
[field]: order === 'DESC' ? 'desc' : 'asc',
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* nextTokenキャッシュ
|
|
69
|
+
* リソースごとに、ページ番号とnextTokenのマッピングを保持
|
|
70
|
+
*/
|
|
71
|
+
const nextTokenCache = {};
|
|
72
|
+
/**
|
|
73
|
+
* nextTokenキャッシュをクリア
|
|
74
|
+
*/
|
|
75
|
+
function clearNextTokenCache(resource) {
|
|
76
|
+
delete nextTokenCache[resource];
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* nextTokenをキャッシュに保存
|
|
80
|
+
*/
|
|
81
|
+
function cacheNextToken(resource, page, nextToken) {
|
|
82
|
+
if (!nextTokenCache[resource]) {
|
|
83
|
+
nextTokenCache[resource] = {};
|
|
84
|
+
}
|
|
85
|
+
nextTokenCache[resource][page] = nextToken;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* キャッシュからnextTokenを取得
|
|
89
|
+
*
|
|
90
|
+
* page=2の場合、1ページ目の結果から得たnextTokenを使用する
|
|
91
|
+
*/
|
|
92
|
+
function getNextTokenFromCache(resource, page) {
|
|
93
|
+
return nextTokenCache[resource]?.[page];
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* DynamoDB Client ベースの DataProvider を作成
|
|
97
|
+
*
|
|
98
|
+
* @param options - DataProviderオプション
|
|
99
|
+
* @returns react-admin DataProvider
|
|
100
|
+
*/
|
|
101
|
+
export function createDataProvider(options) {
|
|
102
|
+
const { apiUrl, databaseName, tokenProvider, defaultPerPage = 25, defaultSortField = 'id', defaultSortOrder = 'ASC', } = options;
|
|
103
|
+
/**
|
|
104
|
+
* DynamoDB Client インスタンスを作成
|
|
105
|
+
*
|
|
106
|
+
* Cognito認証を使用してLambda Function URLに接続します。
|
|
107
|
+
*/
|
|
108
|
+
function createClient() {
|
|
109
|
+
return new DynamoClient(apiUrl, {
|
|
110
|
+
auth: {
|
|
111
|
+
getToken: async () => {
|
|
112
|
+
const token = await tokenProvider.getToken();
|
|
113
|
+
if (!token) {
|
|
114
|
+
throw new Error('認証トークンが見つかりません');
|
|
115
|
+
}
|
|
116
|
+
return token;
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
return {
|
|
122
|
+
/**
|
|
123
|
+
* getList - リスト取得(フィルター・ソート対応)
|
|
124
|
+
*/
|
|
125
|
+
getList: async (resource, params) => {
|
|
126
|
+
const client = createClient();
|
|
127
|
+
await client.connect();
|
|
128
|
+
try {
|
|
129
|
+
const { page = 1, perPage = defaultPerPage } = params.pagination || {};
|
|
130
|
+
const { field = defaultSortField, order = defaultSortOrder } = params.sort || {};
|
|
131
|
+
const filter = params.filter || {};
|
|
132
|
+
const db = client.db(databaseName);
|
|
133
|
+
const collection = db.collection(resource);
|
|
134
|
+
// フィルターまたはソートが変更された場合、キャッシュをクリア
|
|
135
|
+
// (新しいクエリなので、nextTokenをリセット)
|
|
136
|
+
const filterKey = JSON.stringify(filter);
|
|
137
|
+
const sortKey = `${field}:${order}`;
|
|
138
|
+
const cacheKey = `${filterKey}:${sortKey}`;
|
|
139
|
+
if (!nextTokenCache[resource] || nextTokenCache[resource]._cacheKey !== cacheKey) {
|
|
140
|
+
clearNextTokenCache(resource);
|
|
141
|
+
nextTokenCache[resource] = { _cacheKey: cacheKey };
|
|
142
|
+
}
|
|
143
|
+
// ページ番号からnextTokenを取得
|
|
144
|
+
const nextToken = page > 1 ? getNextTokenFromCache(resource, page) : undefined;
|
|
145
|
+
// MongoDB風のクエリでレコードを取得
|
|
146
|
+
const cursor = collection.find(convertFilter(filter), {
|
|
147
|
+
sort: convertSort(field, order),
|
|
148
|
+
limit: perPage,
|
|
149
|
+
nextToken, // nextTokenを渡す
|
|
150
|
+
});
|
|
151
|
+
const items = await cursor.toArray();
|
|
152
|
+
const pageInfo = await cursor.getPageInfo();
|
|
153
|
+
// 次のページのnextTokenをキャッシュ
|
|
154
|
+
if (pageInfo.nextToken) {
|
|
155
|
+
cacheNextToken(resource, page + 1, pageInfo.nextToken);
|
|
156
|
+
}
|
|
157
|
+
// react-admin v5 の期待する形式で返却
|
|
158
|
+
// pageInfo を使用(total は不要)
|
|
159
|
+
return {
|
|
160
|
+
data: items,
|
|
161
|
+
pageInfo: {
|
|
162
|
+
hasNextPage: pageInfo.hasNextPage,
|
|
163
|
+
hasPreviousPage: page > 1,
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
finally {
|
|
168
|
+
await client.close();
|
|
169
|
+
}
|
|
170
|
+
},
|
|
171
|
+
/**
|
|
172
|
+
* getOne - 単一レコード取得
|
|
173
|
+
*/
|
|
174
|
+
getOne: async (resource, params) => {
|
|
175
|
+
const client = createClient();
|
|
176
|
+
await client.connect();
|
|
177
|
+
try {
|
|
178
|
+
const db = client.db(databaseName);
|
|
179
|
+
const collection = db.collection(resource);
|
|
180
|
+
// IDでレコードを検索(デフォルトソートを指定)
|
|
181
|
+
const items = await collection
|
|
182
|
+
.find({ id: String(params.id) })
|
|
183
|
+
.sort({ id: 'asc' })
|
|
184
|
+
.limit(1)
|
|
185
|
+
.toArray();
|
|
186
|
+
if (items.length === 0) {
|
|
187
|
+
throw new Error(`Record not found: ${params.id}`);
|
|
188
|
+
}
|
|
189
|
+
return { data: items[0] };
|
|
190
|
+
}
|
|
191
|
+
finally {
|
|
192
|
+
await client.close();
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
/**
|
|
196
|
+
* getMany - 複数レコード取得(ID指定)
|
|
197
|
+
*/
|
|
198
|
+
getMany: async (resource, params) => {
|
|
199
|
+
const client = createClient();
|
|
200
|
+
await client.connect();
|
|
201
|
+
try {
|
|
202
|
+
const db = client.db(databaseName);
|
|
203
|
+
const collection = db.collection(resource);
|
|
204
|
+
// IDの配列でレコードを検索(デフォルトソートを指定)
|
|
205
|
+
const items = await collection
|
|
206
|
+
.find({ id: { in: params.ids.map(String) } })
|
|
207
|
+
.sort({ id: 'asc' })
|
|
208
|
+
.toArray();
|
|
209
|
+
return { data: items };
|
|
210
|
+
}
|
|
211
|
+
finally {
|
|
212
|
+
await client.close();
|
|
213
|
+
}
|
|
214
|
+
},
|
|
215
|
+
/**
|
|
216
|
+
* getManyReference - 参照レコード取得(外部キー対応)
|
|
217
|
+
*/
|
|
218
|
+
getManyReference: async (resource, params) => {
|
|
219
|
+
const client = createClient();
|
|
220
|
+
await client.connect();
|
|
221
|
+
try {
|
|
222
|
+
const { perPage = defaultPerPage } = params.pagination || {};
|
|
223
|
+
const { field = defaultSortField, order = defaultSortOrder } = params.sort || {};
|
|
224
|
+
const filter = params.filter || {};
|
|
225
|
+
const db = client.db(databaseName);
|
|
226
|
+
const collection = db.collection(resource);
|
|
227
|
+
// 外部キーフィルタを追加
|
|
228
|
+
const combinedFilter = {
|
|
229
|
+
...convertFilter(filter),
|
|
230
|
+
[params.target]: String(params.id),
|
|
231
|
+
};
|
|
232
|
+
// MongoDB風のクエリでレコードを取得
|
|
233
|
+
const items = await collection
|
|
234
|
+
.find(combinedFilter)
|
|
235
|
+
.sort(convertSort(field, order))
|
|
236
|
+
.limit(perPage)
|
|
237
|
+
.toArray();
|
|
238
|
+
// hasNextPageの判定はgetListと同じロジック(無限スクロール対応)
|
|
239
|
+
return {
|
|
240
|
+
data: items,
|
|
241
|
+
pageInfo: {
|
|
242
|
+
hasNextPage: items.length === perPage,
|
|
243
|
+
hasPreviousPage: false,
|
|
244
|
+
},
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
finally {
|
|
248
|
+
await client.close();
|
|
249
|
+
}
|
|
250
|
+
},
|
|
251
|
+
/**
|
|
252
|
+
* create - 単一レコード作成
|
|
253
|
+
*/
|
|
254
|
+
create: async (resource, params) => {
|
|
255
|
+
const client = createClient();
|
|
256
|
+
await client.connect();
|
|
257
|
+
try {
|
|
258
|
+
const db = client.db(databaseName);
|
|
259
|
+
const collection = db.collection(resource);
|
|
260
|
+
// レコードを挿入
|
|
261
|
+
const result = await collection.insertOne({
|
|
262
|
+
...params.data,
|
|
263
|
+
id: params.data.id || undefined,
|
|
264
|
+
});
|
|
265
|
+
// 挿入されたレコードを取得して返却
|
|
266
|
+
const items = await collection.find({ id: result.insertedId }).limit(1).toArray();
|
|
267
|
+
return { data: items[0] };
|
|
268
|
+
}
|
|
269
|
+
finally {
|
|
270
|
+
await client.close();
|
|
271
|
+
}
|
|
272
|
+
},
|
|
273
|
+
/**
|
|
274
|
+
* update - 単一レコード更新
|
|
275
|
+
*/
|
|
276
|
+
update: async (resource, params) => {
|
|
277
|
+
const client = createClient();
|
|
278
|
+
await client.connect();
|
|
279
|
+
try {
|
|
280
|
+
const db = client.db(databaseName);
|
|
281
|
+
const collection = db.collection(resource);
|
|
282
|
+
// レコードを更新
|
|
283
|
+
await collection.updateOne({ id: String(params.id) }, {
|
|
284
|
+
set: params.data,
|
|
285
|
+
});
|
|
286
|
+
// 更新されたレコードを取得して返却(デフォルトソートを指定)
|
|
287
|
+
const items = await collection
|
|
288
|
+
.find({ id: String(params.id) })
|
|
289
|
+
.sort({ id: 'asc' })
|
|
290
|
+
.limit(1)
|
|
291
|
+
.toArray();
|
|
292
|
+
return { data: items[0] };
|
|
293
|
+
}
|
|
294
|
+
finally {
|
|
295
|
+
await client.close();
|
|
296
|
+
}
|
|
297
|
+
},
|
|
298
|
+
/**
|
|
299
|
+
* updateMany - 複数レコード一括更新
|
|
300
|
+
*/
|
|
301
|
+
updateMany: async (resource, params) => {
|
|
302
|
+
const client = createClient();
|
|
303
|
+
await client.connect();
|
|
304
|
+
try {
|
|
305
|
+
const db = client.db(databaseName);
|
|
306
|
+
const collection = db.collection(resource);
|
|
307
|
+
// 複数レコードを更新
|
|
308
|
+
await collection.updateMany({ id: { in: params.ids.map(String) } }, {
|
|
309
|
+
set: params.data,
|
|
310
|
+
});
|
|
311
|
+
// react-adminは更新されたIDの配列を期待
|
|
312
|
+
return { data: params.ids.map(String) };
|
|
313
|
+
}
|
|
314
|
+
finally {
|
|
315
|
+
await client.close();
|
|
316
|
+
}
|
|
317
|
+
},
|
|
318
|
+
/**
|
|
319
|
+
* delete - 単一レコード削除
|
|
320
|
+
*/
|
|
321
|
+
delete: async (resource, params) => {
|
|
322
|
+
const client = createClient();
|
|
323
|
+
await client.connect();
|
|
324
|
+
try {
|
|
325
|
+
const db = client.db(databaseName);
|
|
326
|
+
const collection = db.collection(resource);
|
|
327
|
+
// 削除前にレコードを取得(react-adminが削除されたレコードを期待するため、デフォルトソートを指定)
|
|
328
|
+
const items = await collection
|
|
329
|
+
.find({ id: String(params.id) })
|
|
330
|
+
.sort({ id: 'asc' })
|
|
331
|
+
.limit(1)
|
|
332
|
+
.toArray();
|
|
333
|
+
if (items.length === 0) {
|
|
334
|
+
throw new Error(`Record not found: ${params.id}`);
|
|
335
|
+
}
|
|
336
|
+
// レコードを削除
|
|
337
|
+
await collection.deleteOne({ id: String(params.id) });
|
|
338
|
+
return { data: items[0] };
|
|
339
|
+
}
|
|
340
|
+
finally {
|
|
341
|
+
await client.close();
|
|
342
|
+
}
|
|
343
|
+
},
|
|
344
|
+
/**
|
|
345
|
+
* deleteMany - 複数レコード一括削除
|
|
346
|
+
*/
|
|
347
|
+
deleteMany: async (resource, params) => {
|
|
348
|
+
const client = createClient();
|
|
349
|
+
await client.connect();
|
|
350
|
+
try {
|
|
351
|
+
const db = client.db(databaseName);
|
|
352
|
+
const collection = db.collection(resource);
|
|
353
|
+
// 複数レコードを削除
|
|
354
|
+
await collection.deleteMany({ id: { in: params.ids.map(String) } });
|
|
355
|
+
// react-adminは削除されたIDの配列を期待
|
|
356
|
+
return { data: params.ids.map(String) };
|
|
357
|
+
}
|
|
358
|
+
finally {
|
|
359
|
+
await client.close();
|
|
360
|
+
}
|
|
361
|
+
},
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
//# sourceMappingURL=dataProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataProvider.js","sourceRoot":"","sources":["../../../src/integrations/react-admin/dataProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* react-admin統合
|
|
3
|
+
*
|
|
4
|
+
* DynamoDB ClientをreactAdmin DataProviderとして使用するための統合モジュール。
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* import { createDataProvider } from '@exabugs/dynamodb-client/integrations/react-admin';
|
|
9
|
+
* import type { TokenProvider } from '@exabugs/dynamodb-client/integrations/react-admin';
|
|
10
|
+
*
|
|
11
|
+
* const tokenProvider: TokenProvider = {
|
|
12
|
+
* getToken: async () => 'your-auth-token',
|
|
13
|
+
* };
|
|
14
|
+
*
|
|
15
|
+
* const dataProvider = createDataProvider({
|
|
16
|
+
* apiUrl: 'https://your-lambda-url.amazonaws.com',
|
|
17
|
+
* databaseName: 'your-database',
|
|
18
|
+
* tokenProvider,
|
|
19
|
+
* });
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export { createDataProvider } from './dataProvider.js';
|
|
23
|
+
export type { TokenProvider, DataProviderOptions } from './types.js';
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/integrations/react-admin/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* react-admin統合
|
|
3
|
+
*
|
|
4
|
+
* DynamoDB ClientをreactAdmin DataProviderとして使用するための統合モジュール。
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* import { createDataProvider } from '@exabugs/dynamodb-client/integrations/react-admin';
|
|
9
|
+
* import type { TokenProvider } from '@exabugs/dynamodb-client/integrations/react-admin';
|
|
10
|
+
*
|
|
11
|
+
* const tokenProvider: TokenProvider = {
|
|
12
|
+
* getToken: async () => 'your-auth-token',
|
|
13
|
+
* };
|
|
14
|
+
*
|
|
15
|
+
* const dataProvider = createDataProvider({
|
|
16
|
+
* apiUrl: 'https://your-lambda-url.amazonaws.com',
|
|
17
|
+
* databaseName: 'your-database',
|
|
18
|
+
* tokenProvider,
|
|
19
|
+
* });
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export { createDataProvider } from './dataProvider.js';
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/integrations/react-admin/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* react-admin統合の型定義
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* トークンプロバイダーインターフェース
|
|
6
|
+
*
|
|
7
|
+
* 認証トークンを取得するための抽象化インターフェース。
|
|
8
|
+
* プロジェクト固有の認証ロジックを注入できます。
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* // Cognito認証の例
|
|
13
|
+
* const cognitoTokenProvider: TokenProvider = {
|
|
14
|
+
* getToken: async () => {
|
|
15
|
+
* const session = await Auth.currentSession();
|
|
16
|
+
* return session.getIdToken().getJwtToken();
|
|
17
|
+
* },
|
|
18
|
+
* };
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export interface TokenProvider {
|
|
22
|
+
/**
|
|
23
|
+
* 認証トークンを取得
|
|
24
|
+
*
|
|
25
|
+
* @returns 認証トークン(JWT、Bearer tokenなど)
|
|
26
|
+
* @throws トークンが取得できない場合はエラーをスロー
|
|
27
|
+
*/
|
|
28
|
+
getToken(): Promise<string>;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* DataProviderオプション
|
|
32
|
+
*/
|
|
33
|
+
export interface DataProviderOptions {
|
|
34
|
+
/** Records Lambda Function URL */
|
|
35
|
+
apiUrl: string;
|
|
36
|
+
/** データベース名 */
|
|
37
|
+
databaseName: string;
|
|
38
|
+
/** トークンプロバイダー */
|
|
39
|
+
tokenProvider: TokenProvider;
|
|
40
|
+
/** デフォルトのページサイズ(オプション、デフォルト: 25) */
|
|
41
|
+
defaultPerPage?: number;
|
|
42
|
+
/** デフォルトのソートフィールド(オプション、デフォルト: 'id') */
|
|
43
|
+
defaultSortField?: string;
|
|
44
|
+
/** デフォルトのソート順(オプション、デフォルト: 'ASC') */
|
|
45
|
+
defaultSortOrder?: 'ASC' | 'DESC';
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/integrations/react-admin/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;OAKG;IACH,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,kCAAkC;IAClC,MAAM,EAAE,MAAM,CAAC;IAEf,cAAc;IACd,YAAY,EAAE,MAAM,CAAC;IAErB,iBAAiB;IACjB,aAAa,EAAE,aAAa,CAAC;IAE7B,oCAAoC;IACpC,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,wCAAwC;IACxC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,qCAAqC;IACrC,gBAAgB,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CACnC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/integrations/react-admin/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/dist/logger.d.ts
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ログレベル
|
|
3
|
+
*/
|
|
4
|
+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
5
|
+
/**
|
|
6
|
+
* ログメタデータ
|
|
7
|
+
*/
|
|
8
|
+
export interface LogMetadata {
|
|
9
|
+
[key: string]: unknown;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* ロガー設定オプション
|
|
13
|
+
*/
|
|
14
|
+
export interface LoggerConfig {
|
|
15
|
+
/**
|
|
16
|
+
* ログレベル(デフォルト: 'info')
|
|
17
|
+
*/
|
|
18
|
+
level?: LogLevel;
|
|
19
|
+
/**
|
|
20
|
+
* サービス名(ログに含まれる)
|
|
21
|
+
*/
|
|
22
|
+
service?: string;
|
|
23
|
+
/**
|
|
24
|
+
* 環境名(ログに含まれる)
|
|
25
|
+
*/
|
|
26
|
+
env?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 構造化ロガーインターフェース
|
|
30
|
+
*/
|
|
31
|
+
export interface Logger {
|
|
32
|
+
debug(message: string, metadata?: LogMetadata): void;
|
|
33
|
+
info(message: string, metadata?: LogMetadata): void;
|
|
34
|
+
warn(message: string, metadata?: LogMetadata): void;
|
|
35
|
+
error(message: string, metadata?: LogMetadata): void;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* JSON形式で構造化ログを出力するロガーを作成する
|
|
39
|
+
*
|
|
40
|
+
* このロガーは、要件10.1に従い、CloudWatch Logsで解析可能なJSON形式でログを出力する。
|
|
41
|
+
* 各ログエントリには、タイムスタンプ、レベル、メッセージ、およびオプションのメタデータが含まれる。
|
|
42
|
+
*
|
|
43
|
+
* @param config - ロガー設定オプション
|
|
44
|
+
* @returns 構造化ロガーインスタンス
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```typescript
|
|
48
|
+
* const logger = createLogger({
|
|
49
|
+
* level: 'info',
|
|
50
|
+
* service: 'records-lambda',
|
|
51
|
+
* env: 'dev'
|
|
52
|
+
* });
|
|
53
|
+
*
|
|
54
|
+
* logger.info('Processing request', { requestId: '123', resource: 'articles' });
|
|
55
|
+
* // 出力: {"timestamp":"2025-11-12T10:00:00.000Z","level":"info","message":"Processing request","service":"records-lambda","env":"dev","requestId":"123","resource":"articles"}
|
|
56
|
+
*
|
|
57
|
+
* logger.error('Failed to process', { error: err.message });
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export declare function createLogger(config?: LoggerConfig): Logger;
|
|
61
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACrD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACpD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACpD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;CACtD;AAYD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,YAAY,CAAC,MAAM,GAAE,YAAiB,GAAG,MAAM,CAiE9D"}
|
package/dist/logger.js
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ログレベルの優先順位
|
|
3
|
+
*/
|
|
4
|
+
const LOG_LEVELS = {
|
|
5
|
+
debug: 0,
|
|
6
|
+
info: 1,
|
|
7
|
+
warn: 2,
|
|
8
|
+
error: 3,
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* JSON形式で構造化ログを出力するロガーを作成する
|
|
12
|
+
*
|
|
13
|
+
* このロガーは、要件10.1に従い、CloudWatch Logsで解析可能なJSON形式でログを出力する。
|
|
14
|
+
* 各ログエントリには、タイムスタンプ、レベル、メッセージ、およびオプションのメタデータが含まれる。
|
|
15
|
+
*
|
|
16
|
+
* @param config - ロガー設定オプション
|
|
17
|
+
* @returns 構造化ロガーインスタンス
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* const logger = createLogger({
|
|
22
|
+
* level: 'info',
|
|
23
|
+
* service: 'records-lambda',
|
|
24
|
+
* env: 'dev'
|
|
25
|
+
* });
|
|
26
|
+
*
|
|
27
|
+
* logger.info('Processing request', { requestId: '123', resource: 'articles' });
|
|
28
|
+
* // 出力: {"timestamp":"2025-11-12T10:00:00.000Z","level":"info","message":"Processing request","service":"records-lambda","env":"dev","requestId":"123","resource":"articles"}
|
|
29
|
+
*
|
|
30
|
+
* logger.error('Failed to process', { error: err.message });
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export function createLogger(config = {}) {
|
|
34
|
+
const { level = process.env.LOG_LEVEL || 'info', service = process.env.SERVICE_NAME, env = process.env.ENV, } = config;
|
|
35
|
+
const minLevel = LOG_LEVELS[level];
|
|
36
|
+
/**
|
|
37
|
+
* ログエントリを出力する内部関数
|
|
38
|
+
*/
|
|
39
|
+
function log(logLevel, message, metadata) {
|
|
40
|
+
// 設定されたログレベルより低い場合はスキップ
|
|
41
|
+
if (LOG_LEVELS[logLevel] < minLevel) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
// JSON形式のログエントリを構築
|
|
45
|
+
const logEntry = {
|
|
46
|
+
timestamp: new Date().toISOString(),
|
|
47
|
+
level: logLevel,
|
|
48
|
+
message,
|
|
49
|
+
};
|
|
50
|
+
// サービス名を追加
|
|
51
|
+
if (service) {
|
|
52
|
+
logEntry.service = service;
|
|
53
|
+
}
|
|
54
|
+
// 環境名を追加
|
|
55
|
+
if (env) {
|
|
56
|
+
logEntry.env = env;
|
|
57
|
+
}
|
|
58
|
+
// メタデータを追加
|
|
59
|
+
if (metadata) {
|
|
60
|
+
Object.assign(logEntry, metadata);
|
|
61
|
+
}
|
|
62
|
+
// JSON文字列として出力
|
|
63
|
+
const output = JSON.stringify(logEntry);
|
|
64
|
+
// ログレベルに応じて適切なストリームに出力
|
|
65
|
+
if (logLevel === 'error') {
|
|
66
|
+
console.error(output);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
console.log(output);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
debug(message, metadata) {
|
|
74
|
+
log('debug', message, metadata);
|
|
75
|
+
},
|
|
76
|
+
info(message, metadata) {
|
|
77
|
+
log('info', message, metadata);
|
|
78
|
+
},
|
|
79
|
+
warn(message, metadata) {
|
|
80
|
+
log('warn', message, metadata);
|
|
81
|
+
},
|
|
82
|
+
error(message, metadata) {
|
|
83
|
+
log('error', message, metadata);
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAwCA;;GAEG;AACH,MAAM,UAAU,GAA6B;IAC3C,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,YAAY,CAAC,SAAuB,EAAE;IACpD,MAAM,EACJ,KAAK,GAAI,OAAO,CAAC,GAAG,CAAC,SAAsB,IAAI,MAAM,EACrD,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,EAClC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,GACtB,GAAG,MAAM,CAAC;IAEX,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAEnC;;OAEG;IACH,SAAS,GAAG,CAAC,QAAkB,EAAE,OAAe,EAAE,QAAsB;QACtE,wBAAwB;QACxB,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,QAAQ,EAAE,CAAC;YACpC,OAAO;QACT,CAAC;QAED,mBAAmB;QACnB,MAAM,QAAQ,GAA4B;YACxC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,KAAK,EAAE,QAAQ;YACf,OAAO;SACR,CAAC;QAEF,WAAW;QACX,IAAI,OAAO,EAAE,CAAC;YACZ,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;QAC7B,CAAC;QAED,SAAS;QACT,IAAI,GAAG,EAAE,CAAC;YACR,QAAQ,CAAC,GAAG,GAAG,GAAG,CAAC;QACrB,CAAC;QAED,WAAW;QACX,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACpC,CAAC;QAED,eAAe;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAExC,uBAAuB;QACvB,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,CAAC,OAAe,EAAE,QAAsB;YAC3C,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,OAAe,EAAE,QAAsB;YAC1C,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QACjC,CAAC;QACD,IAAI,CAAC,OAAe,EAAE,QAAsB;YAC1C,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QACjC,CAAC;QACD,KAAK,CAAC,OAAe,EAAE,QAAsB;YAC3C,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAClC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repair-shadows.d.ts","sourceRoot":"","sources":["../../src/scripts/repair-shadows.ts"],"names":[],"mappings":""}
|