@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,280 @@
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
+ /**
8
+ * Fluent builder for constructing media URLs with transformations
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * const url = client.imageUrl(article.featuredImage)
13
+ * .width(800)
14
+ * .height(400)
15
+ * .format('webp')
16
+ * .quality(85)
17
+ * .url()
18
+ * ```
19
+ */
20
+ export class ImageUrlBuilder {
21
+ constructor(options) {
22
+ this.options = options;
23
+ this.mediaId = null;
24
+ }
25
+ /**
26
+ * Set the image source from a media field value
27
+ */
28
+ image(source) {
29
+ if (!source) {
30
+ this.mediaId = null;
31
+ return this;
32
+ }
33
+ if (typeof source === 'string') {
34
+ this.mediaId = source;
35
+ }
36
+ else if (source.asset?._ref) {
37
+ this.mediaId = source.asset._ref;
38
+ }
39
+ else {
40
+ this.mediaId = null;
41
+ }
42
+ return this;
43
+ }
44
+ /**
45
+ * Set image width
46
+ */
47
+ width(w) {
48
+ this._width = Math.round(w);
49
+ return this;
50
+ }
51
+ /**
52
+ * Set image height
53
+ */
54
+ height(h) {
55
+ this._height = Math.round(h);
56
+ return this;
57
+ }
58
+ /**
59
+ * Set both width and height
60
+ */
61
+ size(w, h) {
62
+ this._width = Math.round(w);
63
+ this._height = Math.round(h);
64
+ return this;
65
+ }
66
+ /**
67
+ * Set image format
68
+ */
69
+ format(fmt) {
70
+ this._format = fmt;
71
+ return this;
72
+ }
73
+ /**
74
+ * Set image quality (1-100)
75
+ */
76
+ quality(q) {
77
+ this._quality = Math.max(1, Math.min(100, Math.round(q)));
78
+ return this;
79
+ }
80
+ /**
81
+ * Set image fit mode
82
+ */
83
+ fit(mode) {
84
+ this._fit = mode;
85
+ return this;
86
+ }
87
+ /**
88
+ * Use a predefined variant (e.g., 'thumbnail', 'medium', 'large')
89
+ * When a variant is set, other transformations are ignored
90
+ */
91
+ variant(name) {
92
+ this._variant = name;
93
+ return this;
94
+ }
95
+ /**
96
+ * Apply blur effect (0-100)
97
+ */
98
+ blur(amount) {
99
+ this._blur = Math.max(0, Math.min(100, amount));
100
+ return this;
101
+ }
102
+ /**
103
+ * Apply sharpening (0-100)
104
+ */
105
+ sharpen(amount) {
106
+ this._sharpen = Math.max(0, Math.min(100, amount));
107
+ return this;
108
+ }
109
+ /**
110
+ * Convert to grayscale
111
+ */
112
+ grayscale() {
113
+ this._grayscale = true;
114
+ return this;
115
+ }
116
+ // Convenience presets
117
+ /**
118
+ * Preset for thumbnail size (200x200 cover)
119
+ */
120
+ thumbnail() {
121
+ return this.variant('thumbnail');
122
+ }
123
+ /**
124
+ * Preset for medium size
125
+ */
126
+ medium() {
127
+ return this.variant('medium');
128
+ }
129
+ /**
130
+ * Preset for large size
131
+ */
132
+ large() {
133
+ return this.variant('large');
134
+ }
135
+ /**
136
+ * Get the original file without transformations
137
+ */
138
+ original() {
139
+ this._variant = 'original';
140
+ return this;
141
+ }
142
+ /**
143
+ * Auto-select best format for browser
144
+ */
145
+ auto() {
146
+ this._format = 'auto';
147
+ return this;
148
+ }
149
+ /**
150
+ * Build and return the URL string
151
+ */
152
+ url() {
153
+ if (!this.mediaId) {
154
+ return null;
155
+ }
156
+ const isProxy = !!this.options.proxyPath;
157
+ // When using proxyPath, it replaces the full path (e.g., '/media')
158
+ // When using baseUrl, we need to add /media prefix
159
+ const basePath = isProxy
160
+ ? this.options.proxyPath
161
+ : `${this.options.baseUrl}/media`;
162
+ // Build URL with transformation parameters
163
+ const params = new URLSearchParams();
164
+ // For proxy mode with variants, convert to width params
165
+ if (isProxy && this._variant && this._variant !== 'original') {
166
+ const variantWidths = {
167
+ thumbnail: 300,
168
+ medium: 800,
169
+ large: 1200
170
+ };
171
+ const width = variantWidths[this._variant];
172
+ if (width) {
173
+ params.set('w', width.toString());
174
+ }
175
+ }
176
+ else {
177
+ // Use explicit width/height if set
178
+ if (this._width)
179
+ params.set('w', this._width.toString());
180
+ if (this._height)
181
+ params.set('h', this._height.toString());
182
+ }
183
+ if (this._format && this._format !== 'auto')
184
+ params.set('fm', this._format);
185
+ if (this._quality)
186
+ params.set('q', this._quality.toString());
187
+ if (this._fit)
188
+ params.set('fit', this._fit);
189
+ if (this._blur)
190
+ params.set('blur', this._blur.toString());
191
+ if (this._sharpen)
192
+ params.set('sharp', this._sharpen.toString());
193
+ if (this._grayscale)
194
+ params.set('grayscale', '1');
195
+ const queryString = params.toString();
196
+ // For non-proxy mode with variants, use the /variants/ path
197
+ if (!isProxy && this._variant) {
198
+ if (this._variant === 'original') {
199
+ return `${basePath}/${this.mediaId}/file`;
200
+ }
201
+ return `${basePath}/${this.mediaId}/variants/${this._variant}`;
202
+ }
203
+ // Return URL with query params
204
+ return `${basePath}/${this.mediaId}/file${queryString ? `?${queryString}` : ''}`;
205
+ }
206
+ /**
207
+ * Build URL string (alias for url())
208
+ */
209
+ toString() {
210
+ return this.url() || '';
211
+ }
212
+ }
213
+ /**
214
+ * Create an image URL builder factory
215
+ */
216
+ export function createImageUrlBuilder(options) {
217
+ return function urlFor(source) {
218
+ return new ImageUrlBuilder(options).image(source);
219
+ };
220
+ }
221
+ /**
222
+ * Get responsive srcset for an image
223
+ *
224
+ * @example
225
+ * ```typescript
226
+ * const srcset = getSrcSet(article.image, {
227
+ * baseUrl: 'http://localhost:3000/api',
228
+ * widths: [400, 800, 1200]
229
+ * })
230
+ * // Returns: "/media/abc123/file?w=400 400w, /media/abc123/file?w=800 800w, ..."
231
+ * ```
232
+ */
233
+ export function getSrcSet(source, options) {
234
+ if (!source?.asset?._ref) {
235
+ return null;
236
+ }
237
+ const mediaId = source.asset._ref;
238
+ const isProxy = !!options.proxyPath;
239
+ // When using proxyPath, it replaces the full path (e.g., '/media')
240
+ // When using baseUrl, we need to add /media prefix
241
+ const basePath = isProxy
242
+ ? options.proxyPath
243
+ : `${options.baseUrl}/media`;
244
+ // If using named variants (only for non-proxy mode)
245
+ if (options.variants && !isProxy) {
246
+ const variantWidths = {
247
+ thumbnail: 300,
248
+ medium: 800,
249
+ large: 1200,
250
+ original: 1920
251
+ };
252
+ return options.variants
253
+ .map(variant => {
254
+ const width = variantWidths[variant] || 800;
255
+ const url = variant === 'original'
256
+ ? `${basePath}/${mediaId}/file`
257
+ : `${basePath}/${mediaId}/variants/${variant}`;
258
+ return `${url} ${width}w`;
259
+ })
260
+ .join(', ');
261
+ }
262
+ // Use custom widths or defaults (works for both proxy and non-proxy)
263
+ const widths = options.widths || [400, 800, 1200, 1920];
264
+ return widths
265
+ .map(w => `${basePath}/${mediaId}/file?w=${w} ${w}w`)
266
+ .join(', ');
267
+ }
268
+ /**
269
+ * Get the best variant for a given viewport width
270
+ */
271
+ export function getBestVariant(maxWidth) {
272
+ if (maxWidth <= 200)
273
+ return 'thumbnail';
274
+ if (maxWidth <= 800)
275
+ return 'medium';
276
+ if (maxWidth <= 1200)
277
+ return 'large';
278
+ return 'original';
279
+ }
280
+ //# sourceMappingURL=url-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-builder.js","sourceRoot":"","sources":["../../src/media/url-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,270 @@
1
+ /**
2
+ * Fluent Query Builder
3
+ * Provides a chainable API for building document queries with reference expansion
4
+ */
5
+ import type { HttpClient } from '../http/client.js';
6
+ import type { CacheManager } from '../cache/manager.js';
7
+ import type { BaseDocument } from '../types/index.js';
8
+ export interface QueryBuilderOptions {
9
+ /** Use cache for this query */
10
+ useCache?: boolean;
11
+ /** Disable cache busting timestamp */
12
+ noTimestamp?: boolean;
13
+ }
14
+ export interface ExpandConfig {
15
+ /** Field name to expand */
16
+ field: string;
17
+ /** Whether it's an array of references */
18
+ isArray?: boolean;
19
+ /** Nested expansions */
20
+ expand?: string[];
21
+ }
22
+ /**
23
+ * Fluent query builder for Trokky documents
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * const articles = await client
28
+ * .from('article')
29
+ * .published()
30
+ * .expand('category')
31
+ * .expand('author')
32
+ * .sort({ _createdAt: 'desc' })
33
+ * .limit(10)
34
+ * .fetch()
35
+ * ```
36
+ */
37
+ export declare class QueryBuilder<T extends BaseDocument = BaseDocument> {
38
+ private http;
39
+ private cache;
40
+ private _type;
41
+ private _filter;
42
+ private _sort;
43
+ private _limit?;
44
+ private _offset?;
45
+ private _select?;
46
+ private _expand;
47
+ private _options;
48
+ constructor(http: HttpClient, cache: CacheManager, type: string);
49
+ /**
50
+ * Filter by published status (_status === 'published')
51
+ */
52
+ published(): this;
53
+ /**
54
+ * Filter by draft status (_status === 'draft')
55
+ */
56
+ draft(): this;
57
+ /**
58
+ * Add filter conditions
59
+ * @param conditions Filter object or field name
60
+ * @param value Value if first param is field name
61
+ */
62
+ where(conditions: Record<string, any>): this;
63
+ where(field: string, value: any): this;
64
+ /**
65
+ * Add equality filter
66
+ */
67
+ eq(field: string, value: any): this;
68
+ /**
69
+ * Add not-equal filter
70
+ */
71
+ neq(field: string, value: any): this;
72
+ /**
73
+ * Add greater-than filter
74
+ */
75
+ gt(field: string, value: any): this;
76
+ /**
77
+ * Add greater-than-or-equal filter
78
+ */
79
+ gte(field: string, value: any): this;
80
+ /**
81
+ * Add less-than filter
82
+ */
83
+ lt(field: string, value: any): this;
84
+ /**
85
+ * Add less-than-or-equal filter
86
+ */
87
+ lte(field: string, value: any): this;
88
+ /**
89
+ * Add in-array filter
90
+ */
91
+ in(field: string, values: any[]): this;
92
+ /**
93
+ * Add not-in-array filter
94
+ */
95
+ notIn(field: string, values: any[]): this;
96
+ /**
97
+ * Add text search filter
98
+ */
99
+ search(term: string, fields?: string[]): this;
100
+ /**
101
+ * Expand a reference field (resolve the reference to full document)
102
+ * @param field Field name to expand. Use 'field[]' syntax for array references
103
+ */
104
+ expand(field: string): this;
105
+ /**
106
+ * Set sort order
107
+ * @param sortConfig Sort configuration object
108
+ */
109
+ sort(sortConfig: Record<string, 'asc' | 'desc' | 1 | -1>): this;
110
+ /**
111
+ * Sort by field ascending
112
+ */
113
+ sortAsc(field: string): this;
114
+ /**
115
+ * Sort by field descending
116
+ */
117
+ sortDesc(field: string): this;
118
+ /**
119
+ * Sort by creation date (newest first)
120
+ */
121
+ newest(): this;
122
+ /**
123
+ * Sort by creation date (oldest first)
124
+ */
125
+ oldest(): this;
126
+ /**
127
+ * Limit number of results
128
+ */
129
+ limit(count: number): this;
130
+ /**
131
+ * Skip first N results
132
+ */
133
+ offset(count: number): this;
134
+ /**
135
+ * Skip first N results (alias for offset)
136
+ */
137
+ skip(count: number): this;
138
+ /**
139
+ * Select specific fields only
140
+ */
141
+ select(...fields: string[]): this;
142
+ /**
143
+ * Disable caching for this query
144
+ */
145
+ noCache(): this;
146
+ /**
147
+ * Add cache-busting timestamp to prevent stale data
148
+ */
149
+ fresh(): this;
150
+ /**
151
+ * Execute the query and return results
152
+ */
153
+ fetch(): Promise<T[]>;
154
+ /**
155
+ * Execute the query and return results with metadata
156
+ */
157
+ fetchWithMeta(): Promise<{
158
+ documents: T[];
159
+ total?: number;
160
+ offset?: number;
161
+ limit?: number;
162
+ hasMore?: boolean;
163
+ }>;
164
+ /**
165
+ * Get first result or null
166
+ */
167
+ first(): Promise<T | null>;
168
+ /**
169
+ * Get count of matching documents
170
+ */
171
+ count(): Promise<number>;
172
+ /**
173
+ * Check if any documents match the query
174
+ */
175
+ exists(): Promise<boolean>;
176
+ /**
177
+ * Check if references have already been expanded by the server
178
+ */
179
+ private hasExpandedReferences;
180
+ /**
181
+ * Expand references in documents
182
+ */
183
+ private expandReferences;
184
+ /**
185
+ * Check if a value is a reference object
186
+ */
187
+ private isReference;
188
+ /**
189
+ * Get a nested value from an object using dot notation path
190
+ * @param obj The object to traverse
191
+ * @param path Dot-separated path (e.g., 'documentation.featuredDocument')
192
+ */
193
+ private getNestedValue;
194
+ /**
195
+ * Set a nested value in an object using dot notation path
196
+ * @param obj The object to modify
197
+ * @param path Dot-separated path (e.g., 'documentation.featuredDocument')
198
+ * @param value The value to set
199
+ */
200
+ private setNestedValue;
201
+ /**
202
+ * Infer type from reference ID (e.g., 'category-abc123' -> 'category')
203
+ */
204
+ private inferTypeFromRef;
205
+ /**
206
+ * Extract document from API response
207
+ */
208
+ private extractDocument;
209
+ /**
210
+ * Fetch a single referenced document
211
+ */
212
+ private fetchReference;
213
+ }
214
+ /**
215
+ * Singleton query builder for fetching a single document by type
216
+ */
217
+ export declare class SingletonBuilder<T extends BaseDocument = BaseDocument> {
218
+ private http;
219
+ private cache;
220
+ private _type;
221
+ private _id?;
222
+ private _expand;
223
+ private _options;
224
+ constructor(http: HttpClient, cache: CacheManager, _type: string, _id?: string | undefined);
225
+ /**
226
+ * Expand a reference field
227
+ */
228
+ expand(field: string): this;
229
+ /**
230
+ * Disable caching
231
+ */
232
+ noCache(): this;
233
+ /**
234
+ * Fetch fresh data with cache busting
235
+ */
236
+ fresh(): this;
237
+ /**
238
+ * Execute and return the singleton document
239
+ */
240
+ fetch(): Promise<T | null>;
241
+ /**
242
+ * Check if references have already been expanded by the server
243
+ */
244
+ private hasExpandedReferences;
245
+ /**
246
+ * Expand references in a single document
247
+ */
248
+ private expandReferences;
249
+ private isReference;
250
+ /**
251
+ * Get a nested value from an object using dot notation path
252
+ * @param obj The object to traverse
253
+ * @param path Dot-separated path (e.g., 'documentation.featuredDocument')
254
+ */
255
+ private getNestedValue;
256
+ /**
257
+ * Set a nested value in an object using dot notation path
258
+ * @param obj The object to modify
259
+ * @param path Dot-separated path (e.g., 'documentation.featuredDocument')
260
+ * @param value The value to set
261
+ */
262
+ private setNestedValue;
263
+ private inferTypeFromRef;
264
+ /**
265
+ * Extract document from API response
266
+ */
267
+ private extractDocument;
268
+ private fetchReference;
269
+ }
270
+ //# sourceMappingURL=builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/query/builder.ts"],"names":[],"mappings":"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"}