@cloud-copilot/iam-collect 0.1.52 → 0.1.54

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 (183) hide show
  1. package/dist/cjs/cli.js +49 -2
  2. package/dist/cjs/cli.js.map +1 -1
  3. package/dist/cjs/config/config.d.ts +11 -1
  4. package/dist/cjs/config/config.d.ts.map +1 -1
  5. package/dist/cjs/config/config.js +21 -5
  6. package/dist/cjs/config/config.js.map +1 -1
  7. package/dist/cjs/config/defaultConfig.d.ts.map +1 -1
  8. package/dist/cjs/config/defaultConfig.js +13 -1
  9. package/dist/cjs/config/defaultConfig.js.map +1 -1
  10. package/dist/cjs/download/download.d.ts +1 -1
  11. package/dist/cjs/download/download.d.ts.map +1 -1
  12. package/dist/cjs/download/download.js +37 -14
  13. package/dist/cjs/download/download.js.map +1 -1
  14. package/dist/cjs/index/index.d.ts +4 -0
  15. package/dist/cjs/index/index.d.ts.map +1 -0
  16. package/dist/cjs/index/index.js +42 -0
  17. package/dist/cjs/index/index.js.map +1 -0
  18. package/dist/cjs/indexing/indexMap.d.ts +10 -0
  19. package/dist/cjs/indexing/indexMap.d.ts.map +1 -0
  20. package/dist/cjs/indexing/indexMap.js +32 -0
  21. package/dist/cjs/indexing/indexMap.js.map +1 -0
  22. package/dist/cjs/indexing/indexer.d.ts +37 -0
  23. package/dist/cjs/indexing/indexer.d.ts.map +1 -0
  24. package/dist/cjs/indexing/indexer.js +3 -0
  25. package/dist/cjs/indexing/indexer.js.map +1 -0
  26. package/dist/cjs/indexing/indexers/accountOrgs.d.ts +3 -0
  27. package/dist/cjs/indexing/indexers/accountOrgs.d.ts.map +1 -0
  28. package/dist/cjs/indexing/indexers/accountOrgs.js +41 -0
  29. package/dist/cjs/indexing/indexers/accountOrgs.js.map +1 -0
  30. package/dist/cjs/indexing/indexers/apigateways.d.ts +3 -0
  31. package/dist/cjs/indexing/indexers/apigateways.d.ts.map +1 -0
  32. package/dist/cjs/indexing/indexers/apigateways.js +54 -0
  33. package/dist/cjs/indexing/indexers/apigateways.js.map +1 -0
  34. package/dist/cjs/indexing/indexers/buckets.d.ts +8 -0
  35. package/dist/cjs/indexing/indexers/buckets.d.ts.map +1 -0
  36. package/dist/cjs/indexing/indexers/buckets.js +40 -0
  37. package/dist/cjs/indexing/indexers/buckets.js.map +1 -0
  38. package/dist/cjs/indexing/indexers/vpcEndpoints.d.ts +3 -0
  39. package/dist/cjs/indexing/indexers/vpcEndpoints.d.ts.map +1 -0
  40. package/dist/cjs/indexing/indexers/vpcEndpoints.js +57 -0
  41. package/dist/cjs/indexing/indexers/vpcEndpoints.js.map +1 -0
  42. package/dist/cjs/indexing/runIndexers.d.ts +33 -0
  43. package/dist/cjs/indexing/runIndexers.d.ts.map +1 -0
  44. package/dist/cjs/indexing/runIndexers.js +86 -0
  45. package/dist/cjs/indexing/runIndexers.js.map +1 -0
  46. package/dist/cjs/jobs/jobQueue.d.ts.map +1 -0
  47. package/dist/cjs/jobs/jobQueue.js.map +1 -0
  48. package/dist/cjs/jobs/util.d.ts.map +1 -0
  49. package/dist/cjs/jobs/util.js.map +1 -0
  50. package/dist/cjs/persistence/AwsIamStore.d.ts +36 -0
  51. package/dist/cjs/persistence/AwsIamStore.d.ts.map +1 -1
  52. package/dist/cjs/persistence/InMemoryPathBasedPersistenceAdapter.d.ts +16 -0
  53. package/dist/cjs/persistence/InMemoryPathBasedPersistenceAdapter.d.ts.map +1 -0
  54. package/dist/cjs/persistence/InMemoryPathBasedPersistenceAdapter.js +70 -0
  55. package/dist/cjs/persistence/InMemoryPathBasedPersistenceAdapter.js.map +1 -0
  56. package/dist/cjs/persistence/PathBasedPersistenceAdapter.d.ts +38 -0
  57. package/dist/cjs/persistence/PathBasedPersistenceAdapter.d.ts.map +1 -0
  58. package/dist/cjs/persistence/PathBasedPersistenceAdapter.js +3 -0
  59. package/dist/cjs/persistence/PathBasedPersistenceAdapter.js.map +1 -0
  60. package/dist/cjs/persistence/file/FileSystemAdapter.d.ts +29 -1
  61. package/dist/cjs/persistence/file/FileSystemAdapter.d.ts.map +1 -1
  62. package/dist/cjs/persistence/file/FileSystemAdapter.js +70 -0
  63. package/dist/cjs/persistence/file/FileSystemAdapter.js.map +1 -1
  64. package/dist/cjs/persistence/file/FileSystemAwsIamStore.d.ts +22 -0
  65. package/dist/cjs/persistence/file/FileSystemAwsIamStore.d.ts.map +1 -1
  66. package/dist/cjs/persistence/file/FileSystemAwsIamStore.js +53 -1
  67. package/dist/cjs/persistence/file/FileSystemAwsIamStore.js.map +1 -1
  68. package/dist/cjs/services.d.ts +7 -0
  69. package/dist/cjs/services.d.ts.map +1 -1
  70. package/dist/cjs/services.js +10 -0
  71. package/dist/cjs/services.js.map +1 -1
  72. package/dist/cjs/syncs/ec2/vpcEndpoints.d.ts.map +1 -1
  73. package/dist/cjs/syncs/ec2/vpcEndpoints.js +23 -2
  74. package/dist/cjs/syncs/ec2/vpcEndpoints.js.map +1 -1
  75. package/dist/cjs/syncs/organizations/organizations.d.ts.map +1 -1
  76. package/dist/cjs/syncs/organizations/organizations.js +18 -0
  77. package/dist/cjs/syncs/organizations/organizations.js.map +1 -1
  78. package/dist/cjs/syncs/s3/buckets.d.ts.map +1 -1
  79. package/dist/cjs/syncs/s3/buckets.js +4 -2
  80. package/dist/cjs/syncs/s3/buckets.js.map +1 -1
  81. package/dist/cjs/syncs/syncMap.d.ts.map +1 -1
  82. package/dist/cjs/syncs/syncMap.js +4 -12
  83. package/dist/cjs/syncs/syncMap.js.map +1 -1
  84. package/dist/esm/cli.js +49 -2
  85. package/dist/esm/cli.js.map +1 -1
  86. package/dist/esm/config/config.d.ts +11 -1
  87. package/dist/esm/config/config.d.ts.map +1 -1
  88. package/dist/esm/config/config.js +20 -5
  89. package/dist/esm/config/config.js.map +1 -1
  90. package/dist/esm/config/defaultConfig.d.ts.map +1 -1
  91. package/dist/esm/config/defaultConfig.js +13 -1
  92. package/dist/esm/config/defaultConfig.js.map +1 -1
  93. package/dist/esm/download/download.d.ts +1 -1
  94. package/dist/esm/download/download.d.ts.map +1 -1
  95. package/dist/esm/download/download.js +35 -12
  96. package/dist/esm/download/download.js.map +1 -1
  97. package/dist/esm/index/index.d.ts +4 -0
  98. package/dist/esm/index/index.d.ts.map +1 -0
  99. package/dist/esm/index/index.js +39 -0
  100. package/dist/esm/index/index.js.map +1 -0
  101. package/dist/esm/indexing/indexMap.d.ts +10 -0
  102. package/dist/esm/indexing/indexMap.d.ts.map +1 -0
  103. package/dist/esm/indexing/indexMap.js +29 -0
  104. package/dist/esm/indexing/indexMap.js.map +1 -0
  105. package/dist/esm/indexing/indexer.d.ts +37 -0
  106. package/dist/esm/indexing/indexer.d.ts.map +1 -0
  107. package/dist/esm/indexing/indexer.js +2 -0
  108. package/dist/esm/indexing/indexer.js.map +1 -0
  109. package/dist/esm/indexing/indexers/accountOrgs.d.ts +3 -0
  110. package/dist/esm/indexing/indexers/accountOrgs.d.ts.map +1 -0
  111. package/dist/esm/indexing/indexers/accountOrgs.js +38 -0
  112. package/dist/esm/indexing/indexers/accountOrgs.js.map +1 -0
  113. package/dist/esm/indexing/indexers/apigateways.d.ts +3 -0
  114. package/dist/esm/indexing/indexers/apigateways.d.ts.map +1 -0
  115. package/dist/esm/indexing/indexers/apigateways.js +51 -0
  116. package/dist/esm/indexing/indexers/apigateways.js.map +1 -0
  117. package/dist/esm/indexing/indexers/buckets.d.ts +8 -0
  118. package/dist/esm/indexing/indexers/buckets.d.ts.map +1 -0
  119. package/dist/esm/indexing/indexers/buckets.js +37 -0
  120. package/dist/esm/indexing/indexers/buckets.js.map +1 -0
  121. package/dist/esm/indexing/indexers/vpcEndpoints.d.ts +3 -0
  122. package/dist/esm/indexing/indexers/vpcEndpoints.d.ts.map +1 -0
  123. package/dist/esm/indexing/indexers/vpcEndpoints.js +54 -0
  124. package/dist/esm/indexing/indexers/vpcEndpoints.js.map +1 -0
  125. package/dist/esm/indexing/runIndexers.d.ts +33 -0
  126. package/dist/esm/indexing/runIndexers.d.ts.map +1 -0
  127. package/dist/esm/indexing/runIndexers.js +83 -0
  128. package/dist/esm/indexing/runIndexers.js.map +1 -0
  129. package/dist/esm/jobs/jobQueue.d.ts.map +1 -0
  130. package/dist/esm/jobs/jobQueue.js.map +1 -0
  131. package/dist/esm/jobs/util.d.ts.map +1 -0
  132. package/dist/esm/jobs/util.js.map +1 -0
  133. package/dist/esm/persistence/AwsIamStore.d.ts +36 -0
  134. package/dist/esm/persistence/AwsIamStore.d.ts.map +1 -1
  135. package/dist/esm/persistence/InMemoryPathBasedPersistenceAdapter.d.ts +16 -0
  136. package/dist/esm/persistence/InMemoryPathBasedPersistenceAdapter.d.ts.map +1 -0
  137. package/dist/esm/persistence/InMemoryPathBasedPersistenceAdapter.js +68 -0
  138. package/dist/esm/persistence/InMemoryPathBasedPersistenceAdapter.js.map +1 -0
  139. package/dist/esm/persistence/PathBasedPersistenceAdapter.d.ts +38 -0
  140. package/dist/esm/persistence/PathBasedPersistenceAdapter.d.ts.map +1 -0
  141. package/dist/esm/persistence/PathBasedPersistenceAdapter.js +2 -0
  142. package/dist/esm/persistence/PathBasedPersistenceAdapter.js.map +1 -0
  143. package/dist/esm/persistence/file/FileSystemAdapter.d.ts +29 -1
  144. package/dist/esm/persistence/file/FileSystemAdapter.d.ts.map +1 -1
  145. package/dist/esm/persistence/file/FileSystemAdapter.js +71 -1
  146. package/dist/esm/persistence/file/FileSystemAdapter.js.map +1 -1
  147. package/dist/esm/persistence/file/FileSystemAwsIamStore.d.ts +22 -0
  148. package/dist/esm/persistence/file/FileSystemAwsIamStore.d.ts.map +1 -1
  149. package/dist/esm/persistence/file/FileSystemAwsIamStore.js +53 -1
  150. package/dist/esm/persistence/file/FileSystemAwsIamStore.js.map +1 -1
  151. package/dist/esm/services.d.ts +7 -0
  152. package/dist/esm/services.d.ts.map +1 -1
  153. package/dist/esm/services.js +9 -0
  154. package/dist/esm/services.js.map +1 -1
  155. package/dist/esm/syncs/ec2/vpcEndpoints.d.ts.map +1 -1
  156. package/dist/esm/syncs/ec2/vpcEndpoints.js +23 -2
  157. package/dist/esm/syncs/ec2/vpcEndpoints.js.map +1 -1
  158. package/dist/esm/syncs/organizations/organizations.d.ts.map +1 -1
  159. package/dist/esm/syncs/organizations/organizations.js +18 -0
  160. package/dist/esm/syncs/organizations/organizations.js.map +1 -1
  161. package/dist/esm/syncs/s3/buckets.d.ts.map +1 -1
  162. package/dist/esm/syncs/s3/buckets.js +4 -2
  163. package/dist/esm/syncs/s3/buckets.js.map +1 -1
  164. package/dist/esm/syncs/syncMap.d.ts.map +1 -1
  165. package/dist/esm/syncs/syncMap.js +1 -9
  166. package/dist/esm/syncs/syncMap.js.map +1 -1
  167. package/package.json +1 -1
  168. package/dist/cjs/download/jobQueue.d.ts.map +0 -1
  169. package/dist/cjs/download/jobQueue.js.map +0 -1
  170. package/dist/cjs/download/util.d.ts.map +0 -1
  171. package/dist/cjs/download/util.js.map +0 -1
  172. package/dist/esm/download/jobQueue.d.ts.map +0 -1
  173. package/dist/esm/download/jobQueue.js.map +0 -1
  174. package/dist/esm/download/util.d.ts.map +0 -1
  175. package/dist/esm/download/util.js.map +0 -1
  176. /package/dist/cjs/{download → jobs}/jobQueue.d.ts +0 -0
  177. /package/dist/cjs/{download → jobs}/jobQueue.js +0 -0
  178. /package/dist/cjs/{download → jobs}/util.d.ts +0 -0
  179. /package/dist/cjs/{download → jobs}/util.js +0 -0
  180. /package/dist/esm/{download → jobs}/jobQueue.d.ts +0 -0
  181. /package/dist/esm/{download → jobs}/jobQueue.js +0 -0
  182. /package/dist/esm/{download → jobs}/util.d.ts +0 -0
  183. /package/dist/esm/{download → jobs}/util.js +0 -0
@@ -0,0 +1,38 @@
1
+ const indexName = 'accounts-to-orgs';
2
+ export const AccountOrganizationIndexer = {
3
+ awsService: 'organizations',
4
+ name: 'accountsToOrganizations',
5
+ getCache: async (storage) => {
6
+ const data = await storage.getIndex(indexName, {});
7
+ return data;
8
+ },
9
+ saveCache: async (storage, cache, lockId) => {
10
+ return storage.saveIndex(indexName, cache, lockId);
11
+ },
12
+ updateCache: async (existingCache, accountId, regions, storage) => {
13
+ const orgForAccount = await storage.getAccountMetadata(accountId, 'organization', undefined);
14
+ const organizationId = orgForAccount?.organizationId;
15
+ // If the account is not a organization management account, we don't need to update the cache
16
+ if (!organizationId) {
17
+ return;
18
+ }
19
+ const currentCacheKeys = Object.keys(existingCache);
20
+ // Remove all existing accounts for the organization
21
+ for (const key of currentCacheKeys) {
22
+ if (existingCache[key] == organizationId) {
23
+ delete existingCache[key];
24
+ }
25
+ }
26
+ const currentInfo = await storage.getOrganizationMetadata(organizationId, 'accounts');
27
+ // If there are no accounts for the org, return
28
+ if (!currentInfo) {
29
+ return;
30
+ }
31
+ //Add the current accounts to the cache
32
+ const currentAccounts = Object.keys(currentInfo);
33
+ for (const account of currentAccounts) {
34
+ existingCache[account] = organizationId;
35
+ }
36
+ }
37
+ };
38
+ //# sourceMappingURL=accountOrgs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accountOrgs.js","sourceRoot":"","sources":["../../../../src/indexing/indexers/accountOrgs.ts"],"names":[],"mappings":"AAMA,MAAM,SAAS,GAAG,kBAAkB,CAAA;AAEpC,MAAM,CAAC,MAAM,0BAA0B,GAAoC;IACzE,UAAU,EAAE,eAAe;IAC3B,IAAI,EAAE,yBAAyB;IAC/B,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAC1B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;QAClD,OAAO,IAAI,CAAA;IACb,CAAC;IACD,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAC1C,OAAO,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;IACpD,CAAC;IACD,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;QAChE,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,kBAAkB,CACpD,SAAS,EACT,cAAc,EACd,SAAS,CACV,CAAA;QAED,MAAM,cAAc,GAAG,aAAa,EAAE,cAAc,CAAA;QAEpD,6FAA6F;QAC7F,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAM;QACR,CAAC;QAED,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QAEnD,oDAAoD;QACpD,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;YACnC,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,cAAc,EAAE,CAAC;gBACzC,OAAO,aAAa,CAAC,GAAG,CAAC,CAAA;YAC3B,CAAC;QACH,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,uBAAuB,CAAC,cAAc,EAAE,UAAU,CAAC,CAAA;QACrF,+CAA+C;QAC/C,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAM;QACR,CAAC;QAED,uCAAuC;QACvC,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAChD,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;YACtC,aAAa,CAAC,OAAO,CAAC,GAAG,cAAc,CAAA;QACzC,CAAC;IACH,CAAC;CACF,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { Indexer } from '../indexer.js';
2
+ export declare const ApiGatewayIndexer: Indexer<Record<string, string>>;
3
+ //# sourceMappingURL=apigateways.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apigateways.d.ts","sourceRoot":"","sources":["../../../../src/indexing/indexers/apigateways.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAQvC,eAAO,MAAM,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAkD7D,CAAA"}
@@ -0,0 +1,51 @@
1
+ import { splitArnParts } from '../../utils/arn.js';
2
+ const indexName = 'apigateways-to-accounts';
3
+ export const ApiGatewayIndexer = {
4
+ awsService: 'apigateway',
5
+ name: 'apigatewaysToAccounts',
6
+ getCache: async (storage) => {
7
+ const data = await storage.getIndex(indexName, {});
8
+ return data;
9
+ },
10
+ saveCache: async (storage, cache, lockId) => {
11
+ return storage.saveIndex(indexName, cache, lockId);
12
+ },
13
+ updateCache: async (existingCache, accountId, regions, storage) => {
14
+ const regionsSet = new Set(regions);
15
+ const matchesRegion = (region) => {
16
+ return region && (regionsSet.size == 0 || regionsSet.has(region));
17
+ };
18
+ const currentCacheKeys = Object.keys(existingCache);
19
+ // Remove all existing gateways for the account in the specified regions
20
+ for (const key of currentCacheKeys) {
21
+ const arnParts = splitArnParts(key);
22
+ if (existingCache[key] == accountId && matchesRegion(arnParts.region)) {
23
+ delete existingCache[key];
24
+ }
25
+ }
26
+ const currentGateways = [];
27
+ if (regions.length == 0) {
28
+ const gateways = await storage.findResourceMetadata(accountId, {
29
+ service: 'apigateway',
30
+ region: '*',
31
+ resourceType: 'restapis'
32
+ });
33
+ currentGateways.push(...gateways);
34
+ }
35
+ else {
36
+ for (const region of regions) {
37
+ const gateways = await storage.findResourceMetadata(accountId, {
38
+ service: 'apigateway',
39
+ region: region,
40
+ resourceType: 'restapis'
41
+ });
42
+ currentGateways.push(...gateways);
43
+ }
44
+ }
45
+ // Add the new gateways to the cache
46
+ for (const gateway of currentGateways) {
47
+ existingCache[gateway.arn] = accountId;
48
+ }
49
+ }
50
+ };
51
+ //# sourceMappingURL=apigateways.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apigateways.js","sourceRoot":"","sources":["../../../../src/indexing/indexers/apigateways.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAOlD,MAAM,SAAS,GAAG,yBAAyB,CAAA;AAE3C,MAAM,CAAC,MAAM,iBAAiB,GAAoC;IAChE,UAAU,EAAE,YAAY;IACxB,IAAI,EAAE,uBAAuB;IAC7B,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAC1B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;QAClD,OAAO,IAAI,CAAA;IACb,CAAC;IACD,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAC1C,OAAO,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;IACpD,CAAC;IACD,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;QAChE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAA;QACnC,MAAM,aAAa,GAAG,CAAC,MAA0B,EAAE,EAAE;YACnD,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;QACnE,CAAC,CAAA;QACD,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QAEnD,wEAAwE;QACxE,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;YACnC,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,SAAS,IAAI,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtE,OAAO,aAAa,CAAC,GAAG,CAAC,CAAA;YAC3B,CAAC;QACH,CAAC;QAED,MAAM,eAAe,GAAyB,EAAE,CAAA;QAEhD,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,oBAAoB,CAAqB,SAAS,EAAE;gBACjF,OAAO,EAAE,YAAY;gBACrB,MAAM,EAAE,GAAG;gBACX,YAAY,EAAE,UAAU;aACzB,CAAC,CAAA;YACF,eAAe,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAA;QACnC,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,oBAAoB,CAAqB,SAAS,EAAE;oBACjF,OAAO,EAAE,YAAY;oBACrB,MAAM,EAAE,MAAM;oBACd,YAAY,EAAE,UAAU;iBACzB,CAAC,CAAA;gBACF,eAAe,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAA;YACnC,CAAC;QACH,CAAC;QAED,oCAAoC;QACpC,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;YACtC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,CAAA;QACxC,CAAC;IACH,CAAC;CACF,CAAA"}
@@ -0,0 +1,8 @@
1
+ import { Indexer } from '../indexer.js';
2
+ interface S3BucketIndex {
3
+ accountId: string;
4
+ region: string;
5
+ }
6
+ export declare const S3BucketIndexer: Indexer<Record<string, S3BucketIndex>>;
7
+ export {};
8
+ //# sourceMappingURL=buckets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buckets.d.ts","sourceRoot":"","sources":["../../../../src/indexing/indexers/buckets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAEvC,UAAU,aAAa;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;CACf;AAUD,eAAO,MAAM,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAqClE,CAAA"}
@@ -0,0 +1,37 @@
1
+ const indexName = 'buckets-to-accounts';
2
+ export const S3BucketIndexer = {
3
+ awsService: 's3',
4
+ name: 'bucketsToAccounts',
5
+ getCache: async (storage) => {
6
+ const data = await storage.getIndex(indexName, {});
7
+ return data;
8
+ },
9
+ saveCache: async (storage, cache, lockId) => {
10
+ return storage.saveIndex(indexName, cache, lockId);
11
+ },
12
+ updateCache: async (existingCache, accountId, regions, storage) => {
13
+ const regionsSet = new Set(regions);
14
+ const matchesRegion = (region) => {
15
+ return region && (regionsSet.size == 0 || regionsSet.has(region));
16
+ };
17
+ const currentCacheKeys = Object.keys(existingCache);
18
+ // Remove all existing buckets for the account in the specified regions
19
+ for (const key of currentCacheKeys) {
20
+ if (existingCache[key].accountId == accountId && matchesRegion(existingCache[key].region)) {
21
+ delete existingCache[key];
22
+ }
23
+ }
24
+ const currentBuckets = await storage.findResourceMetadata(accountId, {
25
+ service: 's3'
26
+ });
27
+ for (const bucket of currentBuckets) {
28
+ if (matchesRegion(bucket.region)) {
29
+ existingCache[bucket.name] = {
30
+ accountId: accountId,
31
+ region: bucket.region
32
+ };
33
+ }
34
+ }
35
+ }
36
+ };
37
+ //# sourceMappingURL=buckets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buckets.js","sourceRoot":"","sources":["../../../../src/indexing/indexers/buckets.ts"],"names":[],"mappings":"AAaA,MAAM,SAAS,GAAG,qBAAqB,CAAA;AAEvC,MAAM,CAAC,MAAM,eAAe,GAA2C;IACrE,UAAU,EAAE,IAAI;IAChB,IAAI,EAAE,mBAAmB;IACzB,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAC1B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;QAClD,OAAO,IAAI,CAAA;IACb,CAAC;IACD,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAC1C,OAAO,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;IACpD,CAAC;IACD,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;QAChE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAA;QACnC,MAAM,aAAa,GAAG,CAAC,MAA0B,EAAE,EAAE;YACnD,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;QACnE,CAAC,CAAA;QACD,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QAEnD,uEAAuE;QACvE,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;YACnC,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC,SAAS,IAAI,SAAS,IAAI,aAAa,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1F,OAAO,aAAa,CAAC,GAAG,CAAC,CAAA;YAC3B,CAAC;QACH,CAAC;QAED,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,oBAAoB,CAAiB,SAAS,EAAE;YACnF,OAAO,EAAE,IAAI;SACd,CAAC,CAAA;QAEF,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;YACpC,IAAI,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;gBACjC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG;oBAC3B,SAAS,EAAE,SAAS;oBACpB,MAAM,EAAE,MAAM,CAAC,MAAO;iBACvB,CAAA;YACH,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { Indexer } from '../indexer.js';
2
+ export declare const VpcEndpointIndexer: Indexer<Record<string, string[]>>;
3
+ //# sourceMappingURL=vpcEndpoints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vpcEndpoints.d.ts","sourceRoot":"","sources":["../../../../src/indexing/indexers/vpcEndpoints.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AASvC,eAAO,MAAM,kBAAkB,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAqDhE,CAAA"}
@@ -0,0 +1,54 @@
1
+ import { splitArnParts } from '../../utils/arn.js';
2
+ const indexName = 'vpcs-to-endpoints';
3
+ export const VpcEndpointIndexer = {
4
+ awsService: 'ec2',
5
+ name: 'vpcsToEndpoints',
6
+ getCache: async (storage) => {
7
+ const data = await storage.getIndex(indexName, {});
8
+ return data;
9
+ },
10
+ saveCache: async (storage, cache, lockId) => {
11
+ return storage.saveIndex(indexName, cache, lockId);
12
+ },
13
+ updateCache: async (existingCache, accountId, regions, storage) => {
14
+ const regionsSet = new Set(regions);
15
+ const matchesRegion = (region) => {
16
+ return region && (regionsSet.size == 0 || regionsSet.has(region));
17
+ };
18
+ const currentCacheKeys = Object.keys(existingCache);
19
+ // Remove all existing vpcs for the account in the specified regions
20
+ for (const key of currentCacheKeys) {
21
+ const arnParts = splitArnParts(key);
22
+ if (arnParts.accountId == accountId && matchesRegion(arnParts.region)) {
23
+ delete existingCache[key];
24
+ }
25
+ }
26
+ const currentEndpoints = [];
27
+ if (regions.length == 0) {
28
+ const gateways = await storage.findResourceMetadata(accountId, {
29
+ service: 'ec2',
30
+ region: '*',
31
+ resourceType: 'vpc-endpoint'
32
+ });
33
+ currentEndpoints.push(...gateways);
34
+ }
35
+ else {
36
+ for (const region of regions) {
37
+ const gateways = await storage.findResourceMetadata(accountId, {
38
+ service: 'ec2',
39
+ region: region,
40
+ resourceType: 'vpc-endpoint'
41
+ });
42
+ currentEndpoints.push(...gateways);
43
+ }
44
+ }
45
+ for (const endpoint of currentEndpoints) {
46
+ const vpcId = endpoint.vpc;
47
+ if (!existingCache[vpcId]) {
48
+ existingCache[vpcId] = [];
49
+ }
50
+ existingCache[vpcId].push(endpoint.arn);
51
+ }
52
+ }
53
+ };
54
+ //# sourceMappingURL=vpcEndpoints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vpcEndpoints.js","sourceRoot":"","sources":["../../../../src/indexing/indexers/vpcEndpoints.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAQlD,MAAM,SAAS,GAAG,mBAAmB,CAAA;AAErC,MAAM,CAAC,MAAM,kBAAkB,GAAsC;IACnE,UAAU,EAAE,KAAK;IACjB,IAAI,EAAE,iBAAiB;IACvB,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAC1B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;QAClD,OAAO,IAAI,CAAA;IACb,CAAC;IACD,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAC1C,OAAO,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;IACpD,CAAC;IACD,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;QAChE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAA;QACnC,MAAM,aAAa,GAAG,CAAC,MAA0B,EAAE,EAAE;YACnD,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;QACnE,CAAC,CAAA;QACD,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QAEnD,oEAAoE;QACpE,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;YACnC,IAAI,QAAQ,CAAC,SAAS,IAAI,SAAS,IAAI,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtE,OAAO,aAAa,CAAC,GAAG,CAAC,CAAA;YAC3B,CAAC;QACH,CAAC;QAED,MAAM,gBAAgB,GAA0B,EAAE,CAAA;QAElD,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,oBAAoB,CAAsB,SAAS,EAAE;gBAClF,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,GAAG;gBACX,YAAY,EAAE,cAAc;aAC7B,CAAC,CAAA;YACF,gBAAgB,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAA;QACpC,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,oBAAoB,CAAsB,SAAS,EAAE;oBAClF,OAAO,EAAE,KAAK;oBACd,MAAM,EAAE,MAAM;oBACd,YAAY,EAAE,cAAc;iBAC7B,CAAC,CAAA;gBACF,gBAAgB,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAA;YACpC,CAAC;QACH,CAAC;QAED,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE,CAAC;YACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAA;YAC1B,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,aAAa,CAAC,KAAK,CAAC,GAAG,EAAE,CAAA;YAC3B,CAAC;YACD,aAAa,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;QACzC,CAAC;IACH,CAAC;CACF,CAAA"}
@@ -0,0 +1,33 @@
1
+ import { StorageConfig } from '../config/config.js';
2
+ import { JobResult } from '../jobs/jobQueue.js';
3
+ import { Indexer } from './indexer.js';
4
+ /**
5
+ * An index job to run.
6
+ */
7
+ export interface IndexJob {
8
+ /**
9
+ * The indexer to run.
10
+ */
11
+ indexer: Indexer<any>;
12
+ /**
13
+ * The account ID to run the indexer for.
14
+ */
15
+ accountId: string;
16
+ /**
17
+ * The regions to run the indexer for.
18
+ */
19
+ regions: string[];
20
+ /**
21
+ * The partition to run the indexer for.
22
+ */
23
+ partition: string;
24
+ }
25
+ /**
26
+ * Run index jobs in parallel with a specified concurrency.
27
+ *
28
+ * @param indexJobs the index jobs to run
29
+ * @param storageConfig the storage configuration to use
30
+ * @param concurrency the number of jobs to run in parallel
31
+ */
32
+ export declare function runIndexJobs(indexJobs: IndexJob[], storageConfig: StorageConfig, concurrency: number): Promise<JobResult<void, Record<string, unknown>>[]>;
33
+ //# sourceMappingURL=runIndexers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runIndexers.d.ts","sourceRoot":"","sources":["../../../src/indexing/runIndexers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAO,SAAS,EAAW,MAAM,qBAAqB,CAAA;AAG7D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;IAErB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;IAEjB;;OAEG;IACH,OAAO,EAAE,MAAM,EAAE,CAAA;IAEjB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,SAAS,EAAE,QAAQ,EAAE,EACrB,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAiDrD"}
@@ -0,0 +1,83 @@
1
+ import { runJobs } from '../jobs/jobQueue.js';
2
+ import { createStorageClient } from '../persistence/util.js';
3
+ import { log } from '../utils/log.js';
4
+ /**
5
+ * Run index jobs in parallel with a specified concurrency.
6
+ *
7
+ * @param indexJobs the index jobs to run
8
+ * @param storageConfig the storage configuration to use
9
+ * @param concurrency the number of jobs to run in parallel
10
+ */
11
+ export async function runIndexJobs(indexJobs, storageConfig, concurrency) {
12
+ const sortedJobs = new Map();
13
+ for (const job of indexJobs) {
14
+ const partition = job.partition;
15
+ const indexerName = job.indexer.name;
16
+ if (!sortedJobs.has(partition)) {
17
+ sortedJobs.set(partition, new Map());
18
+ }
19
+ const partitionJobs = sortedJobs.get(partition);
20
+ if (!partitionJobs.has(indexerName)) {
21
+ partitionJobs.set(indexerName, []);
22
+ }
23
+ partitionJobs.get(indexerName).push(job);
24
+ }
25
+ const jobs = [];
26
+ for (const [partition, partitionJobs] of sortedJobs.entries()) {
27
+ for (const [indexerName, indexerJobs] of partitionJobs.entries()) {
28
+ if (indexerJobs.length === 0) {
29
+ continue;
30
+ }
31
+ jobs.push({
32
+ properties: {
33
+ partition,
34
+ indexerName,
35
+ numIndexers: indexerJobs.length
36
+ },
37
+ execute: async (context) => {
38
+ log.debug('Running indexers', { workerId: context.workerId, ...context.properties });
39
+ await runIndexers(partition, storageConfig, indexerJobs);
40
+ log.trace('Finished indexers', { workerId: context.workerId, ...context.properties });
41
+ }
42
+ });
43
+ }
44
+ }
45
+ log.debug('Starting indexing', { jobs: jobs.length, concurrency });
46
+ const indexResults = await runJobs(jobs, concurrency);
47
+ const failedIndexes = indexResults.filter((r) => r.status === 'rejected');
48
+ if (failedIndexes.length > 0) {
49
+ log.error('Some indexers failed', { failedJobs: failedIndexes.length });
50
+ for (const failedJob of failedIndexes) {
51
+ log.error('Indexer failed', failedJob.reason, failedJob.properties);
52
+ }
53
+ throw new Error(`Failed to index some data. See logs for details.`);
54
+ }
55
+ log.info('Finished indexing', { jobs: jobs.length });
56
+ return indexResults;
57
+ }
58
+ /**
59
+ * Run a set of the same indexer jobs for a given partition.
60
+ * All jobs must use the same indexer
61
+ *
62
+ * @param partition the partition to run the indexer for
63
+ * @param storageConfig the storage configuration to use
64
+ * @param indexerJobs the indexer jobs to run
65
+ */
66
+ async function runIndexers(partition, storageConfig, indexerJobs) {
67
+ let saved = false;
68
+ let saveAttempts = 0;
69
+ const indexer = indexerJobs[0].indexer;
70
+ const storage = createStorageClient(storageConfig, partition);
71
+ while (!saved && saveAttempts < 3) {
72
+ const cache = await indexer.getCache(storage);
73
+ for (const job of indexerJobs) {
74
+ await indexer.updateCache(cache.data, job.accountId, job.regions, storage);
75
+ }
76
+ saved = await indexer.saveCache(storage, cache.data, cache.lockId);
77
+ saveAttempts++;
78
+ }
79
+ if (!saved) {
80
+ throw new Error(`Failed to save indexer ${indexer.name} after ${saveAttempts} attempts`);
81
+ }
82
+ }
83
+ //# sourceMappingURL=runIndexers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runIndexers.js","sourceRoot":"","sources":["../../../src/indexing/runIndexers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobQueue.d.ts","sourceRoot":"","sources":["../../../src/jobs/jobQueue.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,EAAE,CAAC,IACtB;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,CAAC,CAAC;IAAC,UAAU,EAAE,CAAC,CAAA;CAAE,GAChD;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,GAAG,CAAC;IAAC,UAAU,EAAE,CAAC,CAAA;CAAE,CAAA;AAEtD,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACxD;;;;;OAKG;IACH,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,GAAG;QAAE,UAAU,EAAE,CAAC,CAAA;KAAE,KAAK,OAAO,CAAC,CAAC,CAAC,CAAA;IAE9D;;OAEG;IACH,UAAU,EAAE,CAAC,CAAA;CACd;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjE,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAgC5B"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobQueue.js","sourceRoot":"","sources":["../../../src/jobs/jobQueue.ts"],"names":[],"mappings":"AA+BA;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,IAAiB,EACjB,WAAmB;IAEnB,MAAM,OAAO,GAAsB,EAAE,CAAA;IACrC,IAAI,SAAS,GAAG,CAAC,CAAA;IAEjB,oFAAoF;IACpF,KAAK,UAAU,MAAM,CAAC,QAAgB;QACpC,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,CAAC,GAAG,SAAS,EAAE,CAAA;YACrB,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM;gBAAE,OAAM;YAE5B,MAAM,OAAO,GAAe;gBAC1B,QAAQ;aACT,CAAA;YAED,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAA;gBACnF,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAA;YAC7E,CAAC;YAAC,OAAO,MAAM,EAAE,CAAC;gBAChB,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAA;YAC7E,CAAC;QACH,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;SACtD,IAAI,CAAC,IAAI,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;IAEnC,iCAAiC;IACjC,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IAE1B,OAAO,OAAO,CAAA;AAChB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../src/jobs/util.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAG3C"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../../src/jobs/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAA;AAEzB;;;;GAIG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,OAAO,GAAG,IAAI,EAAE,CAAC,MAAM,IAAI,CAAC,CAAA;IAClC,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAA;AAC/C,CAAC"}
@@ -87,6 +87,10 @@ export interface AwsIamStore {
87
87
  * @returns A list of resource identifiers (e.g., role names or ARNs).
88
88
  */
89
89
  listResources(accountId: string, options: ResourceTypeParts): Promise<string[]>;
90
+ /**
91
+ * Find all metadata for resource that meet a given set of criteria.
92
+ */
93
+ findResourceMetadata<T>(accountId: string, options: ResourceTypeParts): Promise<T[]>;
90
94
  /**
91
95
  * Synchronizes the list of stored resources with the provided list.
92
96
  * This method can be used to remove resources that no longer exist in the account.
@@ -119,6 +123,14 @@ export interface AwsIamStore {
119
123
  * @param defaultValue the default value to return if the metadata is not found
120
124
  */
121
125
  getAccountMetadata<T, D extends T>(accountId: string, metadataType: string, defaultValue?: D): Promise<D extends undefined ? T | undefined : T>;
126
+ /**
127
+ * Get metadata for an AWS Organization
128
+ *
129
+ * @param organizationId the AWS organization ID
130
+ * @param metadataType the type of metadata to retrieve (e.g., "metadata")
131
+ * @param defaultValue the default value to return if the metadata is not found
132
+ */
133
+ getOrganizationMetadata<T, D extends T>(organizationId: string, metadataType: string, defaultValue?: D): Promise<D extends undefined ? T | undefined : T>;
122
134
  /**
123
135
  * Save metadata for an AWS Organization
124
136
  *
@@ -243,5 +255,29 @@ export interface AwsIamStore {
243
255
  * @returns The resource data if found, otherwise the default value if provided, otherwise undefined
244
256
  */
245
257
  getRamResource<T, D extends T>(accountId: string, arn: string, defaultValue?: D): Promise<D extends undefined ? T | undefined : T>;
258
+ /**
259
+ * List the account IDs that have directories in the store
260
+ */
261
+ listAccountIds(): Promise<string[]>;
262
+ /**
263
+ * Get an index for a given index name.
264
+ *
265
+ * @param indexName the name of the index to retrieve
266
+ * @param defaultValue the default value to return if the index is not found
267
+ * @return the index data and lock ID
268
+ */
269
+ getIndex<T>(indexName: string, defaultValue: T): Promise<{
270
+ data: T;
271
+ lockId: string;
272
+ }>;
273
+ /**
274
+ * Save an index with an optimistic locking check
275
+ *
276
+ * @param indexName the name of the index to save
277
+ * @param data the index data to save
278
+ * @param lockId the lock ID to use for optimistic locking
279
+ * @return true if the index was saved successfully, false if there was an optimistic locking failure
280
+ */
281
+ saveIndex<T>(indexName: string, data: T, lockId: string): Promise<boolean>;
246
282
  }
247
283
  //# sourceMappingURL=AwsIamStore.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AwsIamStore.d.ts","sourceRoot":"","sources":["../../../src/persistence/AwsIamStore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AwsIamStore.d.ts","sourceRoot":"","sources":["../../../src/persistence/AwsIamStore.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;IAEf;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IAErB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAClC;AAED,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,MAAM,CAAA;AAEpD;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;;;;;;OAUG;IACH,oBAAoB,CAClB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,GAAG,GAAG,GACjB,OAAO,CAAC,IAAI,CAAC,CAAA;IAEhB;;;;;;OAMG;IACH,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAEvE;;;;;;;OAOG;IACH,mBAAmB,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,EAChC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,EACpB,YAAY,CAAC,EAAE,CAAC,GACf,OAAO,CAAC,CAAC,SAAS,SAAS,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAA;IAEnD;;;;;;OAMG;IACH,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAE3F;;;;;OAKG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAE7D;;;;;;OAMG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAE/E;;OAEG;IACH,oBAAoB,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAA;IAEpF;;;;;;;OAOG;IACH,gBAAgB,CACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,iBAAiB,EAC1B,gBAAgB,EAAE,MAAM,EAAE,GACzB,OAAO,CAAC,IAAI,CAAC,CAAA;IAEhB;;;;;OAKG;IACH,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAE7E;;;;;;OAMG;IACH,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEtF;;;;;;OAMG;IACH,kBAAkB,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,EAC/B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,YAAY,CAAC,EAAE,CAAC,GACf,OAAO,CAAC,CAAC,SAAS,SAAS,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAA;IAEnD;;;;;;OAMG;IACH,uBAAuB,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,EACpC,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,EACpB,YAAY,CAAC,EAAE,CAAC,GACf,OAAO,CAAC,CAAC,SAAS,SAAS,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAA;IAEnD;;;;;;OAMG;IACH,wBAAwB,CAAC,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEhG;;;;;OAKG;IACH,0BAA0B,CAAC,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEvF;;;;OAIG;IACH,uBAAuB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAElE;;;;;;;OAOG;IACH,8BAA8B,CAC5B,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,GAAG,GACR,OAAO,CAAC,IAAI,CAAC,CAAA;IAEhB;;;;;;OAMG;IACH,gCAAgC,CAC9B,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAAA;IAEhB;;;;;;;OAOG;IACH,6BAA6B,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,EAC1C,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,YAAY,CAAC,EAAE,CAAC,GACf,OAAO,CAAC,CAAC,SAAS,SAAS,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAA;IAEnD;;;;;OAKG;IACH,wBAAwB,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAE7E;;;;;;;OAOG;IACH,gCAAgC,CAC9B,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,sBAAsB,EAClC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAAA;IAEhB;;;;;;;OAOG;IACH,8BAA8B,CAC5B,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,sBAAsB,EAClC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,GAAG,GACR,OAAO,CAAC,IAAI,CAAC,CAAA;IAEhB;;;;;;;;OAQG;IACH,6BAA6B,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,EAC1C,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,sBAAsB,EAClC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,YAAY,CAAC,EAAE,CAAC,GACf,OAAO,CAAC,CAAC,SAAS,SAAS,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAA;IAEnD;;;;;;OAMG;IACH,wBAAwB,CACtB,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,sBAAsB,EAClC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAAA;IAEhB;;;;;;OAMG;IACH,wBAAwB,CACtB,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,sBAAsB,GACjC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAEpB;;;;;;;OAOG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAE9F;;;;;;OAMG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEzE;;;;;;;OAOG;IACH,cAAc,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,EAC3B,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,YAAY,CAAC,EAAE,CAAC,GACf,OAAO,CAAC,CAAC,SAAS,SAAS,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAA;IAEnD;;OAEG;IACH,cAAc,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAEnC;;;;;;OAMG;IACH,QAAQ,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAErF;;;;;;;OAOG;IACH,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CAC3E"}
@@ -0,0 +1,16 @@
1
+ import { PathBasedPersistenceAdapter } from './PathBasedPersistenceAdapter.js';
2
+ export declare class InMemoryPathBasedPersistenceAdapter implements PathBasedPersistenceAdapter {
3
+ private fileSystem;
4
+ writeFile(filePath: string, data: string | Buffer): Promise<void>;
5
+ writeWithOptimisticLock(filePath: string, data: string | Buffer, lockId: string): Promise<boolean>;
6
+ readFile(filePath: string): Promise<string | undefined>;
7
+ readFileWithHash(filePath: string): Promise<{
8
+ data: string;
9
+ hash: string;
10
+ } | undefined>;
11
+ deleteFile(filePath: string): Promise<void>;
12
+ deleteDirectory(dirPath: string): Promise<void>;
13
+ listDirectory(dirPath: string): Promise<string[]>;
14
+ findWithPattern(baseDir: string, pathParts: string[], filename: string): Promise<string[]>;
15
+ }
16
+ //# sourceMappingURL=InMemoryPathBasedPersistenceAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemoryPathBasedPersistenceAdapter.d.ts","sourceRoot":"","sources":["../../../src/persistence/InMemoryPathBasedPersistenceAdapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAA;AAE9E,qBAAa,mCAAoC,YAAW,2BAA2B;IACrF,OAAO,CAAC,UAAU,CAA6B;IAEzC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjE,uBAAuB,CAC3B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GAAG,MAAM,EACrB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC;IASb,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAIvD,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IAcvF,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/C,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAcjD,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAiBjG"}
@@ -0,0 +1,68 @@
1
+ import { createHash } from 'crypto';
2
+ export class InMemoryPathBasedPersistenceAdapter {
3
+ constructor() {
4
+ this.fileSystem = {};
5
+ }
6
+ async writeFile(filePath, data) {
7
+ this.fileSystem[filePath] = data.toString();
8
+ }
9
+ async writeWithOptimisticLock(filePath, data, lockId) {
10
+ const currentData = await this.readFileWithHash(filePath);
11
+ if (currentData && currentData.hash !== lockId) {
12
+ return false;
13
+ }
14
+ await this.writeFile(filePath, data);
15
+ return true;
16
+ }
17
+ async readFile(filePath) {
18
+ return this.fileSystem[filePath];
19
+ }
20
+ async readFileWithHash(filePath) {
21
+ const contents = this.fileSystem[filePath];
22
+ if (!contents) {
23
+ return undefined;
24
+ }
25
+ const hash = createHash('sha256');
26
+ hash.update(contents);
27
+ return {
28
+ data: contents,
29
+ hash: hash.digest('hex')
30
+ };
31
+ }
32
+ async deleteFile(filePath) {
33
+ delete this.fileSystem[filePath];
34
+ }
35
+ async deleteDirectory(dirPath) {
36
+ for (const key in this.fileSystem) {
37
+ if (key.startsWith(dirPath + '/')) {
38
+ delete this.fileSystem[key];
39
+ }
40
+ }
41
+ }
42
+ async listDirectory(dirPath) {
43
+ const keys = Object.keys(this.fileSystem).filter((key) => key.startsWith(dirPath + '/'));
44
+ const allMatches = new Set(keys.map((key) => key
45
+ .slice(dirPath.length + 1)
46
+ .split('/')
47
+ .at(0)));
48
+ return Array.from(allMatches);
49
+ }
50
+ async findWithPattern(baseDir, pathParts, filename) {
51
+ //convert the parts to a regex where some parts may have "*"
52
+ const regexParts = pathParts.map((part) => {
53
+ if (part === '*') {
54
+ return '[^/]+';
55
+ }
56
+ return part;
57
+ });
58
+ const regex = new RegExp(`^${baseDir}/(${regexParts.join('/')})/${filename}$`);
59
+ const result = [];
60
+ for (const key in this.fileSystem) {
61
+ if (regex.test(key)) {
62
+ result.push(this.fileSystem[key]);
63
+ }
64
+ }
65
+ return result;
66
+ }
67
+ }
68
+ //# sourceMappingURL=InMemoryPathBasedPersistenceAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemoryPathBasedPersistenceAdapter.js","sourceRoot":"","sources":["../../../src/persistence/InMemoryPathBasedPersistenceAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ export interface PathBasedPersistenceAdapter {
2
+ /**
3
+ * Ensure the directory exists and write data to a file
4
+ */
5
+ writeFile(filePath: string, data: string | Buffer): Promise<void>;
6
+ /**
7
+ * Write with optimistic locking: only overwrite if current hash matches lockId
8
+ */
9
+ writeWithOptimisticLock(filePath: string, data: string | Buffer, lockId: string): Promise<boolean>;
10
+ /**
11
+ * Read a file’s contents; return undefined if it does not exist
12
+ */
13
+ readFile(filePath: string): Promise<string | undefined>;
14
+ /**
15
+ * Read a file’s contents and compute its SHA‑256 hash; return undefined if missing
16
+ */
17
+ readFileWithHash(filePath: string): Promise<{
18
+ data: string;
19
+ hash: string;
20
+ } | undefined>;
21
+ /**
22
+ * Delete a single file; ignore if it doesn’t exist
23
+ */
24
+ deleteFile(filePath: string): Promise<void>;
25
+ /**
26
+ * Recursively delete a directory; ignore if it doesn’t exist
27
+ */
28
+ deleteDirectory(dirPath: string): Promise<void>;
29
+ /**
30
+ * List top‐level entries in a directory; return empty array if missing
31
+ */
32
+ listDirectory(dirPath: string): Promise<string[]>;
33
+ /**
34
+ * Find files matching a pattern under baseDir, with wildcards in pathParts
35
+ */
36
+ findWithPattern(baseDir: string, pathParts: string[], filename: string): Promise<string[]>;
37
+ }
38
+ //# sourceMappingURL=PathBasedPersistenceAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PathBasedPersistenceAdapter.d.ts","sourceRoot":"","sources":["../../../src/persistence/PathBasedPersistenceAdapter.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,2BAA2B;IAC1C;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEjE;;OAEG;IACH,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAElG;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IAEvD;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC,CAAA;IAEvF;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAE3C;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAE/C;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAEjD;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;CAC3F"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=PathBasedPersistenceAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PathBasedPersistenceAdapter.js","sourceRoot":"","sources":["../../../src/persistence/PathBasedPersistenceAdapter.ts"],"names":[],"mappings":""}