@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.
Files changed (230) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/LICENSE +21 -0
  3. package/README.md +283 -0
  4. package/dist/client/Collection.d.ts +57 -0
  5. package/dist/client/Collection.d.ts.map +1 -0
  6. package/dist/client/Collection.js +174 -0
  7. package/dist/client/Collection.js.map +1 -0
  8. package/dist/client/Database.d.ts +35 -0
  9. package/dist/client/Database.d.ts.map +1 -0
  10. package/dist/client/Database.js +48 -0
  11. package/dist/client/Database.js.map +1 -0
  12. package/dist/client/DynamoClient.d.ts +43 -0
  13. package/dist/client/DynamoClient.d.ts.map +1 -0
  14. package/dist/client/DynamoClient.js +62 -0
  15. package/dist/client/DynamoClient.js.map +1 -0
  16. package/dist/client/FindCursor.d.ts +174 -0
  17. package/dist/client/FindCursor.d.ts.map +1 -0
  18. package/dist/client/FindCursor.js +256 -0
  19. package/dist/client/FindCursor.js.map +1 -0
  20. package/dist/client/aws-sigv4.d.ts +10 -0
  21. package/dist/client/aws-sigv4.d.ts.map +1 -0
  22. package/dist/client/aws-sigv4.js +54 -0
  23. package/dist/client/aws-sigv4.js.map +1 -0
  24. package/dist/client/index.cognito.d.ts +34 -0
  25. package/dist/client/index.cognito.d.ts.map +1 -0
  26. package/dist/client/index.cognito.js +30 -0
  27. package/dist/client/index.cognito.js.map +1 -0
  28. package/dist/client/index.d.ts +12 -0
  29. package/dist/client/index.d.ts.map +1 -0
  30. package/dist/client/index.iam.d.ts +34 -0
  31. package/dist/client/index.iam.d.ts.map +1 -0
  32. package/dist/client/index.iam.js +28 -0
  33. package/dist/client/index.iam.js.map +1 -0
  34. package/dist/client/index.js +12 -0
  35. package/dist/client/index.js.map +1 -0
  36. package/dist/client/index.token.d.ts +33 -0
  37. package/dist/client/index.token.d.ts.map +1 -0
  38. package/dist/client/index.token.js +28 -0
  39. package/dist/client/index.token.js.map +1 -0
  40. package/dist/dynamodb.d.ts +20 -0
  41. package/dist/dynamodb.d.ts.map +1 -0
  42. package/dist/dynamodb.js +31 -0
  43. package/dist/dynamodb.js.map +1 -0
  44. package/dist/errors.d.ts +100 -0
  45. package/dist/errors.d.ts.map +1 -0
  46. package/dist/errors.js +146 -0
  47. package/dist/errors.js.map +1 -0
  48. package/dist/index.d.ts +10 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +7 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/integrations/react-admin/dataProvider.d.ts +59 -0
  53. package/dist/integrations/react-admin/dataProvider.d.ts.map +1 -0
  54. package/dist/integrations/react-admin/dataProvider.js +364 -0
  55. package/dist/integrations/react-admin/dataProvider.js.map +1 -0
  56. package/dist/integrations/react-admin/index.d.ts +24 -0
  57. package/dist/integrations/react-admin/index.d.ts.map +1 -0
  58. package/dist/integrations/react-admin/index.js +23 -0
  59. package/dist/integrations/react-admin/index.js.map +1 -0
  60. package/dist/integrations/react-admin/types.d.ts +47 -0
  61. package/dist/integrations/react-admin/types.d.ts.map +1 -0
  62. package/dist/integrations/react-admin/types.js +5 -0
  63. package/dist/integrations/react-admin/types.js.map +1 -0
  64. package/dist/logger.d.ts +61 -0
  65. package/dist/logger.d.ts.map +1 -0
  66. package/dist/logger.js +87 -0
  67. package/dist/logger.js.map +1 -0
  68. package/dist/scripts/repair-shadows.d.ts +3 -0
  69. package/dist/scripts/repair-shadows.d.ts.map +1 -0
  70. package/dist/scripts/repair-shadows.js +190 -0
  71. package/dist/scripts/repair-shadows.js.map +1 -0
  72. package/dist/server/handler.cjs +31378 -0
  73. package/dist/server/handler.cjs.map +7 -0
  74. package/dist/server/handler.d.ts +18 -0
  75. package/dist/server/handler.d.ts.map +1 -0
  76. package/dist/server/handler.js +435 -0
  77. package/dist/server/handler.js.map +1 -0
  78. package/dist/server/handler.zip +0 -0
  79. package/dist/server/index.d.ts +8 -0
  80. package/dist/server/index.d.ts.map +1 -0
  81. package/dist/server/index.js +8 -0
  82. package/dist/server/index.js.map +1 -0
  83. package/dist/server/operations/deleteMany.d.ts +18 -0
  84. package/dist/server/operations/deleteMany.d.ts.map +1 -0
  85. package/dist/server/operations/deleteMany.js +222 -0
  86. package/dist/server/operations/deleteMany.js.map +1 -0
  87. package/dist/server/operations/deleteOne.d.ts +17 -0
  88. package/dist/server/operations/deleteOne.d.ts.map +1 -0
  89. package/dist/server/operations/deleteOne.js +87 -0
  90. package/dist/server/operations/deleteOne.js.map +1 -0
  91. package/dist/server/operations/find.d.ts +18 -0
  92. package/dist/server/operations/find.d.ts.map +1 -0
  93. package/dist/server/operations/find.js +382 -0
  94. package/dist/server/operations/find.js.map +1 -0
  95. package/dist/server/operations/findMany.d.ts +13 -0
  96. package/dist/server/operations/findMany.d.ts.map +1 -0
  97. package/dist/server/operations/findMany.js +61 -0
  98. package/dist/server/operations/findMany.js.map +1 -0
  99. package/dist/server/operations/findManyReference.d.ts +18 -0
  100. package/dist/server/operations/findManyReference.d.ts.map +1 -0
  101. package/dist/server/operations/findManyReference.js +150 -0
  102. package/dist/server/operations/findManyReference.js.map +1 -0
  103. package/dist/server/operations/findOne.d.ts +14 -0
  104. package/dist/server/operations/findOne.d.ts.map +1 -0
  105. package/dist/server/operations/findOne.js +56 -0
  106. package/dist/server/operations/findOne.js.map +1 -0
  107. package/dist/server/operations/insertMany.d.ts +19 -0
  108. package/dist/server/operations/insertMany.d.ts.map +1 -0
  109. package/dist/server/operations/insertMany.js +243 -0
  110. package/dist/server/operations/insertMany.js.map +1 -0
  111. package/dist/server/operations/insertOne.d.ts +18 -0
  112. package/dist/server/operations/insertOne.d.ts.map +1 -0
  113. package/dist/server/operations/insertOne.js +85 -0
  114. package/dist/server/operations/insertOne.js.map +1 -0
  115. package/dist/server/operations/updateMany.d.ts +20 -0
  116. package/dist/server/operations/updateMany.d.ts.map +1 -0
  117. package/dist/server/operations/updateMany.js +316 -0
  118. package/dist/server/operations/updateMany.js.map +1 -0
  119. package/dist/server/operations/updateOne.d.ts +20 -0
  120. package/dist/server/operations/updateOne.d.ts.map +1 -0
  121. package/dist/server/operations/updateOne.js +159 -0
  122. package/dist/server/operations/updateOne.js.map +1 -0
  123. package/dist/server/query/converter.d.ts +85 -0
  124. package/dist/server/query/converter.d.ts.map +1 -0
  125. package/dist/server/query/converter.js +161 -0
  126. package/dist/server/query/converter.js.map +1 -0
  127. package/dist/server/query/index.d.ts +5 -0
  128. package/dist/server/query/index.d.ts.map +1 -0
  129. package/dist/server/query/index.js +5 -0
  130. package/dist/server/query/index.js.map +1 -0
  131. package/dist/server/shadow/config.d.ts +147 -0
  132. package/dist/server/shadow/config.d.ts.map +1 -0
  133. package/dist/server/shadow/config.js +162 -0
  134. package/dist/server/shadow/config.js.map +1 -0
  135. package/dist/server/shadow/differ.d.ts +42 -0
  136. package/dist/server/shadow/differ.d.ts.map +1 -0
  137. package/dist/server/shadow/differ.js +66 -0
  138. package/dist/server/shadow/differ.js.map +1 -0
  139. package/dist/server/shadow/generator.d.ts +104 -0
  140. package/dist/server/shadow/generator.d.ts.map +1 -0
  141. package/dist/server/shadow/generator.js +148 -0
  142. package/dist/server/shadow/generator.js.map +1 -0
  143. package/dist/server/shadow/index.d.ts +11 -0
  144. package/dist/server/shadow/index.d.ts.map +1 -0
  145. package/dist/server/shadow/index.js +11 -0
  146. package/dist/server/shadow/index.js.map +1 -0
  147. package/dist/server/shadow/types.d.ts +44 -0
  148. package/dist/server/shadow/types.d.ts.map +1 -0
  149. package/dist/server/shadow/types.js +2 -0
  150. package/dist/server/shadow/types.js.map +1 -0
  151. package/dist/server/types.d.ts +295 -0
  152. package/dist/server/types.d.ts.map +1 -0
  153. package/dist/server/types.js +7 -0
  154. package/dist/server/types.js.map +1 -0
  155. package/dist/server/utils/auth.d.ts +43 -0
  156. package/dist/server/utils/auth.d.ts.map +1 -0
  157. package/dist/server/utils/auth.js +123 -0
  158. package/dist/server/utils/auth.js.map +1 -0
  159. package/dist/server/utils/bulkOperations.d.ts +81 -0
  160. package/dist/server/utils/bulkOperations.d.ts.map +1 -0
  161. package/dist/server/utils/bulkOperations.js +147 -0
  162. package/dist/server/utils/bulkOperations.js.map +1 -0
  163. package/dist/server/utils/chunking.d.ts +96 -0
  164. package/dist/server/utils/chunking.d.ts.map +1 -0
  165. package/dist/server/utils/chunking.js +225 -0
  166. package/dist/server/utils/chunking.js.map +1 -0
  167. package/dist/server/utils/dynamodb.d.ts +41 -0
  168. package/dist/server/utils/dynamodb.d.ts.map +1 -0
  169. package/dist/server/utils/dynamodb.js +83 -0
  170. package/dist/server/utils/dynamodb.js.map +1 -0
  171. package/dist/server/utils/filter.d.ts +152 -0
  172. package/dist/server/utils/filter.d.ts.map +1 -0
  173. package/dist/server/utils/filter.js +270 -0
  174. package/dist/server/utils/filter.js.map +1 -0
  175. package/dist/server/utils/pagination.d.ts +27 -0
  176. package/dist/server/utils/pagination.d.ts.map +1 -0
  177. package/dist/server/utils/pagination.js +56 -0
  178. package/dist/server/utils/pagination.js.map +1 -0
  179. package/dist/server/utils/timestamps.d.ts +31 -0
  180. package/dist/server/utils/timestamps.d.ts.map +1 -0
  181. package/dist/server/utils/timestamps.js +84 -0
  182. package/dist/server/utils/timestamps.js.map +1 -0
  183. package/dist/server/utils/ttl.d.ts +17 -0
  184. package/dist/server/utils/ttl.d.ts.map +1 -0
  185. package/dist/server/utils/ttl.js +62 -0
  186. package/dist/server/utils/ttl.js.map +1 -0
  187. package/dist/server/utils/validation.d.ts +40 -0
  188. package/dist/server/utils/validation.d.ts.map +1 -0
  189. package/dist/server/utils/validation.js +54 -0
  190. package/dist/server/utils/validation.js.map +1 -0
  191. package/dist/shadows/config.d.ts +54 -0
  192. package/dist/shadows/config.d.ts.map +1 -0
  193. package/dist/shadows/config.js +95 -0
  194. package/dist/shadows/config.js.map +1 -0
  195. package/dist/shadows/differ.d.ts +42 -0
  196. package/dist/shadows/differ.d.ts.map +1 -0
  197. package/dist/shadows/differ.js +66 -0
  198. package/dist/shadows/differ.js.map +1 -0
  199. package/dist/shadows/generator.d.ts +63 -0
  200. package/dist/shadows/generator.d.ts.map +1 -0
  201. package/dist/shadows/generator.js +107 -0
  202. package/dist/shadows/generator.js.map +1 -0
  203. package/dist/shadows/index.d.ts +15 -0
  204. package/dist/shadows/index.d.ts.map +1 -0
  205. package/dist/shadows/index.js +17 -0
  206. package/dist/shadows/index.js.map +1 -0
  207. package/dist/shadows/types.d.ts +44 -0
  208. package/dist/shadows/types.d.ts.map +1 -0
  209. package/dist/shadows/types.js +2 -0
  210. package/dist/shadows/types.js.map +1 -0
  211. package/dist/types.d.ts +165 -0
  212. package/dist/types.d.ts.map +1 -0
  213. package/dist/types.js +2 -0
  214. package/dist/types.js.map +1 -0
  215. package/dist/ulid.d.ts +46 -0
  216. package/dist/ulid.d.ts.map +1 -0
  217. package/dist/ulid.js +66 -0
  218. package/dist/ulid.js.map +1 -0
  219. package/package.json +136 -0
  220. package/terraform/README.md +222 -0
  221. package/terraform/examples/advanced/README.md +129 -0
  222. package/terraform/examples/advanced/main.tf +158 -0
  223. package/terraform/examples/advanced/shadow.config.json +35 -0
  224. package/terraform/examples/advanced/variables.tf +28 -0
  225. package/terraform/examples/basic/README.md +53 -0
  226. package/terraform/examples/basic/main.tf +99 -0
  227. package/terraform/examples/basic/variables.tf +17 -0
  228. package/terraform/main.tf +159 -0
  229. package/terraform/outputs.tf +56 -0
  230. 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,5 @@
1
+ /**
2
+ * react-admin統合の型定義
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/integrations/react-admin/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -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,3 @@
1
+ #!/usr/bin/env tsx
2
+ export {};
3
+ //# sourceMappingURL=repair-shadows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repair-shadows.d.ts","sourceRoot":"","sources":["../../src/scripts/repair-shadows.ts"],"names":[],"mappings":""}