@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,54 @@
1
+ /**
2
+ * 入力検証ユーティリティ
3
+ */
4
+ import { InvalidFilterError } from '../../index.js';
5
+ import { getDefaultSort, isValidShadowField } from '../shadow/index.js';
6
+ /**
7
+ * getList/getManyReferenceのソートフィールドを検証する
8
+ *
9
+ * @param config - シャドー設定
10
+ * @param resource - リソース名
11
+ * @param sort - ソート条件
12
+ * @throws {InvalidFilterError} ソートフィールドが無効な場合
13
+ */
14
+ export function validateSortField(config, resource, sort) {
15
+ if (!sort) {
16
+ return;
17
+ }
18
+ const { field } = sort;
19
+ // idフィールドは常に有効(本体レコードとして存在)
20
+ if (field === 'id') {
21
+ return;
22
+ }
23
+ // シャドーフィールドとして有効かチェック
24
+ if (!isValidShadowField(config, resource, field)) {
25
+ throw new InvalidFilterError(`Invalid sort field: ${field}`, { field, resource });
26
+ }
27
+ }
28
+ /**
29
+ * ページネーションパラメータを正規化する
30
+ *
31
+ * @param pagination - ページネーション条件
32
+ * @returns 正規化されたページネーション条件
33
+ */
34
+ export function normalizePagination(pagination) {
35
+ const perPage = Math.min(pagination?.perPage || 50, 50); // 最大50件
36
+ const nextToken = pagination?.nextToken;
37
+ return { perPage, nextToken };
38
+ }
39
+ /**
40
+ * ソート条件を正規化する(デフォルト値を適用)
41
+ *
42
+ * @param config - シャドー設定
43
+ * @param resource - リソース名
44
+ * @param sort - ソート条件
45
+ * @returns 正規化されたソート条件
46
+ */
47
+ export function normalizeSort(config, resource, sort) {
48
+ if (sort) {
49
+ return sort;
50
+ }
51
+ // デフォルトソートを取得
52
+ return getDefaultSort(config, resource);
53
+ }
54
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/server/utils/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAIxE;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAoB,EACpB,QAAgB,EAChB,IAA+C;IAE/C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;IACT,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAEvB,4BAA4B;IAC5B,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO;IACT,CAAC;IAED,sBAAsB;IACtB,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,kBAAkB,CAAC,uBAAuB,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACpF,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,UAA6E;IAE7E,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ;IACjE,MAAM,SAAS,GAAG,UAAU,EAAE,SAAS,CAAC;IAExC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAChC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAoB,EACpB,QAAgB,EAChB,IAA+C;IAE/C,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,IAAI,CAAC;IACd,CAAC;IAED,cAAc;IACd,OAAO,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,54 @@
1
+ import type { ResourceShadowConfig, ShadowConfig, ShadowFieldConfig } from './types.js';
2
+ /**
3
+ * shadow.config.jsonファイルから読み込む
4
+ *
5
+ * @param configPath - 設定ファイルのパス(デフォルト: './shadow.config.json')
6
+ * @returns パースされたシャドー設定
7
+ * @throws 設定ファイルが存在しない、または不正な形式の場合
8
+ */
9
+ export declare function loadShadowConfig(configPath?: string): Promise<ShadowConfig>;
10
+ /**
11
+ * 特定のリソースのシャドー設定を取得する
12
+ *
13
+ * @param config - シャドー設定全体
14
+ * @param resourceName - リソース名(例: 'articles', 'tasks')
15
+ * @returns リソースのシャドー設定
16
+ * @throws リソースが設定に存在しない場合
17
+ */
18
+ export declare function getResourceConfig(config: ShadowConfig, resourceName: string): ResourceShadowConfig;
19
+ /**
20
+ * リソースの全シャドーフィールドを取得する
21
+ *
22
+ * @param config - シャドー設定全体
23
+ * @param resourceName - リソース名
24
+ * @returns 全シャドーフィールドの設定
25
+ */
26
+ export declare function getAllShadowFields(config: ShadowConfig, resourceName: string): Record<string, ShadowFieldConfig>;
27
+ /**
28
+ * 指定されたフィールドが有効なシャドーフィールドかどうかを検証する
29
+ *
30
+ * @param config - シャドー設定全体
31
+ * @param resourceName - リソース名
32
+ * @param fieldName - 検証するフィールド名
33
+ * @returns フィールドが有効な場合true
34
+ */
35
+ export declare function isValidShadowField(config: ShadowConfig, resourceName: string, fieldName: string): boolean;
36
+ /**
37
+ * リソースのデフォルトソート設定を取得する
38
+ *
39
+ * @param config - シャドー設定全体
40
+ * @param resourceName - リソース名
41
+ * @returns デフォルトソート設定
42
+ */
43
+ export declare function getDefaultSort(config: ShadowConfig, resourceName: string): {
44
+ field: string;
45
+ order: 'ASC' | 'DESC';
46
+ };
47
+ /**
48
+ * 設定ファイルから環境変数経由でパスを取得する
49
+ *
50
+ * @param envVar - 環境変数名(デフォルト: 'SHADOW_CONFIG_PATH')
51
+ * @returns 設定ファイルのパス
52
+ */
53
+ export declare function getConfigPathFromEnv(envVar?: string): string;
54
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/shadows/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAExF;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,UAAU,GAAE,MAA+B,GAC1C,OAAO,CAAC,YAAY,CAAC,CAuBvB;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,MAAM,GACnB,oBAAoB,CAQtB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,MAAM,GACnB,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAGnC;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAChB,OAAO,CAOT;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,MAAM,GACnB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAAA;CAAE,CAG1C;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,GAAE,MAA6B,GAAG,MAAM,CAElF"}
@@ -0,0 +1,95 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { resolve } from 'node:path';
3
+ /**
4
+ * shadow.config.jsonファイルから読み込む
5
+ *
6
+ * @param configPath - 設定ファイルのパス(デフォルト: './shadow.config.json')
7
+ * @returns パースされたシャドー設定
8
+ * @throws 設定ファイルが存在しない、または不正な形式の場合
9
+ */
10
+ export async function loadShadowConfig(configPath = './shadow.config.json') {
11
+ try {
12
+ // ファイルシステムから読み込む
13
+ const absolutePath = resolve(configPath);
14
+ const content = await readFile(absolutePath, 'utf-8');
15
+ const config = JSON.parse(content);
16
+ // 基本的なバリデーション
17
+ if (!config.$schemaVersion) {
18
+ throw new Error('Missing $schemaVersion in shadow.config.json');
19
+ }
20
+ if (!config.resources || typeof config.resources !== 'object') {
21
+ throw new Error('Missing or invalid resources in shadow.config.json');
22
+ }
23
+ return config;
24
+ }
25
+ catch (error) {
26
+ if (error instanceof Error) {
27
+ throw new Error(`Failed to load shadow config: ${error.message}`);
28
+ }
29
+ throw error;
30
+ }
31
+ }
32
+ /**
33
+ * 特定のリソースのシャドー設定を取得する
34
+ *
35
+ * @param config - シャドー設定全体
36
+ * @param resourceName - リソース名(例: 'articles', 'tasks')
37
+ * @returns リソースのシャドー設定
38
+ * @throws リソースが設定に存在しない場合
39
+ */
40
+ export function getResourceConfig(config, resourceName) {
41
+ const resourceConfig = config.resources[resourceName];
42
+ if (!resourceConfig) {
43
+ throw new Error(`Resource '${resourceName}' not found in shadow config`);
44
+ }
45
+ return resourceConfig;
46
+ }
47
+ /**
48
+ * リソースの全シャドーフィールドを取得する
49
+ *
50
+ * @param config - シャドー設定全体
51
+ * @param resourceName - リソース名
52
+ * @returns 全シャドーフィールドの設定
53
+ */
54
+ export function getAllShadowFields(config, resourceName) {
55
+ const resourceConfig = getResourceConfig(config, resourceName);
56
+ return resourceConfig.shadows;
57
+ }
58
+ /**
59
+ * 指定されたフィールドが有効なシャドーフィールドかどうかを検証する
60
+ *
61
+ * @param config - シャドー設定全体
62
+ * @param resourceName - リソース名
63
+ * @param fieldName - 検証するフィールド名
64
+ * @returns フィールドが有効な場合true
65
+ */
66
+ export function isValidShadowField(config, resourceName, fieldName) {
67
+ try {
68
+ const allFields = getAllShadowFields(config, resourceName);
69
+ return fieldName in allFields;
70
+ }
71
+ catch {
72
+ return false;
73
+ }
74
+ }
75
+ /**
76
+ * リソースのデフォルトソート設定を取得する
77
+ *
78
+ * @param config - シャドー設定全体
79
+ * @param resourceName - リソース名
80
+ * @returns デフォルトソート設定
81
+ */
82
+ export function getDefaultSort(config, resourceName) {
83
+ const resourceConfig = getResourceConfig(config, resourceName);
84
+ return resourceConfig.sortDefaults;
85
+ }
86
+ /**
87
+ * 設定ファイルから環境変数経由でパスを取得する
88
+ *
89
+ * @param envVar - 環境変数名(デフォルト: 'SHADOW_CONFIG_PATH')
90
+ * @returns 設定ファイルのパス
91
+ */
92
+ export function getConfigPathFromEnv(envVar = 'SHADOW_CONFIG_PATH') {
93
+ return process.env[envVar] || './shadow.config.json';
94
+ }
95
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/shadows/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,aAAqB,sBAAsB;IAE3C,IAAI,CAAC;QACH,iBAAiB;QACjB,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAiB,CAAC;QAEnD,cAAc;QACd,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC9D,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACxE,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAoB,EACpB,YAAoB;IAEpB,MAAM,cAAc,GAAG,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAEtD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,aAAa,YAAY,8BAA8B,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAoB,EACpB,YAAoB;IAEpB,MAAM,cAAc,GAAG,iBAAiB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC/D,OAAO,cAAc,CAAC,OAAO,CAAC;AAChC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAoB,EACpB,YAAoB,EACpB,SAAiB;IAEjB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QAC3D,OAAO,SAAS,IAAI,SAAS,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAoB,EACpB,YAAoB;IAEpB,MAAM,cAAc,GAAG,iBAAiB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC/D,OAAO,cAAc,CAAC,YAAY,CAAC;AACrC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB,oBAAoB;IACxE,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,sBAAsB,CAAC;AACvD,CAAC"}
@@ -0,0 +1,42 @@
1
+ import type { ShadowDiff } from './types.js';
2
+ /**
3
+ * 旧シャドーキーと新シャドーキーの差分を計算する
4
+ *
5
+ * この関数は、レコード更新時に既存のシャドーレコードと新しく生成すべき
6
+ * シャドーレコードを比較し、削除すべきものと追加すべきものを特定します。
7
+ *
8
+ * @param oldShadowKeys - 既存のシャドーSKの配列
9
+ * @param newShadowKeys - 新しく生成されたシャドーSKの配列
10
+ * @returns 削除すべきSKと追加すべきSKのリスト
11
+ *
12
+ * @example
13
+ * const oldKeys = [
14
+ * 'name#Old#Name#id#01HZXY123',
15
+ * 'priority#00000000000000000010#id#01HZXY123'
16
+ * ];
17
+ * const newKeys = [
18
+ * 'name#New#Name#id#01HZXY123',
19
+ * 'priority#00000000000000000010#id#01HZXY123'
20
+ * ];
21
+ * const diff = calculateShadowDiff(oldKeys, newKeys);
22
+ * // => {
23
+ * // toDelete: ['name#Old#Name#id#01HZXY123'],
24
+ * // toAdd: ['name#New#Name#id#01HZXY123']
25
+ * // }
26
+ */
27
+ export declare function calculateShadowDiff(oldShadowKeys: string[], newShadowKeys: string[]): ShadowDiff;
28
+ /**
29
+ * シャドー差分が空かどうかを判定する
30
+ *
31
+ * @param diff - シャドー差分オブジェクト
32
+ * @returns 差分が空の場合true
33
+ */
34
+ export declare function isDiffEmpty(diff: ShadowDiff): boolean;
35
+ /**
36
+ * 複数のシャドー差分をマージする
37
+ *
38
+ * @param diffs - マージするシャドー差分の配列
39
+ * @returns マージされたシャドー差分
40
+ */
41
+ export declare function mergeShadowDiffs(diffs: ShadowDiff[]): ShadowDiff;
42
+ //# sourceMappingURL=differ.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"differ.d.ts","sourceRoot":"","sources":["../../src/shadows/differ.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,UAAU,CAehG;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAErD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,UAAU,CAahE"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * 旧シャドーキーと新シャドーキーの差分を計算する
3
+ *
4
+ * この関数は、レコード更新時に既存のシャドーレコードと新しく生成すべき
5
+ * シャドーレコードを比較し、削除すべきものと追加すべきものを特定します。
6
+ *
7
+ * @param oldShadowKeys - 既存のシャドーSKの配列
8
+ * @param newShadowKeys - 新しく生成されたシャドーSKの配列
9
+ * @returns 削除すべきSKと追加すべきSKのリスト
10
+ *
11
+ * @example
12
+ * const oldKeys = [
13
+ * 'name#Old#Name#id#01HZXY123',
14
+ * 'priority#00000000000000000010#id#01HZXY123'
15
+ * ];
16
+ * const newKeys = [
17
+ * 'name#New#Name#id#01HZXY123',
18
+ * 'priority#00000000000000000010#id#01HZXY123'
19
+ * ];
20
+ * const diff = calculateShadowDiff(oldKeys, newKeys);
21
+ * // => {
22
+ * // toDelete: ['name#Old#Name#id#01HZXY123'],
23
+ * // toAdd: ['name#New#Name#id#01HZXY123']
24
+ * // }
25
+ */
26
+ export function calculateShadowDiff(oldShadowKeys, newShadowKeys) {
27
+ // Set を使用して効率的な差分計算を行う
28
+ const oldSet = new Set(oldShadowKeys);
29
+ const newSet = new Set(newShadowKeys);
30
+ // 削除すべきキー: 旧キーに存在するが新キーに存在しない
31
+ const toDelete = oldShadowKeys.filter((key) => !newSet.has(key));
32
+ // 追加すべきキー: 新キーに存在するが旧キーに存在しない
33
+ const toAdd = newShadowKeys.filter((key) => !oldSet.has(key));
34
+ return {
35
+ toDelete,
36
+ toAdd,
37
+ };
38
+ }
39
+ /**
40
+ * シャドー差分が空かどうかを判定する
41
+ *
42
+ * @param diff - シャドー差分オブジェクト
43
+ * @returns 差分が空の場合true
44
+ */
45
+ export function isDiffEmpty(diff) {
46
+ return diff.toDelete.length === 0 && diff.toAdd.length === 0;
47
+ }
48
+ /**
49
+ * 複数のシャドー差分をマージする
50
+ *
51
+ * @param diffs - マージするシャドー差分の配列
52
+ * @returns マージされたシャドー差分
53
+ */
54
+ export function mergeShadowDiffs(diffs) {
55
+ const allToDelete = new Set();
56
+ const allToAdd = new Set();
57
+ for (const diff of diffs) {
58
+ diff.toDelete.forEach((key) => allToDelete.add(key));
59
+ diff.toAdd.forEach((key) => allToAdd.add(key));
60
+ }
61
+ return {
62
+ toDelete: Array.from(allToDelete),
63
+ toAdd: Array.from(allToAdd),
64
+ };
65
+ }
66
+ //# sourceMappingURL=differ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"differ.js","sourceRoot":"","sources":["../../src/shadows/differ.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,mBAAmB,CAAC,aAAuB,EAAE,aAAuB;IAClF,uBAAuB;IACvB,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;IAEtC,8BAA8B;IAC9B,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAEjE,8BAA8B;IAC9B,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAE9D,OAAO;QACL,QAAQ;QACR,KAAK;KACN,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,IAAgB;IAC1C,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;AAC/D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAmB;IAClD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IAEnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;QACjC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;KAC5B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,63 @@
1
+ import type { ShadowFieldType } from './types.js';
2
+ /**
3
+ * 文字列値をエスケープする
4
+ * ルール: # → ##, スペース → #
5
+ *
6
+ * @param value - エスケープする文字列
7
+ * @returns エスケープされた文字列
8
+ */
9
+ export declare function escapeString(value: string): string;
10
+ /**
11
+ * 数値を20桁のゼロ埋め文字列に変換する
12
+ *
13
+ * @param value - 変換する数値(null/undefinedも許容)
14
+ * @returns 20桁のゼロ埋め文字列
15
+ */
16
+ export declare function formatNumber(value: number | null | undefined): string;
17
+ /**
18
+ * 日時をUTC ISO 8601形式にフォーマットする
19
+ *
20
+ * @param value - 日時文字列またはDateオブジェクト(null/undefinedも許容)
21
+ * @returns UTC ISO 8601形式の文字列
22
+ */
23
+ export declare function formatDatetime(value: string | Date | null | undefined): string;
24
+ /**
25
+ * フィールド値を型に応じてフォーマットする
26
+ *
27
+ * @param type - フィールドの型
28
+ * @param value - フォーマットする値(null/undefinedも許容)
29
+ * @returns フォーマットされた文字列
30
+ */
31
+ export declare function formatFieldValue(type: ShadowFieldType, value: string | number | Date | null | undefined): string;
32
+ /**
33
+ * シャドーSKを生成する
34
+ * フォーマット: {fieldName}#{formattedValue}#id#{recordId}
35
+ *
36
+ * @param fieldName - フィールド名
37
+ * @param value - フィールド値
38
+ * @param recordId - レコードID(ULID)
39
+ * @param type - フィールドの型(デフォルト: 'string')
40
+ * @returns 生成されたシャドーSK
41
+ *
42
+ * @example
43
+ * generateShadowSK('name', 'Tech News', '01HZXY123', 'string')
44
+ * // => 'name#Tech#News#id#01HZXY123'
45
+ *
46
+ * @example
47
+ * generateShadowSK('priority', 123, '01HZXY123', 'number')
48
+ * // => 'priority#00000000000000000123#id#01HZXY123'
49
+ *
50
+ * @example
51
+ * generateShadowSK('createdAt', '2025-11-12T10:00:00.000Z', '01HZXY123', 'datetime')
52
+ * // => 'createdAt#2025-11-12T10:00:00.000Z#id#01HZXY123'
53
+ */
54
+ export declare function generateShadowSK(fieldName: string, value: string | number | Date, recordId: string, type?: ShadowFieldType): string;
55
+ /**
56
+ * レコードIDからメインレコードのSKを生成する
57
+ * フォーマット: id#{recordId}
58
+ *
59
+ * @param recordId - レコードID(ULID)
60
+ * @returns メインレコードのSK
61
+ */
62
+ export declare function generateMainRecordSK(recordId: string): string;
63
+ //# sourceMappingURL=generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/shadows/generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;;;;;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;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,eAAe,EACrB,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,GAC/C,MAAM,CAeR;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"}
@@ -0,0 +1,107 @@
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
+ * フィールド値を型に応じてフォーマットする
50
+ *
51
+ * @param type - フィールドの型
52
+ * @param value - フォーマットする値(null/undefinedも許容)
53
+ * @returns フォーマットされた文字列
54
+ */
55
+ export function formatFieldValue(type, value) {
56
+ switch (type) {
57
+ case 'string':
58
+ // 文字列型の場合、null/undefinedは空文字として扱う
59
+ if (value === null || value === undefined) {
60
+ return '';
61
+ }
62
+ return escapeString(String(value));
63
+ case 'number':
64
+ return formatNumber(value);
65
+ case 'datetime':
66
+ return formatDatetime(value);
67
+ default:
68
+ throw new Error(`Unknown shadow field type: ${type}`);
69
+ }
70
+ }
71
+ /**
72
+ * シャドーSKを生成する
73
+ * フォーマット: {fieldName}#{formattedValue}#id#{recordId}
74
+ *
75
+ * @param fieldName - フィールド名
76
+ * @param value - フィールド値
77
+ * @param recordId - レコードID(ULID)
78
+ * @param type - フィールドの型(デフォルト: 'string')
79
+ * @returns 生成されたシャドーSK
80
+ *
81
+ * @example
82
+ * generateShadowSK('name', 'Tech News', '01HZXY123', 'string')
83
+ * // => 'name#Tech#News#id#01HZXY123'
84
+ *
85
+ * @example
86
+ * generateShadowSK('priority', 123, '01HZXY123', 'number')
87
+ * // => 'priority#00000000000000000123#id#01HZXY123'
88
+ *
89
+ * @example
90
+ * generateShadowSK('createdAt', '2025-11-12T10:00:00.000Z', '01HZXY123', 'datetime')
91
+ * // => 'createdAt#2025-11-12T10:00:00.000Z#id#01HZXY123'
92
+ */
93
+ export function generateShadowSK(fieldName, value, recordId, type = 'string') {
94
+ const formattedValue = formatFieldValue(type, value);
95
+ return `${fieldName}#${formattedValue}#id#${recordId}`;
96
+ }
97
+ /**
98
+ * レコードIDからメインレコードのSKを生成する
99
+ * フォーマット: id#{recordId}
100
+ *
101
+ * @param recordId - レコードID(ULID)
102
+ * @returns メインレコードのSK
103
+ */
104
+ export function generateMainRecordSK(recordId) {
105
+ return `id#${recordId}`;
106
+ }
107
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/shadows/generator.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,KAAK;SACT,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,aAAa;SACjC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,cAAc;AACvC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,KAAgC;IAC3D,yBAAyB;IACzB,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1C,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,8BAA8B;IAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAElD,OAAO,UAAU,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;AACjD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,KAAuC;IACpE,yBAAyB;IACzB,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1C,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAEjE,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;AAC5B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAqB,EACrB,KAAgD;IAEhD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ;YACX,kCAAkC;YAClC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC1C,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,OAAO,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACrC,KAAK,QAAQ;YACX,OAAO,YAAY,CAAC,KAAkC,CAAC,CAAC;QAC1D,KAAK,UAAU;YACb,OAAO,cAAc,CAAC,KAAyC,CAAC,CAAC;QACnE;YACE,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,gBAAgB,CAC9B,SAAiB,EACjB,KAA6B,EAC7B,QAAgB,EAChB,OAAwB,QAAQ;IAEhC,MAAM,cAAc,GAAG,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACrD,OAAO,GAAG,SAAS,IAAI,cAAc,OAAO,QAAQ,EAAE,CAAC;AACzD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAgB;IACnD,OAAO,MAAM,QAAQ,EAAE,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * @exabugs/dynamodb-client/shadows - シャドー管理ライブラリ
3
+ *
4
+ * DynamoDB Single-Table設計における動的シャドーレコード管理を提供します。
5
+ *
6
+ * 主な機能:
7
+ * - シャドーSK生成(string/number/datetime対応)
8
+ * - シャドー差分計算(旧影と新影の比較)
9
+ * - shadow.config.json読み込みと検証
10
+ */
11
+ export type { ShadowFieldType, ShadowFieldConfig, ResourceShadowConfig, ShadowConfig, ShadowDiff, } from './types.js';
12
+ export { escapeString, formatNumber, formatDatetime, formatFieldValue, generateShadowSK, generateMainRecordSK, } from './generator.js';
13
+ export { calculateShadowDiff, isDiffEmpty, mergeShadowDiffs } from './differ.js';
14
+ export { loadShadowConfig, getResourceConfig, getAllShadowFields, isValidShadowField, getDefaultSort, getConfigPathFromEnv, } from './config.js';
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shadows/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,YAAY,EACV,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,YAAY,EACZ,UAAU,GACX,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGjF,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EACd,oBAAoB,GACrB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @exabugs/dynamodb-client/shadows - シャドー管理ライブラリ
3
+ *
4
+ * DynamoDB Single-Table設計における動的シャドーレコード管理を提供します。
5
+ *
6
+ * 主な機能:
7
+ * - シャドーSK生成(string/number/datetime対応)
8
+ * - シャドー差分計算(旧影と新影の比較)
9
+ * - shadow.config.json読み込みと検証
10
+ */
11
+ // ジェネレーター関数のエクスポート
12
+ export { escapeString, formatNumber, formatDatetime, formatFieldValue, generateShadowSK, generateMainRecordSK, } from './generator.js';
13
+ // 差分計算関数のエクスポート
14
+ export { calculateShadowDiff, isDiffEmpty, mergeShadowDiffs } from './differ.js';
15
+ // 設定管理関数のエクスポート
16
+ export { loadShadowConfig, getResourceConfig, getAllShadowFields, isValidShadowField, getDefaultSort, getConfigPathFromEnv, } from './config.js';
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/shadows/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAWH,mBAAmB;AACnB,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAExB,gBAAgB;AAChB,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEjF,gBAAgB;AAChB,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EACd,oBAAoB,GACrB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * シャドーフィールドの型定義
3
+ */
4
+ export type ShadowFieldType = 'string' | 'number' | 'datetime';
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/shadows/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE/D;;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/shadows/types.ts"],"names":[],"mappings":""}