@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,270 +0,0 @@
|
|
|
1
|
-
// Integration tests for the S3-compatible cloud drivers (task 28.6): Amazon S3,
|
|
2
|
-
// Cloudflare R2, MinIO, and Backblaze B2. These are *live* provider tests that
|
|
3
|
-
// talk to a real bucket, so they follow the "honest external skipping" policy
|
|
4
|
-
// from Requirement 27 — they never fabricate provider success and never report a
|
|
5
|
-
// skipped provider as passed.
|
|
6
|
-
//
|
|
7
|
-
// Behavior matrix (Requirements 27.2–27.5):
|
|
8
|
-
//
|
|
9
|
-
// • Credentials ABSENT → the test is declared with node:test's
|
|
10
|
-
// test(name, { skip: reason }, ...) so the runner marks it SKIPPED (not
|
|
11
|
-
// passed) and never executes any provider code. This is the normal CI case
|
|
12
|
-
// here: with no credentials the file loads and every provider test skips
|
|
13
|
-
// cleanly, so `node --test dist/tests/*.test.js` stays green. (27.3)
|
|
14
|
-
//
|
|
15
|
-
// • Credentials PRESENT → the test runs against the provider: it constructs the
|
|
16
|
-
// driver from configuration and performs an upload/download/delete
|
|
17
|
-
// round-trip, asserting the downloaded bytes equal the uploaded bytes. (27.2)
|
|
18
|
-
//
|
|
19
|
-
// • Credentials PRESENT but the run cannot proceed for another reason (for
|
|
20
|
-
// example the optional provider SDK is not installed, or the client cannot
|
|
21
|
-
// be constructed) → the running test calls t.skip(reason), which reports it
|
|
22
|
-
// as skipped with a clear message rather than a failure: "passed with a
|
|
23
|
-
// clear skip message". (27.4)
|
|
24
|
-
//
|
|
25
|
-
// • Runner MISCONFIGURED → when a provider's credentials are only *partially*
|
|
26
|
-
// supplied (some required environment variables set, others missing) the
|
|
27
|
-
// configuration is inconsistent. That is a misconfigured runner, so the
|
|
28
|
-
// test FAILS and fails the build rather than silently skipping. (27.5)
|
|
29
|
-
//
|
|
30
|
-
// SDK isolation: this file imports no provider SDK and no driver module at import
|
|
31
|
-
// time. The driver factories (which themselves resolve any optional SDK lazily)
|
|
32
|
-
// are pulled in with a dynamic import() only when credentials are present, so the
|
|
33
|
-
// module always loads even though none of the @aws-sdk / minio peers are
|
|
34
|
-
// installed in this workspace.
|
|
35
|
-
//
|
|
36
|
-
// Requirements: 27.2, 27.3, 27.4, 27.5
|
|
37
|
-
import test from "node:test";
|
|
38
|
-
import assert from "node:assert/strict";
|
|
39
|
-
/**
|
|
40
|
-
* Read the first non-empty value among a list of candidate environment variable
|
|
41
|
-
* names. Returns `undefined` when none are set to a non-empty string.
|
|
42
|
-
*/
|
|
43
|
-
function readEnv(names) {
|
|
44
|
-
for (const name of names) {
|
|
45
|
-
const value = process.env[name];
|
|
46
|
-
if (typeof value === "string" && value.trim() !== "") {
|
|
47
|
-
return value;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
return undefined;
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Descriptors for every S3-compatible provider under test. Each declares the
|
|
54
|
-
* required credential fields (with their accepted environment-variable names),
|
|
55
|
-
* any optional fields, and an async `connect(values)` that builds a driver from
|
|
56
|
-
* the resolved configuration by lazily importing its submodule.
|
|
57
|
-
*/
|
|
58
|
-
const PROVIDERS = [
|
|
59
|
-
{
|
|
60
|
-
label: "S3",
|
|
61
|
-
required: {
|
|
62
|
-
bucket: ["STREETJS_S3_BUCKET"],
|
|
63
|
-
region: ["STREETJS_S3_REGION", "AWS_REGION", "AWS_DEFAULT_REGION"],
|
|
64
|
-
accessKeyId: ["STREETJS_S3_ACCESS_KEY_ID", "AWS_ACCESS_KEY_ID"],
|
|
65
|
-
secretAccessKey: ["STREETJS_S3_SECRET_ACCESS_KEY", "AWS_SECRET_ACCESS_KEY"],
|
|
66
|
-
},
|
|
67
|
-
optional: {
|
|
68
|
-
endpoint: ["STREETJS_S3_ENDPOINT"],
|
|
69
|
-
forcePathStyle: ["STREETJS_S3_FORCE_PATH_STYLE"],
|
|
70
|
-
},
|
|
71
|
-
async connect(v) {
|
|
72
|
-
const { createS3StorageDriverFromConfig } = await import("../drivers/s3.js");
|
|
73
|
-
return createS3StorageDriverFromConfig({
|
|
74
|
-
bucket: v.bucket,
|
|
75
|
-
region: v.region,
|
|
76
|
-
endpoint: v.endpoint,
|
|
77
|
-
// Path-style addressing is required by S3-compatible gateways such as
|
|
78
|
-
// MinIO (which do not support virtual-hosted-style bucket subdomains).
|
|
79
|
-
// Opt-in via STREETJS_S3_FORCE_PATH_STYLE; unset preserves SDK defaults
|
|
80
|
-
// (virtual-hosted-style) for real AWS S3.
|
|
81
|
-
forcePathStyle: v.forcePathStyle !== undefined ? v.forcePathStyle !== "false" : undefined,
|
|
82
|
-
credentials: {
|
|
83
|
-
accessKeyId: v.accessKeyId,
|
|
84
|
-
secretAccessKey: v.secretAccessKey,
|
|
85
|
-
},
|
|
86
|
-
});
|
|
87
|
-
},
|
|
88
|
-
},
|
|
89
|
-
{
|
|
90
|
-
label: "R2",
|
|
91
|
-
required: {
|
|
92
|
-
accountId: ["STREETJS_R2_ACCOUNT_ID", "R2_ACCOUNT_ID"],
|
|
93
|
-
bucket: ["STREETJS_R2_BUCKET", "R2_BUCKET"],
|
|
94
|
-
accessKeyId: ["STREETJS_R2_ACCESS_KEY_ID", "R2_ACCESS_KEY_ID"],
|
|
95
|
-
secretAccessKey: ["STREETJS_R2_SECRET_ACCESS_KEY", "R2_SECRET_ACCESS_KEY"],
|
|
96
|
-
},
|
|
97
|
-
optional: {
|
|
98
|
-
endpoint: ["STREETJS_R2_ENDPOINT", "R2_ENDPOINT"],
|
|
99
|
-
},
|
|
100
|
-
async connect(v) {
|
|
101
|
-
const { connectCloudflareR2Driver } = await import("../drivers/r2.js");
|
|
102
|
-
return connectCloudflareR2Driver({
|
|
103
|
-
accountId: v.accountId,
|
|
104
|
-
bucket: v.bucket,
|
|
105
|
-
accessKeyId: v.accessKeyId,
|
|
106
|
-
secretAccessKey: v.secretAccessKey,
|
|
107
|
-
endpoint: v.endpoint,
|
|
108
|
-
});
|
|
109
|
-
},
|
|
110
|
-
},
|
|
111
|
-
{
|
|
112
|
-
label: "MinIO",
|
|
113
|
-
required: {
|
|
114
|
-
endPoint: ["STREETJS_MINIO_ENDPOINT", "MINIO_ENDPOINT"],
|
|
115
|
-
bucket: ["STREETJS_MINIO_BUCKET", "MINIO_BUCKET"],
|
|
116
|
-
accessKey: ["STREETJS_MINIO_ACCESS_KEY", "MINIO_ACCESS_KEY", "MINIO_ROOT_USER"],
|
|
117
|
-
secretKey: ["STREETJS_MINIO_SECRET_KEY", "MINIO_SECRET_KEY", "MINIO_ROOT_PASSWORD"],
|
|
118
|
-
},
|
|
119
|
-
optional: {
|
|
120
|
-
port: ["STREETJS_MINIO_PORT", "MINIO_PORT"],
|
|
121
|
-
useSSL: ["STREETJS_MINIO_USE_SSL", "MINIO_USE_SSL"],
|
|
122
|
-
region: ["STREETJS_MINIO_REGION", "MINIO_REGION"],
|
|
123
|
-
},
|
|
124
|
-
async connect(v) {
|
|
125
|
-
const { connectMinIODriver } = await import("../drivers/minio.js");
|
|
126
|
-
return connectMinIODriver({
|
|
127
|
-
endPoint: v.endPoint,
|
|
128
|
-
bucket: v.bucket,
|
|
129
|
-
accessKey: v.accessKey,
|
|
130
|
-
secretKey: v.secretKey,
|
|
131
|
-
port: v.port !== undefined ? Number(v.port) : undefined,
|
|
132
|
-
useSSL: v.useSSL !== undefined ? v.useSSL !== "false" : undefined,
|
|
133
|
-
region: v.region,
|
|
134
|
-
});
|
|
135
|
-
},
|
|
136
|
-
},
|
|
137
|
-
{
|
|
138
|
-
label: "Backblaze",
|
|
139
|
-
required: {
|
|
140
|
-
endpoint: ["STREETJS_B2_ENDPOINT", "B2_ENDPOINT"],
|
|
141
|
-
bucket: ["STREETJS_B2_BUCKET", "B2_BUCKET"],
|
|
142
|
-
accessKeyId: ["STREETJS_B2_KEY_ID", "B2_KEY_ID", "B2_APPLICATION_KEY_ID"],
|
|
143
|
-
secretAccessKey: ["STREETJS_B2_APPLICATION_KEY", "B2_APPLICATION_KEY"],
|
|
144
|
-
},
|
|
145
|
-
optional: {
|
|
146
|
-
region: ["STREETJS_B2_REGION", "B2_REGION"],
|
|
147
|
-
},
|
|
148
|
-
async connect(v) {
|
|
149
|
-
const { createBackblazeB2Driver } = await import("../drivers/backblaze.js");
|
|
150
|
-
return createBackblazeB2Driver({
|
|
151
|
-
endpoint: v.endpoint,
|
|
152
|
-
bucket: v.bucket,
|
|
153
|
-
region: v.region,
|
|
154
|
-
credentials: {
|
|
155
|
-
accessKeyId: v.accessKeyId,
|
|
156
|
-
secretAccessKey: v.secretAccessKey,
|
|
157
|
-
},
|
|
158
|
-
});
|
|
159
|
-
},
|
|
160
|
-
},
|
|
161
|
-
];
|
|
162
|
-
/**
|
|
163
|
-
* Resolve a provider's configuration from the environment and classify the
|
|
164
|
-
* result as one of:
|
|
165
|
-
* - "absent" → none of the required fields are set
|
|
166
|
-
* - "present" → every required field is set
|
|
167
|
-
* - "misconfigured" → some (but not all) required fields are set
|
|
168
|
-
*
|
|
169
|
-
* Returns the classification, the resolved values (including optional fields),
|
|
170
|
-
* and the human-readable list of accepted env-var names used in skip/fail
|
|
171
|
-
* messages.
|
|
172
|
-
*/
|
|
173
|
-
function classifyProvider(provider) {
|
|
174
|
-
const values = {};
|
|
175
|
-
const requiredNames = [];
|
|
176
|
-
let resolvedCount = 0;
|
|
177
|
-
const total = Object.keys(provider.required).length;
|
|
178
|
-
for (const [field, names] of Object.entries(provider.required)) {
|
|
179
|
-
requiredNames.push(names[0]);
|
|
180
|
-
const value = readEnv(names);
|
|
181
|
-
if (value !== undefined) {
|
|
182
|
-
values[field] = value;
|
|
183
|
-
resolvedCount += 1;
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
for (const [field, names] of Object.entries(provider.optional ?? {})) {
|
|
187
|
-
const value = readEnv(names);
|
|
188
|
-
if (value !== undefined) {
|
|
189
|
-
values[field] = value;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
let classification;
|
|
193
|
-
if (resolvedCount === 0) {
|
|
194
|
-
classification = "absent";
|
|
195
|
-
}
|
|
196
|
-
else if (resolvedCount === total) {
|
|
197
|
-
classification = "present";
|
|
198
|
-
}
|
|
199
|
-
else {
|
|
200
|
-
classification = "misconfigured";
|
|
201
|
-
}
|
|
202
|
-
return { classification, values, requiredNames, resolvedCount, total };
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* Upload/download/delete round-trip asserting byte fidelity. Cleans up the test
|
|
206
|
-
* object on a best-effort basis so live buckets are not left with test data.
|
|
207
|
-
*/
|
|
208
|
-
async function runRoundTrip(driver) {
|
|
209
|
-
const key = `streetjs-integration/${Date.now()}-${Math.random().toString(16).slice(2)}.bin`;
|
|
210
|
-
const content = new TextEncoder().encode(`streetjs storage integration round-trip ${new Date().toISOString()}`);
|
|
211
|
-
try {
|
|
212
|
-
await driver.put(key, content, { contentType: "application/octet-stream" });
|
|
213
|
-
const exists = await driver.exists(key);
|
|
214
|
-
assert.equal(exists, true, "object must exist after put");
|
|
215
|
-
const got = await driver.get(key);
|
|
216
|
-
assert.equal(got.found, true, "object must be found after put");
|
|
217
|
-
assert.deepEqual(got.bytes, content, "downloaded bytes must equal uploaded bytes");
|
|
218
|
-
}
|
|
219
|
-
finally {
|
|
220
|
-
try {
|
|
221
|
-
await driver.delete(key);
|
|
222
|
-
}
|
|
223
|
-
catch {
|
|
224
|
-
// Best-effort cleanup; a delete failure must not mask the assertion result.
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
// ── Register one integration test per provider, honestly classified ────────────
|
|
229
|
-
for (const provider of PROVIDERS) {
|
|
230
|
-
const { classification, values, requiredNames } = classifyProvider(provider);
|
|
231
|
-
const testName = `[integration] ${provider.label}: upload/download preserves bytes`;
|
|
232
|
-
if (classification === "absent") {
|
|
233
|
-
// Requirement 27.3 — no credentials: skip with a clear message. Declared via
|
|
234
|
-
// the { skip } option so node:test marks it SKIPPED (never passed) and no
|
|
235
|
-
// provider code runs.
|
|
236
|
-
test(testName, {
|
|
237
|
-
skip: `No ${provider.label} credentials present in the environment ` +
|
|
238
|
-
`(set ${requiredNames.join(", ")} to run this integration test).`,
|
|
239
|
-
}, () => { });
|
|
240
|
-
continue;
|
|
241
|
-
}
|
|
242
|
-
if (classification === "misconfigured") {
|
|
243
|
-
// Requirement 27.5 — partial credentials are a misconfigured runner: FAIL so
|
|
244
|
-
// the build fails rather than silently skipping an inconsistent setup.
|
|
245
|
-
test(testName, () => {
|
|
246
|
-
assert.fail(`${provider.label} integration is misconfigured: some but not all required ` +
|
|
247
|
-
`credentials are set. Provide all of [${requiredNames.join(", ")}] to run, ` +
|
|
248
|
-
`or none to skip.`);
|
|
249
|
-
});
|
|
250
|
-
continue;
|
|
251
|
-
}
|
|
252
|
-
// Requirement 27.2 — credentials present: run against the provider.
|
|
253
|
-
test(testName, async (t) => {
|
|
254
|
-
let driver;
|
|
255
|
-
try {
|
|
256
|
-
driver = await provider.connect(values);
|
|
257
|
-
}
|
|
258
|
-
catch (error) {
|
|
259
|
-
// Requirement 27.4 — present but cannot run for another reason (e.g. the
|
|
260
|
-
// optional SDK is not installed, or the client cannot be constructed):
|
|
261
|
-
// report passed-with-skip via t.skip rather than failing the build.
|
|
262
|
-
const reason = error instanceof Error ? error.message : String(error);
|
|
263
|
-
t.skip(`${provider.label} credentials are present but the driver could not be ` +
|
|
264
|
-
`constructed, so the integration test cannot run: ${reason}`);
|
|
265
|
-
return;
|
|
266
|
-
}
|
|
267
|
-
await runRoundTrip(driver);
|
|
268
|
-
});
|
|
269
|
-
}
|
|
270
|
-
//# sourceMappingURL=s3-integration.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"s3-integration.test.js","sourceRoot":"","sources":["../../src/tests/s3-integration.test.ts"],"names":[],"mappings":"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"}
|
package/dist/tests/s3.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"s3.test.d.ts","sourceRoot":"","sources":["../../src/tests/s3.test.ts"],"names":[],"mappings":""}
|
package/dist/tests/s3.test.js
DELETED
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
// Unit tests for the Amazon S3 provider submodule (task 28.2), exercised through
|
|
2
|
-
// the built `dist/drivers/s3.js` entry that backs `@streetjs/storage/s3`.
|
|
3
|
-
//
|
|
4
|
-
// The submodule contributes only client wiring on top of the shared S3-style
|
|
5
|
-
// base; its own responsibilities are:
|
|
6
|
-
// - createS3StorageDriver wraps an injected S3ClientLike as a name:"s3" driver
|
|
7
|
-
// and delegates the whole StorageDriver contract to the base
|
|
8
|
-
// - createS3StorageDriver rejects a missing/invalid client with a descriptive
|
|
9
|
-
// StorageConfigError (no SDK is ever loaded on the injected path)
|
|
10
|
-
// - createS3StorageDriverFromConfig wraps a supplied client without loading any
|
|
11
|
-
// SDK, and throws a descriptive StorageConfigError when it must build a
|
|
12
|
-
// client but the optional @aws-sdk/client-s3 peer dependency is absent
|
|
13
|
-
// - the shared driver contract-conformance suite passes against the wrapper
|
|
14
|
-
//
|
|
15
|
-
// A fake in-memory S3ClientLike stands in for the AWS SDK so the driver is
|
|
16
|
-
// exercised with no external service and no SDK dependency.
|
|
17
|
-
//
|
|
18
|
-
// Requirements: 2.1, 2.3, 3.3
|
|
19
|
-
import test from "node:test";
|
|
20
|
-
import assert from "node:assert/strict";
|
|
21
|
-
import { createS3StorageDriver, createS3StorageDriverFromConfig, } from "../drivers/s3.js";
|
|
22
|
-
import { StorageConfigError } from "../errors.js";
|
|
23
|
-
import { registerStorageDriverContractTests } from "./contract.js";
|
|
24
|
-
const FIXED_NOW = 1_700_000_000_000;
|
|
25
|
-
const fixedClock = () => FIXED_NOW;
|
|
26
|
-
function bytes(str) {
|
|
27
|
-
return new TextEncoder().encode(str);
|
|
28
|
-
}
|
|
29
|
-
/** A minimal in-memory S3ClientLike (with native multipart) standing in for the SDK. */
|
|
30
|
-
function makeFakeClient() {
|
|
31
|
-
const objects = new Map(); // key -> { body, contentType, metadata }
|
|
32
|
-
const uploads = new Map(); // uploadId -> { key, contentType, metadata, parts: Map }
|
|
33
|
-
let seed = 0;
|
|
34
|
-
return {
|
|
35
|
-
async putObject({ key, body, contentType, metadata }) {
|
|
36
|
-
objects.set(key, {
|
|
37
|
-
body: body.slice(),
|
|
38
|
-
contentType,
|
|
39
|
-
metadata: metadata ? { ...metadata } : undefined,
|
|
40
|
-
});
|
|
41
|
-
return { etag: `"${key}-etag"` };
|
|
42
|
-
},
|
|
43
|
-
async getObject({ key }) {
|
|
44
|
-
const obj = objects.get(key);
|
|
45
|
-
if (obj === undefined)
|
|
46
|
-
return null;
|
|
47
|
-
return {
|
|
48
|
-
body: obj.body.slice(),
|
|
49
|
-
contentType: obj.contentType,
|
|
50
|
-
etag: `"${key}-etag"`,
|
|
51
|
-
size: obj.body.byteLength,
|
|
52
|
-
lastModified: FIXED_NOW,
|
|
53
|
-
metadata: obj.metadata,
|
|
54
|
-
};
|
|
55
|
-
},
|
|
56
|
-
async headObject({ key }) {
|
|
57
|
-
const obj = objects.get(key);
|
|
58
|
-
if (obj === undefined)
|
|
59
|
-
return null;
|
|
60
|
-
return {
|
|
61
|
-
contentType: obj.contentType,
|
|
62
|
-
etag: `"${key}-etag"`,
|
|
63
|
-
size: obj.body.byteLength,
|
|
64
|
-
lastModified: FIXED_NOW,
|
|
65
|
-
metadata: obj.metadata,
|
|
66
|
-
};
|
|
67
|
-
},
|
|
68
|
-
async deleteObject({ key }) {
|
|
69
|
-
objects.delete(key);
|
|
70
|
-
},
|
|
71
|
-
async listObjects({ prefix }) {
|
|
72
|
-
return [...objects.entries()]
|
|
73
|
-
.filter(([key]) => key.startsWith(prefix))
|
|
74
|
-
.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
|
|
75
|
-
.map(([key, obj]) => ({ key, size: obj.body.byteLength, updatedAt: FIXED_NOW }));
|
|
76
|
-
},
|
|
77
|
-
async createMultipartUpload({ key, contentType, metadata }) {
|
|
78
|
-
const uploadId = `upload-${(seed += 1)}`;
|
|
79
|
-
uploads.set(uploadId, { key, contentType, metadata, parts: new Map() });
|
|
80
|
-
return { uploadId };
|
|
81
|
-
},
|
|
82
|
-
async uploadPart({ uploadId, partNumber, body }) {
|
|
83
|
-
uploads.get(uploadId).parts.set(partNumber, body.slice());
|
|
84
|
-
return { etag: `"${uploadId}-${partNumber}"` };
|
|
85
|
-
},
|
|
86
|
-
async completeMultipartUpload({ uploadId, parts }) {
|
|
87
|
-
const session = uploads.get(uploadId);
|
|
88
|
-
const ordered = [...parts].sort((a, b) => a.partNumber - b.partNumber);
|
|
89
|
-
const buffers = ordered.map((p) => Buffer.from(session.parts.get(p.partNumber)));
|
|
90
|
-
objects.set(session.key, {
|
|
91
|
-
body: new Uint8Array(Buffer.concat(buffers)),
|
|
92
|
-
contentType: session.contentType,
|
|
93
|
-
metadata: session.metadata,
|
|
94
|
-
});
|
|
95
|
-
uploads.delete(uploadId);
|
|
96
|
-
return { etag: `"${session.key}-etag"` };
|
|
97
|
-
},
|
|
98
|
-
async abortMultipartUpload({ uploadId }) {
|
|
99
|
-
uploads.delete(uploadId);
|
|
100
|
-
},
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
// ── createS3StorageDriver: injected client (no SDK) ─────────────────────────────
|
|
104
|
-
test("createS3StorageDriver wraps an injected client as a name:s3 driver", () => {
|
|
105
|
-
const driver = createS3StorageDriver(makeFakeClient(), { clock: fixedClock });
|
|
106
|
-
assert.equal(driver.name, "s3");
|
|
107
|
-
});
|
|
108
|
-
test("createS3StorageDriver round-trips bytes and typed metadata via the base", async () => {
|
|
109
|
-
const driver = createS3StorageDriver(makeFakeClient(), { clock: fixedClock });
|
|
110
|
-
const content = bytes("amazon s3 content");
|
|
111
|
-
const meta = await driver.put("docs/report.txt", content, {
|
|
112
|
-
contentType: "text/plain",
|
|
113
|
-
owner: "user-9",
|
|
114
|
-
tenant: "tenant-z",
|
|
115
|
-
accessLevel: "public",
|
|
116
|
-
custom: { label: "q3" },
|
|
117
|
-
});
|
|
118
|
-
assert.equal(meta.key, "docs/report.txt");
|
|
119
|
-
assert.equal(meta.size, content.byteLength);
|
|
120
|
-
assert.match(meta.checksum, /^[0-9a-f]{64}$/);
|
|
121
|
-
const result = await driver.get("docs/report.txt");
|
|
122
|
-
assert.equal(result.found, true);
|
|
123
|
-
assert.deepEqual(result.bytes, content);
|
|
124
|
-
assert.equal(result.metadata.contentType, "text/plain");
|
|
125
|
-
assert.equal(result.metadata.owner, "user-9");
|
|
126
|
-
assert.equal(result.metadata.tenant, "tenant-z");
|
|
127
|
-
assert.equal(result.metadata.accessLevel, "public");
|
|
128
|
-
assert.deepEqual(result.metadata.custom, { label: "q3" });
|
|
129
|
-
});
|
|
130
|
-
test("createS3StorageDriver reports a missing key as found:false (not an error)", async () => {
|
|
131
|
-
const driver = createS3StorageDriver(makeFakeClient(), { clock: fixedClock });
|
|
132
|
-
const result = await driver.get("missing");
|
|
133
|
-
assert.equal(result.found, false);
|
|
134
|
-
});
|
|
135
|
-
test("createS3StorageDriver wires native multipart from the injected client", async () => {
|
|
136
|
-
const driver = createS3StorageDriver(makeFakeClient(), { clock: fixedClock });
|
|
137
|
-
assert.notEqual(driver.multipart, undefined);
|
|
138
|
-
assert.ok(driver.multipart);
|
|
139
|
-
const uploadId = await driver.multipart.create("big/file.bin", { contentType: "text/plain" });
|
|
140
|
-
const p1 = await driver.multipart.uploadPart(uploadId, 1, bytes("part-one-"));
|
|
141
|
-
const p2 = await driver.multipart.uploadPart(uploadId, 2, bytes("part-two"));
|
|
142
|
-
const meta = await driver.multipart.complete(uploadId, [p1, p2]);
|
|
143
|
-
assert.equal(meta.key, "big/file.bin");
|
|
144
|
-
const result = await driver.get("big/file.bin");
|
|
145
|
-
assert.ok(result.found);
|
|
146
|
-
assert.deepEqual(result.bytes, bytes("part-one-part-two"));
|
|
147
|
-
});
|
|
148
|
-
test("createS3StorageDriver delegates injected native capabilities", () => {
|
|
149
|
-
const versioning = {
|
|
150
|
-
snapshot: async () => null,
|
|
151
|
-
list: async () => [],
|
|
152
|
-
restore: async () => ({
|
|
153
|
-
key: "",
|
|
154
|
-
size: 0,
|
|
155
|
-
contentType: "application/octet-stream",
|
|
156
|
-
etag: "",
|
|
157
|
-
checksum: "",
|
|
158
|
-
accessLevel: "private",
|
|
159
|
-
createdAt: 0,
|
|
160
|
-
updatedAt: 0,
|
|
161
|
-
custom: {},
|
|
162
|
-
}),
|
|
163
|
-
deleteVersion: async () => { },
|
|
164
|
-
};
|
|
165
|
-
const driver = createS3StorageDriver(makeFakeClient(), { capabilities: { versioning } });
|
|
166
|
-
assert.equal(driver.versioning, versioning);
|
|
167
|
-
});
|
|
168
|
-
// ── createS3StorageDriver: invalid client ───────────────────────────────────────
|
|
169
|
-
test("createS3StorageDriver throws StorageConfigError when no client is injected", () => {
|
|
170
|
-
assert.throws(() => createS3StorageDriver(undefined), (error) => {
|
|
171
|
-
assert.ok(error instanceof StorageConfigError);
|
|
172
|
-
assert.equal(error.provider, "s3");
|
|
173
|
-
return true;
|
|
174
|
-
});
|
|
175
|
-
});
|
|
176
|
-
test("createS3StorageDriver throws StorageConfigError for a non-conforming client", () => {
|
|
177
|
-
assert.throws(() => createS3StorageDriver({ putObject() { } }), (error) => error instanceof StorageConfigError && error.provider === "s3");
|
|
178
|
-
});
|
|
179
|
-
// ── createS3StorageDriverFromConfig ─────────────────────────────────────────────
|
|
180
|
-
test("createS3StorageDriverFromConfig wraps a supplied client without loading any SDK", async () => {
|
|
181
|
-
const driver = await createS3StorageDriverFromConfig({
|
|
182
|
-
bucket: "my-bucket",
|
|
183
|
-
client: makeFakeClient(),
|
|
184
|
-
clock: fixedClock,
|
|
185
|
-
});
|
|
186
|
-
assert.equal(driver.name, "s3");
|
|
187
|
-
const meta = await driver.put("k", bytes("v"), {});
|
|
188
|
-
assert.equal(meta.key, "k");
|
|
189
|
-
const got = await driver.get("k");
|
|
190
|
-
assert.ok(got.found);
|
|
191
|
-
assert.deepEqual(got.bytes, bytes("v"));
|
|
192
|
-
});
|
|
193
|
-
test("createS3StorageDriverFromConfig throws a descriptive StorageConfigError when the AWS SDK is absent", async () => {
|
|
194
|
-
await assert.rejects(() => createS3StorageDriverFromConfig({ bucket: "my-bucket", region: "us-east-1" }), (error) => {
|
|
195
|
-
assert.ok(error instanceof StorageConfigError, "must be a StorageConfigError");
|
|
196
|
-
assert.equal(error.provider, "s3");
|
|
197
|
-
assert.match(error.message, /@aws-sdk\/client-s3/);
|
|
198
|
-
return true;
|
|
199
|
-
});
|
|
200
|
-
});
|
|
201
|
-
// ── shared contract-conformance suite ───────────────────────────────────────────
|
|
202
|
-
registerStorageDriverContractTests("s3", () => createS3StorageDriver(makeFakeClient(), { clock: fixedClock }), test);
|
|
203
|
-
//# sourceMappingURL=s3.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"s3.test.js","sourceRoot":"","sources":["../../src/tests/s3.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold.test.d.ts","sourceRoot":"","sources":["../../src/tests/scaffold.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
// Placeholder scaffold test for @streetjs/storage.
|
|
2
|
-
//
|
|
3
|
-
// Verifies that the package builds and its compiled entry point can be imported
|
|
4
|
-
// and exposes the expected placeholder surface. Uses the Node.js built-in test
|
|
5
|
-
// runner (node:test) and is executed via `node --test dist/tests/*.test.js`.
|
|
6
|
-
import test from "node:test";
|
|
7
|
-
import assert from "node:assert/strict";
|
|
8
|
-
import { STORAGE_FRAMEWORK_VERSION, STORAGE_PACKAGE_NAME } from "../index.js";
|
|
9
|
-
test("built entry point exposes placeholder exports", () => {
|
|
10
|
-
assert.equal(STORAGE_PACKAGE_NAME, "@streetjs/storage");
|
|
11
|
-
assert.equal(STORAGE_FRAMEWORK_VERSION, "1.0.0");
|
|
12
|
-
});
|
|
13
|
-
//# sourceMappingURL=scaffold.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold.test.js","sourceRoot":"","sources":["../../src/tests/scaffold.test.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,EAAE;AACF,gFAAgF;AAChF,+EAA+E;AAC/E,6EAA6E;AAE7E,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAExC,OAAO,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAE9E,IAAI,CAAC,+CAA+C,EAAE,GAAG,EAAE;IACzD,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,mBAAmB,CAAC,CAAC;IACxD,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,OAAO,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"search.test.d.ts","sourceRoot":"","sources":["../../src/tests/search.test.ts"],"names":[],"mappings":""}
|