clefbase 1.3.4 → 1.3.5
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/cli.js +1 -1
- package/dist/react/StorageImage.d.ts +7 -58
- package/dist/react/StorageImage.d.ts.map +1 -1
- package/dist/react/StorageImage.js +12 -69
- package/dist/react/StorageImage.js.map +1 -1
- package/dist/storage/index.d.ts +21 -3
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +43 -13
- package/dist/storage/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -34405,7 +34405,7 @@ async function runSitesList(cwd = process.cwd()) {
|
|
|
34405
34405
|
}
|
|
34406
34406
|
|
|
34407
34407
|
// package.json
|
|
34408
|
-
var version = "1.3.
|
|
34408
|
+
var version = "1.3.5";
|
|
34409
34409
|
|
|
34410
34410
|
// src/cli/index.ts
|
|
34411
34411
|
var program2 = new Command();
|
|
@@ -2,75 +2,24 @@ import React, { type ImgHTMLAttributes } from "react";
|
|
|
2
2
|
import type { ClefbaseStorage } from "../storage";
|
|
3
3
|
export type StorageImageStatus = "loading" | "loaded" | "error";
|
|
4
4
|
export interface StorageImageProps extends Omit<ImgHTMLAttributes<HTMLImageElement>, "src"> {
|
|
5
|
-
/**
|
|
6
|
-
* The ClefbaseStorage instance returned by `getStorage(app)`.
|
|
7
|
-
*/
|
|
8
5
|
storage: ClefbaseStorage;
|
|
9
|
-
/**
|
|
10
|
-
* Path inside the default bucket, e.g. `"avatars/user-123.jpg"`.
|
|
11
|
-
* Mutually exclusive with `bucket` + `path`.
|
|
12
|
-
*/
|
|
6
|
+
/** Path inside the default bucket, e.g. "avatars/user-123.jpg". */
|
|
13
7
|
src?: string;
|
|
14
|
-
/**
|
|
15
|
-
* Named bucket to read from. Pair with `path`.
|
|
16
|
-
*/
|
|
8
|
+
/** Named bucket to read from. Pair with `path`. */
|
|
17
9
|
bucket?: string;
|
|
18
|
-
/**
|
|
19
|
-
* File path inside `bucket`.
|
|
20
|
-
*/
|
|
10
|
+
/** File path inside `bucket`. */
|
|
21
11
|
path?: string;
|
|
22
|
-
/**
|
|
23
|
-
* Shown while the download URL is being resolved.
|
|
24
|
-
* Accepts a URL string or any React node.
|
|
25
|
-
*/
|
|
12
|
+
/** Shown while the download URL is being resolved. */
|
|
26
13
|
placeholder?: React.ReactNode | string;
|
|
27
|
-
/**
|
|
28
|
-
* Shown when the URL cannot be resolved or the image fails to load.
|
|
29
|
-
* Accepts a URL string or any React node.
|
|
30
|
-
*/
|
|
14
|
+
/** Shown when the URL cannot be resolved or the image fails to load. */
|
|
31
15
|
fallback?: React.ReactNode | string;
|
|
32
|
-
/**
|
|
33
|
-
* Called with the resolved download URL once ready.
|
|
34
|
-
*/
|
|
35
16
|
onResolve?: (url: string) => void;
|
|
36
|
-
/**
|
|
37
|
-
* Called if URL resolution or image loading fails.
|
|
38
|
-
*/
|
|
39
17
|
onError?: (err: unknown) => void;
|
|
40
|
-
/**
|
|
41
|
-
* Called whenever the loading status changes.
|
|
42
|
-
*/
|
|
43
18
|
onStatusChange?: (status: StorageImageStatus) => void;
|
|
44
19
|
}
|
|
45
20
|
/**
|
|
46
|
-
*
|
|
47
|
-
* authenticated download URLs
|
|
48
|
-
*
|
|
49
|
-
* @example — default bucket
|
|
50
|
-
* ```tsx
|
|
51
|
-
* const storage = getStorage(app);
|
|
52
|
-
*
|
|
53
|
-
* <StorageImage
|
|
54
|
-
* storage={storage}
|
|
55
|
-
* src="avatars/user-123.jpg"
|
|
56
|
-
* alt="User avatar"
|
|
57
|
-
* width={64}
|
|
58
|
-
* height={64}
|
|
59
|
-
* style={{ borderRadius: "50%" }}
|
|
60
|
-
* />
|
|
61
|
-
* ```
|
|
62
|
-
*
|
|
63
|
-
* @example — named bucket
|
|
64
|
-
* ```tsx
|
|
65
|
-
* <StorageImage
|
|
66
|
-
* storage={storage}
|
|
67
|
-
* bucket="media"
|
|
68
|
-
* path="products/shoe.webp"
|
|
69
|
-
* alt="Product photo"
|
|
70
|
-
* placeholder={<Spinner />}
|
|
71
|
-
* fallback={<img src="/no-image.svg" alt="Not found" />}
|
|
72
|
-
* />
|
|
73
|
-
* ```
|
|
21
|
+
* Drop-in <img> replacement that resolves Clefbase storage paths to
|
|
22
|
+
* authenticated download URLs via /storage/resolve.
|
|
74
23
|
*/
|
|
75
24
|
export declare const StorageImage: React.ForwardRefExoticComponent<StorageImageProps & React.RefAttributes<HTMLImageElement>>;
|
|
76
25
|
export default StorageImage;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StorageImage.d.ts","sourceRoot":"","sources":["../../src/react/StorageImage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAKZ,KAAK,iBAAiB,EACvB,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAIlD,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEhE,MAAM,WAAW,iBACf,SAAQ,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,EAAE,KAAK,CAAC;IACxD
|
|
1
|
+
{"version":3,"file":"StorageImage.d.ts","sourceRoot":"","sources":["../../src/react/StorageImage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAKZ,KAAK,iBAAiB,EACvB,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAIlD,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEhE,MAAM,WAAW,iBACf,SAAQ,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,EAAE,KAAK,CAAC;IACxD,OAAO,EAAE,eAAe,CAAC;IACzB,mEAAmE;IACnE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC;IACvC,wEAAwE;IACxE,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC;IACpC,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IACjC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;CACvD;AAID;;;GAGG;AACH,eAAO,MAAM,YAAY,4FAoIxB,CAAC;AAGF,eAAe,YAAY,CAAC"}
|
|
@@ -5,70 +5,20 @@ const jsx_runtime_1 = require("react/jsx-runtime");
|
|
|
5
5
|
const react_1 = require("react");
|
|
6
6
|
// ─── StorageImage ─────────────────────────────────────────────────────────────
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
9
|
-
* authenticated download URLs
|
|
10
|
-
*
|
|
11
|
-
* @example — default bucket
|
|
12
|
-
* ```tsx
|
|
13
|
-
* const storage = getStorage(app);
|
|
14
|
-
*
|
|
15
|
-
* <StorageImage
|
|
16
|
-
* storage={storage}
|
|
17
|
-
* src="avatars/user-123.jpg"
|
|
18
|
-
* alt="User avatar"
|
|
19
|
-
* width={64}
|
|
20
|
-
* height={64}
|
|
21
|
-
* style={{ borderRadius: "50%" }}
|
|
22
|
-
* />
|
|
23
|
-
* ```
|
|
24
|
-
*
|
|
25
|
-
* @example — named bucket
|
|
26
|
-
* ```tsx
|
|
27
|
-
* <StorageImage
|
|
28
|
-
* storage={storage}
|
|
29
|
-
* bucket="media"
|
|
30
|
-
* path="products/shoe.webp"
|
|
31
|
-
* alt="Product photo"
|
|
32
|
-
* placeholder={<Spinner />}
|
|
33
|
-
* fallback={<img src="/no-image.svg" alt="Not found" />}
|
|
34
|
-
* />
|
|
35
|
-
* ```
|
|
8
|
+
* Drop-in <img> replacement that resolves Clefbase storage paths to
|
|
9
|
+
* authenticated download URLs via /storage/resolve.
|
|
36
10
|
*/
|
|
37
11
|
exports.StorageImage = (0, react_1.forwardRef)(function StorageImage({ storage, src, bucket, path, placeholder, fallback, onResolve, onError, onStatusChange, alt = "", ...imgProps }, ref) {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
// connection pool (typically 6 connections) when many cards mount at once.
|
|
41
|
-
const getDirectUrl = () => {
|
|
42
|
-
try {
|
|
43
|
-
if (bucket && path)
|
|
44
|
-
return storage._directUrl(bucket, path);
|
|
45
|
-
if (src)
|
|
46
|
-
return storage._directUrl(storage["_defaultBucket"] ?? "default", src);
|
|
47
|
-
return null;
|
|
48
|
-
}
|
|
49
|
-
catch {
|
|
50
|
-
return null;
|
|
51
|
-
}
|
|
52
|
-
};
|
|
53
|
-
const initialUrl = getDirectUrl();
|
|
54
|
-
const [resolvedUrl, setResolvedUrl] = (0, react_1.useState)(initialUrl);
|
|
55
|
-
const [status, setStatus] = (0, react_1.useState)(initialUrl ? "loaded" : "loading");
|
|
56
|
-
// Keep a ref to the latest callbacks so the effect closure stays stable.
|
|
12
|
+
const [resolvedUrl, setResolvedUrl] = (0, react_1.useState)(null);
|
|
13
|
+
const [status, setStatus] = (0, react_1.useState)("loading");
|
|
57
14
|
const onResolveRef = (0, react_1.useRef)(onResolve);
|
|
58
15
|
const onErrorRef = (0, react_1.useRef)(onError);
|
|
59
16
|
const onStatusRef = (0, react_1.useRef)(onStatusChange);
|
|
60
17
|
onResolveRef.current = onResolve;
|
|
61
18
|
onErrorRef.current = onError;
|
|
62
19
|
onStatusRef.current = onStatusChange;
|
|
63
|
-
// Determine the key that uniquely identifies the requested file.
|
|
64
20
|
const fileKey = bucket && path ? `${bucket}::${path}` : src ?? null;
|
|
65
21
|
(0, react_1.useEffect)(() => {
|
|
66
|
-
// If we already resolved synchronously, notify callers and skip the
|
|
67
|
-
// async effect entirely — no extra network round-trip needed.
|
|
68
|
-
if (initialUrl) {
|
|
69
|
-
onResolveRef.current?.(initialUrl);
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
22
|
if (!fileKey)
|
|
73
23
|
return;
|
|
74
24
|
let cancelled = false;
|
|
@@ -78,9 +28,7 @@ exports.StorageImage = (0, react_1.forwardRef)(function StorageImage({ storage,
|
|
|
78
28
|
try {
|
|
79
29
|
let url;
|
|
80
30
|
if (bucket && path) {
|
|
81
|
-
url = storage.bucket(bucket).ref(path).getDownloadURL
|
|
82
|
-
? await storage.bucket(bucket).ref(path).getDownloadURL()
|
|
83
|
-
: storage._directUrl(bucket, path);
|
|
31
|
+
url = await storage.bucket(bucket).ref(path).getDownloadURL();
|
|
84
32
|
}
|
|
85
33
|
else if (src) {
|
|
86
34
|
url = await storage.ref(src).getDownloadURL();
|
|
@@ -90,9 +38,11 @@ exports.StorageImage = (0, react_1.forwardRef)(function StorageImage({ storage,
|
|
|
90
38
|
}
|
|
91
39
|
if (cancelled)
|
|
92
40
|
return;
|
|
41
|
+
if (!url)
|
|
42
|
+
throw new Error("StorageImage: empty download URL returned.");
|
|
93
43
|
setResolvedUrl(url);
|
|
94
44
|
onResolveRef.current?.(url);
|
|
95
|
-
// status
|
|
45
|
+
// status → "loaded" fires in the <img> onLoad handler
|
|
96
46
|
}
|
|
97
47
|
catch (err) {
|
|
98
48
|
if (cancelled)
|
|
@@ -103,9 +53,7 @@ exports.StorageImage = (0, react_1.forwardRef)(function StorageImage({ storage,
|
|
|
103
53
|
}
|
|
104
54
|
};
|
|
105
55
|
resolve();
|
|
106
|
-
return () => {
|
|
107
|
-
cancelled = true;
|
|
108
|
-
};
|
|
56
|
+
return () => { cancelled = true; };
|
|
109
57
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
110
58
|
}, [fileKey]);
|
|
111
59
|
// ── Render helpers ────────────────────────────────────────────────────────
|
|
@@ -118,18 +66,17 @@ exports.StorageImage = (0, react_1.forwardRef)(function StorageImage({ storage,
|
|
|
118
66
|
onStatusRef.current?.("error");
|
|
119
67
|
onErrorRef.current?.(e);
|
|
120
68
|
};
|
|
121
|
-
//
|
|
69
|
+
// Placeholder while resolving
|
|
122
70
|
if (status === "loading" && !resolvedUrl) {
|
|
123
71
|
if (placeholder === undefined) {
|
|
124
|
-
// Invisible img keeps layout stable
|
|
125
72
|
return ((0, jsx_runtime_1.jsx)("img", { ...imgProps, ref: ref, src: "", alt: alt, style: { ...imgProps.style, visibility: "hidden" } }));
|
|
126
73
|
}
|
|
127
74
|
if (typeof placeholder === "string") {
|
|
128
|
-
return (
|
|
75
|
+
return (0, jsx_runtime_1.jsx)("img", { ...imgProps, ref: ref, src: placeholder, alt: alt });
|
|
129
76
|
}
|
|
130
77
|
return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: placeholder });
|
|
131
78
|
}
|
|
132
|
-
//
|
|
79
|
+
// Fallback on error
|
|
133
80
|
if (status === "error" || !resolvedUrl) {
|
|
134
81
|
if (fallback === undefined) {
|
|
135
82
|
return ((0, jsx_runtime_1.jsx)("img", { ...imgProps, ref: ref, src: "", alt: alt, style: { ...imgProps.style, visibility: "hidden" } }));
|
|
@@ -139,10 +86,6 @@ exports.StorageImage = (0, react_1.forwardRef)(function StorageImage({ storage,
|
|
|
139
86
|
}
|
|
140
87
|
return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: fallback });
|
|
141
88
|
}
|
|
142
|
-
// Resolved — render the real image.
|
|
143
|
-
// `loading="lazy"` defers off-screen fetches so the browser never
|
|
144
|
-
// saturates its per-host connection pool (typically 6) when many
|
|
145
|
-
// cards render simultaneously. Callers may override with loading="eager".
|
|
146
89
|
return ((0, jsx_runtime_1.jsx)("img", { loading: "lazy", ...imgProps, ref: ref, src: resolvedUrl, alt: alt, onLoad: handleLoad, onError: handleImgError }));
|
|
147
90
|
});
|
|
148
91
|
exports.StorageImage.displayName = "StorageImage";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StorageImage.js","sourceRoot":"","sources":["../../src/react/StorageImage.tsx"],"names":[],"mappings":";;;;AAAA,iCAMe;
|
|
1
|
+
{"version":3,"file":"StorageImage.js","sourceRoot":"","sources":["../../src/react/StorageImage.tsx"],"names":[],"mappings":"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"}
|
package/dist/storage/index.d.ts
CHANGED
|
@@ -22,6 +22,10 @@ export declare class StorageReference {
|
|
|
22
22
|
contentType?: string;
|
|
23
23
|
metadata?: Record<string, unknown>;
|
|
24
24
|
}): Promise<StorageFile>;
|
|
25
|
+
/**
|
|
26
|
+
* Returns the authenticated download URL for this file.
|
|
27
|
+
* Always resolves via /storage/resolve to get the real bucketId + fileId.
|
|
28
|
+
*/
|
|
25
29
|
getDownloadURL(): Promise<string>;
|
|
26
30
|
getMetadata(): Promise<StorageFile>;
|
|
27
31
|
delete(): Promise<void>;
|
|
@@ -40,18 +44,32 @@ export declare class ClefbaseStorage {
|
|
|
40
44
|
private readonly http;
|
|
41
45
|
private readonly projectId;
|
|
42
46
|
private readonly auth;
|
|
43
|
-
/** @internal
|
|
47
|
+
/** @internal used by StorageImage — kept for compat but now returns empty string (no /path route exists) */
|
|
44
48
|
_defaultBucket: string;
|
|
45
49
|
/** In-memory cache: bucket name → UUID */
|
|
46
50
|
private _bucketIdCache;
|
|
51
|
+
/** In-memory cache: "bucket::filePath" → download URL */
|
|
52
|
+
private _urlCache;
|
|
47
53
|
constructor(http: HttpClient, projectId: string, auth?: Auth | null);
|
|
48
54
|
private authHeaders;
|
|
49
55
|
setDefaultBucket(name: string): this;
|
|
50
56
|
bucket(name: string): BucketReference;
|
|
51
57
|
ref(filePath: string): StorageReference;
|
|
52
58
|
_resolveBucketId(bucketName: string): Promise<string>;
|
|
53
|
-
/**
|
|
54
|
-
|
|
59
|
+
/**
|
|
60
|
+
* Resolves a storage path to an authenticated download URL via
|
|
61
|
+
* GET /storage/resolve?projectId=xxx&path=bucketName/folder/file.jpg
|
|
62
|
+
*
|
|
63
|
+
* The server returns { downloadUrl, id, bucketId, ... } — we use downloadUrl directly.
|
|
64
|
+
* Results are cached so repeated calls (e.g. many cards) only hit the server once per path.
|
|
65
|
+
*/
|
|
66
|
+
_getDownloadURL(bucket: string, filePath: string): Promise<string>;
|
|
67
|
+
/**
|
|
68
|
+
* @deprecated No /path route exists on the server.
|
|
69
|
+
* Kept so StorageImage's synchronous fast-path gracefully returns ""
|
|
70
|
+
* (which makes StorageImage fall through to the async resolve path).
|
|
71
|
+
*/
|
|
72
|
+
_directUrl(_bucket: string, _filePath: string): string;
|
|
55
73
|
_resolve(bucket: string, filePath: string): Promise<StorageFile>;
|
|
56
74
|
_upload(bucket: string, filePath: string, data: Buffer | Blob | File, opts?: {
|
|
57
75
|
contentType?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAIpC,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAID,qBAAa,gBAAgB;IAEzB,OAAO,CAAC,QAAQ,CAAC,OAAO;aACR,MAAM,EAAE,MAAM;aACd,QAAQ,EAAE,MAAM;gBAFf,OAAO,EAAE,eAAe,EACzB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM;IAG5B,MAAM,CACV,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,EAC1B,IAAI,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAClE,OAAO,CAAC,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"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"}
|
package/dist/storage/index.js
CHANGED
|
@@ -44,8 +44,12 @@ class StorageReference {
|
|
|
44
44
|
async upload(data, opts) {
|
|
45
45
|
return this.storage._upload(this.bucket, this.filePath, data, opts);
|
|
46
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Returns the authenticated download URL for this file.
|
|
49
|
+
* Always resolves via /storage/resolve to get the real bucketId + fileId.
|
|
50
|
+
*/
|
|
47
51
|
async getDownloadURL() {
|
|
48
|
-
return this.storage.
|
|
52
|
+
return this.storage._getDownloadURL(this.bucket, this.filePath);
|
|
49
53
|
}
|
|
50
54
|
async getMetadata() {
|
|
51
55
|
return this.storage._resolve(this.bucket, this.filePath);
|
|
@@ -75,10 +79,12 @@ class ClefbaseStorage {
|
|
|
75
79
|
this.http = http;
|
|
76
80
|
this.projectId = projectId;
|
|
77
81
|
this.auth = auth;
|
|
78
|
-
/** @internal
|
|
82
|
+
/** @internal used by StorageImage — kept for compat but now returns empty string (no /path route exists) */
|
|
79
83
|
this._defaultBucket = "default";
|
|
80
84
|
/** In-memory cache: bucket name → UUID */
|
|
81
85
|
this._bucketIdCache = new Map();
|
|
86
|
+
/** In-memory cache: "bucket::filePath" → download URL */
|
|
87
|
+
this._urlCache = new Map();
|
|
82
88
|
}
|
|
83
89
|
authHeaders() {
|
|
84
90
|
return this.auth?.getAuthHeaders() ?? {};
|
|
@@ -94,10 +100,6 @@ class ClefbaseStorage {
|
|
|
94
100
|
return new StorageReference(this, this._defaultBucket, filePath.replace(/^\/+/, ""));
|
|
95
101
|
}
|
|
96
102
|
// ─── Bucket UUID resolution ───────────────────────────────────────────────
|
|
97
|
-
//
|
|
98
|
-
// The external storage router identifies buckets by UUID, not by name.
|
|
99
|
-
// dbId comes from the API key (set by dbApiKeyMiddleware), so we just call
|
|
100
|
-
// GET /buckets (no projectId needed — the key carries that context).
|
|
101
103
|
async _resolveBucketId(bucketName) {
|
|
102
104
|
const cached = this._bucketIdCache.get(bucketName);
|
|
103
105
|
if (cached)
|
|
@@ -111,19 +113,43 @@ class ClefbaseStorage {
|
|
|
111
113
|
throw new Error(`Storage bucket "${bucketName}" not found`);
|
|
112
114
|
return id;
|
|
113
115
|
}
|
|
114
|
-
// ───
|
|
115
|
-
/**
|
|
116
|
-
|
|
116
|
+
// ─── Download URL ─────────────────────────────────────────────────────────
|
|
117
|
+
/**
|
|
118
|
+
* Resolves a storage path to an authenticated download URL via
|
|
119
|
+
* GET /storage/resolve?projectId=xxx&path=bucketName/folder/file.jpg
|
|
120
|
+
*
|
|
121
|
+
* The server returns { downloadUrl, id, bucketId, ... } — we use downloadUrl directly.
|
|
122
|
+
* Results are cached so repeated calls (e.g. many cards) only hit the server once per path.
|
|
123
|
+
*/
|
|
124
|
+
async _getDownloadURL(bucket, filePath) {
|
|
117
125
|
const cleanFile = filePath.replace(/^\/+/, "");
|
|
118
|
-
|
|
119
|
-
|
|
126
|
+
// The resolve endpoint expects the full path including bucket name
|
|
127
|
+
const fullPath = `${bucket}/${cleanFile}`;
|
|
128
|
+
const cacheKey = fullPath;
|
|
129
|
+
const cached = this._urlCache.get(cacheKey);
|
|
130
|
+
if (cached)
|
|
131
|
+
return cached;
|
|
132
|
+
const meta = await this._resolve(bucket, cleanFile);
|
|
133
|
+
const url = meta.downloadUrl ?? "";
|
|
134
|
+
if (url)
|
|
135
|
+
this._urlCache.set(cacheKey, url);
|
|
136
|
+
return url;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* @deprecated No /path route exists on the server.
|
|
140
|
+
* Kept so StorageImage's synchronous fast-path gracefully returns ""
|
|
141
|
+
* (which makes StorageImage fall through to the async resolve path).
|
|
142
|
+
*/
|
|
143
|
+
_directUrl(_bucket, _filePath) {
|
|
144
|
+
return "";
|
|
120
145
|
}
|
|
121
146
|
async _resolve(bucket, filePath) {
|
|
122
147
|
const cleanFile = filePath.replace(/^\/+/, "");
|
|
123
|
-
|
|
148
|
+
// The resolve endpoint matches by fullPath = "bucketName/folder/file.jpg"
|
|
149
|
+
const fullPath = `${bucket}/${cleanFile}`;
|
|
150
|
+
return this.http.get(`/resolve?projectId=${encodeURIComponent(this.projectId)}&path=${encodeURIComponent(fullPath)}`);
|
|
124
151
|
}
|
|
125
152
|
async _upload(bucket, filePath, data, opts) {
|
|
126
|
-
// Resolve bucket name → UUID before building the URL
|
|
127
153
|
const bucketId = await this._resolveBucketId(bucket);
|
|
128
154
|
let FormDataImpl;
|
|
129
155
|
if (typeof FormData !== "undefined") {
|
|
@@ -148,6 +174,9 @@ class ClefbaseStorage {
|
|
|
148
174
|
form.append("folder", folder);
|
|
149
175
|
if (opts?.metadata)
|
|
150
176
|
form.append("metadata", JSON.stringify(opts.metadata));
|
|
177
|
+
// Bust the URL cache for this path so a fresh URL is fetched after upload
|
|
178
|
+
const cacheKey = `${bucket}/${cleanPath}`;
|
|
179
|
+
this._urlCache.delete(cacheKey);
|
|
151
180
|
return this.http.request(`/buckets/${bucketId}/files`, {
|
|
152
181
|
method: "POST",
|
|
153
182
|
body: form,
|
|
@@ -158,6 +187,7 @@ class ClefbaseStorage {
|
|
|
158
187
|
async _delete(bucket, filePath) {
|
|
159
188
|
const bucketId = await this._resolveBucketId(bucket);
|
|
160
189
|
const meta = await this._resolve(bucket, filePath);
|
|
190
|
+
this._urlCache.delete(`${bucket}/${filePath.replace(/^\/+/, "")}`);
|
|
161
191
|
await this.http.delete(`/buckets/${bucketId}/files/${meta.id}`, this.authHeaders());
|
|
162
192
|
}
|
|
163
193
|
async _list(bucket, prefix, opts) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBA,iFAAiF;AAEjF,MAAa,gBAAgB;IAC3B,YACmB,OAAwB,EACzB,MAAc,EACd,QAAgB;QAFf,YAAO,GAAP,OAAO,CAAiB;QACzB,WAAM,GAAN,MAAM,CAAQ;QACd,aAAQ,GAAR,QAAQ,CAAQ;IAC/B,CAAC;IAEJ,KAAK,CAAC,MAAM,CACV,IAA0B,EAC1B,IAAmE;QAEnE,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,OAAO,IAAI,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBA,iFAAiF;AAEjF,MAAa,gBAAgB;IAC3B,YACmB,OAAwB,EACzB,MAAc,EACd,QAAgB;QAFf,YAAO,GAAP,OAAO,CAAiB;QACzB,WAAM,GAAN,MAAM,CAAQ;QACd,aAAQ,GAAR,QAAQ,CAAQ;IAC/B,CAAC;IAEJ,KAAK,CAAC,MAAM,CACV,IAA0B,EAC1B,IAAmE;QAEnE,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACtE,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc;QAClB,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,MAAM;QACV,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAA0C;QACnD,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC9D,CAAC;CACF;AAjCD,4CAiCC;AAED,iFAAiF;AAEjF,MAAa,eAAe;IAC1B,YACmB,OAAwB,EACzB,IAAY;QADX,YAAO,GAAP,OAAO,CAAiB;QACzB,SAAI,GAAJ,IAAI,CAAQ;IAC3B,CAAC;IAEJ,GAAG,CAAC,QAAgB;QAClB,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;IACrF,CAAC;CACF;AATD,0CASC;AAED,iFAAiF;AAEjF,MAAa,eAAe;IAU1B,YACmB,IAAgB,EAChB,SAAiB,EACjB,OAAoB,IAAI;QAFxB,SAAI,GAAJ,IAAI,CAAY;QAChB,cAAS,GAAT,SAAS,CAAQ;QACjB,SAAI,GAAJ,IAAI,CAAoB;QAZ3C,4GAA4G;QACrG,mBAAc,GAAG,SAAS,CAAC;QAElC,0CAA0C;QAClC,mBAAc,GAAwB,IAAI,GAAG,EAAE,CAAC;QAExD,yDAAyD;QACjD,cAAS,GAAwB,IAAI,GAAG,EAAE,CAAC;IAMhD,CAAC;IAEI,WAAW;QACjB,OAAO,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;IAC3C,CAAC;IAED,gBAAgB,CAAC,IAAY;QAC3B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,OAAO,IAAI,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,GAAG,CAAC,QAAgB;QAClB,OAAO,IAAI,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;IACvF,CAAC;IAED,6EAA6E;IAE7E,KAAK,CAAC,gBAAgB,CAAC,UAAkB;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACnD,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAG1B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAc,UAAU,CAAC,CAAC;QAC7D,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC/C,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,UAAU,aAAa,CAAC,CAAC;QACrE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,6EAA6E;IAE7E;;;;;;OAMG;IACH,KAAK,CAAC,eAAe,CAAC,MAAc,EAAE,QAAgB;QACpD,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC/C,mEAAmE;QACnE,MAAM,QAAQ,GAAG,GAAG,MAAM,IAAI,SAAS,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,QAAQ,CAAC;QAE1B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAE1B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;QACnC,IAAI,GAAG;YAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC3C,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;;;OAIG;IACH,UAAU,CAAC,OAAe,EAAE,SAAiB;QAC3C,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,QAAgB;QAC7C,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC/C,0EAA0E;QAC1E,MAAM,QAAQ,GAAG,GAAG,MAAM,IAAI,SAAS,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,sBAAsB,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAChG,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CACX,MAAc,EACd,QAAgB,EAChB,IAA0B,EAC1B,IAAmE;QAEnE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAErD,IAAI,YAAgC,CAAC;QACrC,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,CAAC;YACpC,YAAY,GAAG,QAAQ,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,wDAAa,WAAW,GAAC,CAAC;YACtC,YAAY,GAAG,GAAG,CAAC,OAAwC,CAAC;QAC9D,CAAC;QAED,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAI,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC;QACzD,MAAM,KAAK,GAAO,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,MAAM,GAAM,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAE9E,MAAM,IAAI,GAAG,IAAI,YAAY,EAAE,CAAC;QAEhC,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1D,IAAI,CAAC,MAAuD,CAC3D,MAAM,EAAE,IAAI,EACZ,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,IAAI,0BAA0B,EAAE,CAC3E,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAY,EAAE,QAAQ,CAAC,CAAC;QAC9C,CAAC;QAED,IAAI,MAAM;YAAU,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAClD,IAAI,IAAI,EAAE,QAAQ;YAAE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE3E,0EAA0E;QAC1E,MAAM,QAAQ,GAAG,GAAG,MAAM,IAAI,SAAS,EAAE,CAAC;QAC1C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEhC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAc,YAAY,QAAQ,QAAQ,EAAE;YAClE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI;YACV,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE;SAC5B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,QAAgB;QAC5C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACrD,MAAM,IAAI,GAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACvD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QACnE,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CACpB,YAAY,QAAQ,UAAU,IAAI,CAAC,EAAE,EAAE,EACvC,IAAI,CAAC,WAAW,EAAE,CACnB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK,CACT,MAAc,EACd,MAAc,EACd,IAA0C;QAE1C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACrD,MAAM,EAAE,GAAG,IAAI,eAAe,EAAE,CAAC;QACjC,IAAI,MAAM;YAAsB,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACzD,IAAI,IAAI,EAAE,KAAK,KAAM,SAAS;YAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACrE,IAAI,IAAI,EAAE,MAAM,KAAK,SAAS;YAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACtE,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAG5C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAa,YAAY,QAAQ,SAAS,KAAK,EAAE,CAAC,CAAC;QACrF,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,MAAkC,CAAC,IAAI,CAAC;IACnF,CAAC;CACF;AArKD,0CAqKC"}
|