@streetjs/storage 1.0.0 → 1.0.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.
- package/dist/drivers/local.d.ts +8 -0
- package/dist/drivers/local.d.ts.map +1 -1
- package/dist/drivers/local.js +18 -3
- package/dist/drivers/local.js.map +1 -1
- package/package.json +12 -6
- package/dist/tests/access.test.d.ts +0 -2
- package/dist/tests/access.test.d.ts.map +0 -1
- package/dist/tests/access.test.js +0 -270
- package/dist/tests/access.test.js.map +0 -1
- package/dist/tests/azure-driver.test.d.ts +0 -2
- package/dist/tests/azure-driver.test.d.ts.map +0 -1
- package/dist/tests/azure-driver.test.js +0 -183
- package/dist/tests/azure-driver.test.js.map +0 -1
- package/dist/tests/backblaze-driver.test.d.ts +0 -2
- package/dist/tests/backblaze-driver.test.d.ts.map +0 -1
- package/dist/tests/backblaze-driver.test.js +0 -185
- package/dist/tests/backblaze-driver.test.js.map +0 -1
- package/dist/tests/bridge-degradation.test.d.ts +0 -2
- package/dist/tests/bridge-degradation.test.d.ts.map +0 -1
- package/dist/tests/bridge-degradation.test.js +0 -138
- package/dist/tests/bridge-degradation.test.js.map +0 -1
- package/dist/tests/cli.test.d.ts +0 -2
- package/dist/tests/cli.test.d.ts.map +0 -1
- package/dist/tests/cli.test.js +0 -127
- package/dist/tests/cli.test.js.map +0 -1
- package/dist/tests/contract.d.ts +0 -131
- package/dist/tests/contract.d.ts.map +0 -1
- package/dist/tests/contract.js +0 -222
- package/dist/tests/contract.js.map +0 -1
- package/dist/tests/contract.test.d.ts +0 -2
- package/dist/tests/contract.test.d.ts.map +0 -1
- package/dist/tests/contract.test.js +0 -110
- package/dist/tests/contract.test.js.map +0 -1
- package/dist/tests/directory.test.d.ts +0 -2
- package/dist/tests/directory.test.d.ts.map +0 -1
- package/dist/tests/directory.test.js +0 -125
- package/dist/tests/directory.test.js.map +0 -1
- package/dist/tests/errors.test.d.ts +0 -2
- package/dist/tests/errors.test.d.ts.map +0 -1
- package/dist/tests/errors.test.js +0 -93
- package/dist/tests/errors.test.js.map +0 -1
- package/dist/tests/events-bridge.test.d.ts +0 -2
- package/dist/tests/events-bridge.test.d.ts.map +0 -1
- package/dist/tests/events-bridge.test.js +0 -228
- package/dist/tests/events-bridge.test.js.map +0 -1
- package/dist/tests/example-smoke.test.d.ts +0 -2
- package/dist/tests/example-smoke.test.d.ts.map +0 -1
- package/dist/tests/example-smoke.test.js +0 -34
- package/dist/tests/example-smoke.test.js.map +0 -1
- package/dist/tests/gcs-driver.test.d.ts +0 -2
- package/dist/tests/gcs-driver.test.d.ts.map +0 -1
- package/dist/tests/gcs-driver.test.js +0 -197
- package/dist/tests/gcs-driver.test.js.map +0 -1
- package/dist/tests/image.test.d.ts +0 -2
- package/dist/tests/image.test.d.ts.map +0 -1
- package/dist/tests/image.test.js +0 -102
- package/dist/tests/image.test.js.map +0 -1
- package/dist/tests/lifecycle.test.d.ts +0 -2
- package/dist/tests/lifecycle.test.d.ts.map +0 -1
- package/dist/tests/lifecycle.test.js +0 -171
- package/dist/tests/lifecycle.test.js.map +0 -1
- package/dist/tests/local-driver.test.d.ts +0 -2
- package/dist/tests/local-driver.test.d.ts.map +0 -1
- package/dist/tests/local-driver.test.js +0 -153
- package/dist/tests/local-driver.test.js.map +0 -1
- package/dist/tests/local-streaming.test.d.ts +0 -2
- package/dist/tests/local-streaming.test.d.ts.map +0 -1
- package/dist/tests/local-streaming.test.js +0 -121
- package/dist/tests/local-streaming.test.js.map +0 -1
- package/dist/tests/memory-driver.test.d.ts +0 -2
- package/dist/tests/memory-driver.test.d.ts.map +0 -1
- package/dist/tests/memory-driver.test.js +0 -180
- package/dist/tests/memory-driver.test.js.map +0 -1
- package/dist/tests/memory-streaming.test.d.ts +0 -2
- package/dist/tests/memory-streaming.test.d.ts.map +0 -1
- package/dist/tests/memory-streaming.test.js +0 -92
- package/dist/tests/memory-streaming.test.js.map +0 -1
- package/dist/tests/minio-driver.test.d.ts +0 -2
- package/dist/tests/minio-driver.test.d.ts.map +0 -1
- package/dist/tests/minio-driver.test.js +0 -146
- package/dist/tests/minio-driver.test.js.map +0 -1
- package/dist/tests/non-s3-integration.test.d.ts +0 -2
- package/dist/tests/non-s3-integration.test.d.ts.map +0 -1
- package/dist/tests/non-s3-integration.test.js +0 -201
- package/dist/tests/non-s3-integration.test.js.map +0 -1
- package/dist/tests/observability.registration.test.d.ts +0 -2
- package/dist/tests/observability.registration.test.d.ts.map +0 -1
- package/dist/tests/observability.registration.test.js +0 -103
- package/dist/tests/observability.registration.test.js.map +0 -1
- package/dist/tests/observability.test.d.ts +0 -2
- package/dist/tests/observability.test.d.ts.map +0 -1
- package/dist/tests/observability.test.js +0 -240
- package/dist/tests/observability.test.js.map +0 -1
- package/dist/tests/plugin.test.d.ts +0 -2
- package/dist/tests/plugin.test.d.ts.map +0 -1
- package/dist/tests/plugin.test.js +0 -112
- package/dist/tests/plugin.test.js.map +0 -1
- package/dist/tests/prop-concurrent.test.d.ts +0 -2
- package/dist/tests/prop-concurrent.test.d.ts.map +0 -1
- package/dist/tests/prop-concurrent.test.js +0 -59
- package/dist/tests/prop-concurrent.test.js.map +0 -1
- package/dist/tests/prop-copy.test.d.ts +0 -2
- package/dist/tests/prop-copy.test.d.ts.map +0 -1
- package/dist/tests/prop-copy.test.js +0 -63
- package/dist/tests/prop-copy.test.js.map +0 -1
- package/dist/tests/prop-delete.test.d.ts +0 -2
- package/dist/tests/prop-delete.test.d.ts.map +0 -1
- package/dist/tests/prop-delete.test.js +0 -35
- package/dist/tests/prop-delete.test.js.map +0 -1
- package/dist/tests/prop-directory.test.d.ts +0 -2
- package/dist/tests/prop-directory.test.d.ts.map +0 -1
- package/dist/tests/prop-directory.test.js +0 -118
- package/dist/tests/prop-directory.test.js.map +0 -1
- package/dist/tests/prop-driver-conformance.test.d.ts +0 -2
- package/dist/tests/prop-driver-conformance.test.d.ts.map +0 -1
- package/dist/tests/prop-driver-conformance.test.js +0 -110
- package/dist/tests/prop-driver-conformance.test.js.map +0 -1
- package/dist/tests/prop-driver-equivalence.test.d.ts +0 -2
- package/dist/tests/prop-driver-equivalence.test.d.ts.map +0 -1
- package/dist/tests/prop-driver-equivalence.test.js +0 -163
- package/dist/tests/prop-driver-equivalence.test.js.map +0 -1
- package/dist/tests/prop-lifecycle.test.d.ts +0 -2
- package/dist/tests/prop-lifecycle.test.d.ts.map +0 -1
- package/dist/tests/prop-lifecycle.test.js +0 -83
- package/dist/tests/prop-lifecycle.test.js.map +0 -1
- package/dist/tests/prop-list.test.d.ts +0 -2
- package/dist/tests/prop-list.test.d.ts.map +0 -1
- package/dist/tests/prop-list.test.js +0 -53
- package/dist/tests/prop-list.test.js.map +0 -1
- package/dist/tests/prop-metadata.test.d.ts +0 -2
- package/dist/tests/prop-metadata.test.d.ts.map +0 -1
- package/dist/tests/prop-metadata.test.js +0 -87
- package/dist/tests/prop-metadata.test.js.map +0 -1
- package/dist/tests/prop-move.test.d.ts +0 -2
- package/dist/tests/prop-move.test.d.ts.map +0 -1
- package/dist/tests/prop-move.test.js +0 -67
- package/dist/tests/prop-move.test.js.map +0 -1
- package/dist/tests/prop-multipart-abort.test.d.ts +0 -2
- package/dist/tests/prop-multipart-abort.test.d.ts.map +0 -1
- package/dist/tests/prop-multipart-abort.test.js +0 -48
- package/dist/tests/prop-multipart-abort.test.js.map +0 -1
- package/dist/tests/prop-multipart.test.d.ts +0 -2
- package/dist/tests/prop-multipart.test.d.ts.map +0 -1
- package/dist/tests/prop-multipart.test.js +0 -65
- package/dist/tests/prop-multipart.test.js.map +0 -1
- package/dist/tests/prop-resumable.test.d.ts +0 -2
- package/dist/tests/prop-resumable.test.d.ts.map +0 -1
- package/dist/tests/prop-resumable.test.js +0 -78
- package/dist/tests/prop-resumable.test.js.map +0 -1
- package/dist/tests/prop-search.test.d.ts +0 -2
- package/dist/tests/prop-search.test.d.ts.map +0 -1
- package/dist/tests/prop-search.test.js +0 -120
- package/dist/tests/prop-search.test.js.map +0 -1
- package/dist/tests/prop-signed-url.test.d.ts +0 -2
- package/dist/tests/prop-signed-url.test.d.ts.map +0 -1
- package/dist/tests/prop-signed-url.test.js +0 -74
- package/dist/tests/prop-signed-url.test.js.map +0 -1
- package/dist/tests/prop-streaming.test.d.ts +0 -2
- package/dist/tests/prop-streaming.test.d.ts.map +0 -1
- package/dist/tests/prop-streaming.test.js +0 -34
- package/dist/tests/prop-streaming.test.js.map +0 -1
- package/dist/tests/prop-upload-download.test.d.ts +0 -2
- package/dist/tests/prop-upload-download.test.d.ts.map +0 -1
- package/dist/tests/prop-upload-download.test.js +0 -30
- package/dist/tests/prop-upload-download.test.js.map +0 -1
- package/dist/tests/prop-validation.test.d.ts +0 -2
- package/dist/tests/prop-validation.test.d.ts.map +0 -1
- package/dist/tests/prop-validation.test.js +0 -50
- package/dist/tests/prop-validation.test.js.map +0 -1
- package/dist/tests/prop-versioning.test.d.ts +0 -2
- package/dist/tests/prop-versioning.test.d.ts.map +0 -1
- package/dist/tests/prop-versioning.test.js +0 -74
- package/dist/tests/prop-versioning.test.js.map +0 -1
- package/dist/tests/queue-bridge.test.d.ts +0 -2
- package/dist/tests/queue-bridge.test.d.ts.map +0 -1
- package/dist/tests/queue-bridge.test.js +0 -111
- package/dist/tests/queue-bridge.test.js.map +0 -1
- package/dist/tests/r2-driver.test.d.ts +0 -2
- package/dist/tests/r2-driver.test.d.ts.map +0 -1
- package/dist/tests/r2-driver.test.js +0 -143
- package/dist/tests/r2-driver.test.js.map +0 -1
- package/dist/tests/realtime-bridge.test.d.ts +0 -2
- package/dist/tests/realtime-bridge.test.d.ts.map +0 -1
- package/dist/tests/realtime-bridge.test.js +0 -106
- package/dist/tests/realtime-bridge.test.js.map +0 -1
- package/dist/tests/resumable.test.d.ts +0 -2
- package/dist/tests/resumable.test.d.ts.map +0 -1
- package/dist/tests/resumable.test.js +0 -104
- package/dist/tests/resumable.test.js.map +0 -1
- package/dist/tests/s3-base.test.d.ts +0 -2
- package/dist/tests/s3-base.test.d.ts.map +0 -1
- package/dist/tests/s3-base.test.js +0 -289
- package/dist/tests/s3-base.test.js.map +0 -1
- package/dist/tests/s3-integration.test.d.ts +0 -2
- package/dist/tests/s3-integration.test.d.ts.map +0 -1
- package/dist/tests/s3-integration.test.js +0 -270
- package/dist/tests/s3-integration.test.js.map +0 -1
- package/dist/tests/s3.test.d.ts +0 -2
- package/dist/tests/s3.test.d.ts.map +0 -1
- package/dist/tests/s3.test.js +0 -203
- package/dist/tests/s3.test.js.map +0 -1
- package/dist/tests/scaffold.test.d.ts +0 -2
- package/dist/tests/scaffold.test.d.ts.map +0 -1
- package/dist/tests/scaffold.test.js +0 -13
- package/dist/tests/scaffold.test.js.map +0 -1
- package/dist/tests/search.test.d.ts +0 -2
- package/dist/tests/search.test.d.ts.map +0 -1
- package/dist/tests/search.test.js +0 -106
- package/dist/tests/search.test.js.map +0 -1
- package/dist/tests/supabase-driver.test.d.ts +0 -2
- package/dist/tests/supabase-driver.test.d.ts.map +0 -1
- package/dist/tests/supabase-driver.test.js +0 -196
- package/dist/tests/supabase-driver.test.js.map +0 -1
- package/dist/tests/testing-utilities.test.d.ts +0 -2
- package/dist/tests/testing-utilities.test.d.ts.map +0 -1
- package/dist/tests/testing-utilities.test.js +0 -138
- package/dist/tests/testing-utilities.test.js.map +0 -1
- package/dist/tests/validation.test.d.ts +0 -2
- package/dist/tests/validation.test.d.ts.map +0 -1
- package/dist/tests/validation.test.js +0 -135
- package/dist/tests/validation.test.js.map +0 -1
- package/dist/tests/versioning.test.d.ts +0 -2
- package/dist/tests/versioning.test.d.ts.map +0 -1
- package/dist/tests/versioning.test.js +0 -128
- package/dist/tests/versioning.test.js.map +0 -1
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
// Unit tests for the Directory API wired into the storage facade (task 17.1).
|
|
2
|
-
//
|
|
3
|
-
// Verifies the Requirement 15 semantics over the zero-dependency `memory`
|
|
4
|
-
// provider, exercised through `storage.directory`:
|
|
5
|
-
//
|
|
6
|
-
// - mkdir(path) makes the path available as a directory prefix (15.1).
|
|
7
|
-
// - listDirectory(path) returns only the IMMEDIATE children, collapsing
|
|
8
|
-
// deeper keys into a single sub-directory entry (15.2).
|
|
9
|
-
// - removeDirectory(path) removes every object under the prefix (15.3), and is
|
|
10
|
-
// a success no-op returning { removed: false } for an empty/missing prefix
|
|
11
|
-
// (15.6).
|
|
12
|
-
// - walk(path) returns every object key beneath the prefix (15.4).
|
|
13
|
-
//
|
|
14
|
-
// Uses the Node.js built-in test runner (node:test); executed via
|
|
15
|
-
// `node --test dist/tests/*.test.js`.
|
|
16
|
-
//
|
|
17
|
-
// Requirements: 15.1, 15.2, 15.3, 15.4, 15.5, 15.6
|
|
18
|
-
import test from "node:test";
|
|
19
|
-
import assert from "node:assert/strict";
|
|
20
|
-
import { createStorage } from "../facade.js";
|
|
21
|
-
import { MemoryStorageDriver } from "../drivers/memory.js";
|
|
22
|
-
/** Build a facade backed by a fresh in-memory driver. */
|
|
23
|
-
function makeStorage() {
|
|
24
|
-
const driver = new MemoryStorageDriver({});
|
|
25
|
-
return createStorage({ provider: "memory", driver });
|
|
26
|
-
}
|
|
27
|
-
/** Seed the store with a small hierarchy of objects. */
|
|
28
|
-
async function seed(storage) {
|
|
29
|
-
await storage.put("photos/a.jpg", "a");
|
|
30
|
-
await storage.put("photos/b.jpg", "bb");
|
|
31
|
-
await storage.put("photos/2024/c.jpg", "ccc");
|
|
32
|
-
await storage.put("photos/2024/holidays/d.jpg", "dddd");
|
|
33
|
-
await storage.put("docs/readme.txt", "hello");
|
|
34
|
-
}
|
|
35
|
-
test("directory getter returns a working, cached DirectoryApi", () => {
|
|
36
|
-
const storage = makeStorage();
|
|
37
|
-
const dir = storage.directory;
|
|
38
|
-
assert.equal(typeof dir.mkdir, "function");
|
|
39
|
-
assert.equal(typeof dir.listDirectory, "function");
|
|
40
|
-
assert.equal(typeof dir.removeDirectory, "function");
|
|
41
|
-
assert.equal(typeof dir.walk, "function");
|
|
42
|
-
// Same instance is reused across accesses (lazily constructed once).
|
|
43
|
-
assert.equal(storage.directory, dir);
|
|
44
|
-
});
|
|
45
|
-
test("mkdir makes the path available as a directory prefix (15.1)", async () => {
|
|
46
|
-
const storage = makeStorage();
|
|
47
|
-
await storage.directory.mkdir("uploads");
|
|
48
|
-
// The marker key exists so the empty directory is discoverable.
|
|
49
|
-
assert.equal(await storage.exists("uploads/"), true);
|
|
50
|
-
// A freshly-made directory has no child entries yet.
|
|
51
|
-
const listing = await storage.directory.listDirectory("uploads");
|
|
52
|
-
assert.deepEqual(listing, []);
|
|
53
|
-
});
|
|
54
|
-
test("mkdir on the root/empty path is a no-op (15.1)", async () => {
|
|
55
|
-
const storage = makeStorage();
|
|
56
|
-
await storage.directory.mkdir("");
|
|
57
|
-
await storage.directory.mkdir("/");
|
|
58
|
-
// No marker keys were written for the root.
|
|
59
|
-
const keys = await storage.directory.walk("");
|
|
60
|
-
assert.deepEqual(keys, []);
|
|
61
|
-
});
|
|
62
|
-
test("listDirectory returns only immediate children (15.2)", async () => {
|
|
63
|
-
const storage = makeStorage();
|
|
64
|
-
await seed(storage);
|
|
65
|
-
const listing = await storage.directory.listDirectory("photos");
|
|
66
|
-
const keys = listing.map((item) => item.key).sort();
|
|
67
|
-
// Immediate children of photos/: two files and one sub-directory entry;
|
|
68
|
-
// deeper keys (photos/2024/holidays/...) collapse into photos/2024/.
|
|
69
|
-
assert.deepEqual(keys, ["photos/2024/", "photos/a.jpg", "photos/b.jpg"]);
|
|
70
|
-
// The sub-directory entry is synthesized with size 0.
|
|
71
|
-
const subdir = listing.find((item) => item.key === "photos/2024/");
|
|
72
|
-
assert.equal(subdir.size, 0);
|
|
73
|
-
// File entries carry their real byte sizes.
|
|
74
|
-
const fileA = listing.find((item) => item.key === "photos/a.jpg");
|
|
75
|
-
assert.equal(fileA.size, 1);
|
|
76
|
-
const fileB = listing.find((item) => item.key === "photos/b.jpg");
|
|
77
|
-
assert.equal(fileB.size, 2);
|
|
78
|
-
});
|
|
79
|
-
test("listDirectory accepts leading/trailing delimiters equivalently (15.2)", async () => {
|
|
80
|
-
const storage = makeStorage();
|
|
81
|
-
await seed(storage);
|
|
82
|
-
const a = (await storage.directory.listDirectory("photos")).map((i) => i.key).sort();
|
|
83
|
-
const b = (await storage.directory.listDirectory("/photos/")).map((i) => i.key).sort();
|
|
84
|
-
assert.deepEqual(a, b);
|
|
85
|
-
});
|
|
86
|
-
test("walk returns every object key beneath the prefix (15.4)", async () => {
|
|
87
|
-
const storage = makeStorage();
|
|
88
|
-
await seed(storage);
|
|
89
|
-
const keys = (await storage.directory.walk("photos")).sort();
|
|
90
|
-
assert.deepEqual(keys, [
|
|
91
|
-
"photos/2024/c.jpg",
|
|
92
|
-
"photos/2024/holidays/d.jpg",
|
|
93
|
-
"photos/a.jpg",
|
|
94
|
-
"photos/b.jpg",
|
|
95
|
-
]);
|
|
96
|
-
// walk excludes the directory's own marker key.
|
|
97
|
-
await storage.directory.mkdir("photos");
|
|
98
|
-
const withMarker = (await storage.directory.walk("photos")).sort();
|
|
99
|
-
assert.equal(withMarker.includes("photos/"), false);
|
|
100
|
-
});
|
|
101
|
-
test("removeDirectory removes every object under the prefix (15.3)", async () => {
|
|
102
|
-
const storage = makeStorage();
|
|
103
|
-
await seed(storage);
|
|
104
|
-
const result = await storage.directory.removeDirectory("photos");
|
|
105
|
-
assert.deepEqual(result, { removed: true });
|
|
106
|
-
// Nothing remains beneath photos/.
|
|
107
|
-
assert.deepEqual(await storage.directory.walk("photos"), []);
|
|
108
|
-
assert.equal(await storage.exists("photos/a.jpg"), false);
|
|
109
|
-
assert.equal(await storage.exists("photos/2024/holidays/d.jpg"), false);
|
|
110
|
-
// Sibling directories are untouched.
|
|
111
|
-
assert.equal(await storage.exists("docs/readme.txt"), true);
|
|
112
|
-
});
|
|
113
|
-
test("removeDirectory of an empty/missing prefix is a success no-op (15.6)", async () => {
|
|
114
|
-
const storage = makeStorage();
|
|
115
|
-
await seed(storage);
|
|
116
|
-
// Missing prefix: no objects removed, success result, siblings intact.
|
|
117
|
-
const missing = await storage.directory.removeDirectory("does-not-exist");
|
|
118
|
-
assert.deepEqual(missing, { removed: false });
|
|
119
|
-
assert.equal(await storage.exists("docs/readme.txt"), true);
|
|
120
|
-
// Removing twice: second call finds nothing and reports removed: false.
|
|
121
|
-
await storage.directory.removeDirectory("docs");
|
|
122
|
-
const second = await storage.directory.removeDirectory("docs");
|
|
123
|
-
assert.deepEqual(second, { removed: false });
|
|
124
|
-
});
|
|
125
|
-
//# sourceMappingURL=directory.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"directory.test.js","sourceRoot":"","sources":["../../src/tests/directory.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors.test.d.ts","sourceRoot":"","sources":["../../src/tests/errors.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
// Unit tests for the typed error hierarchy of @streetjs/storage.
|
|
2
|
-
//
|
|
3
|
-
// Verifies that every concrete error subclass derives from both StorageError
|
|
4
|
-
// and the native Error (so consumers can catch the whole family or discriminate
|
|
5
|
-
// on a subclass), that each carries its descriptive typed fields, and that each
|
|
6
|
-
// sets `name` correctly. Uses the Node.js built-in test runner (node:test) and
|
|
7
|
-
// is executed via `node --test dist/tests/*.test.js`.
|
|
8
|
-
//
|
|
9
|
-
// Requirements: 1.5, 9.4, 11.3
|
|
10
|
-
import test from "node:test";
|
|
11
|
-
import assert from "node:assert/strict";
|
|
12
|
-
import { StorageError, StorageConfigError, NotFoundError, ValidationError, AuthorizationError, UnsupportedImageError, } from "../index.js";
|
|
13
|
-
test("StorageError is a native Error and sets its name", () => {
|
|
14
|
-
const err = new StorageError("boom");
|
|
15
|
-
assert.ok(err instanceof Error);
|
|
16
|
-
assert.ok(err instanceof StorageError);
|
|
17
|
-
assert.equal(err.name, "StorageError");
|
|
18
|
-
assert.equal(err.message, "boom");
|
|
19
|
-
});
|
|
20
|
-
test("StorageError carries an optional cause", () => {
|
|
21
|
-
const underlying = new Error("root cause");
|
|
22
|
-
const err = new StorageError("wrapped", { cause: underlying });
|
|
23
|
-
assert.equal(err.cause, underlying);
|
|
24
|
-
});
|
|
25
|
-
test("StorageConfigError is instanceof StorageError and Error", () => {
|
|
26
|
-
const err = new StorageConfigError("bad config", { provider: "s3" });
|
|
27
|
-
assert.ok(err instanceof Error);
|
|
28
|
-
assert.ok(err instanceof StorageError);
|
|
29
|
-
assert.ok(err instanceof StorageConfigError);
|
|
30
|
-
});
|
|
31
|
-
test("StorageConfigError carries provider and name", () => {
|
|
32
|
-
const err = new StorageConfigError("unknown provider", { provider: "nope" });
|
|
33
|
-
assert.equal(err.name, "StorageConfigError");
|
|
34
|
-
assert.equal(err.provider, "nope");
|
|
35
|
-
});
|
|
36
|
-
test("NotFoundError is instanceof StorageError and Error", () => {
|
|
37
|
-
const err = new NotFoundError("photos/1.png");
|
|
38
|
-
assert.ok(err instanceof Error);
|
|
39
|
-
assert.ok(err instanceof StorageError);
|
|
40
|
-
assert.ok(err instanceof NotFoundError);
|
|
41
|
-
});
|
|
42
|
-
test("NotFoundError carries key, name, and default message", () => {
|
|
43
|
-
const err = new NotFoundError("photos/1.png");
|
|
44
|
-
assert.equal(err.name, "NotFoundError");
|
|
45
|
-
assert.equal(err.key, "photos/1.png");
|
|
46
|
-
assert.equal(err.message, 'Object not found for key "photos/1.png"');
|
|
47
|
-
});
|
|
48
|
-
test("ValidationError is instanceof StorageError and Error", () => {
|
|
49
|
-
const err = new ValidationError("file too large");
|
|
50
|
-
assert.ok(err instanceof Error);
|
|
51
|
-
assert.ok(err instanceof StorageError);
|
|
52
|
-
assert.ok(err instanceof ValidationError);
|
|
53
|
-
});
|
|
54
|
-
test("ValidationError carries validationError, optional key, and name", () => {
|
|
55
|
-
const err = new ValidationError("file too large", { key: "uploads/big.zip" });
|
|
56
|
-
assert.equal(err.name, "ValidationError");
|
|
57
|
-
assert.equal(err.validationError, "file too large");
|
|
58
|
-
assert.equal(err.key, "uploads/big.zip");
|
|
59
|
-
assert.equal(err.message, "Upload validation failed: file too large");
|
|
60
|
-
});
|
|
61
|
-
test("AuthorizationError is instanceof StorageError and Error", () => {
|
|
62
|
-
const err = new AuthorizationError("denied");
|
|
63
|
-
assert.ok(err instanceof Error);
|
|
64
|
-
assert.ok(err instanceof StorageError);
|
|
65
|
-
assert.ok(err instanceof AuthorizationError);
|
|
66
|
-
});
|
|
67
|
-
test("AuthorizationError carries key, operation, accessLevel, and name", () => {
|
|
68
|
-
const err = new AuthorizationError("access denied", {
|
|
69
|
-
key: "private/secret.txt",
|
|
70
|
-
operation: "read",
|
|
71
|
-
accessLevel: "private",
|
|
72
|
-
});
|
|
73
|
-
assert.equal(err.name, "AuthorizationError");
|
|
74
|
-
assert.equal(err.key, "private/secret.txt");
|
|
75
|
-
assert.equal(err.operation, "read");
|
|
76
|
-
assert.equal(err.accessLevel, "private");
|
|
77
|
-
});
|
|
78
|
-
test("UnsupportedImageError is instanceof StorageError and Error", () => {
|
|
79
|
-
const err = new UnsupportedImageError("cannot process");
|
|
80
|
-
assert.ok(err instanceof Error);
|
|
81
|
-
assert.ok(err instanceof StorageError);
|
|
82
|
-
assert.ok(err instanceof UnsupportedImageError);
|
|
83
|
-
});
|
|
84
|
-
test("UnsupportedImageError carries format, key, and name", () => {
|
|
85
|
-
const err = new UnsupportedImageError("unsupported format", {
|
|
86
|
-
format: "image/tiff",
|
|
87
|
-
key: "images/scan.tiff",
|
|
88
|
-
});
|
|
89
|
-
assert.equal(err.name, "UnsupportedImageError");
|
|
90
|
-
assert.equal(err.format, "image/tiff");
|
|
91
|
-
assert.equal(err.key, "images/scan.tiff");
|
|
92
|
-
});
|
|
93
|
-
//# sourceMappingURL=errors.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors.test.js","sourceRoot":"","sources":["../../src/tests/errors.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"events-bridge.test.d.ts","sourceRoot":"","sources":["../../src/tests/events-bridge.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,228 +0,0 @@
|
|
|
1
|
-
// Unit tests for the Events integration bridge wired into the storage facade
|
|
2
|
-
// (task 21.1).
|
|
3
|
-
//
|
|
4
|
-
// Verifies the Requirement 18 / 13.4 semantics over the zero-dependency
|
|
5
|
-
// `memory` provider:
|
|
6
|
-
//
|
|
7
|
-
// - object mutations publish the corresponding typed event through the
|
|
8
|
-
// structural EventsLike bridge: put(new) → storage.uploaded, put(existing) →
|
|
9
|
-
// storage.updated, delete → storage.deleted, move/rename → storage.moved,
|
|
10
|
-
// restoreVersion → storage.restored (18.1).
|
|
11
|
-
// - each payload carries the affected key and (when available) metadata (18.2).
|
|
12
|
-
// - applied lifecycle actions publish through the same bridge (13.4).
|
|
13
|
-
// - a failing events layer never throws into the storage operation path.
|
|
14
|
-
// - with no events bridge configured, publication is a complete no-op.
|
|
15
|
-
// - bridgeStorageEvents is a standalone, never-throwing publisher.
|
|
16
|
-
//
|
|
17
|
-
// Uses the Node.js built-in test runner (node:test); executed via
|
|
18
|
-
// `node --test dist/tests/*.test.js`.
|
|
19
|
-
//
|
|
20
|
-
// Requirements: 13.4, 18.1, 18.2, 18.3, 28.3
|
|
21
|
-
import test from "node:test";
|
|
22
|
-
import assert from "node:assert/strict";
|
|
23
|
-
import { createStorage, bridgeStorageEvents } from "../index.js";
|
|
24
|
-
const DAY = 24 * 60 * 60 * 1000;
|
|
25
|
-
const T0 = 1_700_000_000_000;
|
|
26
|
-
/** A recording EventsLike double capturing every published (event, payload). */
|
|
27
|
-
function recordingEvents() {
|
|
28
|
-
const published = [];
|
|
29
|
-
return {
|
|
30
|
-
published,
|
|
31
|
-
publish(event, payload) {
|
|
32
|
-
published.push({ event, payload: payload });
|
|
33
|
-
},
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
test("put on a new key publishes storage.uploaded with key + metadata (Req 18.1, 18.2)", async () => {
|
|
37
|
-
const events = recordingEvents();
|
|
38
|
-
const storage = createStorage({ provider: "memory", bridges: { events } });
|
|
39
|
-
await storage.put("photo.png", "bytes", { contentType: "image/png" });
|
|
40
|
-
assert.equal(events.published.length, 1);
|
|
41
|
-
const { event, payload } = events.published[0];
|
|
42
|
-
assert.equal(event, "storage.uploaded");
|
|
43
|
-
assert.equal(payload.key, "photo.png");
|
|
44
|
-
assert.ok(payload.metadata);
|
|
45
|
-
assert.equal(payload.metadata.key, "photo.png");
|
|
46
|
-
assert.equal(payload.metadata.contentType, "image/png");
|
|
47
|
-
});
|
|
48
|
-
test("put overwriting an existing key publishes storage.updated (Req 18.1)", async () => {
|
|
49
|
-
const events = recordingEvents();
|
|
50
|
-
const storage = createStorage({ provider: "memory", bridges: { events } });
|
|
51
|
-
await storage.put("doc.txt", "v1");
|
|
52
|
-
await storage.put("doc.txt", "v2");
|
|
53
|
-
assert.deepEqual(events.published.map((e) => e.event), ["storage.uploaded", "storage.updated"]);
|
|
54
|
-
assert.equal(events.published[1].payload.key, "doc.txt");
|
|
55
|
-
assert.ok(events.published[1].payload.metadata);
|
|
56
|
-
});
|
|
57
|
-
test("delete publishes storage.deleted with the key (Req 18.1, 18.2)", async () => {
|
|
58
|
-
const events = recordingEvents();
|
|
59
|
-
const storage = createStorage({ provider: "memory", bridges: { events } });
|
|
60
|
-
await storage.put("gone.txt", "x");
|
|
61
|
-
events.published.length = 0; // ignore the upload event
|
|
62
|
-
await storage.delete("gone.txt");
|
|
63
|
-
assert.equal(events.published.length, 1);
|
|
64
|
-
assert.equal(events.published[0].event, "storage.deleted");
|
|
65
|
-
assert.equal(events.published[0].payload.key, "gone.txt");
|
|
66
|
-
});
|
|
67
|
-
test("move publishes storage.moved for the destination (Req 18.1)", async () => {
|
|
68
|
-
const events = recordingEvents();
|
|
69
|
-
const storage = createStorage({ provider: "memory", bridges: { events } });
|
|
70
|
-
await storage.put("a.txt", "content");
|
|
71
|
-
events.published.length = 0;
|
|
72
|
-
await storage.move("a.txt", "b.txt");
|
|
73
|
-
assert.equal(events.published.length, 1);
|
|
74
|
-
assert.equal(events.published[0].event, "storage.moved");
|
|
75
|
-
assert.equal(events.published[0].payload.key, "b.txt");
|
|
76
|
-
assert.ok(events.published[0].payload.metadata);
|
|
77
|
-
});
|
|
78
|
-
test("rename publishes storage.moved (delegates to move) (Req 18.1)", async () => {
|
|
79
|
-
const events = recordingEvents();
|
|
80
|
-
const storage = createStorage({ provider: "memory", bridges: { events } });
|
|
81
|
-
await storage.put("old", "content");
|
|
82
|
-
events.published.length = 0;
|
|
83
|
-
await storage.rename("old", "new");
|
|
84
|
-
assert.deepEqual(events.published.map((e) => e.event), ["storage.moved"]);
|
|
85
|
-
assert.equal(events.published[0].payload.key, "new");
|
|
86
|
-
});
|
|
87
|
-
test("move of a missing source publishes nothing", async () => {
|
|
88
|
-
const events = recordingEvents();
|
|
89
|
-
const storage = createStorage({ provider: "memory", bridges: { events } });
|
|
90
|
-
const result = await storage.move("missing", "dest");
|
|
91
|
-
assert.equal(result.moved, false);
|
|
92
|
-
assert.deepEqual(events.published, []);
|
|
93
|
-
});
|
|
94
|
-
test("restoreVersion publishes storage.restored (Req 18.1)", async () => {
|
|
95
|
-
const events = recordingEvents();
|
|
96
|
-
const storage = createStorage({
|
|
97
|
-
provider: "memory",
|
|
98
|
-
versioning: true,
|
|
99
|
-
bridges: { events },
|
|
100
|
-
});
|
|
101
|
-
await storage.put("k", "v1");
|
|
102
|
-
await storage.put("k", "v2"); // snapshots v1 as a version
|
|
103
|
-
const versions = await storage.listVersions("k");
|
|
104
|
-
assert.equal(versions.length, 1);
|
|
105
|
-
events.published.length = 0;
|
|
106
|
-
await storage.restoreVersion("k", versions[0].versionId);
|
|
107
|
-
assert.equal(events.published.length, 1);
|
|
108
|
-
assert.equal(events.published[0].event, "storage.restored");
|
|
109
|
-
assert.equal(events.published[0].payload.key, "k");
|
|
110
|
-
assert.ok(events.published[0].payload.metadata);
|
|
111
|
-
});
|
|
112
|
-
test("applyLifecycle publishes lifecycle events through the bridge (Req 13.4)", async () => {
|
|
113
|
-
const events = recordingEvents();
|
|
114
|
-
let now = T0;
|
|
115
|
-
const clock = () => now;
|
|
116
|
-
const storage = createStorage({ provider: "memory", clock, bridges: { events } });
|
|
117
|
-
await storage.put("old", "a");
|
|
118
|
-
now = T0 + 10 * DAY;
|
|
119
|
-
events.published.length = 0;
|
|
120
|
-
const outcomes = await storage.applyLifecycle({ type: "delete-after-days", days: 5 });
|
|
121
|
-
assert.deepEqual(outcomes, [{ key: "old", action: "deleted" }]);
|
|
122
|
-
assert.equal(events.published.length, 1);
|
|
123
|
-
assert.equal(events.published[0].event, "storage.deleted");
|
|
124
|
-
assert.equal(events.published[0].payload.key, "old");
|
|
125
|
-
assert.equal(events.published[0].payload.action, "deleted");
|
|
126
|
-
});
|
|
127
|
-
test("expire-temp-uploads publishes storage.expired (Req 13.4)", async () => {
|
|
128
|
-
const events = recordingEvents();
|
|
129
|
-
let now = T0;
|
|
130
|
-
const clock = () => now;
|
|
131
|
-
const storage = createStorage({ provider: "memory", clock, bridges: { events } });
|
|
132
|
-
const uploadId = await storage.createMultipartUpload("big", { contentType: "text/plain" });
|
|
133
|
-
await storage.uploadPart(uploadId, 1, new TextEncoder().encode("part-1"));
|
|
134
|
-
now = T0 + 60_000;
|
|
135
|
-
events.published.length = 0;
|
|
136
|
-
const outcomes = await storage.applyLifecycle({ type: "expire-temp-uploads", afterMs: 30_000 });
|
|
137
|
-
assert.equal(outcomes.length, 1);
|
|
138
|
-
assert.equal(events.published.length, 1);
|
|
139
|
-
assert.equal(events.published[0].event, "storage.expired");
|
|
140
|
-
assert.equal(events.published[0].payload.action, "expired");
|
|
141
|
-
});
|
|
142
|
-
test("archive-after-months publishes storage.moved with action=archived (Req 13.4)", async () => {
|
|
143
|
-
const events = recordingEvents();
|
|
144
|
-
let now = T0;
|
|
145
|
-
const clock = () => now;
|
|
146
|
-
const storage = createStorage({ provider: "memory", clock, bridges: { events } });
|
|
147
|
-
await storage.put("report", "payload");
|
|
148
|
-
now = T0 + 90 * DAY;
|
|
149
|
-
events.published.length = 0;
|
|
150
|
-
const outcomes = await storage.applyLifecycle({ type: "archive-after-months", months: 2 });
|
|
151
|
-
assert.deepEqual(outcomes, [{ key: "report", action: "archived" }]);
|
|
152
|
-
assert.equal(events.published.length, 1);
|
|
153
|
-
assert.equal(events.published[0].event, "storage.moved");
|
|
154
|
-
assert.equal(events.published[0].payload.action, "archived");
|
|
155
|
-
});
|
|
156
|
-
test("a synchronous publish failure never breaks the storage operation", async () => {
|
|
157
|
-
const throwingEvents = {
|
|
158
|
-
publish() {
|
|
159
|
-
throw new Error("event bus down");
|
|
160
|
-
},
|
|
161
|
-
};
|
|
162
|
-
const storage = createStorage({ provider: "memory", bridges: { events: throwingEvents } });
|
|
163
|
-
// The put must still succeed and return metadata despite the publish throwing.
|
|
164
|
-
const metadata = await storage.put("k", "v");
|
|
165
|
-
assert.equal(metadata.key, "k");
|
|
166
|
-
assert.equal(await storage.exists("k"), true);
|
|
167
|
-
// delete must likewise succeed.
|
|
168
|
-
await storage.delete("k");
|
|
169
|
-
assert.equal(await storage.exists("k"), false);
|
|
170
|
-
});
|
|
171
|
-
test("an asynchronous publish rejection never breaks the storage operation", async () => {
|
|
172
|
-
const rejectingEvents = {
|
|
173
|
-
publish() {
|
|
174
|
-
return Promise.reject(new Error("async bus down"));
|
|
175
|
-
},
|
|
176
|
-
};
|
|
177
|
-
const storage = createStorage({ provider: "memory", bridges: { events: rejectingEvents } });
|
|
178
|
-
const metadata = await storage.put("k", "v");
|
|
179
|
-
assert.equal(metadata.key, "k");
|
|
180
|
-
const result = await storage.get("k");
|
|
181
|
-
assert.equal(result.found, true);
|
|
182
|
-
});
|
|
183
|
-
test("with no events bridge configured, operations proceed with no publication", async () => {
|
|
184
|
-
const storage = createStorage({ provider: "memory" });
|
|
185
|
-
const metadata = await storage.put("k", "v");
|
|
186
|
-
assert.equal(metadata.key, "k");
|
|
187
|
-
await storage.delete("k");
|
|
188
|
-
assert.equal(await storage.exists("k"), false);
|
|
189
|
-
});
|
|
190
|
-
test("bridgeStorageEvents is a standalone never-throwing publisher", () => {
|
|
191
|
-
const events = recordingEvents();
|
|
192
|
-
const publisher = bridgeStorageEvents(events);
|
|
193
|
-
const metadata = {
|
|
194
|
-
key: "k",
|
|
195
|
-
size: 1,
|
|
196
|
-
contentType: "text/plain",
|
|
197
|
-
etag: "e",
|
|
198
|
-
checksum: "c",
|
|
199
|
-
accessLevel: "private",
|
|
200
|
-
createdAt: T0,
|
|
201
|
-
updatedAt: T0,
|
|
202
|
-
custom: {},
|
|
203
|
-
};
|
|
204
|
-
publisher.uploaded(metadata);
|
|
205
|
-
publisher.updated(metadata);
|
|
206
|
-
publisher.deleted("k");
|
|
207
|
-
publisher.moved(metadata);
|
|
208
|
-
publisher.restored(metadata);
|
|
209
|
-
publisher.expired("k");
|
|
210
|
-
publisher.lifecycle({ key: "k", action: "moved" });
|
|
211
|
-
assert.deepEqual(events.published.map((e) => e.event), [
|
|
212
|
-
"storage.uploaded",
|
|
213
|
-
"storage.updated",
|
|
214
|
-
"storage.deleted",
|
|
215
|
-
"storage.moved",
|
|
216
|
-
"storage.restored",
|
|
217
|
-
"storage.expired",
|
|
218
|
-
"storage.moved",
|
|
219
|
-
]);
|
|
220
|
-
// A throwing bus is fully isolated.
|
|
221
|
-
const badPublisher = bridgeStorageEvents({
|
|
222
|
-
publish() {
|
|
223
|
-
throw new Error("down");
|
|
224
|
-
},
|
|
225
|
-
});
|
|
226
|
-
assert.doesNotThrow(() => badPublisher.uploaded(metadata));
|
|
227
|
-
});
|
|
228
|
-
//# sourceMappingURL=events-bridge.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"events-bridge.test.js","sourceRoot":"","sources":["../../src/tests/events-bridge.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"example-smoke.test.d.ts","sourceRoot":"","sources":["../../src/tests/example-smoke.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
// Smoke test for the runnable end-to-end example (task 31.2).
|
|
2
|
-
//
|
|
3
|
-
// This test imports `runStorageDemo` from the example application and executes
|
|
4
|
-
// it end to end against the zero-dependency in-memory driver — no external
|
|
5
|
-
// services, no network, no real image library. It passes a no-op log sink to
|
|
6
|
-
// keep test output quiet and asserts on the returned summary to prove the
|
|
7
|
-
// demonstrated operations (upload, download, replace, list, delete, signed URL,
|
|
8
|
-
// streaming progress, resize, thumbnail, metadata) all succeeded.
|
|
9
|
-
//
|
|
10
|
-
// Requirements: 25.3, 27.1
|
|
11
|
-
import test from "node:test";
|
|
12
|
-
import assert from "node:assert/strict";
|
|
13
|
-
import { runStorageDemo } from "../examples/storage-demo.js";
|
|
14
|
-
/** A no-op log sink so the demo runs quietly under the test runner. */
|
|
15
|
-
const quietLog = (_line) => { };
|
|
16
|
-
test("runStorageDemo runs end to end on the zero-dependency driver", async () => {
|
|
17
|
-
const summary = await runStorageDemo(quietLog);
|
|
18
|
-
// Download round-tripped and matched the upload.
|
|
19
|
-
assert.equal(summary.downloaded, "ok");
|
|
20
|
-
// Listing returned at least one stored object.
|
|
21
|
-
assert.ok(Array.isArray(summary.listedKeys));
|
|
22
|
-
assert.ok(summary.listedKeys.length > 0, "expected at least one listed key");
|
|
23
|
-
// A signed URL was produced.
|
|
24
|
-
assert.equal(typeof summary.signedUrl, "string");
|
|
25
|
-
assert.ok(summary.signedUrl.length > 0, "expected a non-empty signed URL");
|
|
26
|
-
// Streaming upload surfaced byte-level progress.
|
|
27
|
-
assert.ok(summary.progressUpdates > 0, "expected at least one progress update");
|
|
28
|
-
// Image processing produced resized and thumbnail variants.
|
|
29
|
-
assert.ok(typeof summary.resizedKey === "string" && summary.resizedKey.length > 0, "expected a resized variant key");
|
|
30
|
-
assert.ok(typeof summary.thumbnailKey === "string" && summary.thumbnailKey.length > 0, "expected a thumbnail variant key");
|
|
31
|
-
// Metadata inspection reported a positive object size.
|
|
32
|
-
assert.ok(summary.avatarSize > 0, "expected a positive avatar size");
|
|
33
|
-
});
|
|
34
|
-
//# sourceMappingURL=example-smoke.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"example-smoke.test.js","sourceRoot":"","sources":["../../src/tests/example-smoke.test.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,EAAE;AACF,+EAA+E;AAC/E,2EAA2E;AAC3E,6EAA6E;AAC7E,0EAA0E;AAC1E,gFAAgF;AAChF,kEAAkE;AAClE,EAAE;AACF,2BAA2B;AAE3B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAExC,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,uEAAuE;AACvE,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAQ,EAAE,GAAE,CAAC,CAAC;AAE7C,IAAI,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;IAC9E,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;IAE/C,iDAAiD;IACjD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAEvC,+CAA+C;IAC/C,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAC7C,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,kCAAkC,CAAC,CAAC;IAE7E,6BAA6B;IAC7B,MAAM,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACjD,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,iCAAiC,CAAC,CAAC;IAE3E,iDAAiD;IACjD,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,eAAe,GAAG,CAAC,EAAE,uCAAuC,CAAC,CAAC;IAEhF,4DAA4D;IAC5D,MAAM,CAAC,EAAE,CACP,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EACvE,gCAAgC,CACjC,CAAC;IACF,MAAM,CAAC,EAAE,CACP,OAAO,OAAO,CAAC,YAAY,KAAK,QAAQ,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAC3E,kCAAkC,CACnC,CAAC;IAEF,uDAAuD;IACvD,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,GAAG,CAAC,EAAE,iCAAiC,CAAC,CAAC;AACvE,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gcs-driver.test.d.ts","sourceRoot":"","sources":["../../src/tests/gcs-driver.test.ts"],"names":[],"mappings":""}
|