@reventlessdev/reventless-seed-aws 1.0.0-alpha.10
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.
- package/CHANGELOG.md +69 -0
- package/LICENSE +202 -0
- package/lib/bs/.compiler.log +2 -0
- package/lib/bs/.sourcedirs.json +1 -0
- package/lib/bs/build.ninja +0 -0
- package/lib/bs/compiler-info.json +8 -0
- package/lib/bs/src/ReventlessSeedAws.ast +0 -0
- package/lib/bs/src/ReventlessSeedAws.cmi +0 -0
- package/lib/bs/src/ReventlessSeedAws.cmj +0 -0
- package/lib/bs/src/ReventlessSeedAws.cmt +0 -0
- package/lib/bs/src/ReventlessSeedAws.res +328 -0
- package/lib/bs/src/ReventlessSeedAws.res.mjs +309 -0
- package/lib/bs/src/ReventlessSeedAws_Reconcile.ast +0 -0
- package/lib/bs/src/ReventlessSeedAws_Reconcile.cmi +0 -0
- package/lib/bs/src/ReventlessSeedAws_Reconcile.cmj +0 -0
- package/lib/bs/src/ReventlessSeedAws_Reconcile.cmt +0 -0
- package/lib/bs/src/ReventlessSeedAws_Reconcile.res +389 -0
- package/lib/bs/src/ReventlessSeedAws_Reconcile.res.mjs +318 -0
- package/lib/bs/src/ReventlessSeedAws_Reset.ast +0 -0
- package/lib/bs/src/ReventlessSeedAws_Reset.cmi +0 -0
- package/lib/bs/src/ReventlessSeedAws_Reset.cmj +0 -0
- package/lib/bs/src/ReventlessSeedAws_Reset.cmt +0 -0
- package/lib/bs/src/ReventlessSeedAws_Reset.res +948 -0
- package/lib/bs/src/ReventlessSeedAws_Reset.res.mjs +861 -0
- package/lib/bs/tests/EndpointResolutionTest.ast +0 -0
- package/lib/bs/tests/EndpointResolutionTest.cmi +0 -0
- package/lib/bs/tests/EndpointResolutionTest.cmj +0 -0
- package/lib/bs/tests/EndpointResolutionTest.cmt +0 -0
- package/lib/bs/tests/EndpointResolutionTest.res +83 -0
- package/lib/bs/tests/EndpointResolutionTest.res.mjs +115 -0
- package/lib/bs/tests/ObjectStoreReconcileTest.ast +0 -0
- package/lib/bs/tests/ObjectStoreReconcileTest.cmi +0 -0
- package/lib/bs/tests/ObjectStoreReconcileTest.cmj +0 -0
- package/lib/bs/tests/ObjectStoreReconcileTest.cmt +0 -0
- package/lib/bs/tests/ObjectStoreReconcileTest.res +84 -0
- package/lib/bs/tests/ObjectStoreReconcileTest.res.mjs +102 -0
- package/lib/bs/tests/ObjectStoreResetTest.ast +0 -0
- package/lib/bs/tests/ObjectStoreResetTest.cmi +0 -0
- package/lib/bs/tests/ObjectStoreResetTest.cmj +0 -0
- package/lib/bs/tests/ObjectStoreResetTest.cmt +0 -0
- package/lib/bs/tests/ObjectStoreResetTest.res +170 -0
- package/lib/bs/tests/ObjectStoreResetTest.res.mjs +211 -0
- package/lib/ocaml/.compiler.log +2 -0
- package/lib/ocaml/EndpointResolutionTest.ast +0 -0
- package/lib/ocaml/EndpointResolutionTest.cmi +0 -0
- package/lib/ocaml/EndpointResolutionTest.cmj +0 -0
- package/lib/ocaml/EndpointResolutionTest.cmt +0 -0
- package/lib/ocaml/EndpointResolutionTest.res +83 -0
- package/lib/ocaml/ObjectStoreReconcileTest.ast +0 -0
- package/lib/ocaml/ObjectStoreReconcileTest.cmi +0 -0
- package/lib/ocaml/ObjectStoreReconcileTest.cmj +0 -0
- package/lib/ocaml/ObjectStoreReconcileTest.cmt +0 -0
- package/lib/ocaml/ObjectStoreReconcileTest.res +84 -0
- package/lib/ocaml/ObjectStoreResetTest.ast +0 -0
- package/lib/ocaml/ObjectStoreResetTest.cmi +0 -0
- package/lib/ocaml/ObjectStoreResetTest.cmj +0 -0
- package/lib/ocaml/ObjectStoreResetTest.cmt +0 -0
- package/lib/ocaml/ObjectStoreResetTest.res +170 -0
- package/lib/ocaml/ReventlessSeedAws.ast +0 -0
- package/lib/ocaml/ReventlessSeedAws.cmi +0 -0
- package/lib/ocaml/ReventlessSeedAws.cmj +0 -0
- package/lib/ocaml/ReventlessSeedAws.cmt +0 -0
- package/lib/ocaml/ReventlessSeedAws.res +328 -0
- package/lib/ocaml/ReventlessSeedAws_Reconcile.ast +0 -0
- package/lib/ocaml/ReventlessSeedAws_Reconcile.cmi +0 -0
- package/lib/ocaml/ReventlessSeedAws_Reconcile.cmj +0 -0
- package/lib/ocaml/ReventlessSeedAws_Reconcile.cmt +0 -0
- package/lib/ocaml/ReventlessSeedAws_Reconcile.res +389 -0
- package/lib/ocaml/ReventlessSeedAws_Reset.ast +0 -0
- package/lib/ocaml/ReventlessSeedAws_Reset.cmi +0 -0
- package/lib/ocaml/ReventlessSeedAws_Reset.cmj +0 -0
- package/lib/ocaml/ReventlessSeedAws_Reset.cmt +0 -0
- package/lib/ocaml/ReventlessSeedAws_Reset.res +948 -0
- package/package.json +32 -0
- package/rescript.json +29 -0
- package/src/ReventlessSeedAws.res +328 -0
- package/src/ReventlessSeedAws.res.mjs +309 -0
- package/src/ReventlessSeedAws_Reconcile.res +389 -0
- package/src/ReventlessSeedAws_Reconcile.res.mjs +318 -0
- package/src/ReventlessSeedAws_Reset.res +948 -0
- package/src/ReventlessSeedAws_Reset.res.mjs +861 -0
- package/tests/EndpointResolutionTest.res +83 -0
- package/tests/EndpointResolutionTest.res.mjs +115 -0
- package/tests/ObjectStoreReconcileTest.res +84 -0
- package/tests/ObjectStoreReconcileTest.res.mjs +102 -0
- package/tests/ObjectStoreResetTest.res +170 -0
- package/tests/ObjectStoreResetTest.res.mjs +211 -0
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as S3$AwsSdk from "@reventlessdev/rescript-aws-sdk/src/S3.res.mjs";
|
|
4
|
+
import * as Stdlib_JSON from "@rescript/runtime/lib/es6/Stdlib_JSON.js";
|
|
5
|
+
import * as Stdlib_Array from "@rescript/runtime/lib/es6/Stdlib_Array.js";
|
|
6
|
+
import * as Stdlib_JsExn from "@rescript/runtime/lib/es6/Stdlib_JsExn.js";
|
|
7
|
+
import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
|
|
8
|
+
import * as ReventlessSeedAws from "./ReventlessSeedAws.res.mjs";
|
|
9
|
+
import * as ClientS3 from "@aws-sdk/client-s3";
|
|
10
|
+
import * as Seed$ReventlessSeed from "@reventlessdev/reventless-seed/src/Seed.res.mjs";
|
|
11
|
+
import * as Primitive_exceptions from "@rescript/runtime/lib/es6/Primitive_exceptions.js";
|
|
12
|
+
import * as LibDynamodb from "@aws-sdk/lib-dynamodb";
|
|
13
|
+
import * as ReventlessSeedAws_Reset from "./ReventlessSeedAws_Reset.res.mjs";
|
|
14
|
+
import * as Seed_Prompt$ReventlessSeed from "@reventlessdev/reventless-seed/src/Seed_Prompt.res.mjs";
|
|
15
|
+
import * as Seed_Runner$ReventlessSeed from "@reventlessdev/reventless-seed/src/Seed_Runner.res.mjs";
|
|
16
|
+
import * as DynamoDb_DocumentClient$AwsSdk from "@reventlessdev/rescript-aws-sdk/src/DynamoDb_DocumentClient.res.mjs";
|
|
17
|
+
|
|
18
|
+
let pendingTagKey = "reventless:pending";
|
|
19
|
+
|
|
20
|
+
function collectRefs(prefix, json, into) {
|
|
21
|
+
if (Array.isArray(json)) {
|
|
22
|
+
json.forEach(item => collectRefs(prefix, item, into));
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (json === null) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
switch (typeof json) {
|
|
29
|
+
case "string" :
|
|
30
|
+
if (json.startsWith(`/` + prefix + `/`)) {
|
|
31
|
+
into.add(json);
|
|
32
|
+
return;
|
|
33
|
+
} else {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
case "object" :
|
|
37
|
+
Object.values(json).forEach(v => collectRefs(prefix, v, into));
|
|
38
|
+
return;
|
|
39
|
+
default:
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
async function refsInTable(table, prefix, into) {
|
|
45
|
+
let loop = async (start, rows) => {
|
|
46
|
+
let out = await DynamoDb_DocumentClient$AwsSdk.ScanCommand.send(new LibDynamodb.ScanCommand({
|
|
47
|
+
TableName: table,
|
|
48
|
+
ExclusiveStartKey: start
|
|
49
|
+
}));
|
|
50
|
+
let items = Stdlib_Option.getOr(out.Items, []);
|
|
51
|
+
items.forEach(item => {
|
|
52
|
+
let row = Stdlib_JSON.Decode.object(item);
|
|
53
|
+
if (row === undefined) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
let match = row["event"];
|
|
57
|
+
let match$1 = row["data"];
|
|
58
|
+
if (typeof match === "string" && match$1 !== undefined) {
|
|
59
|
+
return collectRefs(prefix, match$1, into);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
let rows$1 = rows + items.length | 0;
|
|
63
|
+
let k = out.LastEvaluatedKey;
|
|
64
|
+
if (k !== undefined) {
|
|
65
|
+
return await loop(k, rows$1);
|
|
66
|
+
} else {
|
|
67
|
+
return rows$1;
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
return await loop(undefined, 0);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async function listObjects(bucket, prefix) {
|
|
74
|
+
let keys = [];
|
|
75
|
+
let loop = async (keyMarker, versionMarker) => {
|
|
76
|
+
let out = await S3$AwsSdk.ListObjectVersionsCommand.send(new ClientS3.ListObjectVersionsCommand({
|
|
77
|
+
Bucket: bucket,
|
|
78
|
+
Prefix: prefix + `/`,
|
|
79
|
+
KeyMarker: keyMarker,
|
|
80
|
+
VersionIdMarker: versionMarker
|
|
81
|
+
}));
|
|
82
|
+
Stdlib_Option.getOr(out.Versions, []).forEach(v => {
|
|
83
|
+
if (v.IsLatest) {
|
|
84
|
+
keys.push(v.Key);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
let match = out.IsTruncated;
|
|
89
|
+
let match$1 = out.NextKeyMarker;
|
|
90
|
+
if (match !== undefined && match && match$1 !== undefined) {
|
|
91
|
+
return await loop(out.NextKeyMarker, out.NextVersionIdMarker);
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
await loop(undefined, undefined);
|
|
95
|
+
let objects = [];
|
|
96
|
+
await Stdlib_Array.reduce(keys, Promise.resolve(), (acc, key) => acc.then(async () => {
|
|
97
|
+
let tagging = await S3$AwsSdk.GetObjectTaggingCommand.send(new ClientS3.GetObjectTaggingCommand({
|
|
98
|
+
Bucket: bucket,
|
|
99
|
+
Key: key
|
|
100
|
+
}));
|
|
101
|
+
let pending = Stdlib_Option.getOr(tagging.TagSet, []).some(t => t.Key === pendingTagKey);
|
|
102
|
+
objects.push({
|
|
103
|
+
key: key,
|
|
104
|
+
ref: `/` + key,
|
|
105
|
+
pending: pending
|
|
106
|
+
});
|
|
107
|
+
}));
|
|
108
|
+
return objects;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
async function reconcileStore(store, bucket, prefix, tables) {
|
|
112
|
+
let refs = new Set();
|
|
113
|
+
let eventRows = {
|
|
114
|
+
contents: 0
|
|
115
|
+
};
|
|
116
|
+
await Stdlib_Array.reduce(tables, Promise.resolve(), (acc, table) => acc.then(async () => {
|
|
117
|
+
let rows = await refsInTable(table, prefix, refs);
|
|
118
|
+
eventRows.contents = eventRows.contents + rows | 0;
|
|
119
|
+
}));
|
|
120
|
+
let objects = await listObjects(bucket, prefix);
|
|
121
|
+
let present = new Set();
|
|
122
|
+
objects.forEach(o => {
|
|
123
|
+
present.add(o.ref);
|
|
124
|
+
});
|
|
125
|
+
return {
|
|
126
|
+
store: store,
|
|
127
|
+
bucket: bucket,
|
|
128
|
+
prefix: prefix,
|
|
129
|
+
eventRows: eventRows.contents,
|
|
130
|
+
referencedButPending: objects.filter(o => {
|
|
131
|
+
if (o.pending) {
|
|
132
|
+
return refs.has(o.ref);
|
|
133
|
+
} else {
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
}),
|
|
137
|
+
unreferencedPending: objects.filter(o => {
|
|
138
|
+
if (o.pending) {
|
|
139
|
+
return !refs.has(o.ref);
|
|
140
|
+
} else {
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
}),
|
|
144
|
+
unreferencedUntagged: objects.filter(o => {
|
|
145
|
+
if (o.pending) {
|
|
146
|
+
return false;
|
|
147
|
+
} else {
|
|
148
|
+
return !refs.has(o.ref);
|
|
149
|
+
}
|
|
150
|
+
}),
|
|
151
|
+
danglingRefs: Array.from(refs).filter(r => !present.has(r))
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function sample(objects, limitOpt) {
|
|
156
|
+
let limit = limitOpt !== undefined ? limitOpt : 10;
|
|
157
|
+
return objects.slice(0, limit);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function print(r) {
|
|
161
|
+
console.log("");
|
|
162
|
+
console.log(` ` + r.store + ` ` + r.bucket + `/` + r.prefix + `/`);
|
|
163
|
+
console.log(` event rows scanned: ` + r.eventRows.toString());
|
|
164
|
+
let line = (label, n) => {
|
|
165
|
+
console.log(` ` + n.toString().padStart(8, " ") + ` ` + label);
|
|
166
|
+
};
|
|
167
|
+
line("referenced, still tagged pending ← must be 0", r.referencedButPending.length);
|
|
168
|
+
line("unreferenced, tagged pending ← what expiry would delete", r.unreferencedPending.length);
|
|
169
|
+
line("unreferenced, untagged ← outside the rule", r.unreferencedUntagged.length);
|
|
170
|
+
line("referenced but missing ← dangling refs", r.danglingRefs.length);
|
|
171
|
+
let objectCount = (r.referencedButPending.length + r.unreferencedPending.length | 0) + r.unreferencedUntagged.length | 0;
|
|
172
|
+
if (objectCount > 0 && r.referencedButPending.length === 0 && r.unreferencedPending.length === 0) {
|
|
173
|
+
console.log("");
|
|
174
|
+
console.log(` Note: none of the ` + objectCount.toString() + ` objects carry "` + pendingTagKey + `". That is ` + "what a fully-claimed store looks like — and also what it looks like if the mint side never wrote the tag (a store whose objects all predate it) or if this tool's tag key has drifted from the deploy's.");
|
|
175
|
+
}
|
|
176
|
+
if (r.referencedButPending.length !== 0) {
|
|
177
|
+
console.log("");
|
|
178
|
+
console.log(" Referenced objects that are still tagged pending:");
|
|
179
|
+
sample(r.referencedButPending, undefined).forEach(o => {
|
|
180
|
+
console.log(` ` + o.ref);
|
|
181
|
+
});
|
|
182
|
+
if (r.referencedButPending.length > 10) {
|
|
183
|
+
console.log(` … and ` + (r.referencedButPending.length - 10 | 0).toString() + ` more`);
|
|
184
|
+
}
|
|
185
|
+
console.log("");
|
|
186
|
+
console.log(" Do NOT enable this store's expiry rule. Either the claim component is behind or stopped (check its IteratorAge alarm), or a field holding these refs is missing its `@storageRef` annotation — in which case the claimer never sees it and never will.");
|
|
187
|
+
}
|
|
188
|
+
return r.referencedButPending.length === 0;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
function run(stack, backend, targets, param) {
|
|
192
|
+
let go = async () => {
|
|
193
|
+
try {
|
|
194
|
+
if (targets.length === 0) {
|
|
195
|
+
throw {
|
|
196
|
+
RE_EXN_ID: Seed$ReventlessSeed.Failed,
|
|
197
|
+
_1: "no targets were declared — nothing to reconcile.",
|
|
198
|
+
Error: new Error()
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
let url = Seed_Prompt$ReventlessSeed.envValue("SEED_PULUMI_BACKEND");
|
|
202
|
+
let backend$1 = url !== undefined ? url : backend;
|
|
203
|
+
let t = targets.find(t => t.group === "Platform");
|
|
204
|
+
let platformTarget;
|
|
205
|
+
if (t !== undefined) {
|
|
206
|
+
platformTarget = t;
|
|
207
|
+
} else {
|
|
208
|
+
throw {
|
|
209
|
+
RE_EXN_ID: Seed$ReventlessSeed.Failed,
|
|
210
|
+
_1: "no `platform` target is declared — declared object stores live in the platform project's stack output and cannot be resolved without it.",
|
|
211
|
+
Error: new Error()
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
let stack$1 = await ReventlessSeedAws.resolveStack(platformTarget.projectDir, backend$1, stack);
|
|
215
|
+
let output = ReventlessSeedAws.stackOutputs(platformTarget.projectDir, backend$1, stack$1);
|
|
216
|
+
let stores = ReventlessSeedAws_Reset.parseObjectStores(ReventlessSeedAws_Reset.field(output, "objectStores"));
|
|
217
|
+
let stores$1;
|
|
218
|
+
if (stores.TAG === "Ok") {
|
|
219
|
+
stores$1 = stores._0;
|
|
220
|
+
} else {
|
|
221
|
+
throw {
|
|
222
|
+
RE_EXN_ID: Seed$ReventlessSeed.Failed,
|
|
223
|
+
_1: stores._0,
|
|
224
|
+
Error: new Error()
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
if (stores$1.length === 0) {
|
|
228
|
+
Seed_Runner$ReventlessSeed.heading(`Reconcile: stack "` + stack$1 + `" declares no object stores.`);
|
|
229
|
+
} else {
|
|
230
|
+
let r = Seed_Prompt$ReventlessSeed.envValue("AWS_REGION");
|
|
231
|
+
let region;
|
|
232
|
+
if (r !== undefined) {
|
|
233
|
+
if (r !== "") {
|
|
234
|
+
region = r;
|
|
235
|
+
} else {
|
|
236
|
+
throw {
|
|
237
|
+
RE_EXN_ID: Seed$ReventlessSeed.Failed,
|
|
238
|
+
_1: "could not resolve the AWS region — set AWS_REGION.",
|
|
239
|
+
Error: new Error()
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
} else {
|
|
243
|
+
throw {
|
|
244
|
+
RE_EXN_ID: Seed$ReventlessSeed.Failed,
|
|
245
|
+
_1: "could not resolve the AWS region — set AWS_REGION.",
|
|
246
|
+
Error: new Error()
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
Seed_Runner$ReventlessSeed.heading(`Reconcile: stack "` + stack$1 + `" in ` + region);
|
|
250
|
+
let tables = [];
|
|
251
|
+
await Stdlib_Array.reduce(targets, Promise.resolve(), (acc, target) => acc.then(async () => {
|
|
252
|
+
let platform = ReventlessSeedAws_Reset.projectName(target.projectDir);
|
|
253
|
+
let match = await ReventlessSeedAws_Reset.discover(region, stack$1, platform);
|
|
254
|
+
match[0].forEach(t => {
|
|
255
|
+
tables.push(t);
|
|
256
|
+
});
|
|
257
|
+
}));
|
|
258
|
+
let allClear = {
|
|
259
|
+
contents: true
|
|
260
|
+
};
|
|
261
|
+
await Stdlib_Array.reduce(stores$1, Promise.resolve(), (acc, s) => acc.then(async () => {
|
|
262
|
+
let report = await reconcileStore(s.qualified, s.bucketName, s.keyPrefix, tables);
|
|
263
|
+
if (!print(report)) {
|
|
264
|
+
allClear.contents = false;
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
}));
|
|
268
|
+
console.log("");
|
|
269
|
+
if (allClear.contents) {
|
|
270
|
+
console.log("Every referenced object has been claimed. Enabling a store's expiry rule (`pendingUploadExpiryDays: \"<plugin>.<store>=<days>\"`) would delete only objects nothing references.");
|
|
271
|
+
} else {
|
|
272
|
+
throw {
|
|
273
|
+
RE_EXN_ID: Seed$ReventlessSeed.Failed,
|
|
274
|
+
_1: "at least one referenced object is still tagged pending — see above. No store's expiry rule should be enabled while this is true.",
|
|
275
|
+
Error: new Error()
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
process.exit(0);
|
|
280
|
+
return;
|
|
281
|
+
} catch (raw_message) {
|
|
282
|
+
let message = Primitive_exceptions.internalToException(raw_message);
|
|
283
|
+
if (message.RE_EXN_ID === Seed$ReventlessSeed.Failed) {
|
|
284
|
+
console.error("");
|
|
285
|
+
console.error(`Reconcile failed — ` + message._1);
|
|
286
|
+
process.exit(1);
|
|
287
|
+
} else {
|
|
288
|
+
console.error("");
|
|
289
|
+
console.error("Reconcile failed with an unexpected error:");
|
|
290
|
+
console.error(Stdlib_Option.getOr(Stdlib_Option.flatMap(Stdlib_JsExn.fromException(message), Stdlib_JsExn.message), "unknown"));
|
|
291
|
+
process.exit(1);
|
|
292
|
+
}
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
};
|
|
296
|
+
go();
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
let Ddb;
|
|
300
|
+
|
|
301
|
+
let Rgt;
|
|
302
|
+
|
|
303
|
+
let S3;
|
|
304
|
+
|
|
305
|
+
export {
|
|
306
|
+
Ddb,
|
|
307
|
+
Rgt,
|
|
308
|
+
S3,
|
|
309
|
+
pendingTagKey,
|
|
310
|
+
collectRefs,
|
|
311
|
+
refsInTable,
|
|
312
|
+
listObjects,
|
|
313
|
+
reconcileStore,
|
|
314
|
+
sample,
|
|
315
|
+
print,
|
|
316
|
+
run,
|
|
317
|
+
}
|
|
318
|
+
/* S3-AwsSdk Not a pure module */
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|