@fairu/sdk 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/CHANGELOG.md +16 -0
- package/README.md +447 -0
- package/dist/FairuClient-BUObk5LJ.cjs +91 -0
- package/dist/FairuClient-BUObk5LJ.cjs.map +1 -0
- package/dist/FairuClient-CT-IPh8i.js +92 -0
- package/dist/FairuClient-CT-IPh8i.js.map +1 -0
- package/dist/FairuError-D8sSmRAa.js +214 -0
- package/dist/FairuError-D8sSmRAa.js.map +1 -0
- package/dist/FairuError-DWH_Nwk0.cjs +213 -0
- package/dist/FairuError-DWH_Nwk0.cjs.map +1 -0
- package/dist/FairuProvider-BRpRddCI.cjs +51 -0
- package/dist/FairuProvider-BRpRddCI.cjs.map +1 -0
- package/dist/FairuProvider-Tc0vFo5L.js +52 -0
- package/dist/FairuProvider-Tc0vFo5L.js.map +1 -0
- package/dist/FileProxyBuilder-D-jZpAtd.cjs +269 -0
- package/dist/FileProxyBuilder-D-jZpAtd.cjs.map +1 -0
- package/dist/FileProxyBuilder-vHw1zBpJ.js +270 -0
- package/dist/FileProxyBuilder-vHw1zBpJ.js.map +1 -0
- package/dist/FragmentBuilder-BinoxeVS.js +194 -0
- package/dist/FragmentBuilder-BinoxeVS.js.map +1 -0
- package/dist/FragmentBuilder-BuvIC0aT.cjs +193 -0
- package/dist/FragmentBuilder-BuvIC0aT.cjs.map +1 -0
- package/dist/UploadError-CHBJuChw.cjs +81 -0
- package/dist/UploadError-CHBJuChw.cjs.map +1 -0
- package/dist/UploadError-_gEcJqSS.js +82 -0
- package/dist/UploadError-_gEcJqSS.js.map +1 -0
- package/dist/client/FairuClient.d.ts +8 -0
- package/dist/client/FairuClient.d.ts.map +1 -0
- package/dist/client/FairuProvider.d.ts +78 -0
- package/dist/client/FairuProvider.d.ts.map +1 -0
- package/dist/client/cache.d.ts +6 -0
- package/dist/client/cache.d.ts.map +1 -0
- package/dist/client/config.d.ts +77 -0
- package/dist/client/config.d.ts.map +1 -0
- package/dist/client/index.d.ts +5 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/errors/FairuError.d.ts +107 -0
- package/dist/errors/FairuError.d.ts.map +1 -0
- package/dist/errors/UploadError.d.ts +54 -0
- package/dist/errors/UploadError.d.ts.map +1 -0
- package/dist/errors/index.d.ts +3 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/fileproxy/FileProxyBuilder.d.ts +141 -0
- package/dist/fileproxy/FileProxyBuilder.d.ts.map +1 -0
- package/dist/fileproxy/index.d.ts +4 -0
- package/dist/fileproxy/index.d.ts.map +1 -0
- package/dist/fileproxy/types.d.ts +79 -0
- package/dist/fileproxy/types.d.ts.map +1 -0
- package/dist/fileproxy/useFileProxyUrl.d.ts +91 -0
- package/dist/fileproxy/useFileProxyUrl.d.ts.map +1 -0
- package/dist/fileproxy.cjs +10 -0
- package/dist/fileproxy.cjs.map +1 -0
- package/dist/fileproxy.d.ts +2 -0
- package/dist/fileproxy.js +10 -0
- package/dist/fileproxy.js.map +1 -0
- package/dist/fragments/FragmentBuilder.d.ts +107 -0
- package/dist/fragments/FragmentBuilder.d.ts.map +1 -0
- package/dist/fragments/FragmentRegistry.d.ts +93 -0
- package/dist/fragments/FragmentRegistry.d.ts.map +1 -0
- package/dist/fragments/index.d.ts +5 -0
- package/dist/fragments/index.d.ts.map +1 -0
- package/dist/fragments/predefined/assetFragments.d.ts +39 -0
- package/dist/fragments/predefined/assetFragments.d.ts.map +1 -0
- package/dist/fragments/predefined/copyrightFragments.d.ts +12 -0
- package/dist/fragments/predefined/copyrightFragments.d.ts.map +1 -0
- package/dist/fragments/predefined/folderFragments.d.ts +28 -0
- package/dist/fragments/predefined/folderFragments.d.ts.map +1 -0
- package/dist/fragments/predefined/galleryFragments.d.ts +24 -0
- package/dist/fragments/predefined/galleryFragments.d.ts.map +1 -0
- package/dist/fragments/predefined/index.d.ts +6 -0
- package/dist/fragments/predefined/index.d.ts.map +1 -0
- package/dist/fragments/predefined/licenseFragments.d.ts +12 -0
- package/dist/fragments/predefined/licenseFragments.d.ts.map +1 -0
- package/dist/fragments/types.d.ts +46 -0
- package/dist/fragments/types.d.ts.map +1 -0
- package/dist/fragments.cjs +403 -0
- package/dist/fragments.cjs.map +1 -0
- package/dist/fragments.d.ts +2 -0
- package/dist/fragments.js +403 -0
- package/dist/fragments.js.map +1 -0
- package/dist/generated/graphql.d.ts +3464 -0
- package/dist/generated/graphql.d.ts.map +1 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/mutations/index.d.ts +5 -0
- package/dist/hooks/mutations/index.d.ts.map +1 -0
- package/dist/hooks/mutations/useAssetMutations.d.ts +66 -0
- package/dist/hooks/mutations/useAssetMutations.d.ts.map +1 -0
- package/dist/hooks/mutations/useFolderMutations.d.ts +69 -0
- package/dist/hooks/mutations/useFolderMutations.d.ts.map +1 -0
- package/dist/hooks/mutations/useGalleryMutations.d.ts +39 -0
- package/dist/hooks/mutations/useGalleryMutations.d.ts.map +1 -0
- package/dist/hooks/mutations/useUpdateAsset.d.ts +50 -0
- package/dist/hooks/mutations/useUpdateAsset.d.ts.map +1 -0
- package/dist/hooks/queries/index.d.ts +8 -0
- package/dist/hooks/queries/index.d.ts.map +1 -0
- package/dist/hooks/queries/useAsset.d.ts +46 -0
- package/dist/hooks/queries/useAsset.d.ts.map +1 -0
- package/dist/hooks/queries/useAssets.d.ts +58 -0
- package/dist/hooks/queries/useAssets.d.ts.map +1 -0
- package/dist/hooks/queries/useCopyright.d.ts +51 -0
- package/dist/hooks/queries/useCopyright.d.ts.map +1 -0
- package/dist/hooks/queries/useFolder.d.ts +93 -0
- package/dist/hooks/queries/useFolder.d.ts.map +1 -0
- package/dist/hooks/queries/useGallery.d.ts +101 -0
- package/dist/hooks/queries/useGallery.d.ts.map +1 -0
- package/dist/hooks/queries/useLicense.d.ts +63 -0
- package/dist/hooks/queries/useLicense.d.ts.map +1 -0
- package/dist/hooks/queries/useTenant.d.ts +89 -0
- package/dist/hooks/queries/useTenant.d.ts.map +1 -0
- package/dist/index.cjs +244 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +244 -0
- package/dist/index.js.map +1 -0
- package/dist/react.cjs +596 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.ts +22 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +596 -0
- package/dist/react.js.map +1 -0
- package/dist/upload/index.d.ts +4 -0
- package/dist/upload/index.d.ts.map +1 -0
- package/dist/upload/types.d.ts +96 -0
- package/dist/upload/types.d.ts.map +1 -0
- package/dist/upload/useMultipartUpload.d.ts +67 -0
- package/dist/upload/useMultipartUpload.d.ts.map +1 -0
- package/dist/upload/useUpload.d.ts +64 -0
- package/dist/upload/useUpload.d.ts.map +1 -0
- package/dist/upload.cjs +6 -0
- package/dist/upload.cjs.map +1 -0
- package/dist/upload.d.ts +2 -0
- package/dist/upload.js +6 -0
- package/dist/upload.js.map +1 -0
- package/dist/useFileProxyUrl-BCcux6re.cjs +87 -0
- package/dist/useFileProxyUrl-BCcux6re.cjs.map +1 -0
- package/dist/useFileProxyUrl-D_S1R_7O.js +88 -0
- package/dist/useFileProxyUrl-D_S1R_7O.js.map +1 -0
- package/dist/useMultipartUpload-BKnDbl8h.cjs +423 -0
- package/dist/useMultipartUpload-BKnDbl8h.cjs.map +1 -0
- package/dist/useMultipartUpload-CPK_PgUU.js +424 -0
- package/dist/useMultipartUpload-CPK_PgUU.js.map +1 -0
- package/dist/vanilla.cjs +219 -0
- package/dist/vanilla.cjs.map +1 -0
- package/dist/vanilla.d.ts +94 -0
- package/dist/vanilla.d.ts.map +1 -0
- package/dist/vanilla.js +220 -0
- package/dist/vanilla.js.map +1 -0
- package/package.json +177 -0
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { useUpload, type UseUploadState, type UseUploadResult, } from './useUpload';
|
|
2
|
+
export { useMultipartUpload, type UseMultipartUploadState, type UseMultipartUploadResult, } from './useMultipartUpload';
|
|
3
|
+
export type { UploadStatus, UploadProgress, UploadPart, UploadOptions, MultipartUploadOptions, UploadResult, } from './types';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/upload/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,KAAK,cAAc,EACnB,KAAK,eAAe,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,kBAAkB,EAClB,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,GAC9B,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,YAAY,EACZ,cAAc,EACd,UAAU,EACV,aAAa,EACb,sBAAsB,EACtB,YAAY,GACb,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Upload status.
|
|
3
|
+
*/
|
|
4
|
+
export type UploadStatus = 'idle' | 'preparing' | 'uploading' | 'processing' | 'completed' | 'error' | 'aborted';
|
|
5
|
+
/**
|
|
6
|
+
* Upload progress information.
|
|
7
|
+
*/
|
|
8
|
+
export interface UploadProgress {
|
|
9
|
+
/**
|
|
10
|
+
* Bytes uploaded.
|
|
11
|
+
*/
|
|
12
|
+
loaded: number;
|
|
13
|
+
/**
|
|
14
|
+
* Total bytes.
|
|
15
|
+
*/
|
|
16
|
+
total: number;
|
|
17
|
+
/**
|
|
18
|
+
* Percentage (0-100).
|
|
19
|
+
*/
|
|
20
|
+
percentage: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Completed upload part.
|
|
24
|
+
*/
|
|
25
|
+
export interface UploadPart {
|
|
26
|
+
partNumber: number;
|
|
27
|
+
etag: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Options for simple uploads.
|
|
31
|
+
*/
|
|
32
|
+
export interface UploadOptions {
|
|
33
|
+
/**
|
|
34
|
+
* Target folder ID.
|
|
35
|
+
*/
|
|
36
|
+
folderId?: string;
|
|
37
|
+
/**
|
|
38
|
+
* Alt text for the file.
|
|
39
|
+
*/
|
|
40
|
+
alt?: string;
|
|
41
|
+
/**
|
|
42
|
+
* Caption for the file.
|
|
43
|
+
*/
|
|
44
|
+
caption?: string;
|
|
45
|
+
/**
|
|
46
|
+
* Description for the file.
|
|
47
|
+
*/
|
|
48
|
+
description?: string;
|
|
49
|
+
/**
|
|
50
|
+
* Copyright text.
|
|
51
|
+
*/
|
|
52
|
+
copyright?: string;
|
|
53
|
+
/**
|
|
54
|
+
* Focal point (e.g., "50,50").
|
|
55
|
+
*/
|
|
56
|
+
focalPoint?: string;
|
|
57
|
+
/**
|
|
58
|
+
* Progress callback.
|
|
59
|
+
*/
|
|
60
|
+
onProgress?: (progress: UploadProgress) => void;
|
|
61
|
+
/**
|
|
62
|
+
* Status change callback.
|
|
63
|
+
*/
|
|
64
|
+
onStatusChange?: (status: UploadStatus) => void;
|
|
65
|
+
/**
|
|
66
|
+
* Abort signal for cancellation.
|
|
67
|
+
*/
|
|
68
|
+
abortSignal?: AbortSignal;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Options for multipart uploads.
|
|
72
|
+
*/
|
|
73
|
+
export interface MultipartUploadOptions extends UploadOptions {
|
|
74
|
+
/**
|
|
75
|
+
* Part size in bytes (default: 5MB).
|
|
76
|
+
*/
|
|
77
|
+
partSize?: number;
|
|
78
|
+
/**
|
|
79
|
+
* Number of concurrent part uploads (default: 3).
|
|
80
|
+
*/
|
|
81
|
+
concurrency?: number;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Result of a completed upload.
|
|
85
|
+
*/
|
|
86
|
+
export interface UploadResult {
|
|
87
|
+
/**
|
|
88
|
+
* ID of the uploaded file.
|
|
89
|
+
*/
|
|
90
|
+
id: string;
|
|
91
|
+
/**
|
|
92
|
+
* URL of the uploaded file.
|
|
93
|
+
*/
|
|
94
|
+
url: string;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/upload/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,YAAY,GACpB,MAAM,GACN,WAAW,GACX,WAAW,GACX,YAAY,GACZ,WAAW,GACX,OAAO,GACP,SAAS,CAAC;AAEd;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,CAAC;IAEhD;;OAEG;IACH,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;IAEhD;;OAEG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,sBAAuB,SAAQ,aAAa;IAC3D;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;CACb"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { UploadStatus, UploadProgress, MultipartUploadOptions, UploadResult } from './types';
|
|
2
|
+
import { UploadError } from '../errors';
|
|
3
|
+
/**
|
|
4
|
+
* State for the multipart upload hook.
|
|
5
|
+
*/
|
|
6
|
+
export interface UseMultipartUploadState {
|
|
7
|
+
status: UploadStatus;
|
|
8
|
+
progress: UploadProgress;
|
|
9
|
+
error: UploadError | null;
|
|
10
|
+
result: UploadResult | null;
|
|
11
|
+
partsCompleted: number;
|
|
12
|
+
totalParts: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Result of the useMultipartUpload hook.
|
|
16
|
+
*/
|
|
17
|
+
export interface UseMultipartUploadResult extends UseMultipartUploadState {
|
|
18
|
+
upload: (file: File, options?: MultipartUploadOptions) => Promise<UploadResult>;
|
|
19
|
+
abort: () => void;
|
|
20
|
+
reset: () => void;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Hook for multipart uploads of large files.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```tsx
|
|
27
|
+
* function LargeFileUploader() {
|
|
28
|
+
* const {
|
|
29
|
+
* upload,
|
|
30
|
+
* progress,
|
|
31
|
+
* status,
|
|
32
|
+
* partsCompleted,
|
|
33
|
+
* totalParts,
|
|
34
|
+
* abort,
|
|
35
|
+
* } = useMultipartUpload();
|
|
36
|
+
*
|
|
37
|
+
* const handleFileSelect = async (e) => {
|
|
38
|
+
* const file = e.target.files?.[0];
|
|
39
|
+
* if (!file) return;
|
|
40
|
+
*
|
|
41
|
+
* try {
|
|
42
|
+
* await upload(file, {
|
|
43
|
+
* partSize: 10 * 1024 * 1024, // 10MB parts
|
|
44
|
+
* concurrency: 5,
|
|
45
|
+
* });
|
|
46
|
+
* } catch (err) {
|
|
47
|
+
* console.error('Upload failed:', err);
|
|
48
|
+
* }
|
|
49
|
+
* };
|
|
50
|
+
*
|
|
51
|
+
* return (
|
|
52
|
+
* <div>
|
|
53
|
+
* <input type="file" onChange={handleFileSelect} />
|
|
54
|
+
* {status === 'uploading' && (
|
|
55
|
+
* <div>
|
|
56
|
+
* <progress value={progress.percentage} max={100} />
|
|
57
|
+
* <span>Parts: {partsCompleted}/{totalParts}</span>
|
|
58
|
+
* <button onClick={abort}>Cancel</button>
|
|
59
|
+
* </div>
|
|
60
|
+
* )}
|
|
61
|
+
* </div>
|
|
62
|
+
* );
|
|
63
|
+
* }
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
export declare function useMultipartUpload(): UseMultipartUploadResult;
|
|
67
|
+
//# sourceMappingURL=useMultipartUpload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMultipartUpload.d.ts","sourceRoot":"","sources":["../../src/upload/useMultipartUpload.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACd,sBAAsB,EACtB,YAAY,EAEb,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAwDxC;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,cAAc,CAAC;IACzB,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAyB,SAAQ,uBAAuB;IACvE,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,sBAAsB,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IAChF,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAWD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,wBAAgB,kBAAkB,IAAI,wBAAwB,CAmO7D"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { UploadStatus, UploadProgress, UploadOptions, UploadResult } from './types';
|
|
2
|
+
import { UploadError } from '../errors';
|
|
3
|
+
/**
|
|
4
|
+
* State for the upload hook.
|
|
5
|
+
*/
|
|
6
|
+
export interface UseUploadState {
|
|
7
|
+
status: UploadStatus;
|
|
8
|
+
progress: UploadProgress;
|
|
9
|
+
error: UploadError | null;
|
|
10
|
+
result: UploadResult | null;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Result of the useUpload hook.
|
|
14
|
+
*/
|
|
15
|
+
export interface UseUploadResult extends UseUploadState {
|
|
16
|
+
/**
|
|
17
|
+
* Upload a file.
|
|
18
|
+
*/
|
|
19
|
+
upload: (file: File, options?: UploadOptions) => Promise<UploadResult>;
|
|
20
|
+
/**
|
|
21
|
+
* Abort the current upload.
|
|
22
|
+
*/
|
|
23
|
+
abort: () => void;
|
|
24
|
+
/**
|
|
25
|
+
* Reset the upload state.
|
|
26
|
+
*/
|
|
27
|
+
reset: () => void;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Hook for uploading files to Fairu.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```tsx
|
|
34
|
+
* function FileUploader() {
|
|
35
|
+
* const { upload, progress, status, error, result } = useUpload();
|
|
36
|
+
*
|
|
37
|
+
* const handleFileSelect = async (e) => {
|
|
38
|
+
* const file = e.target.files?.[0];
|
|
39
|
+
* if (!file) return;
|
|
40
|
+
*
|
|
41
|
+
* try {
|
|
42
|
+
* const result = await upload(file, {
|
|
43
|
+
* folderId: 'target-folder-id',
|
|
44
|
+
* alt: 'Uploaded image',
|
|
45
|
+
* });
|
|
46
|
+
* console.log('Uploaded:', result);
|
|
47
|
+
* } catch (err) {
|
|
48
|
+
* console.error('Upload failed:', err);
|
|
49
|
+
* }
|
|
50
|
+
* };
|
|
51
|
+
*
|
|
52
|
+
* return (
|
|
53
|
+
* <div>
|
|
54
|
+
* <input type="file" onChange={handleFileSelect} />
|
|
55
|
+
* {status === 'uploading' && (
|
|
56
|
+
* <progress value={progress.percentage} max={100} />
|
|
57
|
+
* )}
|
|
58
|
+
* </div>
|
|
59
|
+
* );
|
|
60
|
+
* }
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export declare function useUpload(): UseUploadResult;
|
|
64
|
+
//# sourceMappingURL=useUpload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useUpload.d.ts","sourceRoot":"","sources":["../../src/upload/useUpload.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACd,aAAa,EACb,YAAY,EACb,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AA6BxC;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,cAAc,CAAC;IACzB,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,eAAgB,SAAQ,cAAc;IACrD;;OAEG;IACH,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IAEvE;;OAEG;IACH,KAAK,EAAE,MAAM,IAAI,CAAC;IAElB;;OAEG;IACH,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AASD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,SAAS,IAAI,eAAe,CA6G3C"}
|
package/dist/upload.cjs
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const useMultipartUpload = require("./useMultipartUpload-BKnDbl8h.cjs");
|
|
4
|
+
exports.useMultipartUpload = useMultipartUpload.useMultipartUpload;
|
|
5
|
+
exports.useUpload = useMultipartUpload.useUpload;
|
|
6
|
+
//# sourceMappingURL=upload.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
|
package/dist/upload.d.ts
ADDED
package/dist/upload.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const react = require("react");
|
|
3
|
+
const FileProxyBuilder = require("./FileProxyBuilder-D-jZpAtd.cjs");
|
|
4
|
+
function useFileProxyUrl(id, name, options = {}) {
|
|
5
|
+
return react.useMemo(() => {
|
|
6
|
+
if (!id || !name || options.skip) {
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
const builder = new FileProxyBuilder.FileProxyBuilder(id, name, options.baseUrl);
|
|
10
|
+
if (options.width !== void 0) {
|
|
11
|
+
builder.width(options.width);
|
|
12
|
+
}
|
|
13
|
+
if (options.height !== void 0) {
|
|
14
|
+
builder.height(options.height);
|
|
15
|
+
}
|
|
16
|
+
if (options.quality !== void 0) {
|
|
17
|
+
builder.quality(options.quality);
|
|
18
|
+
}
|
|
19
|
+
if (options.format !== void 0) {
|
|
20
|
+
builder.format(options.format);
|
|
21
|
+
}
|
|
22
|
+
if (options.fit !== void 0) {
|
|
23
|
+
builder.fit(options.fit);
|
|
24
|
+
}
|
|
25
|
+
if (options.focal) {
|
|
26
|
+
builder.focalFromString(options.focal);
|
|
27
|
+
}
|
|
28
|
+
if (options.raw) {
|
|
29
|
+
builder.raw(true);
|
|
30
|
+
}
|
|
31
|
+
if (options.processSvg) {
|
|
32
|
+
builder.processSvg(true);
|
|
33
|
+
}
|
|
34
|
+
return builder.build();
|
|
35
|
+
}, [
|
|
36
|
+
id,
|
|
37
|
+
name,
|
|
38
|
+
options.width,
|
|
39
|
+
options.height,
|
|
40
|
+
options.quality,
|
|
41
|
+
options.format,
|
|
42
|
+
options.fit,
|
|
43
|
+
options.focal,
|
|
44
|
+
options.raw,
|
|
45
|
+
options.processSvg,
|
|
46
|
+
options.baseUrl,
|
|
47
|
+
options.skip
|
|
48
|
+
]);
|
|
49
|
+
}
|
|
50
|
+
function useResponsiveImageUrl(id, name, options) {
|
|
51
|
+
return react.useMemo(() => {
|
|
52
|
+
if (!id || !name || options.widths.length === 0) {
|
|
53
|
+
return { src: null, srcSet: null, sizes: void 0 };
|
|
54
|
+
}
|
|
55
|
+
const sortedWidths = [...options.widths].sort((a, b) => a - b);
|
|
56
|
+
const defaultWidth = sortedWidths[Math.floor(sortedWidths.length / 2)];
|
|
57
|
+
const srcBuilder = new FileProxyBuilder.FileProxyBuilder(id, name, options.baseUrl).width(defaultWidth);
|
|
58
|
+
if (options.format) srcBuilder.format(options.format);
|
|
59
|
+
if (options.quality) srcBuilder.quality(options.quality);
|
|
60
|
+
if (options.focal) srcBuilder.focalFromString(options.focal);
|
|
61
|
+
const src = srcBuilder.build();
|
|
62
|
+
const srcSetParts = sortedWidths.map((width) => {
|
|
63
|
+
const builder = new FileProxyBuilder.FileProxyBuilder(id, name, options.baseUrl).width(width);
|
|
64
|
+
if (options.format) builder.format(options.format);
|
|
65
|
+
if (options.quality) builder.quality(options.quality);
|
|
66
|
+
if (options.focal) builder.focalFromString(options.focal);
|
|
67
|
+
return `${builder.build()} ${width}w`;
|
|
68
|
+
});
|
|
69
|
+
return {
|
|
70
|
+
src,
|
|
71
|
+
srcSet: srcSetParts.join(", "),
|
|
72
|
+
sizes: options.sizes
|
|
73
|
+
};
|
|
74
|
+
}, [
|
|
75
|
+
id,
|
|
76
|
+
name,
|
|
77
|
+
options.widths,
|
|
78
|
+
options.sizes,
|
|
79
|
+
options.format,
|
|
80
|
+
options.quality,
|
|
81
|
+
options.focal,
|
|
82
|
+
options.baseUrl
|
|
83
|
+
]);
|
|
84
|
+
}
|
|
85
|
+
exports.useFileProxyUrl = useFileProxyUrl;
|
|
86
|
+
exports.useResponsiveImageUrl = useResponsiveImageUrl;
|
|
87
|
+
//# sourceMappingURL=useFileProxyUrl-BCcux6re.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFileProxyUrl-BCcux6re.cjs","sources":["../src/fileproxy/useFileProxyUrl.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport { FileProxyBuilder } from './FileProxyBuilder';\nimport type { ImageFormat, FitMode } from './types';\n\n/**\n * Options for the useFileProxyUrl hook.\n */\nexport interface UseFileProxyUrlOptions {\n /**\n * Width in pixels.\n */\n width?: number;\n\n /**\n * Height in pixels.\n */\n height?: number;\n\n /**\n * Quality (1-100).\n */\n quality?: number;\n\n /**\n * Output format.\n */\n format?: ImageFormat;\n\n /**\n * Fit mode for cropping.\n */\n fit?: FitMode;\n\n /**\n * Focal point string (e.g., \"50,50\" or \"50-30-1.5\").\n */\n focal?: string | null;\n\n /**\n * Return raw file without processing.\n */\n raw?: boolean;\n\n /**\n * Process SVG to raster.\n */\n processSvg?: boolean;\n\n /**\n * Custom base URL.\n */\n baseUrl?: string;\n\n /**\n * Skip URL generation if true.\n */\n skip?: boolean;\n}\n\n/**\n * React hook for generating FileProxy URLs.\n *\n * @example\n * ```tsx\n * function AssetImage({ asset }) {\n * const url = useFileProxyUrl(asset.id, asset.name, {\n * width: 800,\n * format: 'webp',\n * focal: asset.focal_point,\n * });\n *\n * return <img src={url} alt={asset.alt} />;\n * }\n * ```\n */\nexport function useFileProxyUrl(\n id: string | null | undefined,\n name: string | null | undefined,\n options: UseFileProxyUrlOptions = {}\n): string | null {\n return useMemo(() => {\n // Skip if no id or name, or if explicitly skipped\n if (!id || !name || options.skip) {\n return null;\n }\n\n const builder = new FileProxyBuilder(id, name, options.baseUrl);\n\n // Apply options\n if (options.width !== undefined) {\n builder.width(options.width);\n }\n if (options.height !== undefined) {\n builder.height(options.height);\n }\n if (options.quality !== undefined) {\n builder.quality(options.quality);\n }\n if (options.format !== undefined) {\n builder.format(options.format);\n }\n if (options.fit !== undefined) {\n builder.fit(options.fit);\n }\n if (options.focal) {\n builder.focalFromString(options.focal);\n }\n if (options.raw) {\n builder.raw(true);\n }\n if (options.processSvg) {\n builder.processSvg(true);\n }\n\n return builder.build();\n }, [\n id,\n name,\n options.width,\n options.height,\n options.quality,\n options.format,\n options.fit,\n options.focal,\n options.raw,\n options.processSvg,\n options.baseUrl,\n options.skip,\n ]);\n}\n\n/**\n * React hook for generating responsive image srcset.\n *\n * @example\n * ```tsx\n * function ResponsiveImage({ asset }) {\n * const { src, srcSet, sizes } = useResponsiveImageUrl(asset.id, asset.name, {\n * widths: [400, 800, 1200, 1600],\n * sizes: '(max-width: 600px) 100vw, 50vw',\n * });\n *\n * return <img src={src} srcSet={srcSet} sizes={sizes} alt={asset.alt} />;\n * }\n * ```\n */\nexport function useResponsiveImageUrl(\n id: string | null | undefined,\n name: string | null | undefined,\n options: {\n widths: number[];\n sizes?: string;\n format?: ImageFormat;\n quality?: number;\n focal?: string | null;\n baseUrl?: string;\n }\n): {\n src: string | null;\n srcSet: string | null;\n sizes: string | undefined;\n} {\n return useMemo(() => {\n if (!id || !name || options.widths.length === 0) {\n return { src: null, srcSet: null, sizes: undefined };\n }\n\n const sortedWidths = [...options.widths].sort((a, b) => a - b);\n const defaultWidth = sortedWidths[Math.floor(sortedWidths.length / 2)];\n\n // Generate default src\n const srcBuilder = new FileProxyBuilder(id, name, options.baseUrl)\n .width(defaultWidth);\n\n if (options.format) srcBuilder.format(options.format);\n if (options.quality) srcBuilder.quality(options.quality);\n if (options.focal) srcBuilder.focalFromString(options.focal);\n\n const src = srcBuilder.build();\n\n // Generate srcSet\n const srcSetParts = sortedWidths.map((width) => {\n const builder = new FileProxyBuilder(id, name, options.baseUrl)\n .width(width);\n\n if (options.format) builder.format(options.format);\n if (options.quality) builder.quality(options.quality);\n if (options.focal) builder.focalFromString(options.focal);\n\n return `${builder.build()} ${width}w`;\n });\n\n return {\n src,\n srcSet: srcSetParts.join(', '),\n sizes: options.sizes,\n };\n }, [\n id,\n name,\n options.widths,\n options.sizes,\n options.format,\n options.quality,\n options.focal,\n options.baseUrl,\n ]);\n}\n"],"names":["useMemo","FileProxyBuilder"],"mappings":";;;AA2EO,SAAS,gBACd,IACA,MACA,UAAkC,CAAA,GACnB;AACf,SAAOA,MAAAA,QAAQ,MAAM;AAEnB,QAAI,CAAC,MAAM,CAAC,QAAQ,QAAQ,MAAM;AAChC,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,IAAIC,iBAAAA,iBAAiB,IAAI,MAAM,QAAQ,OAAO;AAG9D,QAAI,QAAQ,UAAU,QAAW;AAC/B,cAAQ,MAAM,QAAQ,KAAK;AAAA,IAC7B;AACA,QAAI,QAAQ,WAAW,QAAW;AAChC,cAAQ,OAAO,QAAQ,MAAM;AAAA,IAC/B;AACA,QAAI,QAAQ,YAAY,QAAW;AACjC,cAAQ,QAAQ,QAAQ,OAAO;AAAA,IACjC;AACA,QAAI,QAAQ,WAAW,QAAW;AAChC,cAAQ,OAAO,QAAQ,MAAM;AAAA,IAC/B;AACA,QAAI,QAAQ,QAAQ,QAAW;AAC7B,cAAQ,IAAI,QAAQ,GAAG;AAAA,IACzB;AACA,QAAI,QAAQ,OAAO;AACjB,cAAQ,gBAAgB,QAAQ,KAAK;AAAA,IACvC;AACA,QAAI,QAAQ,KAAK;AACf,cAAQ,IAAI,IAAI;AAAA,IAClB;AACA,QAAI,QAAQ,YAAY;AACtB,cAAQ,WAAW,IAAI;AAAA,IACzB;AAEA,WAAO,QAAQ,MAAA;AAAA,EACjB,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EAAA,CACT;AACH;AAiBO,SAAS,sBACd,IACA,MACA,SAYA;AACA,SAAOD,MAAAA,QAAQ,MAAM;AACnB,QAAI,CAAC,MAAM,CAAC,QAAQ,QAAQ,OAAO,WAAW,GAAG;AAC/C,aAAO,EAAE,KAAK,MAAM,QAAQ,MAAM,OAAO,OAAA;AAAA,IAC3C;AAEA,UAAM,eAAe,CAAC,GAAG,QAAQ,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAC7D,UAAM,eAAe,aAAa,KAAK,MAAM,aAAa,SAAS,CAAC,CAAC;AAGrE,UAAM,aAAa,IAAIC,iBAAAA,iBAAiB,IAAI,MAAM,QAAQ,OAAO,EAC9D,MAAM,YAAY;AAErB,QAAI,QAAQ,OAAQ,YAAW,OAAO,QAAQ,MAAM;AACpD,QAAI,QAAQ,QAAS,YAAW,QAAQ,QAAQ,OAAO;AACvD,QAAI,QAAQ,MAAO,YAAW,gBAAgB,QAAQ,KAAK;AAE3D,UAAM,MAAM,WAAW,MAAA;AAGvB,UAAM,cAAc,aAAa,IAAI,CAAC,UAAU;AAC9C,YAAM,UAAU,IAAIA,iBAAAA,iBAAiB,IAAI,MAAM,QAAQ,OAAO,EAC3D,MAAM,KAAK;AAEd,UAAI,QAAQ,OAAQ,SAAQ,OAAO,QAAQ,MAAM;AACjD,UAAI,QAAQ,QAAS,SAAQ,QAAQ,QAAQ,OAAO;AACpD,UAAI,QAAQ,MAAO,SAAQ,gBAAgB,QAAQ,KAAK;AAExD,aAAO,GAAG,QAAQ,MAAA,CAAO,IAAI,KAAK;AAAA,IACpC,CAAC;AAED,WAAO;AAAA,MACL;AAAA,MACA,QAAQ,YAAY,KAAK,IAAI;AAAA,MAC7B,OAAO,QAAQ;AAAA,IAAA;AAAA,EAEnB,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EAAA,CACT;AACH;;;"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { useMemo } from "react";
|
|
2
|
+
import { F as FileProxyBuilder } from "./FileProxyBuilder-vHw1zBpJ.js";
|
|
3
|
+
function useFileProxyUrl(id, name, options = {}) {
|
|
4
|
+
return useMemo(() => {
|
|
5
|
+
if (!id || !name || options.skip) {
|
|
6
|
+
return null;
|
|
7
|
+
}
|
|
8
|
+
const builder = new FileProxyBuilder(id, name, options.baseUrl);
|
|
9
|
+
if (options.width !== void 0) {
|
|
10
|
+
builder.width(options.width);
|
|
11
|
+
}
|
|
12
|
+
if (options.height !== void 0) {
|
|
13
|
+
builder.height(options.height);
|
|
14
|
+
}
|
|
15
|
+
if (options.quality !== void 0) {
|
|
16
|
+
builder.quality(options.quality);
|
|
17
|
+
}
|
|
18
|
+
if (options.format !== void 0) {
|
|
19
|
+
builder.format(options.format);
|
|
20
|
+
}
|
|
21
|
+
if (options.fit !== void 0) {
|
|
22
|
+
builder.fit(options.fit);
|
|
23
|
+
}
|
|
24
|
+
if (options.focal) {
|
|
25
|
+
builder.focalFromString(options.focal);
|
|
26
|
+
}
|
|
27
|
+
if (options.raw) {
|
|
28
|
+
builder.raw(true);
|
|
29
|
+
}
|
|
30
|
+
if (options.processSvg) {
|
|
31
|
+
builder.processSvg(true);
|
|
32
|
+
}
|
|
33
|
+
return builder.build();
|
|
34
|
+
}, [
|
|
35
|
+
id,
|
|
36
|
+
name,
|
|
37
|
+
options.width,
|
|
38
|
+
options.height,
|
|
39
|
+
options.quality,
|
|
40
|
+
options.format,
|
|
41
|
+
options.fit,
|
|
42
|
+
options.focal,
|
|
43
|
+
options.raw,
|
|
44
|
+
options.processSvg,
|
|
45
|
+
options.baseUrl,
|
|
46
|
+
options.skip
|
|
47
|
+
]);
|
|
48
|
+
}
|
|
49
|
+
function useResponsiveImageUrl(id, name, options) {
|
|
50
|
+
return useMemo(() => {
|
|
51
|
+
if (!id || !name || options.widths.length === 0) {
|
|
52
|
+
return { src: null, srcSet: null, sizes: void 0 };
|
|
53
|
+
}
|
|
54
|
+
const sortedWidths = [...options.widths].sort((a, b) => a - b);
|
|
55
|
+
const defaultWidth = sortedWidths[Math.floor(sortedWidths.length / 2)];
|
|
56
|
+
const srcBuilder = new FileProxyBuilder(id, name, options.baseUrl).width(defaultWidth);
|
|
57
|
+
if (options.format) srcBuilder.format(options.format);
|
|
58
|
+
if (options.quality) srcBuilder.quality(options.quality);
|
|
59
|
+
if (options.focal) srcBuilder.focalFromString(options.focal);
|
|
60
|
+
const src = srcBuilder.build();
|
|
61
|
+
const srcSetParts = sortedWidths.map((width) => {
|
|
62
|
+
const builder = new FileProxyBuilder(id, name, options.baseUrl).width(width);
|
|
63
|
+
if (options.format) builder.format(options.format);
|
|
64
|
+
if (options.quality) builder.quality(options.quality);
|
|
65
|
+
if (options.focal) builder.focalFromString(options.focal);
|
|
66
|
+
return `${builder.build()} ${width}w`;
|
|
67
|
+
});
|
|
68
|
+
return {
|
|
69
|
+
src,
|
|
70
|
+
srcSet: srcSetParts.join(", "),
|
|
71
|
+
sizes: options.sizes
|
|
72
|
+
};
|
|
73
|
+
}, [
|
|
74
|
+
id,
|
|
75
|
+
name,
|
|
76
|
+
options.widths,
|
|
77
|
+
options.sizes,
|
|
78
|
+
options.format,
|
|
79
|
+
options.quality,
|
|
80
|
+
options.focal,
|
|
81
|
+
options.baseUrl
|
|
82
|
+
]);
|
|
83
|
+
}
|
|
84
|
+
export {
|
|
85
|
+
useResponsiveImageUrl as a,
|
|
86
|
+
useFileProxyUrl as u
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=useFileProxyUrl-D_S1R_7O.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFileProxyUrl-D_S1R_7O.js","sources":["../src/fileproxy/useFileProxyUrl.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport { FileProxyBuilder } from './FileProxyBuilder';\nimport type { ImageFormat, FitMode } from './types';\n\n/**\n * Options for the useFileProxyUrl hook.\n */\nexport interface UseFileProxyUrlOptions {\n /**\n * Width in pixels.\n */\n width?: number;\n\n /**\n * Height in pixels.\n */\n height?: number;\n\n /**\n * Quality (1-100).\n */\n quality?: number;\n\n /**\n * Output format.\n */\n format?: ImageFormat;\n\n /**\n * Fit mode for cropping.\n */\n fit?: FitMode;\n\n /**\n * Focal point string (e.g., \"50,50\" or \"50-30-1.5\").\n */\n focal?: string | null;\n\n /**\n * Return raw file without processing.\n */\n raw?: boolean;\n\n /**\n * Process SVG to raster.\n */\n processSvg?: boolean;\n\n /**\n * Custom base URL.\n */\n baseUrl?: string;\n\n /**\n * Skip URL generation if true.\n */\n skip?: boolean;\n}\n\n/**\n * React hook for generating FileProxy URLs.\n *\n * @example\n * ```tsx\n * function AssetImage({ asset }) {\n * const url = useFileProxyUrl(asset.id, asset.name, {\n * width: 800,\n * format: 'webp',\n * focal: asset.focal_point,\n * });\n *\n * return <img src={url} alt={asset.alt} />;\n * }\n * ```\n */\nexport function useFileProxyUrl(\n id: string | null | undefined,\n name: string | null | undefined,\n options: UseFileProxyUrlOptions = {}\n): string | null {\n return useMemo(() => {\n // Skip if no id or name, or if explicitly skipped\n if (!id || !name || options.skip) {\n return null;\n }\n\n const builder = new FileProxyBuilder(id, name, options.baseUrl);\n\n // Apply options\n if (options.width !== undefined) {\n builder.width(options.width);\n }\n if (options.height !== undefined) {\n builder.height(options.height);\n }\n if (options.quality !== undefined) {\n builder.quality(options.quality);\n }\n if (options.format !== undefined) {\n builder.format(options.format);\n }\n if (options.fit !== undefined) {\n builder.fit(options.fit);\n }\n if (options.focal) {\n builder.focalFromString(options.focal);\n }\n if (options.raw) {\n builder.raw(true);\n }\n if (options.processSvg) {\n builder.processSvg(true);\n }\n\n return builder.build();\n }, [\n id,\n name,\n options.width,\n options.height,\n options.quality,\n options.format,\n options.fit,\n options.focal,\n options.raw,\n options.processSvg,\n options.baseUrl,\n options.skip,\n ]);\n}\n\n/**\n * React hook for generating responsive image srcset.\n *\n * @example\n * ```tsx\n * function ResponsiveImage({ asset }) {\n * const { src, srcSet, sizes } = useResponsiveImageUrl(asset.id, asset.name, {\n * widths: [400, 800, 1200, 1600],\n * sizes: '(max-width: 600px) 100vw, 50vw',\n * });\n *\n * return <img src={src} srcSet={srcSet} sizes={sizes} alt={asset.alt} />;\n * }\n * ```\n */\nexport function useResponsiveImageUrl(\n id: string | null | undefined,\n name: string | null | undefined,\n options: {\n widths: number[];\n sizes?: string;\n format?: ImageFormat;\n quality?: number;\n focal?: string | null;\n baseUrl?: string;\n }\n): {\n src: string | null;\n srcSet: string | null;\n sizes: string | undefined;\n} {\n return useMemo(() => {\n if (!id || !name || options.widths.length === 0) {\n return { src: null, srcSet: null, sizes: undefined };\n }\n\n const sortedWidths = [...options.widths].sort((a, b) => a - b);\n const defaultWidth = sortedWidths[Math.floor(sortedWidths.length / 2)];\n\n // Generate default src\n const srcBuilder = new FileProxyBuilder(id, name, options.baseUrl)\n .width(defaultWidth);\n\n if (options.format) srcBuilder.format(options.format);\n if (options.quality) srcBuilder.quality(options.quality);\n if (options.focal) srcBuilder.focalFromString(options.focal);\n\n const src = srcBuilder.build();\n\n // Generate srcSet\n const srcSetParts = sortedWidths.map((width) => {\n const builder = new FileProxyBuilder(id, name, options.baseUrl)\n .width(width);\n\n if (options.format) builder.format(options.format);\n if (options.quality) builder.quality(options.quality);\n if (options.focal) builder.focalFromString(options.focal);\n\n return `${builder.build()} ${width}w`;\n });\n\n return {\n src,\n srcSet: srcSetParts.join(', '),\n sizes: options.sizes,\n };\n }, [\n id,\n name,\n options.widths,\n options.sizes,\n options.format,\n options.quality,\n options.focal,\n options.baseUrl,\n ]);\n}\n"],"names":[],"mappings":";;AA2EO,SAAS,gBACd,IACA,MACA,UAAkC,CAAA,GACnB;AACf,SAAO,QAAQ,MAAM;AAEnB,QAAI,CAAC,MAAM,CAAC,QAAQ,QAAQ,MAAM;AAChC,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,IAAI,iBAAiB,IAAI,MAAM,QAAQ,OAAO;AAG9D,QAAI,QAAQ,UAAU,QAAW;AAC/B,cAAQ,MAAM,QAAQ,KAAK;AAAA,IAC7B;AACA,QAAI,QAAQ,WAAW,QAAW;AAChC,cAAQ,OAAO,QAAQ,MAAM;AAAA,IAC/B;AACA,QAAI,QAAQ,YAAY,QAAW;AACjC,cAAQ,QAAQ,QAAQ,OAAO;AAAA,IACjC;AACA,QAAI,QAAQ,WAAW,QAAW;AAChC,cAAQ,OAAO,QAAQ,MAAM;AAAA,IAC/B;AACA,QAAI,QAAQ,QAAQ,QAAW;AAC7B,cAAQ,IAAI,QAAQ,GAAG;AAAA,IACzB;AACA,QAAI,QAAQ,OAAO;AACjB,cAAQ,gBAAgB,QAAQ,KAAK;AAAA,IACvC;AACA,QAAI,QAAQ,KAAK;AACf,cAAQ,IAAI,IAAI;AAAA,IAClB;AACA,QAAI,QAAQ,YAAY;AACtB,cAAQ,WAAW,IAAI;AAAA,IACzB;AAEA,WAAO,QAAQ,MAAA;AAAA,EACjB,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EAAA,CACT;AACH;AAiBO,SAAS,sBACd,IACA,MACA,SAYA;AACA,SAAO,QAAQ,MAAM;AACnB,QAAI,CAAC,MAAM,CAAC,QAAQ,QAAQ,OAAO,WAAW,GAAG;AAC/C,aAAO,EAAE,KAAK,MAAM,QAAQ,MAAM,OAAO,OAAA;AAAA,IAC3C;AAEA,UAAM,eAAe,CAAC,GAAG,QAAQ,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAC7D,UAAM,eAAe,aAAa,KAAK,MAAM,aAAa,SAAS,CAAC,CAAC;AAGrE,UAAM,aAAa,IAAI,iBAAiB,IAAI,MAAM,QAAQ,OAAO,EAC9D,MAAM,YAAY;AAErB,QAAI,QAAQ,OAAQ,YAAW,OAAO,QAAQ,MAAM;AACpD,QAAI,QAAQ,QAAS,YAAW,QAAQ,QAAQ,OAAO;AACvD,QAAI,QAAQ,MAAO,YAAW,gBAAgB,QAAQ,KAAK;AAE3D,UAAM,MAAM,WAAW,MAAA;AAGvB,UAAM,cAAc,aAAa,IAAI,CAAC,UAAU;AAC9C,YAAM,UAAU,IAAI,iBAAiB,IAAI,MAAM,QAAQ,OAAO,EAC3D,MAAM,KAAK;AAEd,UAAI,QAAQ,OAAQ,SAAQ,OAAO,QAAQ,MAAM;AACjD,UAAI,QAAQ,QAAS,SAAQ,QAAQ,QAAQ,OAAO;AACpD,UAAI,QAAQ,MAAO,SAAQ,gBAAgB,QAAQ,KAAK;AAExD,aAAO,GAAG,QAAQ,MAAA,CAAO,IAAI,KAAK;AAAA,IACpC,CAAC;AAED,WAAO;AAAA,MACL;AAAA,MACA,QAAQ,YAAY,KAAK,IAAI;AAAA,MAC7B,OAAO,QAAQ;AAAA,IAAA;AAAA,EAEnB,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EAAA,CACT;AACH;"}
|