@trokky/client 2.0.3
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/README.md +833 -0
- package/dist/cache/manager.d.ts +47 -0
- package/dist/cache/manager.d.ts.map +1 -0
- package/dist/cache/manager.js +100 -0
- package/dist/cache/manager.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +159 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/client.d.ts +221 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +310 -0
- package/dist/client.js.map +1 -0
- package/dist/document/client.d.ts +57 -0
- package/dist/document/client.d.ts.map +1 -0
- package/dist/document/client.js +176 -0
- package/dist/document/client.js.map +1 -0
- package/dist/generator/document-generator.d.ts +50 -0
- package/dist/generator/document-generator.d.ts.map +1 -0
- package/dist/generator/document-generator.js +329 -0
- package/dist/generator/document-generator.js.map +1 -0
- package/dist/generator/index.d.ts +121 -0
- package/dist/generator/index.d.ts.map +1 -0
- package/dist/generator/index.js +559 -0
- package/dist/generator/index.js.map +1 -0
- package/dist/http/client.d.ts +117 -0
- package/dist/http/client.d.ts.map +1 -0
- package/dist/http/client.js +411 -0
- package/dist/http/client.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/media/helper.d.ts +89 -0
- package/dist/media/helper.d.ts.map +1 -0
- package/dist/media/helper.js +197 -0
- package/dist/media/helper.js.map +1 -0
- package/dist/media/url-builder.d.ts +142 -0
- package/dist/media/url-builder.d.ts.map +1 -0
- package/dist/media/url-builder.js +280 -0
- package/dist/media/url-builder.js.map +1 -0
- package/dist/query/builder.d.ts +270 -0
- package/dist/query/builder.d.ts.map +1 -0
- package/dist/query/builder.js +731 -0
- package/dist/query/builder.js.map +1 -0
- package/dist/query/index.d.ts +6 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/index.js +5 -0
- package/dist/query/index.js.map +1 -0
- package/dist/react/hooks.d.ts +42 -0
- package/dist/react/hooks.d.ts.map +1 -0
- package/dist/react/hooks.js +59 -0
- package/dist/react/hooks.js.map +1 -0
- package/dist/react/index.d.ts +6 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +6 -0
- package/dist/react/index.js.map +1 -0
- package/dist/server/index.d.ts +9 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +8 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/media-proxy.d.ts +102 -0
- package/dist/server/media-proxy.d.ts.map +1 -0
- package/dist/server/media-proxy.js +160 -0
- package/dist/server/media-proxy.js.map +1 -0
- package/dist/shortcodes/index.d.ts +11 -0
- package/dist/shortcodes/index.d.ts.map +1 -0
- package/dist/shortcodes/index.js +10 -0
- package/dist/shortcodes/index.js.map +1 -0
- package/dist/shortcodes/parser.d.ts +32 -0
- package/dist/shortcodes/parser.d.ts.map +1 -0
- package/dist/shortcodes/parser.js +88 -0
- package/dist/shortcodes/parser.js.map +1 -0
- package/dist/shortcodes/resolver.d.ts +57 -0
- package/dist/shortcodes/resolver.d.ts.map +1 -0
- package/dist/shortcodes/resolver.js +97 -0
- package/dist/shortcodes/resolver.js.map +1 -0
- package/dist/shortcodes/types.d.ts +17 -0
- package/dist/shortcodes/types.d.ts.map +1 -0
- package/dist/shortcodes/types.js +6 -0
- package/dist/shortcodes/types.js.map +1 -0
- package/dist/types/index.d.ts +134 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +101 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Media Helper Module
|
|
3
|
+
* Utilities for working with Trokky media assets with dynamic variant discovery
|
|
4
|
+
*/
|
|
5
|
+
import type { HttpClient } from '../http/client.js';
|
|
6
|
+
import type { MediaFieldValue } from '@trokky/trokky/types';
|
|
7
|
+
export interface MediaVariant {
|
|
8
|
+
url: string;
|
|
9
|
+
width: number;
|
|
10
|
+
height: number;
|
|
11
|
+
format: string;
|
|
12
|
+
size: number;
|
|
13
|
+
}
|
|
14
|
+
export interface MediaFile {
|
|
15
|
+
id: string;
|
|
16
|
+
url: string;
|
|
17
|
+
filename: string;
|
|
18
|
+
contentType: string;
|
|
19
|
+
size: number;
|
|
20
|
+
metadata?: {
|
|
21
|
+
path?: string;
|
|
22
|
+
extension?: string;
|
|
23
|
+
originalFilename?: string;
|
|
24
|
+
imageVariants?: Record<string, MediaVariant>;
|
|
25
|
+
originalDimensions?: {
|
|
26
|
+
width: number;
|
|
27
|
+
height: number;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
_createdAt: string;
|
|
31
|
+
}
|
|
32
|
+
export interface MediaResponse {
|
|
33
|
+
success: boolean;
|
|
34
|
+
data: {
|
|
35
|
+
file: MediaFile;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Media helper class for working with media assets
|
|
40
|
+
*/
|
|
41
|
+
export declare class MediaHelper {
|
|
42
|
+
private http;
|
|
43
|
+
private metadataCache;
|
|
44
|
+
constructor(http: HttpClient);
|
|
45
|
+
/**
|
|
46
|
+
* Fetch media metadata to check available variants
|
|
47
|
+
*/
|
|
48
|
+
fetchMetadata(mediaId: string): Promise<MediaFile | null>;
|
|
49
|
+
/**
|
|
50
|
+
* Get the URL for a media asset
|
|
51
|
+
* @param mediaAsset The media asset reference
|
|
52
|
+
* @param variant The desired variant name (e.g., 'thumbnail', 'preview', or any custom variant)
|
|
53
|
+
* @returns The media URL or null if not available
|
|
54
|
+
*/
|
|
55
|
+
getUrl(mediaAsset: MediaFieldValue | null | undefined, variant?: string): string | null;
|
|
56
|
+
/**
|
|
57
|
+
* Validate and get the best available media URL
|
|
58
|
+
* Checks if variant exists and falls back to original if not
|
|
59
|
+
*/
|
|
60
|
+
getValidatedUrl(mediaAsset: MediaFieldValue | null | undefined, variant?: string): Promise<string | null>;
|
|
61
|
+
/**
|
|
62
|
+
* Get the best image URL for a given max width
|
|
63
|
+
* This method dynamically discovers available variants and chooses the best one
|
|
64
|
+
*/
|
|
65
|
+
getBestUrlForWidth(mediaAsset: MediaFieldValue | null | undefined, maxWidth: number): Promise<string | null>;
|
|
66
|
+
/**
|
|
67
|
+
* Get available variants for a media asset
|
|
68
|
+
* Returns an array of variant names that are available
|
|
69
|
+
*/
|
|
70
|
+
getAvailableVariants(mediaAsset: MediaFieldValue | null | undefined): Promise<string[]>;
|
|
71
|
+
/**
|
|
72
|
+
* Check if a media asset has a specific variant
|
|
73
|
+
*/
|
|
74
|
+
hasVariant(mediaAsset: MediaFieldValue | null | undefined, variant: string): Promise<boolean>;
|
|
75
|
+
/**
|
|
76
|
+
* Get all variant URLs for a media asset
|
|
77
|
+
* Returns an object with variant names as keys and URLs as values
|
|
78
|
+
*/
|
|
79
|
+
getAllVariantUrls(mediaAsset: MediaFieldValue | null | undefined): Promise<Record<string, string>>;
|
|
80
|
+
/**
|
|
81
|
+
* Clear the metadata cache
|
|
82
|
+
*/
|
|
83
|
+
clearCache(): void;
|
|
84
|
+
/**
|
|
85
|
+
* Clear cache for a specific media ID
|
|
86
|
+
*/
|
|
87
|
+
clearCacheFor(mediaId: string): void;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=helper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helper.d.ts","sourceRoot":"","sources":["../../src/media/helper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAE3D,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE;QACT,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,gBAAgB,CAAC,EAAE,MAAM,CAAA;QACzB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;QAC5C,kBAAkB,CAAC,EAAE;YACnB,KAAK,EAAE,MAAM,CAAA;YACb,MAAM,EAAE,MAAM,CAAA;SACf,CAAA;KACF,CAAA;IACD,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS,CAAA;KAChB,CAAA;CACF;AAED;;GAEG;AACH,qBAAa,WAAW;IAGV,OAAO,CAAC,IAAI;IAFxB,OAAO,CAAC,aAAa,CAA+C;gBAEhD,IAAI,EAAE,UAAU;IAEpC;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAkB/D;;;;;OAKG;IACH,MAAM,CACJ,UAAU,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,EAC9C,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,GAAG,IAAI;IAgBhB;;;OAGG;IACG,eAAe,CACnB,UAAU,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,EAC9C,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAyCzB;;;OAGG;IACG,kBAAkB,CACtB,UAAU,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,EAC9C,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAqDzB;;;OAGG;IACG,oBAAoB,CACxB,UAAU,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,GAC7C,OAAO,CAAC,MAAM,EAAE,CAAC;IAiBpB;;OAEG;IACG,UAAU,CACd,UAAU,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,EAC9C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC;IAenB;;;OAGG;IACG,iBAAiB,CACrB,UAAU,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,GAC7C,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAsBlC;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAGrC"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Media Helper Module
|
|
3
|
+
* Utilities for working with Trokky media assets with dynamic variant discovery
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Media helper class for working with media assets
|
|
7
|
+
*/
|
|
8
|
+
export class MediaHelper {
|
|
9
|
+
constructor(http) {
|
|
10
|
+
this.http = http;
|
|
11
|
+
this.metadataCache = new Map();
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Fetch media metadata to check available variants
|
|
15
|
+
*/
|
|
16
|
+
async fetchMetadata(mediaId) {
|
|
17
|
+
const cacheKey = mediaId;
|
|
18
|
+
if (this.metadataCache.has(cacheKey)) {
|
|
19
|
+
return this.metadataCache.get(cacheKey);
|
|
20
|
+
}
|
|
21
|
+
const promise = this.http.get(`/media/${mediaId}`)
|
|
22
|
+
.then(response => response?.data?.file || null)
|
|
23
|
+
.catch(error => {
|
|
24
|
+
console.warn(`Failed to fetch media metadata for ${mediaId}:`, error);
|
|
25
|
+
return null;
|
|
26
|
+
});
|
|
27
|
+
this.metadataCache.set(cacheKey, promise);
|
|
28
|
+
return promise;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get the URL for a media asset
|
|
32
|
+
* @param mediaAsset The media asset reference
|
|
33
|
+
* @param variant The desired variant name (e.g., 'thumbnail', 'preview', or any custom variant)
|
|
34
|
+
* @returns The media URL or null if not available
|
|
35
|
+
*/
|
|
36
|
+
getUrl(mediaAsset, variant) {
|
|
37
|
+
if (!mediaAsset?.asset?._ref) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
const mediaId = mediaAsset.asset._ref;
|
|
41
|
+
const baseUrl = this.http.getBaseUrl();
|
|
42
|
+
if (!variant || variant === 'original') {
|
|
43
|
+
return `${baseUrl}/media/${mediaId}/file`;
|
|
44
|
+
}
|
|
45
|
+
// Return optimistic URL for SSR/SSG
|
|
46
|
+
return `${baseUrl}/media/${mediaId}/variants/${variant}`;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Validate and get the best available media URL
|
|
50
|
+
* Checks if variant exists and falls back to original if not
|
|
51
|
+
*/
|
|
52
|
+
async getValidatedUrl(mediaAsset, variant) {
|
|
53
|
+
if (!mediaAsset?.asset?._ref) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
const mediaId = mediaAsset.asset._ref;
|
|
57
|
+
const baseUrl = this.http.getBaseUrl();
|
|
58
|
+
// Always have original as fallback
|
|
59
|
+
const originalUrl = `${baseUrl}/media/${mediaId}/file`;
|
|
60
|
+
if (!variant || variant === 'original') {
|
|
61
|
+
return originalUrl;
|
|
62
|
+
}
|
|
63
|
+
// Fetch metadata to check if variant exists
|
|
64
|
+
const metadata = await this.fetchMetadata(mediaId);
|
|
65
|
+
if (!metadata) {
|
|
66
|
+
// If we can't fetch metadata, return original as safe fallback
|
|
67
|
+
return originalUrl;
|
|
68
|
+
}
|
|
69
|
+
// Check if the specific variant exists
|
|
70
|
+
const variantExists = metadata.metadata?.imageVariants?.[variant];
|
|
71
|
+
if (variantExists) {
|
|
72
|
+
return `${baseUrl}/media/${mediaId}/variants/${variant}`;
|
|
73
|
+
}
|
|
74
|
+
// Try thumbnail as a fallback (it's always generated)
|
|
75
|
+
if (variant !== 'thumbnail' && metadata.metadata?.imageVariants?.['thumbnail']) {
|
|
76
|
+
console.warn(`Variant '${variant}' not found for media ${mediaId}, using thumbnail`);
|
|
77
|
+
return `${baseUrl}/media/${mediaId}/variants/thumbnail`;
|
|
78
|
+
}
|
|
79
|
+
// Final fallback to original
|
|
80
|
+
console.warn(`No variants found for media ${mediaId}, using original`);
|
|
81
|
+
return originalUrl;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Get the best image URL for a given max width
|
|
85
|
+
* This method dynamically discovers available variants and chooses the best one
|
|
86
|
+
*/
|
|
87
|
+
async getBestUrlForWidth(mediaAsset, maxWidth) {
|
|
88
|
+
if (!mediaAsset?.asset?._ref) {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
const mediaId = mediaAsset.asset._ref;
|
|
92
|
+
const baseUrl = this.http.getBaseUrl();
|
|
93
|
+
const originalUrl = `${baseUrl}/media/${mediaId}/file`;
|
|
94
|
+
// Fetch metadata to discover available variants
|
|
95
|
+
const metadata = await this.fetchMetadata(mediaId);
|
|
96
|
+
if (!metadata?.metadata?.imageVariants) {
|
|
97
|
+
// No variants available, return original
|
|
98
|
+
return originalUrl;
|
|
99
|
+
}
|
|
100
|
+
// Find the best variant based on width
|
|
101
|
+
const variants = metadata.metadata.imageVariants;
|
|
102
|
+
let bestVariant = null;
|
|
103
|
+
let closestLarger = null;
|
|
104
|
+
let closestSmaller = null;
|
|
105
|
+
for (const [name, variant] of Object.entries(variants)) {
|
|
106
|
+
if (!variant)
|
|
107
|
+
continue;
|
|
108
|
+
if (variant.width === maxWidth) {
|
|
109
|
+
// Exact match
|
|
110
|
+
bestVariant = { name, variant };
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
else if (variant.width > maxWidth) {
|
|
114
|
+
// Larger than needed
|
|
115
|
+
if (!closestLarger || variant.width < closestLarger.variant.width) {
|
|
116
|
+
closestLarger = { name, variant };
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
// Smaller than needed
|
|
121
|
+
if (!closestSmaller || variant.width > closestSmaller.variant.width) {
|
|
122
|
+
closestSmaller = { name, variant };
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Choose the best variant: exact match > closest larger > closest smaller > original
|
|
127
|
+
const chosen = bestVariant || closestLarger || closestSmaller;
|
|
128
|
+
if (chosen) {
|
|
129
|
+
return `${baseUrl}/media/${mediaId}/variants/${chosen.name}`;
|
|
130
|
+
}
|
|
131
|
+
return originalUrl;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Get available variants for a media asset
|
|
135
|
+
* Returns an array of variant names that are available
|
|
136
|
+
*/
|
|
137
|
+
async getAvailableVariants(mediaAsset) {
|
|
138
|
+
if (!mediaAsset?.asset?._ref) {
|
|
139
|
+
return [];
|
|
140
|
+
}
|
|
141
|
+
const mediaId = mediaAsset.asset._ref;
|
|
142
|
+
const metadata = await this.fetchMetadata(mediaId);
|
|
143
|
+
const variants = ['original']; // Always have original
|
|
144
|
+
if (metadata?.metadata?.imageVariants) {
|
|
145
|
+
variants.push(...Object.keys(metadata.metadata.imageVariants));
|
|
146
|
+
}
|
|
147
|
+
return variants;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Check if a media asset has a specific variant
|
|
151
|
+
*/
|
|
152
|
+
async hasVariant(mediaAsset, variant) {
|
|
153
|
+
if (!mediaAsset?.asset?._ref) {
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
if (!variant || variant === 'original') {
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
const mediaId = mediaAsset.asset._ref;
|
|
160
|
+
const metadata = await this.fetchMetadata(mediaId);
|
|
161
|
+
return !!metadata?.metadata?.imageVariants?.[variant];
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Get all variant URLs for a media asset
|
|
165
|
+
* Returns an object with variant names as keys and URLs as values
|
|
166
|
+
*/
|
|
167
|
+
async getAllVariantUrls(mediaAsset) {
|
|
168
|
+
if (!mediaAsset?.asset?._ref) {
|
|
169
|
+
return {};
|
|
170
|
+
}
|
|
171
|
+
const mediaId = mediaAsset.asset._ref;
|
|
172
|
+
const baseUrl = this.http.getBaseUrl();
|
|
173
|
+
const metadata = await this.fetchMetadata(mediaId);
|
|
174
|
+
const urls = {
|
|
175
|
+
original: `${baseUrl}/media/${mediaId}/file`
|
|
176
|
+
};
|
|
177
|
+
if (metadata?.metadata?.imageVariants) {
|
|
178
|
+
for (const variantName of Object.keys(metadata.metadata.imageVariants)) {
|
|
179
|
+
urls[variantName] = `${baseUrl}/media/${mediaId}/variants/${variantName}`;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return urls;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Clear the metadata cache
|
|
186
|
+
*/
|
|
187
|
+
clearCache() {
|
|
188
|
+
this.metadataCache.clear();
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Clear cache for a specific media ID
|
|
192
|
+
*/
|
|
193
|
+
clearCacheFor(mediaId) {
|
|
194
|
+
this.metadataCache.delete(mediaId);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helper.js","sourceRoot":"","sources":["../../src/media/helper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fluent Image URL Builder
|
|
3
|
+
* Provides a chainable API for building media URLs with transformations
|
|
4
|
+
*
|
|
5
|
+
* Inspired by Sanity's @sanity/image-url builder
|
|
6
|
+
*/
|
|
7
|
+
import type { MediaFieldValue } from '@trokky/trokky/types';
|
|
8
|
+
export interface ImageUrlBuilderOptions {
|
|
9
|
+
/** Base URL for media API */
|
|
10
|
+
baseUrl: string;
|
|
11
|
+
/** Use proxy path instead of direct API URL */
|
|
12
|
+
proxyPath?: string;
|
|
13
|
+
}
|
|
14
|
+
export type ImageFormat = 'webp' | 'jpeg' | 'jpg' | 'png' | 'avif' | 'auto';
|
|
15
|
+
export type ImageFit = 'cover' | 'contain' | 'fill' | 'inside' | 'outside';
|
|
16
|
+
/**
|
|
17
|
+
* Fluent builder for constructing media URLs with transformations
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* const url = client.imageUrl(article.featuredImage)
|
|
22
|
+
* .width(800)
|
|
23
|
+
* .height(400)
|
|
24
|
+
* .format('webp')
|
|
25
|
+
* .quality(85)
|
|
26
|
+
* .url()
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export declare class ImageUrlBuilder {
|
|
30
|
+
private options;
|
|
31
|
+
private mediaId;
|
|
32
|
+
private _width?;
|
|
33
|
+
private _height?;
|
|
34
|
+
private _format?;
|
|
35
|
+
private _quality?;
|
|
36
|
+
private _fit?;
|
|
37
|
+
private _variant?;
|
|
38
|
+
private _blur?;
|
|
39
|
+
private _sharpen?;
|
|
40
|
+
private _grayscale?;
|
|
41
|
+
constructor(options: ImageUrlBuilderOptions);
|
|
42
|
+
/**
|
|
43
|
+
* Set the image source from a media field value
|
|
44
|
+
*/
|
|
45
|
+
image(source: MediaFieldValue | string | null | undefined): this;
|
|
46
|
+
/**
|
|
47
|
+
* Set image width
|
|
48
|
+
*/
|
|
49
|
+
width(w: number): this;
|
|
50
|
+
/**
|
|
51
|
+
* Set image height
|
|
52
|
+
*/
|
|
53
|
+
height(h: number): this;
|
|
54
|
+
/**
|
|
55
|
+
* Set both width and height
|
|
56
|
+
*/
|
|
57
|
+
size(w: number, h: number): this;
|
|
58
|
+
/**
|
|
59
|
+
* Set image format
|
|
60
|
+
*/
|
|
61
|
+
format(fmt: ImageFormat): this;
|
|
62
|
+
/**
|
|
63
|
+
* Set image quality (1-100)
|
|
64
|
+
*/
|
|
65
|
+
quality(q: number): this;
|
|
66
|
+
/**
|
|
67
|
+
* Set image fit mode
|
|
68
|
+
*/
|
|
69
|
+
fit(mode: ImageFit): this;
|
|
70
|
+
/**
|
|
71
|
+
* Use a predefined variant (e.g., 'thumbnail', 'medium', 'large')
|
|
72
|
+
* When a variant is set, other transformations are ignored
|
|
73
|
+
*/
|
|
74
|
+
variant(name: string): this;
|
|
75
|
+
/**
|
|
76
|
+
* Apply blur effect (0-100)
|
|
77
|
+
*/
|
|
78
|
+
blur(amount: number): this;
|
|
79
|
+
/**
|
|
80
|
+
* Apply sharpening (0-100)
|
|
81
|
+
*/
|
|
82
|
+
sharpen(amount: number): this;
|
|
83
|
+
/**
|
|
84
|
+
* Convert to grayscale
|
|
85
|
+
*/
|
|
86
|
+
grayscale(): this;
|
|
87
|
+
/**
|
|
88
|
+
* Preset for thumbnail size (200x200 cover)
|
|
89
|
+
*/
|
|
90
|
+
thumbnail(): this;
|
|
91
|
+
/**
|
|
92
|
+
* Preset for medium size
|
|
93
|
+
*/
|
|
94
|
+
medium(): this;
|
|
95
|
+
/**
|
|
96
|
+
* Preset for large size
|
|
97
|
+
*/
|
|
98
|
+
large(): this;
|
|
99
|
+
/**
|
|
100
|
+
* Get the original file without transformations
|
|
101
|
+
*/
|
|
102
|
+
original(): this;
|
|
103
|
+
/**
|
|
104
|
+
* Auto-select best format for browser
|
|
105
|
+
*/
|
|
106
|
+
auto(): this;
|
|
107
|
+
/**
|
|
108
|
+
* Build and return the URL string
|
|
109
|
+
*/
|
|
110
|
+
url(): string | null;
|
|
111
|
+
/**
|
|
112
|
+
* Build URL string (alias for url())
|
|
113
|
+
*/
|
|
114
|
+
toString(): string;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Create an image URL builder factory
|
|
118
|
+
*/
|
|
119
|
+
export declare function createImageUrlBuilder(options: ImageUrlBuilderOptions): (source: MediaFieldValue | string | null | undefined) => ImageUrlBuilder;
|
|
120
|
+
/**
|
|
121
|
+
* Get responsive srcset for an image
|
|
122
|
+
*
|
|
123
|
+
* @example
|
|
124
|
+
* ```typescript
|
|
125
|
+
* const srcset = getSrcSet(article.image, {
|
|
126
|
+
* baseUrl: 'http://localhost:3000/api',
|
|
127
|
+
* widths: [400, 800, 1200]
|
|
128
|
+
* })
|
|
129
|
+
* // Returns: "/media/abc123/file?w=400 400w, /media/abc123/file?w=800 800w, ..."
|
|
130
|
+
* ```
|
|
131
|
+
*/
|
|
132
|
+
export declare function getSrcSet(source: MediaFieldValue | null | undefined, options: {
|
|
133
|
+
baseUrl: string;
|
|
134
|
+
proxyPath?: string;
|
|
135
|
+
widths?: number[];
|
|
136
|
+
variants?: string[];
|
|
137
|
+
}): string | null;
|
|
138
|
+
/**
|
|
139
|
+
* Get the best variant for a given viewport width
|
|
140
|
+
*/
|
|
141
|
+
export declare function getBestVariant(maxWidth: number): string;
|
|
142
|
+
//# sourceMappingURL=url-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url-builder.d.ts","sourceRoot":"","sources":["../../src/media/url-builder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAE3D,MAAM,WAAW,sBAAsB;IACrC,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAA;AAC3E,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAA;AAE1E;;;;;;;;;;;;GAYG;AACH,qBAAa,eAAe;IAYd,OAAO,CAAC,OAAO;IAX3B,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,MAAM,CAAC,CAAQ;IACvB,OAAO,CAAC,OAAO,CAAC,CAAQ;IACxB,OAAO,CAAC,OAAO,CAAC,CAAa;IAC7B,OAAO,CAAC,QAAQ,CAAC,CAAQ;IACzB,OAAO,CAAC,IAAI,CAAC,CAAU;IACvB,OAAO,CAAC,QAAQ,CAAC,CAAQ;IACzB,OAAO,CAAC,KAAK,CAAC,CAAQ;IACtB,OAAO,CAAC,QAAQ,CAAC,CAAQ;IACzB,OAAO,CAAC,UAAU,CAAC,CAAS;gBAER,OAAO,EAAE,sBAAsB;IAEnD;;OAEG;IACH,KAAK,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI;IAiBhE;;OAEG;IACH,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAKtB;;OAEG;IACH,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAKvB;;OAEG;IACH,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAMhC;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IAK9B;;OAEG;IACH,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAKxB;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAKzB;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK3B;;OAEG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK1B;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK7B;;OAEG;IACH,SAAS,IAAI,IAAI;IAOjB;;OAEG;IACH,SAAS,IAAI,IAAI;IAIjB;;OAEG;IACH,MAAM,IAAI,IAAI;IAId;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,QAAQ,IAAI,IAAI;IAKhB;;OAEG;IACH,IAAI,IAAI,IAAI;IAKZ;;OAEG;IACH,GAAG,IAAI,MAAM,GAAG,IAAI;IAqDpB;;OAEG;IACH,QAAQ,IAAI,MAAM;CAGnB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,IAC5C,QAAQ,eAAe,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,KAAG,eAAe,CAG7F;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CACvB,MAAM,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,EAC1C,OAAO,EAAE;IACP,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB,GACA,MAAM,GAAG,IAAI,CAuCf;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKvD"}
|