@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.
Files changed (86) hide show
  1. package/README.md +833 -0
  2. package/dist/cache/manager.d.ts +47 -0
  3. package/dist/cache/manager.d.ts.map +1 -0
  4. package/dist/cache/manager.js +100 -0
  5. package/dist/cache/manager.js.map +1 -0
  6. package/dist/cli/index.d.ts +7 -0
  7. package/dist/cli/index.d.ts.map +1 -0
  8. package/dist/cli/index.js +159 -0
  9. package/dist/cli/index.js.map +1 -0
  10. package/dist/client.d.ts +221 -0
  11. package/dist/client.d.ts.map +1 -0
  12. package/dist/client.js +310 -0
  13. package/dist/client.js.map +1 -0
  14. package/dist/document/client.d.ts +57 -0
  15. package/dist/document/client.d.ts.map +1 -0
  16. package/dist/document/client.js +176 -0
  17. package/dist/document/client.js.map +1 -0
  18. package/dist/generator/document-generator.d.ts +50 -0
  19. package/dist/generator/document-generator.d.ts.map +1 -0
  20. package/dist/generator/document-generator.js +329 -0
  21. package/dist/generator/document-generator.js.map +1 -0
  22. package/dist/generator/index.d.ts +121 -0
  23. package/dist/generator/index.d.ts.map +1 -0
  24. package/dist/generator/index.js +559 -0
  25. package/dist/generator/index.js.map +1 -0
  26. package/dist/http/client.d.ts +117 -0
  27. package/dist/http/client.d.ts.map +1 -0
  28. package/dist/http/client.js +411 -0
  29. package/dist/http/client.js.map +1 -0
  30. package/dist/index.d.ts +22 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +21 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/media/helper.d.ts +89 -0
  35. package/dist/media/helper.d.ts.map +1 -0
  36. package/dist/media/helper.js +197 -0
  37. package/dist/media/helper.js.map +1 -0
  38. package/dist/media/url-builder.d.ts +142 -0
  39. package/dist/media/url-builder.d.ts.map +1 -0
  40. package/dist/media/url-builder.js +280 -0
  41. package/dist/media/url-builder.js.map +1 -0
  42. package/dist/query/builder.d.ts +270 -0
  43. package/dist/query/builder.d.ts.map +1 -0
  44. package/dist/query/builder.js +731 -0
  45. package/dist/query/builder.js.map +1 -0
  46. package/dist/query/index.d.ts +6 -0
  47. package/dist/query/index.d.ts.map +1 -0
  48. package/dist/query/index.js +5 -0
  49. package/dist/query/index.js.map +1 -0
  50. package/dist/react/hooks.d.ts +42 -0
  51. package/dist/react/hooks.d.ts.map +1 -0
  52. package/dist/react/hooks.js +59 -0
  53. package/dist/react/hooks.js.map +1 -0
  54. package/dist/react/index.d.ts +6 -0
  55. package/dist/react/index.d.ts.map +1 -0
  56. package/dist/react/index.js +6 -0
  57. package/dist/react/index.js.map +1 -0
  58. package/dist/server/index.d.ts +9 -0
  59. package/dist/server/index.d.ts.map +1 -0
  60. package/dist/server/index.js +8 -0
  61. package/dist/server/index.js.map +1 -0
  62. package/dist/server/media-proxy.d.ts +102 -0
  63. package/dist/server/media-proxy.d.ts.map +1 -0
  64. package/dist/server/media-proxy.js +160 -0
  65. package/dist/server/media-proxy.js.map +1 -0
  66. package/dist/shortcodes/index.d.ts +11 -0
  67. package/dist/shortcodes/index.d.ts.map +1 -0
  68. package/dist/shortcodes/index.js +10 -0
  69. package/dist/shortcodes/index.js.map +1 -0
  70. package/dist/shortcodes/parser.d.ts +32 -0
  71. package/dist/shortcodes/parser.d.ts.map +1 -0
  72. package/dist/shortcodes/parser.js +88 -0
  73. package/dist/shortcodes/parser.js.map +1 -0
  74. package/dist/shortcodes/resolver.d.ts +57 -0
  75. package/dist/shortcodes/resolver.d.ts.map +1 -0
  76. package/dist/shortcodes/resolver.js +97 -0
  77. package/dist/shortcodes/resolver.js.map +1 -0
  78. package/dist/shortcodes/types.d.ts +17 -0
  79. package/dist/shortcodes/types.d.ts.map +1 -0
  80. package/dist/shortcodes/types.js +6 -0
  81. package/dist/shortcodes/types.js.map +1 -0
  82. package/dist/types/index.d.ts +134 -0
  83. package/dist/types/index.d.ts.map +1 -0
  84. package/dist/types/index.js +6 -0
  85. package/dist/types/index.js.map +1 -0
  86. 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"}