@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,104 @@
1
+ import type { ShadowFieldConfig, ShadowFieldType } from './types.js';
2
+ /**
3
+ * シャドースキーマ(簡易版)
4
+ */
5
+ export interface ShadowSchema {
6
+ /** リソース名 */
7
+ resource: string;
8
+ /** ソート可能なフィールド定義 */
9
+ sortableFields: Record<string, ShadowFieldConfig>;
10
+ }
11
+ /**
12
+ * シャドウレコード
13
+ */
14
+ export interface ShadowRecord {
15
+ /** パーティションキー(リソース名) */
16
+ PK: string;
17
+ /** ソートキー(シャドウキー) */
18
+ SK: string;
19
+ /** レコードデータ(最小限の情報) */
20
+ data: {
21
+ /** レコードID */
22
+ id: string;
23
+ };
24
+ }
25
+ /**
26
+ * 文字列値をエスケープする
27
+ * ルール: # → ##, スペース → #
28
+ *
29
+ * @param value - エスケープする文字列
30
+ * @returns エスケープされた文字列
31
+ */
32
+ export declare function escapeString(value: string): string;
33
+ /**
34
+ * 数値を20桁のゼロ埋め文字列に変換する
35
+ *
36
+ * @param value - 変換する数値(null/undefinedも許容)
37
+ * @returns 20桁のゼロ埋め文字列
38
+ */
39
+ export declare function formatNumber(value: number | null | undefined): string;
40
+ /**
41
+ * 日時をUTC ISO 8601形式にフォーマットする
42
+ *
43
+ * @param value - 日時文字列またはDateオブジェクト(null/undefinedも許容)
44
+ * @returns UTC ISO 8601形式の文字列
45
+ */
46
+ export declare function formatDatetime(value: string | Date | null | undefined): string;
47
+ /**
48
+ * 真偽値を"0"または"1"に変換する
49
+ *
50
+ * @param value - 真偽値(null/undefinedも許容)
51
+ * @returns "0"(false)、"1"(true)、または空文字(null/undefined)
52
+ */
53
+ export declare function formatBoolean(value: boolean | null | undefined): string;
54
+ /**
55
+ * フィールド値を型に応じてフォーマットする
56
+ *
57
+ * @param type - フィールドの型
58
+ * @param value - フォーマットする値(null/undefinedも許容)
59
+ * @returns フォーマットされた文字列
60
+ */
61
+ export declare function formatFieldValue(type: ShadowFieldType, value: string | number | Date | boolean | null | undefined): string;
62
+ /**
63
+ * シャドーSKを生成する
64
+ * フォーマット: {fieldName}#{formattedValue}#id#{recordId}
65
+ *
66
+ * @param fieldName - フィールド名
67
+ * @param value - フィールド値
68
+ * @param recordId - レコードID(ULID)
69
+ * @param type - フィールドの型(デフォルト: 'string')
70
+ * @returns 生成されたシャドーSK
71
+ *
72
+ * @example
73
+ * generateShadowSK('name', 'Tech News', '01HZXY123', 'string')
74
+ * // => 'name#Tech#News#id#01HZXY123'
75
+ *
76
+ * @example
77
+ * generateShadowSK('priority', 123, '01HZXY123', 'number')
78
+ * // => 'priority#00000000000000000123#id#01HZXY123'
79
+ *
80
+ * @example
81
+ * generateShadowSK('createdAt', '2025-11-12T10:00:00.000Z', '01HZXY123', 'datetime')
82
+ * // => 'createdAt#2025-11-12T10:00:00.000Z#id#01HZXY123'
83
+ */
84
+ export declare function generateShadowSK(fieldName: string, value: string | number | Date, recordId: string, type?: ShadowFieldType): string;
85
+ /**
86
+ * レコードIDからメインレコードのSKを生成する
87
+ * フォーマット: id#{recordId}
88
+ *
89
+ * @param recordId - レコードID(ULID)
90
+ * @returns メインレコードのSK
91
+ */
92
+ export declare function generateMainRecordSK(recordId: string): string;
93
+ /**
94
+ * レコードからシャドウレコードを生成する
95
+ *
96
+ * sortableFieldsに定義されたフィールドのみを処理します。
97
+ * 値がundefined/nullの場合は空文字として扱い、シャドウレコードを生成します。
98
+ *
99
+ * @param record - レコードオブジェクト(idフィールドを含む)
100
+ * @param schema - シャドウスキーマ定義
101
+ * @returns 生成されたシャドウレコードの配列
102
+ */
103
+ export declare function generateShadowRecords(record: Record<string, unknown>, schema: ShadowSchema): ShadowRecord[];
104
+ //# sourceMappingURL=generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../src/server/shadow/generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,YAAY;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB;IACpB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;CACnD;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,uBAAuB;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,oBAAoB;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,sBAAsB;IACtB,IAAI,EAAE;QACJ,aAAa;QACb,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC;CACH;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAcrE;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAa9E;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAKvE;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,eAAe,EACrB,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,GACzD,MAAM,CAiBR;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,EAC7B,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,eAA0B,GAC/B,MAAM,CAGR;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,YAAY,GACnB,YAAY,EAAE,CAqBhB"}
@@ -0,0 +1,148 @@
1
+ /**
2
+ * 文字列値をエスケープする
3
+ * ルール: # → ##, スペース → #
4
+ *
5
+ * @param value - エスケープする文字列
6
+ * @returns エスケープされた文字列
7
+ */
8
+ export function escapeString(value) {
9
+ return value
10
+ .replace(/#/g, '##') // # を ## に置換
11
+ .replace(/ /g, '#'); // スペースを # に置換
12
+ }
13
+ /**
14
+ * 数値を20桁のゼロ埋め文字列に変換する
15
+ *
16
+ * @param value - 変換する数値(null/undefinedも許容)
17
+ * @returns 20桁のゼロ埋め文字列
18
+ */
19
+ export function formatNumber(value) {
20
+ // null/undefined は空文字を返す
21
+ if (value === null || value === undefined) {
22
+ return '';
23
+ }
24
+ if (!Number.isFinite(value)) {
25
+ throw new Error(`Invalid number value: ${value}`);
26
+ }
27
+ // 負の数値は0として扱う(または別のエラーハンドリング)
28
+ const normalized = Math.max(0, Math.floor(value));
29
+ return normalized.toString().padStart(20, '0');
30
+ }
31
+ /**
32
+ * 日時をUTC ISO 8601形式にフォーマットする
33
+ *
34
+ * @param value - 日時文字列またはDateオブジェクト(null/undefinedも許容)
35
+ * @returns UTC ISO 8601形式の文字列
36
+ */
37
+ export function formatDatetime(value) {
38
+ // null/undefined は空文字を返す
39
+ if (value === null || value === undefined) {
40
+ return '';
41
+ }
42
+ const date = typeof value === 'string' ? new Date(value) : value;
43
+ if (isNaN(date.getTime())) {
44
+ throw new Error(`Invalid datetime value: ${value}`);
45
+ }
46
+ return date.toISOString();
47
+ }
48
+ /**
49
+ * 真偽値を"0"または"1"に変換する
50
+ *
51
+ * @param value - 真偽値(null/undefinedも許容)
52
+ * @returns "0"(false)、"1"(true)、または空文字(null/undefined)
53
+ */
54
+ export function formatBoolean(value) {
55
+ if (value === null || value === undefined) {
56
+ return '';
57
+ }
58
+ return value ? '1' : '0';
59
+ }
60
+ /**
61
+ * フィールド値を型に応じてフォーマットする
62
+ *
63
+ * @param type - フィールドの型
64
+ * @param value - フォーマットする値(null/undefinedも許容)
65
+ * @returns フォーマットされた文字列
66
+ */
67
+ export function formatFieldValue(type, value) {
68
+ switch (type) {
69
+ case 'string':
70
+ // 文字列型の場合、null/undefinedは空文字として扱う
71
+ if (value === null || value === undefined) {
72
+ return '';
73
+ }
74
+ return escapeString(String(value));
75
+ case 'number':
76
+ return formatNumber(value);
77
+ case 'datetime':
78
+ return formatDatetime(value);
79
+ case 'boolean':
80
+ return formatBoolean(value);
81
+ default:
82
+ throw new Error(`Unknown shadow field type: ${type}`);
83
+ }
84
+ }
85
+ /**
86
+ * シャドーSKを生成する
87
+ * フォーマット: {fieldName}#{formattedValue}#id#{recordId}
88
+ *
89
+ * @param fieldName - フィールド名
90
+ * @param value - フィールド値
91
+ * @param recordId - レコードID(ULID)
92
+ * @param type - フィールドの型(デフォルト: 'string')
93
+ * @returns 生成されたシャドーSK
94
+ *
95
+ * @example
96
+ * generateShadowSK('name', 'Tech News', '01HZXY123', 'string')
97
+ * // => 'name#Tech#News#id#01HZXY123'
98
+ *
99
+ * @example
100
+ * generateShadowSK('priority', 123, '01HZXY123', 'number')
101
+ * // => 'priority#00000000000000000123#id#01HZXY123'
102
+ *
103
+ * @example
104
+ * generateShadowSK('createdAt', '2025-11-12T10:00:00.000Z', '01HZXY123', 'datetime')
105
+ * // => 'createdAt#2025-11-12T10:00:00.000Z#id#01HZXY123'
106
+ */
107
+ export function generateShadowSK(fieldName, value, recordId, type = 'string') {
108
+ const formattedValue = formatFieldValue(type, value);
109
+ return `${fieldName}#${formattedValue}#id#${recordId}`;
110
+ }
111
+ /**
112
+ * レコードIDからメインレコードのSKを生成する
113
+ * フォーマット: id#{recordId}
114
+ *
115
+ * @param recordId - レコードID(ULID)
116
+ * @returns メインレコードのSK
117
+ */
118
+ export function generateMainRecordSK(recordId) {
119
+ return `id#${recordId}`;
120
+ }
121
+ /**
122
+ * レコードからシャドウレコードを生成する
123
+ *
124
+ * sortableFieldsに定義されたフィールドのみを処理します。
125
+ * 値がundefined/nullの場合は空文字として扱い、シャドウレコードを生成します。
126
+ *
127
+ * @param record - レコードオブジェクト(idフィールドを含む)
128
+ * @param schema - シャドウスキーマ定義
129
+ * @returns 生成されたシャドウレコードの配列
130
+ */
131
+ export function generateShadowRecords(record, schema) {
132
+ const shadows = [];
133
+ // sortableFieldsに定義されたフィールドのみ処理
134
+ for (const [fieldName, fieldDef] of Object.entries(schema.sortableFields)) {
135
+ const value = record[fieldName];
136
+ // 値を型に応じて正規化(undefined/nullは空文字として扱う)
137
+ const normalizedValue = formatFieldValue(fieldDef.type, value);
138
+ // シャドウキーを生成
139
+ const sk = `${fieldName}#${normalizedValue}#id#${record.id}`;
140
+ shadows.push({
141
+ PK: schema.resource,
142
+ SK: sk,
143
+ data: { id: record.id },
144
+ });
145
+ }
146
+ return shadows;
147
+ }
148
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../src/server/shadow/generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * シャドー管理モジュール
3
+ *
4
+ * DynamoDB Single-Table設計における動的シャドーレコード管理を提供します。
5
+ */
6
+ export type { ShadowFieldType, ShadowFieldConfig, ResourceShadowConfig, ShadowConfig, ShadowDiff, } from './types.js';
7
+ export type { ShadowSchema, ShadowRecord } from './generator.js';
8
+ export { escapeString, formatNumber, formatDatetime, formatBoolean, formatFieldValue, generateShadowSK, generateMainRecordSK, generateShadowRecords, } from './generator.js';
9
+ export { calculateShadowDiff, isDiffEmpty, mergeShadowDiffs } from './differ.js';
10
+ export { getShadowConfig, getResourceSchema, getShadowConfigHash, getSchemaVersion, clearShadowConfigCache, getAllShadowFields, isValidShadowField, getDefaultSort, } from './config.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/shadow/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACV,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,YAAY,EACZ,UAAU,GACX,MAAM,YAAY,CAAC;AAGpB,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGjF,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,sBAAsB,EACtB,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,GACf,MAAM,aAAa,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * シャドー管理モジュール
3
+ *
4
+ * DynamoDB Single-Table設計における動的シャドーレコード管理を提供します。
5
+ */
6
+ export { escapeString, formatNumber, formatDatetime, formatBoolean, formatFieldValue, generateShadowSK, generateMainRecordSK, generateShadowRecords, } from './generator.js';
7
+ // 差分計算関数のエクスポート
8
+ export { calculateShadowDiff, isDiffEmpty, mergeShadowDiffs } from './differ.js';
9
+ // 設定管理関数のエクスポート
10
+ export { getShadowConfig, getResourceSchema, getShadowConfigHash, getSchemaVersion, clearShadowConfigCache, getAllShadowFields, isValidShadowField, getDefaultSort, } from './config.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/shadow/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AAExB,gBAAgB;AAChB,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEjF,gBAAgB;AAChB,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,sBAAsB,EACtB,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,GACf,MAAM,aAAa,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * シャドーフィールドの型定義
3
+ */
4
+ export type ShadowFieldType = 'string' | 'number' | 'datetime' | 'boolean';
5
+ /**
6
+ * シャドー設定のフィールド定義
7
+ */
8
+ export interface ShadowFieldConfig {
9
+ type: ShadowFieldType;
10
+ }
11
+ /**
12
+ * リソースごとのシャドー設定
13
+ */
14
+ export interface ResourceShadowConfig {
15
+ sortDefaults: {
16
+ field: string;
17
+ order: 'ASC' | 'DESC';
18
+ };
19
+ shadows: {
20
+ [fieldName: string]: ShadowFieldConfig;
21
+ };
22
+ ttl?: {
23
+ days: number;
24
+ };
25
+ }
26
+ /**
27
+ * shadow.config.jsonの全体構造
28
+ */
29
+ export interface ShadowConfig {
30
+ $schemaVersion: string;
31
+ resources: {
32
+ [resourceName: string]: ResourceShadowConfig;
33
+ };
34
+ }
35
+ /**
36
+ * シャドー差分計算の結果
37
+ */
38
+ export interface ShadowDiff {
39
+ /** 削除すべきシャドーSKのリスト */
40
+ toDelete: string[];
41
+ /** 追加すべきシャドーSKのリスト */
42
+ toAdd: string[];
43
+ }
44
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/server/shadow/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;AAE3E;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,eAAe,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC;KACvB,CAAC;IACF,OAAO,EAAE;QACP,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,CAAC;KACxC,CAAC;IACF,GAAG,CAAC,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE;QACT,CAAC,YAAY,EAAE,MAAM,GAAG,oBAAoB,CAAC;KAC9C,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,sBAAsB;IACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,sBAAsB;IACtB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/server/shadow/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,295 @@
1
+ /**
2
+ * Records Lambda API型定義
3
+ * Lambda Function URL (RPC スタイル) で使用される型定義
4
+ * MongoDB 風の操作インターフェース
5
+ */
6
+ /**
7
+ * API操作タイプ(MongoDB 風)
8
+ */
9
+ export type ApiOperation = 'find' | 'findOne' | 'findMany' | 'findManyReference' | 'insertOne' | 'updateOne' | 'updateMany' | 'deleteOne' | 'deleteMany' | 'insertMany';
10
+ /**
11
+ * API リクエスト(共通)
12
+ */
13
+ export interface ApiRequest<T = unknown> {
14
+ /** 操作名 */
15
+ op: ApiOperation;
16
+ /** リソース名(例: "articles", "tasks") */
17
+ resource: string;
18
+ /** 操作パラメータ */
19
+ params: T;
20
+ }
21
+ /**
22
+ * find パラメータ
23
+ */
24
+ export interface FindParams {
25
+ /** フィルター条件 */
26
+ filter?: Record<string, unknown>;
27
+ /** ソート条件 */
28
+ sort?: {
29
+ /** ソート対象フィールド名(シャドー名) */
30
+ field: string;
31
+ /** ソート順序(ASC: 昇順, DESC: 降順) */
32
+ order: 'ASC' | 'DESC';
33
+ };
34
+ /** ページネーション条件 */
35
+ pagination?: {
36
+ /** ページ番号(1始まり) */
37
+ page?: number;
38
+ /** 1ページあたりの件数(最大50件) */
39
+ perPage?: number;
40
+ /** 次ページトークン(Base64URL エンコード) */
41
+ nextToken?: string;
42
+ };
43
+ }
44
+ /**
45
+ * findOne パラメータ
46
+ */
47
+ export interface FindOneParams {
48
+ /** 取得するレコードのID */
49
+ id: string;
50
+ }
51
+ /**
52
+ * findMany パラメータ
53
+ */
54
+ export interface FindManyParams {
55
+ /** 取得するレコードのIDリスト */
56
+ ids: string[];
57
+ }
58
+ /**
59
+ * findManyReference パラメータ
60
+ */
61
+ export interface FindManyReferenceParams {
62
+ /** 参照フィールド名(例: "userId") */
63
+ target: string;
64
+ /** 参照先ID */
65
+ id: string;
66
+ /** フィルター条件 */
67
+ filter?: Record<string, unknown>;
68
+ /** ソート条件 */
69
+ sort?: {
70
+ field: string;
71
+ order: 'ASC' | 'DESC';
72
+ };
73
+ /** ページネーション条件 */
74
+ pagination?: {
75
+ page?: number;
76
+ perPage?: number;
77
+ nextToken?: string;
78
+ };
79
+ }
80
+ /**
81
+ * insertOne パラメータ
82
+ */
83
+ export interface InsertOneParams {
84
+ /** 作成するレコードのデータ */
85
+ data: Record<string, unknown>;
86
+ }
87
+ /**
88
+ * updateOne パラメータ
89
+ */
90
+ export interface UpdateOneParams {
91
+ /** 更新対象のレコードID */
92
+ id: string;
93
+ /** 更新データ(JSON Merge Patch形式) */
94
+ data: Record<string, unknown>;
95
+ }
96
+ /**
97
+ * updateMany パラメータ
98
+ */
99
+ export interface UpdateManyParams {
100
+ /** 更新対象のレコードIDリスト */
101
+ ids: string[];
102
+ /** 更新データ(JSON Merge Patch形式) */
103
+ data: Record<string, unknown>;
104
+ }
105
+ /**
106
+ * deleteOne パラメータ
107
+ */
108
+ export interface DeleteOneParams {
109
+ /** 削除対象のレコードID */
110
+ id: string;
111
+ }
112
+ /**
113
+ * deleteMany パラメータ
114
+ */
115
+ export interface DeleteManyParams {
116
+ /** 削除対象のレコードIDリスト */
117
+ ids: string[];
118
+ }
119
+ /**
120
+ * insertMany パラメータ
121
+ */
122
+ export interface InsertManyParams {
123
+ /** 作成するレコードのデータ配列 */
124
+ data: Record<string, unknown>[];
125
+ }
126
+ /**
127
+ * API 成功レスポンス
128
+ */
129
+ export interface ApiSuccessResponse<T> {
130
+ /** 成功フラグ */
131
+ success: true;
132
+ /** レスポンスデータ */
133
+ data: T;
134
+ }
135
+ /**
136
+ * API エラーレスポンス
137
+ */
138
+ export interface ApiErrorResponse {
139
+ /** 成功フラグ */
140
+ success: false;
141
+ /** エラー情報 */
142
+ error: {
143
+ /** エラーコード */
144
+ code: string;
145
+ /** エラーメッセージ */
146
+ message: string;
147
+ /** HTTPステータスコード */
148
+ statusCode: number;
149
+ /** 追加詳細情報(オプション) */
150
+ details?: unknown;
151
+ };
152
+ }
153
+ /**
154
+ * API レスポンス(共通)
155
+ */
156
+ export type ApiResponse<T> = ApiSuccessResponse<T> | ApiErrorResponse;
157
+ /**
158
+ * find レスポンスデータ
159
+ */
160
+ export interface FindResult {
161
+ /** レコードリスト */
162
+ items: Record<string, unknown>[];
163
+ /** ページ情報 */
164
+ pageInfo: {
165
+ /** 次ページが存在するか */
166
+ hasNextPage: boolean;
167
+ /** 前ページが存在するか */
168
+ hasPreviousPage: boolean;
169
+ };
170
+ /** 次ページトークン(存在する場合) */
171
+ nextToken?: string;
172
+ /** 総件数(オプション、パフォーマンス影響あり) */
173
+ total?: number;
174
+ }
175
+ /**
176
+ * findOne レスポンスデータ
177
+ */
178
+ export type FindOneResult = Record<string, unknown>;
179
+ /**
180
+ * findMany レスポンスデータ
181
+ */
182
+ export type FindManyResult = Record<string, unknown>[];
183
+ /**
184
+ * findManyReference レスポンスデータ
185
+ */
186
+ export interface FindManyReferenceResult {
187
+ /** レコードリスト */
188
+ items: Record<string, unknown>[];
189
+ /** ページ情報 */
190
+ pageInfo: {
191
+ hasNextPage: boolean;
192
+ hasPreviousPage: boolean;
193
+ };
194
+ /** 次ページトークン(存在する場合) */
195
+ nextToken?: string;
196
+ /** 総件数(オプション) */
197
+ total?: number;
198
+ }
199
+ /**
200
+ * insertOne レスポンスデータ
201
+ */
202
+ export type InsertOneResult = Record<string, unknown>;
203
+ /**
204
+ * updateOne レスポンスデータ
205
+ */
206
+ export type UpdateOneResult = Record<string, unknown>;
207
+ /**
208
+ * 操作エラー
209
+ * 部分失敗時の個別エラー情報
210
+ */
211
+ export interface OperationError {
212
+ /** エラーが発生したレコードのID */
213
+ id: string;
214
+ /** エラーコード */
215
+ code: string;
216
+ /** エラーメッセージ */
217
+ message: string;
218
+ }
219
+ /**
220
+ * バルク操作の統一レスポンス形式(Records Lambda内部形式)
221
+ *
222
+ * Records Lambdaは統一された内部形式でレスポンスを返却します。
223
+ * この形式は情報を保持し、Collection.tsでMongoDB互換形式に変換されます。
224
+ */
225
+ export interface BulkOperationResult {
226
+ /** 成功件数 */
227
+ count: number;
228
+ /** 成功したレコードのインデックスとID({ 0: 'A', 2: 'C' }) */
229
+ successIds: Record<number, string>;
230
+ /** 失敗したレコードのインデックス({ 1: 'B' }) */
231
+ failedIds: Record<number, string>;
232
+ /** エラー情報(インデックスをキーとする)({ 1: { code: '...', message: '...' } }) */
233
+ errors: Record<number, OperationError>;
234
+ }
235
+ /**
236
+ * updateMany レスポンスデータ(Records Lambda内部形式)
237
+ */
238
+ export interface UpdateManyResult extends BulkOperationResult {
239
+ }
240
+ /**
241
+ * deleteOne レスポンスデータ
242
+ */
243
+ export interface DeleteOneResult {
244
+ /** 削除されたレコードのID */
245
+ id: string;
246
+ }
247
+ /**
248
+ * deleteMany レスポンスデータ(Records Lambda内部形式)
249
+ */
250
+ export interface DeleteManyResult extends BulkOperationResult {
251
+ }
252
+ /**
253
+ * insertMany レスポンスデータ(Records Lambda内部形式)
254
+ */
255
+ export interface InsertManyResult extends BulkOperationResult {
256
+ }
257
+ /**
258
+ * 操作ごとのパラメータ型マッピング
259
+ */
260
+ export type ApiParamsMap = {
261
+ find: FindParams;
262
+ findOne: FindOneParams;
263
+ findMany: FindManyParams;
264
+ findManyReference: FindManyReferenceParams;
265
+ insertOne: InsertOneParams;
266
+ updateOne: UpdateOneParams;
267
+ updateMany: UpdateManyParams;
268
+ deleteOne: DeleteOneParams;
269
+ deleteMany: DeleteManyParams;
270
+ insertMany: InsertManyParams;
271
+ };
272
+ /**
273
+ * 操作ごとのレスポンスデータ型マッピング
274
+ */
275
+ export type ApiDataMap = {
276
+ find: FindResult;
277
+ findOne: FindOneResult;
278
+ findMany: FindManyResult;
279
+ findManyReference: FindManyReferenceResult;
280
+ insertOne: InsertOneResult;
281
+ updateOne: UpdateOneResult;
282
+ updateMany: UpdateManyResult;
283
+ deleteOne: DeleteOneResult;
284
+ deleteMany: DeleteManyResult;
285
+ insertMany: InsertManyResult;
286
+ };
287
+ /**
288
+ * 型安全な API リクエスト
289
+ */
290
+ export type TypedApiRequest<T extends ApiOperation> = ApiRequest<ApiParamsMap[T]>;
291
+ /**
292
+ * 型安全な API レスポンス
293
+ */
294
+ export type TypedApiResponse<T extends ApiOperation> = ApiResponse<ApiDataMap[T]>;
295
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/server/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Records Lambda API型定義
3
+ * Lambda Function URL (RPC スタイル) で使用される型定義
4
+ * MongoDB 風の操作インターフェース
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/server/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}