@exabugs/dynamodb-client 1.13.1 → 1.14.1

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 (118) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +5 -15
  3. package/bin/dynamodb-access-check.js +6 -0
  4. package/dist/server/handler.cjs +3 -3
  5. package/dist/server/handler.cjs.map +1 -1
  6. package/dist/server/media-handler.cjs +2 -2
  7. package/dist/server/media-process-handler-dlq.cjs +2 -2
  8. package/dist/server/media-process-handler.cjs +2 -2
  9. package/dist/server/operations/parameterConverter.js +3 -3
  10. package/dist/server/operations/parameterConverter.js.map +1 -1
  11. package/dist/tools/dynamodb-access-check/allowlist.d.ts +39 -0
  12. package/dist/tools/dynamodb-access-check/allowlist.d.ts.map +1 -0
  13. package/dist/tools/dynamodb-access-check/allowlist.js +34 -0
  14. package/dist/tools/dynamodb-access-check/allowlist.js.map +1 -0
  15. package/dist/tools/dynamodb-access-check/check.d.ts +24 -0
  16. package/dist/tools/dynamodb-access-check/check.d.ts.map +1 -0
  17. package/dist/tools/dynamodb-access-check/check.js +40 -0
  18. package/dist/tools/dynamodb-access-check/check.js.map +1 -0
  19. package/dist/tools/dynamodb-access-check/cli.d.ts +10 -0
  20. package/dist/tools/dynamodb-access-check/cli.d.ts.map +1 -0
  21. package/dist/tools/dynamodb-access-check/cli.js +96 -0
  22. package/dist/tools/dynamodb-access-check/cli.js.map +1 -0
  23. package/dist/tools/dynamodb-access-check/forbidden.d.ts +15 -0
  24. package/dist/tools/dynamodb-access-check/forbidden.d.ts.map +1 -0
  25. package/dist/tools/dynamodb-access-check/forbidden.js +34 -0
  26. package/dist/tools/dynamodb-access-check/forbidden.js.map +1 -0
  27. package/dist/tools/dynamodb-access-check/glob.d.ts +8 -0
  28. package/dist/tools/dynamodb-access-check/glob.d.ts.map +1 -0
  29. package/dist/tools/dynamodb-access-check/glob.js +37 -0
  30. package/dist/tools/dynamodb-access-check/glob.js.map +1 -0
  31. package/dist/tools/dynamodb-access-check/index.d.ts +5 -0
  32. package/dist/tools/dynamodb-access-check/index.d.ts.map +1 -0
  33. package/dist/tools/dynamodb-access-check/index.js +4 -0
  34. package/dist/tools/dynamodb-access-check/index.js.map +1 -0
  35. package/dist/tools/dynamodb-access-check/run.d.ts +2 -0
  36. package/dist/tools/dynamodb-access-check/run.d.ts.map +1 -0
  37. package/dist/tools/dynamodb-access-check/run.js +3 -0
  38. package/dist/tools/dynamodb-access-check/run.js.map +1 -0
  39. package/dist/tools/dynamodb-access-check/scan.d.ts +25 -0
  40. package/dist/tools/dynamodb-access-check/scan.d.ts.map +1 -0
  41. package/dist/tools/dynamodb-access-check/scan.js +151 -0
  42. package/dist/tools/dynamodb-access-check/scan.js.map +1 -0
  43. package/dist/tools/eslint/index.d.ts +28 -0
  44. package/dist/tools/eslint/index.d.ts.map +1 -0
  45. package/dist/tools/eslint/index.js +34 -0
  46. package/dist/tools/eslint/index.js.map +1 -0
  47. package/docs/DYNAMODB_ACCESS.md +152 -0
  48. package/package.json +11 -11
  49. package/terraform/media/main.tf +9 -0
  50. package/bin/dynamodb-mcp.js +0 -12
  51. package/dist/mcp/adapter.d.ts +0 -36
  52. package/dist/mcp/adapter.d.ts.map +0 -1
  53. package/dist/mcp/adapter.js +0 -213
  54. package/dist/mcp/adapter.js.map +0 -1
  55. package/dist/mcp/cli.d.ts +0 -2
  56. package/dist/mcp/cli.d.ts.map +0 -1
  57. package/dist/mcp/cli.js +0 -122
  58. package/dist/mcp/cli.js.map +0 -1
  59. package/dist/mcp/index.d.ts +0 -7
  60. package/dist/mcp/index.d.ts.map +0 -1
  61. package/dist/mcp/index.js +0 -6
  62. package/dist/mcp/index.js.map +0 -1
  63. package/dist/mcp/server.d.ts +0 -18
  64. package/dist/mcp/server.d.ts.map +0 -1
  65. package/dist/mcp/server.js +0 -127
  66. package/dist/mcp/server.js.map +0 -1
  67. package/dist/mcp/tools/deleteMany.d.ts +0 -12
  68. package/dist/mcp/tools/deleteMany.d.ts.map +0 -1
  69. package/dist/mcp/tools/deleteMany.js +0 -24
  70. package/dist/mcp/tools/deleteMany.js.map +0 -1
  71. package/dist/mcp/tools/deleteOne.d.ts +0 -12
  72. package/dist/mcp/tools/deleteOne.d.ts.map +0 -1
  73. package/dist/mcp/tools/deleteOne.js +0 -24
  74. package/dist/mcp/tools/deleteOne.js.map +0 -1
  75. package/dist/mcp/tools/find.d.ts +0 -12
  76. package/dist/mcp/tools/find.d.ts.map +0 -1
  77. package/dist/mcp/tools/find.js +0 -56
  78. package/dist/mcp/tools/find.js.map +0 -1
  79. package/dist/mcp/tools/findMany.d.ts +0 -12
  80. package/dist/mcp/tools/findMany.d.ts.map +0 -1
  81. package/dist/mcp/tools/findMany.js +0 -28
  82. package/dist/mcp/tools/findMany.js.map +0 -1
  83. package/dist/mcp/tools/findManyReference.d.ts +0 -12
  84. package/dist/mcp/tools/findManyReference.d.ts.map +0 -1
  85. package/dist/mcp/tools/findManyReference.js +0 -32
  86. package/dist/mcp/tools/findManyReference.js.map +0 -1
  87. package/dist/mcp/tools/findOne.d.ts +0 -12
  88. package/dist/mcp/tools/findOne.d.ts.map +0 -1
  89. package/dist/mcp/tools/findOne.js +0 -24
  90. package/dist/mcp/tools/findOne.js.map +0 -1
  91. package/dist/mcp/tools/generated.d.ts +0 -11
  92. package/dist/mcp/tools/generated.d.ts.map +0 -1
  93. package/dist/mcp/tools/generated.js +0 -171
  94. package/dist/mcp/tools/generated.js.map +0 -1
  95. package/dist/mcp/tools/index.d.ts +0 -13
  96. package/dist/mcp/tools/index.d.ts.map +0 -1
  97. package/dist/mcp/tools/index.js +0 -29
  98. package/dist/mcp/tools/index.js.map +0 -1
  99. package/dist/mcp/tools/insertMany.d.ts +0 -12
  100. package/dist/mcp/tools/insertMany.d.ts.map +0 -1
  101. package/dist/mcp/tools/insertMany.js +0 -28
  102. package/dist/mcp/tools/insertMany.js.map +0 -1
  103. package/dist/mcp/tools/insertOne.d.ts +0 -12
  104. package/dist/mcp/tools/insertOne.d.ts.map +0 -1
  105. package/dist/mcp/tools/insertOne.js +0 -24
  106. package/dist/mcp/tools/insertOne.js.map +0 -1
  107. package/dist/mcp/tools/updateMany.d.ts +0 -12
  108. package/dist/mcp/tools/updateMany.d.ts.map +0 -1
  109. package/dist/mcp/tools/updateMany.js +0 -28
  110. package/dist/mcp/tools/updateMany.js.map +0 -1
  111. package/dist/mcp/tools/updateOne.d.ts +0 -12
  112. package/dist/mcp/tools/updateOne.d.ts.map +0 -1
  113. package/dist/mcp/tools/updateOne.js +0 -38
  114. package/dist/mcp/tools/updateOne.js.map +0 -1
  115. package/dist/mcp/types.d.ts +0 -50
  116. package/dist/mcp/types.d.ts.map +0 -1
  117. package/dist/mcp/types.js +0 -49
  118. package/dist/mcp/types.js.map +0 -1
@@ -1,5 +1,5 @@
1
- // @exabugs/dynamodb-client v1.13.1
2
- // Built: 2026-10-16T12:17:45.971Z
1
+ // @exabugs/dynamodb-client v1.14.1
2
+ // Built: 2026-10-18T06:44:22.491Z
3
3
  "use strict";
4
4
  var __create = Object.create;
5
5
  var __defProp = Object.defineProperty;
@@ -1,5 +1,5 @@
1
- // @exabugs/dynamodb-client v1.13.1
2
- // Built: 2026-10-16T12:17:45.971Z
1
+ // @exabugs/dynamodb-client v1.14.1
2
+ // Built: 2026-10-18T06:44:22.491Z
3
3
  "use strict";
4
4
  var __create = Object.create;
5
5
  var __defProp = Object.defineProperty;
@@ -1,5 +1,5 @@
1
- // @exabugs/dynamodb-client v1.13.1
2
- // Built: 2026-10-16T12:17:45.971Z
1
+ // @exabugs/dynamodb-client v1.14.1
2
+ // Built: 2026-10-18T06:44:22.491Z
3
3
  "use strict";
4
4
  var __create = Object.create;
5
5
  var __defProp = Object.defineProperty;
@@ -54,7 +54,7 @@ export function convertFindOneParams(mongoParams) {
54
54
  * @returns 内部形式のfindManyパラメータ
55
55
  */
56
56
  export function convertFindManyParams(mongoParams) {
57
- // MCP用: idsが直接指定されている場合
57
+ // idsが直接指定されている場合
58
58
  if (mongoParams.ids !== undefined) {
59
59
  return { ids: mongoParams.ids };
60
60
  }
@@ -109,7 +109,7 @@ export function convertUpdateOneParams(mongoParams) {
109
109
  else {
110
110
  updateData = {};
111
111
  }
112
- // MCPツールから直接idが指定されている場合(優先)
112
+ // idが直接指定されている場合(優先)
113
113
  const directId = 'id' in mongoParams && typeof mongoParams.id === 'string' ? mongoParams.id : undefined;
114
114
  if (directId) {
115
115
  return {
@@ -181,7 +181,7 @@ export function convertUpdateManyParams(mongoParams) {
181
181
  * @throws {Error} idが指定されていない場合
182
182
  */
183
183
  export function convertDeleteOneParams(mongoParams) {
184
- // MCPツールから直接idが指定されている場合(優先)
184
+ // idが直接指定されている場合(優先)
185
185
  const directId = 'id' in mongoParams && typeof mongoParams.id === 'string' ? mongoParams.id : undefined;
186
186
  if (directId) {
187
187
  return { id: directId };
@@ -1 +1 @@
1
- {"version":3,"file":"parameterConverter.js","sourceRoot":"","sources":["../../../src/server/operations/parameterConverter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parameterConverter.js","sourceRoot":"","sources":["../../../src/server/operations/parameterConverter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ export type AllowlistKind = 'permanent' | 'debt';
2
+ /**
3
+ * 許可リストのエントリ(3 リポジトリ共通の形式)。
4
+ * - コード: `file` のみ(glob 可。例: `src/server/**`)
5
+ * - Terraform: `file`(.tf のパス)と `terraform`(`aws_iam_role_policy.x` / `data.aws_iam_policy_document.y`)
6
+ */
7
+ export interface AllowlistEntry {
8
+ file: string;
9
+ /** Terraform の resource / data の名前。あれば Terraform のエントリ */
10
+ terraform?: string;
11
+ kind: AllowlistKind;
12
+ reason: string;
13
+ /** kind が debt のとき必須: 解消の道筋 */
14
+ todo?: string;
15
+ /** `file` の glob から除くもの(ESLint でも同じ除外になる) */
16
+ exclude?: string[];
17
+ /** 検出した行(任意)。ずれていても警告だけ */
18
+ line?: number;
19
+ /**
20
+ * ESLint だけが検出する制限(利用側固有の patterns)に対する例外。
21
+ * CLI は import を検出できないので、「検出されない」警告を出さない。
22
+ */
23
+ eslintOnly?: boolean;
24
+ notes?: string;
25
+ }
26
+ export interface Allowlist {
27
+ entries: AllowlistEntry[];
28
+ }
29
+ /** 許可リストを読み、書式を検査する。不正なら、問題の一覧を返す */
30
+ export declare function loadAllowlist(path: string): {
31
+ allowlist: Allowlist;
32
+ problems: string[];
33
+ };
34
+ /** エントリが、検出(種別・ファイル・Terraform の名前)に当てはまるか */
35
+ export declare function entryMatches(entry: AllowlistEntry, found: {
36
+ file: string;
37
+ terraform?: string;
38
+ }): boolean;
39
+ //# sourceMappingURL=allowlist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"allowlist.d.ts","sourceRoot":"","sources":["../../../src/tools/dynamodb-access-check/allowlist.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,MAAM,CAAC;AAEjD;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,2BAA2B;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,cAAc,EAAE,CAAC;CAC3B;AAED,qCAAqC;AACrC,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAmBxF;AAED,6CAA6C;AAC7C,wBAAgB,YAAY,CAC1B,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1C,OAAO,CAIT"}
@@ -0,0 +1,34 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { matchesAny } from './glob.js';
3
+ /** 許可リストを読み、書式を検査する。不正なら、問題の一覧を返す */
4
+ export function loadAllowlist(path) {
5
+ const raw = JSON.parse(readFileSync(path, 'utf8'));
6
+ const problems = [];
7
+ if (!raw || !Array.isArray(raw.entries)) {
8
+ return { allowlist: { entries: [] }, problems: ['`entries` の配列が無い'] };
9
+ }
10
+ const entries = raw.entries;
11
+ entries.forEach((e, i) => {
12
+ const label = `entries[${i}] (${e?.file ?? '?'}${e?.terraform ? ` ${e.terraform}` : ''})`;
13
+ if (!e || typeof e.file !== 'string' || e.file === '')
14
+ problems.push(`${label}: file が無い`);
15
+ if (e.kind !== 'permanent' && e.kind !== 'debt') {
16
+ problems.push(`${label}: kind は permanent か debt`);
17
+ }
18
+ if (typeof e.reason !== 'string' || e.reason === '')
19
+ problems.push(`${label}: reason が無い`);
20
+ if (e.kind === 'debt' && (typeof e.todo !== 'string' || e.todo === '')) {
21
+ problems.push(`${label}: debt には todo が要る`);
22
+ }
23
+ });
24
+ return { allowlist: { entries }, problems };
25
+ }
26
+ /** エントリが、検出(種別・ファイル・Terraform の名前)に当てはまるか */
27
+ export function entryMatches(entry, found) {
28
+ if ((entry.terraform !== undefined) !== (found.terraform !== undefined))
29
+ return false;
30
+ if (entry.terraform !== undefined && entry.terraform !== found.terraform)
31
+ return false;
32
+ return matchesAny([entry.file], found.file) && !matchesAny(entry.exclude ?? [], found.file);
33
+ }
34
+ //# sourceMappingURL=allowlist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"allowlist.js","sourceRoot":"","sources":["../../../src/tools/dynamodb-access-check/allowlist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAiCvC,qCAAqC;AACrC,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAA0B,CAAC;IAC5E,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACxC,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,kBAAkB,CAAC,EAAE,CAAC;IACxE,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,CAAC,OAA2B,CAAC;IAChD,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACvB,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,EAAE,IAAI,IAAI,GAAG,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;QAC1F,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,EAAE;YAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,YAAY,CAAC,CAAC;QAC3F,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAChD,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,2BAA2B,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,EAAE;YAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,cAAc,CAAC,CAAC;QAC3F,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,CAAC;YACvE,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,oBAAoB,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC;AAC9C,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,YAAY,CAC1B,KAAqB,EACrB,KAA2C;IAE3C,IAAI,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IACtF,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IACvF,OAAO,UAAU,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;AAC9F,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { type Finding } from './scan.js';
2
+ export interface CheckOptions {
3
+ /** 相対パス(許可リストの file、src、tf、ignore)の基準 */
4
+ root: string;
5
+ allowlistPath: string;
6
+ /** 走査するソースのディレクトリ(root からの相対) */
7
+ src: string[];
8
+ /** 走査する Terraform のディレクトリ(root からの相対) */
9
+ tf: string[];
10
+ /** 走査から除く glob(root からの相対パスに対して) */
11
+ ignore: string[];
12
+ }
13
+ export interface CheckResult {
14
+ /** 許可リストに無い検出、許可リストの書式の問題 */
15
+ violations: string[];
16
+ warnings: string[];
17
+ /** 許可リストにある検出のうち、負債のもの */
18
+ debts: Finding[];
19
+ found: number;
20
+ allowed: number;
21
+ }
22
+ /** 走査して、許可リストと照合する(出力はしない) */
23
+ export declare function runCheck(options: CheckOptions): CheckResult;
24
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../src/tools/dynamodb-access-check/check.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,OAAO,EAA8B,MAAM,WAAW,CAAC;AAErE,MAAM,WAAW,YAAY;IAC3B,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,iCAAiC;IACjC,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,yCAAyC;IACzC,EAAE,EAAE,MAAM,EAAE,CAAC;IACb,oCAAoC;IACpC,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,6BAA6B;IAC7B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,0BAA0B;IAC1B,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAUD,8BAA8B;AAC9B,wBAAgB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,WAAW,CAiC3D"}
@@ -0,0 +1,40 @@
1
+ import { entryMatches, loadAllowlist } from './allowlist.js';
2
+ import { scanSources, scanTerraform } from './scan.js';
3
+ const describe = (f) => f.terraform
4
+ ? `${f.file}:${f.line} ${f.terraform} [${f.detail}]`
5
+ : `${f.file}:${f.line} ${f.detail}`;
6
+ const entryLabel = (e) => e.terraform ? `${e.file} ${e.terraform}` : e.file;
7
+ /** 走査して、許可リストと照合する(出力はしない) */
8
+ export function runCheck(options) {
9
+ const { allowlist, problems } = loadAllowlist(options.allowlistPath);
10
+ const violations = problems.map((p) => `許可リストの書式が不正: ${p}`);
11
+ const warnings = [];
12
+ const code = scanSources(options.root, options.src, options.ignore);
13
+ const tf = scanTerraform(options.root, options.tf, options.ignore);
14
+ const found = [...code.findings, ...tf.findings];
15
+ const debts = [];
16
+ let allowed = 0;
17
+ for (const f of found) {
18
+ const entry = findEntry(allowlist, f);
19
+ if (!entry) {
20
+ violations.push(`許可リストに無い DynamoDB への直接アクセス: ${describe(f)}`);
21
+ continue;
22
+ }
23
+ allowed++;
24
+ if (entry.kind === 'debt')
25
+ debts.push(f);
26
+ if (entry.line !== undefined && entry.line !== f.line) {
27
+ warnings.push(`行番号がずれている: ${entryLabel(entry)} (リスト ${entry.line} → 実際 ${f.line})`);
28
+ }
29
+ }
30
+ for (const e of allowlist.entries) {
31
+ if (!e.eslintOnly && !found.some((f) => entryMatches(e, f))) {
32
+ warnings.push(`許可リストにあるが検出されない(リストから消す): ${entryLabel(e)} [${e.kind}]`);
33
+ }
34
+ }
35
+ return { violations, warnings, debts, found: found.length, allowed };
36
+ }
37
+ function findEntry(allowlist, f) {
38
+ return allowlist.entries.find((e) => entryMatches(e, f));
39
+ }
40
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/tools/dynamodb-access-check/check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuC,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAClG,OAAO,EAAgB,WAAW,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAwBrE,MAAM,QAAQ,GAAG,CAAC,CAAU,EAAU,EAAE,CACtC,CAAC,CAAC,SAAS;IACT,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,MAAM,GAAG;IACpD,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;AAExC,MAAM,UAAU,GAAG,CAAC,CAAiB,EAAU,EAAE,CAC/C,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAEpD,8BAA8B;AAC9B,MAAM,UAAU,QAAQ,CAAC,OAAqB;IAC5C,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACpE,MAAM,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACnE,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC;IAEjD,MAAM,KAAK,GAAc,EAAE,CAAC;IAC5B,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,UAAU,CAAC,IAAI,CAAC,+BAA+B,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC9D,SAAS;QACX,CAAC;QACD,OAAO,EAAE,CAAC;QACV,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;YACtD,QAAQ,CAAC,IAAI,CACX,cAAc,UAAU,CAAC,KAAK,CAAC,SAAS,KAAK,CAAC,IAAI,SAAS,CAAC,CAAC,IAAI,GAAG,CACrE,CAAC;QACJ,CAAC;IACH,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;QAClC,IAAI,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5D,QAAQ,CAAC,IAAI,CACX,6BAA6B,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CACzD,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;AACvE,CAAC;AAED,SAAS,SAAS,CAAC,SAAoB,EAAE,CAAU;IACjD,OAAO,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { type CheckOptions } from './check.js';
2
+ export interface CliIo {
3
+ out: (s: string) => void;
4
+ err: (s: string) => void;
5
+ }
6
+ /** 引数を解釈する。誤りは Error */
7
+ export declare function parseArgs(argv: string[]): CheckOptions;
8
+ /** CLI 本体。終了コードを返す(process.exit は bin が呼ぶ) */
9
+ export declare function main(argv: string[], io?: CliIo): number;
10
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../src/tools/dynamodb-access-check/cli.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,YAAY,EAAY,MAAM,YAAY,CAAC;AAEzD,MAAM,WAAW,KAAK;IACpB,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACzB,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1B;AAYD,wBAAwB;AACxB,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,YAAY,CAgCtD;AAED,8CAA8C;AAC9C,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,GAAE,KAAgD,GAAG,MAAM,CAsCjG"}
@@ -0,0 +1,96 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ import { runCheck } from './check.js';
4
+ const USAGE = `使い方: dynamodb-access-check --allowlist <json> [--root <dir>] [--src <dir>...] [--tf <dir>...] [--ignore <glob>...]
5
+
6
+ --allowlist <path> 許可リストの JSON(必須)
7
+ --root <dir> 相対パスの基準(既定: カレントディレクトリ)
8
+ --src <dir>... 走査するソースのディレクトリ(既定: .)
9
+ --tf <dir>... 走査する Terraform のディレクトリ(既定: .)
10
+ --ignore <glob>... 走査から除く glob(root からの相対パス。例: '**/__tests__/**')
11
+
12
+ 終了コード: 0=OK / 1=許可リストに無い違反 / 2=引数・読み込みの誤り`;
13
+ /** 引数を解釈する。誤りは Error */
14
+ export function parseArgs(argv) {
15
+ const multi = { '--src': [], '--tf': [], '--ignore': [] };
16
+ let allowlist;
17
+ let root = process.cwd();
18
+ let current;
19
+ for (let i = 0; i < argv.length; i++) {
20
+ const a = argv[i];
21
+ if (a === '--allowlist' || a === '--root') {
22
+ const v = argv[++i];
23
+ if (!v || v.startsWith('--'))
24
+ throw new Error(`${a} に値が要る`);
25
+ if (a === '--allowlist')
26
+ allowlist = v;
27
+ else
28
+ root = resolve(v);
29
+ current = undefined;
30
+ }
31
+ else if (a in multi) {
32
+ current = a;
33
+ }
34
+ else if (a.startsWith('--')) {
35
+ throw new Error(`未知の引数: ${a}`);
36
+ }
37
+ else if (current) {
38
+ multi[current].push(a); // 値は複数並べられる
39
+ }
40
+ else {
41
+ throw new Error(`位置が不正な引数: ${a}`);
42
+ }
43
+ }
44
+ if (!allowlist)
45
+ throw new Error('--allowlist が要る');
46
+ for (const k of ['--src', '--tf'])
47
+ if (multi[k].length === 0)
48
+ multi[k].push('.');
49
+ return {
50
+ root,
51
+ allowlistPath: resolve(allowlist),
52
+ src: multi['--src'],
53
+ tf: multi['--tf'],
54
+ ignore: multi['--ignore'],
55
+ };
56
+ }
57
+ /** CLI 本体。終了コードを返す(process.exit は bin が呼ぶ) */
58
+ export function main(argv, io = { out: console.log, err: console.error }) {
59
+ if (argv.includes('--help') || argv.includes('-h')) {
60
+ io.out(USAGE);
61
+ return 0;
62
+ }
63
+ let options;
64
+ try {
65
+ options = parseArgs(argv);
66
+ if (!existsSync(options.allowlistPath)) {
67
+ throw new Error(`許可リストが無い: ${options.allowlistPath}`);
68
+ }
69
+ }
70
+ catch (e) {
71
+ io.err(`${e.message}\n\n${USAGE}`);
72
+ return 2;
73
+ }
74
+ let result;
75
+ try {
76
+ result = runCheck(options);
77
+ }
78
+ catch (e) {
79
+ io.err(`検査を実行できない: ${e.message}`);
80
+ return 2;
81
+ }
82
+ for (const w of result.warnings)
83
+ io.err(`WARN: ${w}`);
84
+ for (const d of result.debts) {
85
+ io.out(`負債: ${d.file}:${d.line} ${d.terraform ?? d.detail}`);
86
+ }
87
+ if (result.violations.length > 0) {
88
+ for (const v of result.violations)
89
+ io.err(`NG: ${v}`);
90
+ io.err('\nDynamoDB の操作は Records(DynamoClient 経由)に限る。例外にするなら許可リストに理由つきで追加する。');
91
+ return 1;
92
+ }
93
+ io.out(`OK: DynamoDB への直接アクセスは許可リストの範囲内(検出 ${result.found} 件、負債 ${result.debts.length} 件)`);
94
+ return 0;
95
+ }
96
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/tools/dynamodb-access-check/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * DynamoDB への直接アクセスとみなす import の定義(CLI と ESLint の共有設定の唯一の正本)。
3
+ */
4
+ /**
5
+ * このライブラリの内部で DynamoDB に触れるエントリポイント。
6
+ * 触れない `server/media/*`、`server/media-sign` は含めない(許可)。
7
+ */
8
+ export declare const LIBRARY_INTERNAL_IMPORTS: readonly ["@exabugs/dynamodb-client/server", "@exabugs/dynamodb-client/server/handler", "@exabugs/dynamodb-client/server/media-handler", "@exabugs/dynamodb-client/server/media-process-handler", "@exabugs/dynamodb-client/server/media-process-handler-dlq"];
9
+ /** ESLint の `no-restricted-imports` の `paths` に使う、完全一致の禁止リスト */
10
+ export declare const FORBIDDEN_IMPORT_NAMES: readonly string[];
11
+ /** import の指定子が禁止のものか */
12
+ export declare function isForbiddenSpecifier(specifier: string): boolean;
13
+ /** aws-sdk v2 のグローバルな DynamoDB クライアント(`AWS` 名前空間の DynamoDB)を検出したときの表示 */
14
+ export declare const AWS_V2_DYNAMODB_LABEL = "aws-sdk v2 \u306E DynamoDB \u30AF\u30E9\u30A4\u30A2\u30F3\u30C8";
15
+ //# sourceMappingURL=forbidden.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forbidden.d.ts","sourceRoot":"","sources":["../../../src/tools/dynamodb-access-check/forbidden.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH;;;GAGG;AACH,eAAO,MAAM,wBAAwB,gQAM3B,CAAC;AAEX,gEAAgE;AAChE,eAAO,MAAM,sBAAsB,EAAE,SAAS,MAAM,EAKnD,CAAC;AAEF,yBAAyB;AACzB,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAM/D;AAED,yEAAyE;AACzE,eAAO,MAAM,qBAAqB,oEAAiC,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * DynamoDB への直接アクセスとみなす import の定義(CLI と ESLint の共有設定の唯一の正本)。
3
+ */
4
+ /** AWS SDK の DynamoDB パッケージ(v3)。サブパスも含めて禁止 */
5
+ const AWS_SDK_V3 = /^@aws-sdk\/(?:client|lib|util)-dynamodb(?:\/.*)?$/;
6
+ /** aws-sdk v2 の DynamoDB クライアントを直接 import する形 */
7
+ const AWS_SDK_V2 = /^aws-sdk\/clients\/dynamodb(?:\/.*)?$/;
8
+ /**
9
+ * このライブラリの内部で DynamoDB に触れるエントリポイント。
10
+ * 触れない `server/media/*`、`server/media-sign` は含めない(許可)。
11
+ */
12
+ export const LIBRARY_INTERNAL_IMPORTS = [
13
+ '@exabugs/dynamodb-client/server',
14
+ '@exabugs/dynamodb-client/server/handler',
15
+ '@exabugs/dynamodb-client/server/media-handler',
16
+ '@exabugs/dynamodb-client/server/media-process-handler',
17
+ '@exabugs/dynamodb-client/server/media-process-handler-dlq',
18
+ ];
19
+ /** ESLint の `no-restricted-imports` の `paths` に使う、完全一致の禁止リスト */
20
+ export const FORBIDDEN_IMPORT_NAMES = [
21
+ '@aws-sdk/client-dynamodb',
22
+ '@aws-sdk/lib-dynamodb',
23
+ '@aws-sdk/util-dynamodb',
24
+ ...LIBRARY_INTERNAL_IMPORTS,
25
+ ];
26
+ /** import の指定子が禁止のものか */
27
+ export function isForbiddenSpecifier(specifier) {
28
+ return (AWS_SDK_V3.test(specifier) ||
29
+ AWS_SDK_V2.test(specifier) ||
30
+ LIBRARY_INTERNAL_IMPORTS.includes(specifier));
31
+ }
32
+ /** aws-sdk v2 のグローバルな DynamoDB クライアント(`AWS` 名前空間の DynamoDB)を検出したときの表示 */
33
+ export const AWS_V2_DYNAMODB_LABEL = 'aws-sdk v2 の DynamoDB クライアント';
34
+ //# sourceMappingURL=forbidden.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forbidden.js","sourceRoot":"","sources":["../../../src/tools/dynamodb-access-check/forbidden.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,8CAA8C;AAC9C,MAAM,UAAU,GAAG,mDAAmD,CAAC;AAEvE,iDAAiD;AACjD,MAAM,UAAU,GAAG,uCAAuC,CAAC;AAE3D;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,iCAAiC;IACjC,yCAAyC;IACzC,+CAA+C;IAC/C,uDAAuD;IACvD,2DAA2D;CACnD,CAAC;AAEX,gEAAgE;AAChE,MAAM,CAAC,MAAM,sBAAsB,GAAsB;IACvD,0BAA0B;IAC1B,uBAAuB;IACvB,wBAAwB;IACxB,GAAG,wBAAwB;CAC5B,CAAC;AAEF,yBAAyB;AACzB,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACpD,OAAO,CACL,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;QAC1B,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;QACzB,wBAA8C,CAAC,QAAQ,CAAC,SAAS,CAAC,CACpE,CAAC;AACJ,CAAC;AAED,yEAAyE;AACzE,MAAM,CAAC,MAAM,qBAAqB,GAAG,8BAA8B,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * 最小限の glob(`**`、`*`、`?`)。依存を増やさないための自前実装。
3
+ * パスは `/` 区切りの、ルートからの相対パス。
4
+ */
5
+ export declare function globToRegExp(glob: string): RegExp;
6
+ /** いずれかの glob に一致するか */
7
+ export declare function matchesAny(globs: readonly string[], path: string): boolean;
8
+ //# sourceMappingURL=glob.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../../src/tools/dynamodb-access-check/glob.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAuBjD;AAED,wBAAwB;AACxB,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1E"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * 最小限の glob(`**`、`*`、`?`)。依存を増やさないための自前実装。
3
+ * パスは `/` 区切りの、ルートからの相対パス。
4
+ */
5
+ export function globToRegExp(glob) {
6
+ let out = '';
7
+ for (let i = 0; i < glob.length; i++) {
8
+ const c = glob[i];
9
+ if (c === '*') {
10
+ if (glob[i + 1] === '*') {
11
+ if (glob[i + 2] === '/') {
12
+ out += '(?:.*/)?'; // `**/` は 0 個以上のディレクトリ
13
+ i += 2;
14
+ }
15
+ else {
16
+ out += '.*';
17
+ i += 1;
18
+ }
19
+ }
20
+ else {
21
+ out += '[^/]*';
22
+ }
23
+ }
24
+ else if (c === '?') {
25
+ out += '[^/]';
26
+ }
27
+ else {
28
+ out += c.replace(/[.+^${}()|[\]\\]/g, '\\$&');
29
+ }
30
+ }
31
+ return new RegExp(`^${out}$`);
32
+ }
33
+ /** いずれかの glob に一致するか */
34
+ export function matchesAny(globs, path) {
35
+ return globs.some((g) => globToRegExp(g).test(path));
36
+ }
37
+ //# sourceMappingURL=glob.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob.js","sourceRoot":"","sources":["../../../src/tools/dynamodb-access-check/glob.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACd,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACxB,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;oBACxB,GAAG,IAAI,UAAU,CAAC,CAAC,uBAAuB;oBAC1C,CAAC,IAAI,CAAC,CAAC;gBACT,CAAC;qBAAM,CAAC;oBACN,GAAG,IAAI,IAAI,CAAC;oBACZ,CAAC,IAAI,CAAC,CAAC;gBACT,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,GAAG,IAAI,OAAO,CAAC;YACjB,CAAC;QACH,CAAC;aAAM,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACrB,GAAG,IAAI,MAAM,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IACD,OAAO,IAAI,MAAM,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;AAChC,CAAC;AAED,wBAAwB;AACxB,MAAM,UAAU,UAAU,CAAC,KAAwB,EAAE,IAAY;IAC/D,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACvD,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { type CheckOptions, type CheckResult, runCheck } from './check.js';
2
+ export { type Allowlist, type AllowlistEntry, type AllowlistKind } from './allowlist.js';
3
+ export { FORBIDDEN_IMPORT_NAMES, isForbiddenSpecifier } from './forbidden.js';
4
+ export { main, parseArgs } from './cli.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/dynamodb-access-check/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3E,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACzF,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { runCheck } from './check.js';
2
+ export { FORBIDDEN_IMPORT_NAMES, isForbiddenSpecifier } from './forbidden.js';
3
+ export { main, parseArgs } from './cli.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/dynamodb-access-check/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuC,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3E,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/tools/dynamodb-access-check/run.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import { main } from './cli.js';
2
+ process.exitCode = main(process.argv.slice(2));
3
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/tools/dynamodb-access-check/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAEhC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,25 @@
1
+ /** 検出 1 件。`terraform` があれば IAM(Terraform)、なければコード */
2
+ export interface Finding {
3
+ file: string;
4
+ line: number;
5
+ /** 禁止された import の指定子 / aws-sdk v2 の検出 / dynamodb: の権限 */
6
+ detail: string;
7
+ terraform?: string;
8
+ }
9
+ /** 常に走査しないディレクトリ */
10
+ export declare const DEFAULT_IGNORED_DIRS: Set<string>;
11
+ /** dir 配下のファイルを集める(root からの相対パスを返す)。`ignore` の glob に一致するものは除く */
12
+ export declare function walkFiles(root: string, dirs: readonly string[], accept: (name: string) => boolean, ignore: readonly string[]): string[];
13
+ /** ソースから、禁止された import(と aws-sdk v2 の DynamoDB クライアント)を検出する */
14
+ export declare function scanSources(root: string, dirs: readonly string[], ignore: readonly string[]): {
15
+ findings: Finding[];
16
+ scanned: number;
17
+ };
18
+ /** 名前のないブロック(locals・module など)の検出に使う名前 */
19
+ export declare const TF_TOP_LEVEL = "(top-level)";
20
+ /** Terraform から、DynamoDB の権限(`dynamodb:*`、AWS 管理ポリシー)を持つブロックを検出する */
21
+ export declare function scanTerraform(root: string, dirs: readonly string[], ignore: readonly string[]): {
22
+ findings: Finding[];
23
+ scanned: number;
24
+ };
25
+ //# sourceMappingURL=scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/tools/dynamodb-access-check/scan.ts"],"names":[],"mappings":"AAMA,qDAAqD;AACrD,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,oBAAoB;AACpB,eAAO,MAAM,oBAAoB,aAU/B,CAAC;AAIH,kEAAkE;AAClE,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,EACjC,MAAM,EAAE,SAAS,MAAM,EAAE,GACxB,MAAM,EAAE,CAoBV;AAQD,8DAA8D;AAC9D,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE;;;EAiB3F;AAoCD,0CAA0C;AAC1C,eAAO,MAAM,YAAY,gBAAgB,CAAC;AAE1C,qEAAqE;AACrE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE;;;EAsC7F"}