@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
package/CHANGELOG.md ADDED
@@ -0,0 +1,41 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ## [0.1.0] - 2024-11-29
11
+
12
+ ### Added
13
+
14
+ - Initial release of @exabugs/dynamodb-client
15
+ - MongoDB-like API for DynamoDB Single-Table Design
16
+ - Shadow Records for efficient sorting and querying
17
+ - Multiple authentication methods:
18
+ - IAM authentication for server-side
19
+ - Cognito authentication for web applications
20
+ - Token authentication for custom scenarios
21
+ - Lambda function implementation with Function URL support
22
+ - react-admin integration for admin UIs
23
+ - Terraform modules for infrastructure deployment
24
+ - Comprehensive TypeScript support
25
+ - Full test coverage with Vitest
26
+
27
+ ### Features
28
+
29
+ - **Client SDK**: DynamoDB operations with MongoDB-like API
30
+ - `insertOne`, `insertMany`
31
+ - `findOne`, `find` with cursor support
32
+ - `updateOne`, `updateMany`
33
+ - `deleteOne`, `deleteMany`
34
+ - **Server Implementation**: Lambda handler for serverless deployments
35
+ - **Shadow Records**: Automatic generation and management for sorting
36
+ - **Advanced Filtering**: 7 operators (eq, lt, lte, gt, gte, starts, ends)
37
+ - **Bulk Operations**: Automatic chunking for large datasets
38
+ - **TTL Support**: Automatic data expiration
39
+
40
+ [Unreleased]: https://github.com/exabugs/dynamodb-client/compare/v0.1.0...HEAD
41
+ [0.1.0]: https://github.com/exabugs/dynamodb-client/releases/tag/v0.1.0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 exabugs
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,283 @@
1
+ # DynamoDB Client SDK
2
+
3
+ [![CI](https://github.com/exabugs/dynamodb-client/actions/workflows/ci.yml/badge.svg)](https://github.com/exabugs/dynamodb-client/actions/workflows/ci.yml)
4
+ [![npm version](https://badge.fury.io/js/@exabugs%2Fdynamodb-client.svg)](https://www.npmjs.com/package/@exabugs/dynamodb-client)
5
+
6
+ DynamoDB Single-Table Client SDK with MongoDB-like API, Shadow Records, and Lambda implementation for serverless applications.
7
+
8
+ ## Features
9
+
10
+ - 🚀 MongoDB-like API for DynamoDB
11
+ - 📦 Single-Table Design with Shadow Records
12
+ - 🔐 Multiple authentication methods (IAM, Cognito, Token)
13
+ - ⚡ Lambda function implementation included
14
+ - 🎨 react-admin integration
15
+ - 📝 TypeScript support
16
+ - 🏗️ Terraform modules for deployment
17
+
18
+ ## Installation
19
+
20
+ ### From GitHub Packages (Private Repository)
21
+
22
+ 1. Create a Personal Access Token with `read:packages` scope
23
+ 2. Configure `.npmrc`:
24
+
25
+ ```bash
26
+ @exabugs:registry=https://npm.pkg.github.com
27
+ //npm.pkg.github.com/:_authToken=YOUR_GITHUB_TOKEN
28
+ ```
29
+
30
+ 3. Install the package:
31
+
32
+ ```bash
33
+ npm install @exabugs/dynamodb-client
34
+ ```
35
+
36
+ For detailed instructions, see [Private Package Usage Guide](docs/PRIVATE_PACKAGE_USAGE.md).
37
+
38
+ ### From npm (Public - Coming Soon)
39
+
40
+ ```bash
41
+ npm install @exabugs/dynamodb-client
42
+ ```
43
+
44
+ ## Quick Start
45
+
46
+ ### Client Usage (IAM Authentication)
47
+
48
+ ```typescript
49
+ import { DynamoClient } from '@exabugs/dynamodb-client/client/iam';
50
+
51
+ const client = new DynamoClient(FUNCTION_URL, {
52
+ region: 'ap-northeast-1',
53
+ });
54
+
55
+ const db = client.db();
56
+ const collection = db.collection('articles');
57
+
58
+ // Create
59
+ await collection.insertOne({ title: 'Hello World', content: '...' });
60
+
61
+ // Read
62
+ const article = await collection.findOne({ title: 'Hello World' });
63
+
64
+ // Update
65
+ await collection.updateOne({ id: article.id }, { $set: { status: 'published' } });
66
+
67
+ // Delete
68
+ await collection.deleteOne({ id: article.id });
69
+ ```
70
+
71
+ ### Server Usage (Lambda Function)
72
+
73
+ ```typescript
74
+ import { createHandler } from '@exabugs/dynamodb-client/server/handler';
75
+
76
+ export const handler = createHandler({
77
+ tableName: process.env.TABLE_NAME!,
78
+ region: process.env.AWS_REGION!,
79
+ });
80
+ ```
81
+
82
+ ## Requirements
83
+
84
+ - Node.js >= 18.0.0
85
+ - AWS Account (for DynamoDB and Lambda)
86
+
87
+ ## Development
88
+
89
+ ```bash
90
+ # Install dependencies
91
+ npm install
92
+
93
+ # Run tests
94
+ npm test
95
+
96
+ # Run tests with coverage
97
+ npm run test:coverage
98
+
99
+ # Build
100
+ npm run build
101
+
102
+ # Lint
103
+ npm run lint
104
+
105
+ # Format
106
+ npm run format
107
+ ```
108
+
109
+ ### 主要コマンド
110
+
111
+ ```bash
112
+ # ヘルプを表示
113
+ make help
114
+
115
+ # 開発
116
+ make install # 依存関係のインストール
117
+ make build # 全パッケージとLambda関数のビルド
118
+ make test # 全パッケージのテスト実行
119
+ make lint # Lint実行
120
+ make format # フォーマット実行
121
+ make clean # ビルド成果物の削除
122
+
123
+ # デプロイ
124
+ make deploy-dev # dev環境にデプロイ
125
+ make deploy-stg # stg環境にデプロイ
126
+ make deploy-prd # prd環境にデプロイ
127
+
128
+ # インフラ操作
129
+ make infra-plan ENV=dev # Terraformプランを表示
130
+ make infra-apply ENV=dev # Terraformを適用
131
+ make infra-status # Terraform状態を表示
132
+
133
+ # Lambda操作
134
+ make invoke-fetch ENV=dev # Fetch Lambdaを実行
135
+ make logs-fetch ENV=dev # Fetch Lambdaのログを表示
136
+ make logs-records ENV=dev # Records Lambdaのログを表示
137
+
138
+ # その他
139
+ make shadow-config # shadow.config.jsonを再生成
140
+ ```
141
+
142
+ ### 個別Makefileの使用
143
+
144
+ 各Lambda関数には個別のMakefileも用意されています:
145
+
146
+ ```bash
147
+ # Fetch Lambda
148
+ cd functions/fetch
149
+ make help
150
+ make build
151
+ make deploy ENV=dev
152
+ make invoke
153
+ make logs
154
+
155
+ # Terraform
156
+ cd infra
157
+ make help
158
+ make plan ENV=dev
159
+ make apply ENV=dev
160
+ make status
161
+ ```
162
+
163
+ 詳細は[Makefile運用ガイドライン](.kiro/steering/makefile-operations.md)を参照してください。
164
+
165
+ ## Records Lambda
166
+
167
+ Records Lambdaは`@exabugs/dynamodb-client`ライブラリに統合されています。
168
+
169
+ 詳細は[packages/core/README.md](packages/core/README.md)を参照してください。
170
+
171
+ ## ワークスペース構成
172
+
173
+ ```
174
+ .
175
+ ├── apps/ # アプリケーション (Admin UI, Mobile App)
176
+ ├── functions/ # Lambda関数 (Fetch, Pipeline, Maintenance)
177
+ ├── packages/ # 共有ライブラリ (core, shadows, graphql-types)
178
+ │ └── core/ # Records Lambda(サーバー実装)を含む
179
+ └── infra/ # Terraform設定
180
+ ```
181
+
182
+ **注**: Records Lambdaは`packages/core/`に統合されています。
183
+
184
+ ## Admin UI 開発・デプロイ
185
+
186
+ ### ローカル開発
187
+
188
+ ```bash
189
+ # 開発サーバー起動
190
+ pnpm --filter @ainews/admin dev
191
+
192
+ # ブラウザで http://localhost:3000 にアクセス
193
+ ```
194
+
195
+ ### 環境変数設定
196
+
197
+ `apps/admin/.env`ファイルを作成:
198
+
199
+ ```bash
200
+ # Records Lambda Function URL
201
+ VITE_RECORDS_API_URL=https://xxxxx.lambda-url.us-east-1.on.aws/
202
+
203
+ # Cognito User Pool設定
204
+ VITE_COGNITO_USER_POOL_ID=us-east-1_xxxxxxxxx
205
+ VITE_COGNITO_USER_POOL_CLIENT_ID=xxxxxxxxxxxxxxxxxxxxxxxxxx
206
+ VITE_COGNITO_DOMAIN=ainews-dev-auth.auth.us-east-1.amazoncognito.com
207
+ VITE_COGNITO_REGION=us-east-1
208
+
209
+ # 開発環境で認証を無効化する場合のみ(本番環境では必ずfalse)
210
+ VITE_DISABLE_AUTH=false
211
+ ```
212
+
213
+ ### 重要な設定
214
+
215
+ **必須**: Admin UIは**BrowserRouter**を使用します。HashRouterは使用しないでください。
216
+
217
+ 理由:
218
+
219
+ - Cognito Hosted UIの認証コールバックがクエリパラメータ(`?code=xxx`)を使用
220
+ - HashRouter(`#/`)ではクエリパラメータが正しく処理されない
221
+
222
+ ### 本番デプロイ(CloudFront)
223
+
224
+ CloudFront経由で配信する場合、以下の設定が必要です:
225
+
226
+ 1. **エラーページ設定**: 404/403エラーを`/index.html`にリダイレクト(SPA対応)
227
+ 2. **キャッシュ設定**:
228
+ - `index.html`: キャッシュしない(TTL=0)
229
+ - 静的アセット(JS/CSS/画像): 長期キャッシュ(TTL=7日〜1年)
230
+ 3. **Cognitoコールバック URL**: 本番ドメインを追加
231
+
232
+ 詳細は[設計書](.kiro/specs/ainews-pipeline/design.md)の「Admin UI 重要な設定」セクションを参照してください。
233
+
234
+ ### トラブルシューティング
235
+
236
+ #### CORSエラーが発生する場合
237
+
238
+ 1. **Lambda関数を最新版にデプロイ**:
239
+
240
+ ```bash
241
+ cd functions/records
242
+ pnpm build
243
+ cd ../../infra
244
+ terraform apply -var-file=envs/dev.tfvars
245
+ ```
246
+
247
+ 2. **ブラウザのキャッシュをクリア**: Cmd+Shift+R (Mac) または Ctrl+Shift+R (Windows/Linux)
248
+
249
+ 3. **Lambda Function URLのCORS設定を確認**: `infra/modules/api/lambda-records/main.tf`
250
+
251
+ **重要**: Lambda Function URLのCORS設定を使用するため、Lambda関数のハンドラーではCORSヘッダーを設定しません。
252
+
253
+ #### Cognito Hosted UIでログインできない場合
254
+
255
+ 1. **開発サーバーのポートを確認**: `http://localhost:3000` で起動していることを確認
256
+ - Vite設定で `strictPort: true` が設定されているため、ポート3000が使用中の場合はエラーになります
257
+ - 他のプロセスがポート3000を使用していないか確認してください
258
+
259
+ 2. **Cognitoのコールバック/ログアウトURLを確認**: `infra/envs/dev.tfvars`
260
+
261
+ ```hcl
262
+ admin_callback_urls = [
263
+ "http://localhost:3000",
264
+ "http://localhost:3000/callback",
265
+ ...
266
+ ]
267
+ ```
268
+
269
+ 3. **ブラウザのローカルストレージをクリア**: 古いセッション情報が残っている可能性があります
270
+
271
+ ## ドキュメント
272
+
273
+ 詳細な設計・要件については以下を参照してください:
274
+
275
+ - [要件定義書](.kiro/specs/ainews-pipeline/requirements.md)
276
+ - [設計書](.kiro/specs/ainews-pipeline/design.md)
277
+ - [実装タスクリスト](.kiro/specs/ainews-pipeline/tasks.md)
278
+
279
+ ## ライセンス
280
+
281
+ MIT License - 詳細は [LICENSE](LICENSE) ファイルを参照してください。
282
+
283
+ Copyright (c) 2024 exabugs
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Collection(共通実装)
3
+ *
4
+ * 認証ハンドラーは外部から注入されます。
5
+ */
6
+ import type { DeleteResult, Filter, FindOptions, InsertManyResult, InsertOneResult, UpdateOperators, UpdateResult } from '../types.js';
7
+ import type { ClientOptions } from './DynamoClient.js';
8
+ import { FindCursor } from './FindCursor.js';
9
+ /**
10
+ * 認証ハンドラー関数の型
11
+ */
12
+ export type AuthHeadersGetter<TAuthOptions = unknown> = (endpoint: string, body: string, authOptions?: TAuthOptions) => Promise<Record<string, string>>;
13
+ /**
14
+ * コレクションのドキュメント型の基本インターフェース
15
+ */
16
+ export interface DocumentBase {
17
+ id: string;
18
+ [key: string]: unknown;
19
+ }
20
+ /**
21
+ * コレクション
22
+ *
23
+ * MongoDB風のCRUD操作を提供します。
24
+ * 型安全なフィルタとクエリAPIでDynamoDBを操作できます。
25
+ *
26
+ * @template TSchema - コレクションのドキュメント型
27
+ * @template TAuthOptions - 認証オプションの型
28
+ */
29
+ export declare class Collection<TSchema extends DocumentBase = DocumentBase, TAuthOptions = unknown> {
30
+ private endpoint;
31
+ private databaseName;
32
+ private collectionName;
33
+ private authToken;
34
+ private authOptions;
35
+ private clientOptions;
36
+ private getAuthHeaders;
37
+ constructor(endpoint: string, databaseName: string, collectionName: string, authToken: string | undefined, authOptions: TAuthOptions | undefined, clientOptions: ClientOptions | undefined, getAuthHeaders: AuthHeadersGetter<TAuthOptions>);
38
+ getName(): string;
39
+ getEndpoint(): string;
40
+ getDatabaseName(): string;
41
+ getAuthToken(): string | undefined;
42
+ getAuthOptions(): TAuthOptions | undefined;
43
+ /**
44
+ * HTTPリクエストを送信(内部使用)
45
+ */
46
+ private request;
47
+ find(filter?: Filter<TSchema>, options?: FindOptions): FindCursor<TSchema, TAuthOptions>;
48
+ findOne(filter: Filter<TSchema>): Promise<TSchema | null>;
49
+ findMany(ids: string[]): Promise<TSchema[]>;
50
+ insertOne(document: TSchema): Promise<InsertOneResult>;
51
+ insertMany(documents: TSchema[]): Promise<InsertManyResult>;
52
+ updateOne(filter: Filter<TSchema>, update: UpdateOperators<TSchema>): Promise<UpdateResult>;
53
+ updateMany(filter: Filter<TSchema>, update: UpdateOperators<TSchema>): Promise<UpdateResult>;
54
+ deleteOne(filter: Filter<TSchema>): Promise<DeleteResult>;
55
+ deleteMany(filter: Filter<TSchema>): Promise<DeleteResult>;
56
+ }
57
+ //# sourceMappingURL=Collection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Collection.d.ts","sourceRoot":"","sources":["../../src/client/Collection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EACV,YAAY,EACZ,MAAM,EACN,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,YAAY,EACb,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAAC,YAAY,GAAG,OAAO,IAAI,CACtD,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,WAAW,CAAC,EAAE,YAAY,KACvB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAErC;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;;;;GAQG;AACH,qBAAa,UAAU,CAAC,OAAO,SAAS,YAAY,GAAG,YAAY,EAAE,YAAY,GAAG,OAAO;IAEvF,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,cAAc;gBANd,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,WAAW,EAAE,YAAY,GAAG,SAAS,EACrC,aAAa,EAAE,aAAa,GAAG,SAAS,EACxC,cAAc,EAAE,iBAAiB,CAAC,YAAY,CAAC;IAGzD,OAAO,IAAI,MAAM;IAIjB,WAAW,IAAI,MAAM;IAIrB,eAAe,IAAI,MAAM;IAIzB,YAAY,IAAI,MAAM,GAAG,SAAS;IAIlC,cAAc,IAAI,YAAY,GAAG,SAAS;IAI1C;;OAEG;YACW,OAAO;IAwDrB,IAAI,CAAC,MAAM,GAAE,MAAM,CAAC,OAAO,CAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC;IActF,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAUzD,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAU3C,SAAS,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC;IAStD,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAmB3D,SAAS,CACb,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,EACvB,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC,GAC/B,OAAO,CAAC,YAAY,CAAC;IAelB,UAAU,CACd,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,EACvB,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC,GAC/B,OAAO,CAAC,YAAY,CAAC;IAkBlB,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;IASzD,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;CAUjE"}
@@ -0,0 +1,174 @@
1
+ import { FindCursor } from './FindCursor.js';
2
+ /**
3
+ * コレクション
4
+ *
5
+ * MongoDB風のCRUD操作を提供します。
6
+ * 型安全なフィルタとクエリAPIでDynamoDBを操作できます。
7
+ *
8
+ * @template TSchema - コレクションのドキュメント型
9
+ * @template TAuthOptions - 認証オプションの型
10
+ */
11
+ export class Collection {
12
+ endpoint;
13
+ databaseName;
14
+ collectionName;
15
+ authToken;
16
+ authOptions;
17
+ clientOptions;
18
+ getAuthHeaders;
19
+ constructor(endpoint, databaseName, collectionName, authToken, authOptions, clientOptions, getAuthHeaders) {
20
+ this.endpoint = endpoint;
21
+ this.databaseName = databaseName;
22
+ this.collectionName = collectionName;
23
+ this.authToken = authToken;
24
+ this.authOptions = authOptions;
25
+ this.clientOptions = clientOptions;
26
+ this.getAuthHeaders = getAuthHeaders;
27
+ }
28
+ getName() {
29
+ return this.collectionName;
30
+ }
31
+ getEndpoint() {
32
+ return this.endpoint;
33
+ }
34
+ getDatabaseName() {
35
+ return this.databaseName;
36
+ }
37
+ getAuthToken() {
38
+ return this.authToken;
39
+ }
40
+ getAuthOptions() {
41
+ return this.authOptions;
42
+ }
43
+ /**
44
+ * HTTPリクエストを送信(内部使用)
45
+ */
46
+ async request(operation, params) {
47
+ const requestBody = JSON.stringify({
48
+ operation,
49
+ database: this.databaseName,
50
+ collection: this.collectionName,
51
+ params,
52
+ });
53
+ let headers = {
54
+ 'Content-Type': 'application/json',
55
+ };
56
+ // 認証ヘッダーを追加(注入された関数を使用)
57
+ const authHeaders = await this.getAuthHeaders(this.endpoint, requestBody, this.authOptions);
58
+ headers = { ...headers, ...authHeaders };
59
+ // 後方互換性: authTokenが直接指定されている場合(非推奨)
60
+ if (this.authToken && !this.authOptions) {
61
+ headers['Authorization'] = `Bearer ${this.authToken}`;
62
+ }
63
+ // タイムアウト設定
64
+ const controller = new AbortController();
65
+ const timeout = this.clientOptions?.timeout || 30000;
66
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
67
+ try {
68
+ const response = await fetch(this.endpoint, {
69
+ method: 'POST',
70
+ headers,
71
+ body: requestBody,
72
+ signal: controller.signal,
73
+ });
74
+ clearTimeout(timeoutId);
75
+ if (!response.ok) {
76
+ const error = (await response.json().catch(() => ({ message: response.statusText })));
77
+ throw new Error(`Request failed: ${error.message || response.statusText}`);
78
+ }
79
+ const result = (await response.json());
80
+ return result.data;
81
+ }
82
+ catch (error) {
83
+ clearTimeout(timeoutId);
84
+ if (error instanceof Error && error.name === 'AbortError') {
85
+ throw new Error(`Request timeout after ${timeout}ms`);
86
+ }
87
+ throw error;
88
+ }
89
+ }
90
+ find(filter = {}, options) {
91
+ return new FindCursor(this.endpoint, this.databaseName, this.collectionName, filter, options, this.authToken, this.authOptions, this.clientOptions, this.getAuthHeaders);
92
+ }
93
+ async findOne(filter) {
94
+ const response = await this.request('findOne', { filter });
95
+ // Records Lambda は直接レコードを返す({ document: ... } ではない)
96
+ // 空オブジェクトの場合はnullを返す
97
+ if (!response || (typeof response === 'object' && Object.keys(response).length === 0)) {
98
+ return null;
99
+ }
100
+ return response;
101
+ }
102
+ async findMany(ids) {
103
+ const response = await this.request('findMany', { filter: { id: { in: ids } } });
104
+ // Records Lambdaは配列を直接返す
105
+ if (Array.isArray(response)) {
106
+ return response;
107
+ }
108
+ const responseObj = response;
109
+ return responseObj.items || [];
110
+ }
111
+ async insertOne(document) {
112
+ const response = await this.request('insertOne', { document });
113
+ const result = response;
114
+ return {
115
+ acknowledged: true,
116
+ insertedId: result.insertedId,
117
+ };
118
+ }
119
+ async insertMany(documents) {
120
+ const response = await this.request('insertMany', { documents });
121
+ // Records Lambdaは統一形式 { count, successIds, failedIds, errors } を返す
122
+ // MongoDB互換形式に変換
123
+ const result = response;
124
+ return {
125
+ acknowledged: true,
126
+ insertedCount: result.count || 0,
127
+ insertedIds: result.successIds || {},
128
+ failedIds: result.failedIds,
129
+ errors: result.errors,
130
+ };
131
+ }
132
+ async updateOne(filter, update) {
133
+ const response = await this.request('updateOne', { filter, update });
134
+ const result = response;
135
+ return {
136
+ acknowledged: true,
137
+ matchedCount: result.matchedCount,
138
+ modifiedCount: result.modifiedCount,
139
+ upsertedId: result.upsertedId,
140
+ };
141
+ }
142
+ async updateMany(filter, update) {
143
+ const response = await this.request('updateMany', { filter, update });
144
+ // Records Lambdaは統一形式 { count, successIds, failedIds, errors } を返す
145
+ // MongoDB互換形式に変換
146
+ const result = response;
147
+ const successCount = Object.keys(result.successIds || {}).length;
148
+ const failedCount = Object.keys(result.failedIds || {}).length;
149
+ return {
150
+ acknowledged: true,
151
+ matchedCount: successCount + failedCount, // 成功 + 失敗の合計
152
+ modifiedCount: result.count || 0, // 実際に更新された件数
153
+ };
154
+ }
155
+ async deleteOne(filter) {
156
+ const response = await this.request('deleteOne', { filter });
157
+ const result = response;
158
+ return {
159
+ acknowledged: true,
160
+ deletedCount: result.deletedCount,
161
+ };
162
+ }
163
+ async deleteMany(filter) {
164
+ const response = await this.request('deleteMany', { filter });
165
+ // Records Lambdaは統一形式 { count, successIds, failedIds, errors } を返す
166
+ // MongoDB互換形式に変換
167
+ const result = response;
168
+ return {
169
+ acknowledged: true,
170
+ deletedCount: result.count || 0, // 実際に削除された件数
171
+ };
172
+ }
173
+ }
174
+ //# sourceMappingURL=Collection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Collection.js","sourceRoot":"","sources":["../../src/client/Collection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * データベース(共通実装)
3
+ *
4
+ * 認証ハンドラーは外部から注入されます。
5
+ */
6
+ import { type AuthHeadersGetter, Collection } from './Collection.js';
7
+ import type { ClientOptions } from './DynamoClient.js';
8
+ /**
9
+ * データベース
10
+ *
11
+ * コレクションへのアクセスを提供します。
12
+ *
13
+ * @template TAuthOptions - 認証オプションの型
14
+ */
15
+ export declare class Database<TAuthOptions = unknown> {
16
+ private _endpoint;
17
+ private _databaseName;
18
+ private _authToken;
19
+ private _authOptions;
20
+ private _clientOptions;
21
+ private _getAuthHeaders;
22
+ constructor(_endpoint: string, _databaseName: string, _authToken: string | undefined, _authOptions: TAuthOptions | undefined, _clientOptions: ClientOptions | undefined, _getAuthHeaders: AuthHeadersGetter<TAuthOptions>);
23
+ getEndpoint(): string;
24
+ getDatabaseName(): string;
25
+ getAuthToken(): string | undefined;
26
+ getAuthOptions(): TAuthOptions | undefined;
27
+ collection<TSchema extends {
28
+ id: string;
29
+ [key: string]: unknown;
30
+ } = {
31
+ id: string;
32
+ [key: string]: unknown;
33
+ }>(name: string): Collection<TSchema, TAuthOptions>;
34
+ }
35
+ //# sourceMappingURL=Database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Database.d.ts","sourceRoot":"","sources":["../../src/client/Database.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,KAAK,iBAAiB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD;;;;;;GAMG;AACH,qBAAa,QAAQ,CAAC,YAAY,GAAG,OAAO;IAExC,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,eAAe;gBALf,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,YAAY,EAAE,YAAY,GAAG,SAAS,EACtC,cAAc,EAAE,aAAa,GAAG,SAAS,EACzC,eAAe,EAAE,iBAAiB,CAAC,YAAY,CAAC;IAG1D,WAAW,IAAI,MAAM;IAIrB,eAAe,IAAI,MAAM;IAIzB,YAAY,IAAI,MAAM,GAAG,SAAS;IAIlC,cAAc,IAAI,YAAY,GAAG,SAAS;IAI1C,UAAU,CACR,OAAO,SAAS;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,EAC/F,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC;CAenD"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * データベース(共通実装)
3
+ *
4
+ * 認証ハンドラーは外部から注入されます。
5
+ */
6
+ import { Collection } from './Collection.js';
7
+ /**
8
+ * データベース
9
+ *
10
+ * コレクションへのアクセスを提供します。
11
+ *
12
+ * @template TAuthOptions - 認証オプションの型
13
+ */
14
+ export class Database {
15
+ _endpoint;
16
+ _databaseName;
17
+ _authToken;
18
+ _authOptions;
19
+ _clientOptions;
20
+ _getAuthHeaders;
21
+ constructor(_endpoint, _databaseName, _authToken, _authOptions, _clientOptions, _getAuthHeaders) {
22
+ this._endpoint = _endpoint;
23
+ this._databaseName = _databaseName;
24
+ this._authToken = _authToken;
25
+ this._authOptions = _authOptions;
26
+ this._clientOptions = _clientOptions;
27
+ this._getAuthHeaders = _getAuthHeaders;
28
+ }
29
+ getEndpoint() {
30
+ return this._endpoint;
31
+ }
32
+ getDatabaseName() {
33
+ return this._databaseName;
34
+ }
35
+ getAuthToken() {
36
+ return this._authToken;
37
+ }
38
+ getAuthOptions() {
39
+ return this._authOptions;
40
+ }
41
+ collection(name) {
42
+ if (!name || name.trim() === '') {
43
+ throw new Error('Collection name cannot be empty');
44
+ }
45
+ return new Collection(this._endpoint, this._databaseName, name, this._authToken, this._authOptions, this._clientOptions, this._getAuthHeaders);
46
+ }
47
+ }
48
+ //# sourceMappingURL=Database.js.map