@chanomhub/sdk 1.2.2 → 1.2.4

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 CHANGED
@@ -117,6 +117,28 @@ const sdk = createChanomhubClient({
117
117
  });
118
118
  ```
119
119
 
120
+ ### Safely Handling Images (CDN Fallback)
121
+
122
+ The SDK provides a `getFallbackUrl` utility to handle cases where the CDN image fails to load. This allows your application to gracefully degrade to the original storage URL.
123
+
124
+ ```typescript
125
+ import { getFallbackUrl } from '@chanomhub/sdk';
126
+
127
+ // In your image component (e.g., React/Next.js)
128
+ <img
129
+ src={article.mainImage}
130
+ onError={(e) => {
131
+ // Falls back to direct storage URL (e.g., skips cdn-cgi optimization)
132
+ // You can pass specific config.storageUrl if configured, otherwise it defaults to stripped CDN path
133
+ const fallback = getFallbackUrl(e.currentTarget.src, config.cdnUrl);
134
+
135
+ if (fallback && fallback !== e.currentTarget.src) {
136
+ e.currentTarget.src = fallback;
137
+ }
138
+ }}
139
+ />
140
+ ```
141
+
120
142
  ### Next.js Server Components
121
143
 
122
144
  For Next.js Server Components, use the special helper:
@@ -4,13 +4,20 @@ const vitest_1 = require("vitest");
4
4
  const index_1 = require("../index");
5
5
  const config_1 = require("../config");
6
6
  const CDN_URL = config_1.DEFAULT_CONFIG.cdnUrl;
7
+ const STORAGE_URL = config_1.DEFAULT_CONFIG.storageUrl;
8
+ // Helper to build expected imgproxy URL
9
+ const buildImgproxyUrl = (filename) => {
10
+ const sourceUrl = `${STORAGE_URL}/${filename}`;
11
+ const encodedUrl = encodeURIComponent(sourceUrl);
12
+ return `${CDN_URL}/insecure/plain/${encodedUrl}@webp`;
13
+ };
7
14
  (0, vitest_1.describe)('Chanomhub SDK Integration Tests (MSW)', () => {
8
15
  (0, vitest_1.it)('should fetch and transform articles correctly', async () => {
9
16
  const client = (0, index_1.createChanomhubClient)();
10
17
  const articles = await client.articles.getAll();
11
18
  (0, vitest_1.expect)(articles).toHaveLength(2);
12
- // Check transformation locally (filename only -> full URL)
13
- (0, vitest_1.expect)(articles[0].mainImage).toBe(`${CDN_URL}/article1.jpg`);
19
+ // Check transformation locally (filename only -> imgproxy URL)
20
+ (0, vitest_1.expect)(articles[0].mainImage).toBe(buildImgproxyUrl('article1.jpg'));
14
21
  // Check no double transformation (full URL stays full URL)
15
22
  (0, vitest_1.expect)(articles[1].mainImage).toBe('https://external.com/image.jpg');
16
23
  });
@@ -20,12 +27,12 @@ const CDN_URL = config_1.DEFAULT_CONFIG.cdnUrl;
20
27
  (0, vitest_1.expect)(article).not.toBeNull();
21
28
  (0, vitest_1.expect)(article.slug).toBe('test-article-1');
22
29
  // Check flat field
23
- (0, vitest_1.expect)(article.mainImage).toBe(`${CDN_URL}/article1.jpg`);
30
+ (0, vitest_1.expect)(article.mainImage).toBe(buildImgproxyUrl('article1.jpg'));
24
31
  // Check nested author image
25
- (0, vitest_1.expect)(article.author.image).toBe(`${CDN_URL}/john.jpg`);
32
+ (0, vitest_1.expect)(article.author.image).toBe(buildImgproxyUrl('john.jpg'));
26
33
  // Check array of images
27
- (0, vitest_1.expect)(article.images[0].url).toBe(`${CDN_URL}/img1.jpg`);
28
- (0, vitest_1.expect)(article.images[1].url).toBe(`${CDN_URL}/img2.jpg`);
34
+ (0, vitest_1.expect)(article.images[0].url).toBe(buildImgproxyUrl('img1.jpg'));
35
+ (0, vitest_1.expect)(article.images[1].url).toBe(buildImgproxyUrl('img2.jpg'));
29
36
  });
30
37
  (0, vitest_1.it)('should return null when article not found', async () => {
31
38
  const client = (0, index_1.createChanomhubClient)();
@@ -1 +1 @@
1
- {"version":3,"file":"client.test.js","sourceRoot":"","sources":["../../__tests__/client.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.test.js","sourceRoot":"","sources":["../../__tests__/client.test.ts"],"names":[],"mappings":"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"}
@@ -2,8 +2,60 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const vitest_1 = require("vitest");
4
4
  const imageUrl_1 = require("../transforms/imageUrl");
5
- const CDN_URL = 'https://cdn.chanomhub.com/cdn-cgi/image/format=auto';
5
+ const CDN_URL = 'https://imgproxy.chanomhub.com';
6
6
  const STORAGE_URL = 'https://cdn.chanomhub.com';
7
+ // Helper to build expected imgproxy URL (default format: webp)
8
+ const buildImgproxyUrl = (filename, optionsPath) => {
9
+ const sourceUrl = `${STORAGE_URL}/${filename}`;
10
+ const encodedUrl = encodeURIComponent(sourceUrl);
11
+ if (optionsPath) {
12
+ return `${CDN_URL}/insecure/${optionsPath}/plain/${encodedUrl}@webp`;
13
+ }
14
+ return `${CDN_URL}/insecure/plain/${encodedUrl}@webp`;
15
+ };
16
+ (0, vitest_1.describe)('buildImgproxyPath', () => {
17
+ (0, vitest_1.it)('should return empty string for empty options', () => {
18
+ (0, vitest_1.expect)((0, imageUrl_1.buildImgproxyPath)({})).toBe('');
19
+ });
20
+ (0, vitest_1.it)('should build resize options', () => {
21
+ const options = { width: 300, height: 200 };
22
+ (0, vitest_1.expect)((0, imageUrl_1.buildImgproxyPath)(options)).toBe('rs:fit:300:200:0');
23
+ });
24
+ (0, vitest_1.it)('should build resize with type and enlarge', () => {
25
+ const options = { resizeType: 'fill', width: 400, enlarge: true };
26
+ (0, vitest_1.expect)((0, imageUrl_1.buildImgproxyPath)(options)).toBe('rs:fill:400:0:1');
27
+ });
28
+ (0, vitest_1.it)('should build quality option', () => {
29
+ const options = { quality: 80 };
30
+ (0, vitest_1.expect)((0, imageUrl_1.buildImgproxyPath)(options)).toBe('q:80');
31
+ });
32
+ (0, vitest_1.it)('should build gravity option', () => {
33
+ const options = { gravity: 'sm' };
34
+ (0, vitest_1.expect)((0, imageUrl_1.buildImgproxyPath)(options)).toBe('g:sm');
35
+ });
36
+ (0, vitest_1.it)('should build dpr option', () => {
37
+ const options = { dpr: 2 };
38
+ (0, vitest_1.expect)((0, imageUrl_1.buildImgproxyPath)(options)).toBe('dpr:2');
39
+ });
40
+ (0, vitest_1.it)('should build blur option', () => {
41
+ const options = { blur: 10 };
42
+ (0, vitest_1.expect)((0, imageUrl_1.buildImgproxyPath)(options)).toBe('bl:10');
43
+ });
44
+ (0, vitest_1.it)('should build sharpen option', () => {
45
+ const options = { sharpen: 0.5 };
46
+ (0, vitest_1.expect)((0, imageUrl_1.buildImgproxyPath)(options)).toBe('sh:0.5');
47
+ });
48
+ (0, vitest_1.it)('should combine multiple options', () => {
49
+ const options = {
50
+ resizeType: 'fill',
51
+ width: 300,
52
+ height: 200,
53
+ quality: 85,
54
+ gravity: 'ce',
55
+ };
56
+ (0, vitest_1.expect)((0, imageUrl_1.buildImgproxyPath)(options)).toBe('rs:fill:300:200:0/q:85/g:ce');
57
+ });
58
+ });
7
59
  (0, vitest_1.describe)('resolveImageUrl', () => {
8
60
  (0, vitest_1.it)('should return null for null input', () => {
9
61
  (0, vitest_1.expect)((0, imageUrl_1.resolveImageUrl)(null, CDN_URL)).toBeNull();
@@ -19,11 +71,20 @@ const STORAGE_URL = 'https://cdn.chanomhub.com';
19
71
  const url = 'https://example.com/image.jpg';
20
72
  (0, vitest_1.expect)((0, imageUrl_1.resolveImageUrl)(url, CDN_URL)).toBe(url);
21
73
  });
22
- (0, vitest_1.it)('should prepend CDN URL for filename only', () => {
23
- (0, vitest_1.expect)((0, imageUrl_1.resolveImageUrl)('abc.jpg', CDN_URL)).toBe(`${CDN_URL}/abc.jpg`);
74
+ (0, vitest_1.it)('should create imgproxy URL for filename only', () => {
75
+ const result = (0, imageUrl_1.resolveImageUrl)('abc.jpg', CDN_URL);
76
+ (0, vitest_1.expect)(result).toBe(buildImgproxyUrl('abc.jpg'));
24
77
  });
25
78
  (0, vitest_1.it)('should handle filenames with paths', () => {
26
- (0, vitest_1.expect)((0, imageUrl_1.resolveImageUrl)('uploads/abc.jpg', CDN_URL)).toBe(`${CDN_URL}/uploads/abc.jpg`);
79
+ const result = (0, imageUrl_1.resolveImageUrl)('uploads/abc.jpg', CDN_URL);
80
+ (0, vitest_1.expect)(result).toBe(buildImgproxyUrl('uploads/abc.jpg'));
81
+ });
82
+ (0, vitest_1.it)('should allow custom storage URL', () => {
83
+ const customStorage = 'https://custom-storage.com';
84
+ const result = (0, imageUrl_1.resolveImageUrl)('abc.jpg', CDN_URL, customStorage);
85
+ const sourceUrl = `${customStorage}/abc.jpg`;
86
+ const encodedUrl = encodeURIComponent(sourceUrl);
87
+ (0, vitest_1.expect)(result).toBe(`${CDN_URL}/insecure/plain/${encodedUrl}@webp`);
27
88
  });
28
89
  });
29
90
  (0, vitest_1.describe)('transformImageUrlsDeep', () => {
@@ -40,10 +101,10 @@ const STORAGE_URL = 'https://cdn.chanomhub.com';
40
101
  title: 'Test Article',
41
102
  };
42
103
  const result = (0, imageUrl_1.transformImageUrlsDeep)(data, CDN_URL);
43
- (0, vitest_1.expect)(result.mainImage).toBe(`${CDN_URL}/main.jpg`);
44
- (0, vitest_1.expect)(result.coverImage).toBe(`${CDN_URL}/cover.jpg`);
45
- (0, vitest_1.expect)(result.backgroundImage).toBe(`${CDN_URL}/bg.jpg`);
46
- (0, vitest_1.expect)(result.image).toBe(`${CDN_URL}/profile.jpg`);
104
+ (0, vitest_1.expect)(result.mainImage).toBe(buildImgproxyUrl('main.jpg'));
105
+ (0, vitest_1.expect)(result.coverImage).toBe(buildImgproxyUrl('cover.jpg'));
106
+ (0, vitest_1.expect)(result.backgroundImage).toBe(buildImgproxyUrl('bg.jpg'));
107
+ (0, vitest_1.expect)(result.image).toBe(buildImgproxyUrl('profile.jpg'));
47
108
  (0, vitest_1.expect)(result.title).toBe('Test Article'); // Non-image field unchanged
48
109
  });
49
110
  (0, vitest_1.it)('should not transform already full URLs', () => {
@@ -58,8 +119,8 @@ const STORAGE_URL = 'https://cdn.chanomhub.com';
58
119
  images: [{ url: 'image1.jpg' }, { url: 'image2.jpg' }],
59
120
  };
60
121
  const result = (0, imageUrl_1.transformImageUrlsDeep)(data, CDN_URL);
61
- (0, vitest_1.expect)(result.images[0].url).toBe(`${CDN_URL}/image1.jpg`);
62
- (0, vitest_1.expect)(result.images[1].url).toBe(`${CDN_URL}/image2.jpg`);
122
+ (0, vitest_1.expect)(result.images[0].url).toBe(buildImgproxyUrl('image1.jpg'));
123
+ (0, vitest_1.expect)(result.images[1].url).toBe(buildImgproxyUrl('image2.jpg'));
63
124
  });
64
125
  (0, vitest_1.it)('should recursively transform nested objects', () => {
65
126
  const data = {
@@ -71,14 +132,14 @@ const STORAGE_URL = 'https://cdn.chanomhub.com';
71
132
  },
72
133
  };
73
134
  const result = (0, imageUrl_1.transformImageUrlsDeep)(data, CDN_URL);
74
- (0, vitest_1.expect)(result.article.mainImage).toBe(`${CDN_URL}/article.jpg`);
75
- (0, vitest_1.expect)(result.article.author.image).toBe(`${CDN_URL}/author.jpg`);
135
+ (0, vitest_1.expect)(result.article.mainImage).toBe(buildImgproxyUrl('article.jpg'));
136
+ (0, vitest_1.expect)(result.article.author.image).toBe(buildImgproxyUrl('author.jpg'));
76
137
  });
77
138
  (0, vitest_1.it)('should handle arrays at root level', () => {
78
139
  const data = [{ mainImage: 'img1.jpg' }, { mainImage: 'img2.jpg' }];
79
140
  const result = (0, imageUrl_1.transformImageUrlsDeep)(data, CDN_URL);
80
- (0, vitest_1.expect)(result[0].mainImage).toBe(`${CDN_URL}/img1.jpg`);
81
- (0, vitest_1.expect)(result[1].mainImage).toBe(`${CDN_URL}/img2.jpg`);
141
+ (0, vitest_1.expect)(result[0].mainImage).toBe(buildImgproxyUrl('img1.jpg'));
142
+ (0, vitest_1.expect)(result[1].mainImage).toBe(buildImgproxyUrl('img2.jpg'));
82
143
  });
83
144
  });
84
145
  (0, vitest_1.describe)('getFallbackUrl', () => {
@@ -86,23 +147,25 @@ const STORAGE_URL = 'https://cdn.chanomhub.com';
86
147
  (0, vitest_1.expect)((0, imageUrl_1.getFallbackUrl)(null, CDN_URL)).toBeNull();
87
148
  (0, vitest_1.expect)((0, imageUrl_1.getFallbackUrl)(undefined, CDN_URL)).toBeNull();
88
149
  });
89
- (0, vitest_1.it)('should return filename as-is if just filename', () => {
90
- (0, vitest_1.expect)((0, imageUrl_1.getFallbackUrl)('abc.jpg', CDN_URL)).toBe('abc.jpg');
150
+ (0, vitest_1.it)('should return storage URL for filename', () => {
151
+ (0, vitest_1.expect)((0, imageUrl_1.getFallbackUrl)('abc.jpg', CDN_URL)).toBe(`${STORAGE_URL}/abc.jpg`);
91
152
  });
92
- (0, vitest_1.it)('should strip CDN URL from full URL', () => {
93
- const fullUrl = `${CDN_URL}/abc.jpg`;
94
- (0, vitest_1.expect)((0, imageUrl_1.getFallbackUrl)(fullUrl, CDN_URL)).toBe('abc.jpg');
153
+ (0, vitest_1.it)('should extract source URL from imgproxy URL', () => {
154
+ // Build an imgproxy URL and verify we can extract the original
155
+ const imgproxyUrl = buildImgproxyUrl('abc.jpg');
156
+ (0, vitest_1.expect)((0, imageUrl_1.getFallbackUrl)(imgproxyUrl, CDN_URL)).toBe(`${STORAGE_URL}/abc.jpg`);
95
157
  });
96
- (0, vitest_1.it)('should handle optional storageUrl', () => {
97
- const fullUrl = `${CDN_URL}/abc.jpg`;
98
- (0, vitest_1.expect)((0, imageUrl_1.getFallbackUrl)(fullUrl, CDN_URL, STORAGE_URL)).toBe(`${STORAGE_URL}/abc.jpg`);
158
+ (0, vitest_1.it)('should handle imgproxy URL with path', () => {
159
+ const imgproxyUrl = buildImgproxyUrl('uploads/abc.jpg');
160
+ (0, vitest_1.expect)((0, imageUrl_1.getFallbackUrl)(imgproxyUrl, CDN_URL)).toBe(`${STORAGE_URL}/uploads/abc.jpg`);
99
161
  });
100
162
  (0, vitest_1.it)('should return other external URLs as-is', () => {
101
163
  const url = 'https://other-cdn.com/image.jpg';
102
- (0, vitest_1.expect)((0, imageUrl_1.getFallbackUrl)(url, CDN_URL, STORAGE_URL)).toBe(url);
164
+ (0, vitest_1.expect)((0, imageUrl_1.getFallbackUrl)(url, CDN_URL)).toBe(url);
103
165
  });
104
- (0, vitest_1.it)('should prepend storageUrl to filename if provided', () => {
105
- (0, vitest_1.expect)((0, imageUrl_1.getFallbackUrl)('abc.jpg', CDN_URL, STORAGE_URL)).toBe(`${STORAGE_URL}/abc.jpg`);
166
+ (0, vitest_1.it)('should use custom storage URL for filename', () => {
167
+ const customStorage = 'https://custom-storage.com';
168
+ (0, vitest_1.expect)((0, imageUrl_1.getFallbackUrl)('abc.jpg', CDN_URL, customStorage)).toBe(`${customStorage}/abc.jpg`);
106
169
  });
107
170
  });
108
171
  //# sourceMappingURL=imageUrl.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"imageUrl.test.js","sourceRoot":"","sources":["../../__tests__/imageUrl.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"imageUrl.test.js","sourceRoot":"","sources":["../../__tests__/imageUrl.test.ts"],"names":[],"mappings":"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"}
package/dist/client.d.ts CHANGED
@@ -36,7 +36,7 @@ export interface RestResponse<T> {
36
36
  * @returns REST fetch function
37
37
  */
38
38
  export declare function createRestClient(config: ChanomhubConfig): <T>(endpoint: string, options?: {
39
- method?: "GET" | "POST" | "PUT" | "DELETE";
39
+ method?: "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
40
40
  body?: Record<string, unknown>;
41
41
  }) => Promise<RestResponse<T>>;
42
42
  export type RestFetcher = ReturnType<typeof createRestClient>;
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGtD,MAAM,WAAW,YAAY;IACzB,6BAA6B;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0BAA0B;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,eAAe,IACpB,CAAC,EAChC,OAAO,MAAM,EACb,YAAW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACvC,UAAS,YAAiB,KAC3B,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAkEjC;AAED,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEpE;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC;IAC3B,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,eAAe,IACpB,CAAC,EAC7B,UAAU,MAAM,EAChB,UAAS;IACL,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7B,KACP,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CA4D9B;AAED,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGtD,MAAM,WAAW,YAAY;IACzB,6BAA6B;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0BAA0B;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,eAAe,IACpB,CAAC,EAChC,OAAO,MAAM,EACb,YAAW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACvC,UAAS,YAAiB,KAC3B,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAkEjC;AAED,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEpE;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC;IAC3B,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,eAAe,IACpB,CAAC,EAC7B,UAAU,MAAM,EAChB,UAAS;IACL,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAC;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7B,KACP,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CA4D9B;AAED,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
package/dist/config.d.ts CHANGED
@@ -1,13 +1,47 @@
1
1
  /**
2
2
  * Chanomhub SDK Configuration
3
3
  */
4
+ /** Imgproxy resize type */
5
+ export type ImgproxyResizeType = 'fit' | 'fill' | 'fill-down' | 'force' | 'auto';
6
+ /** Imgproxy gravity (for cropping) */
7
+ export type ImgproxyGravity = 'no' | 'so' | 'ea' | 'we' | 'noea' | 'nowe' | 'soea' | 'sowe' | 'ce' | 'sm' | 'fp';
8
+ /** Imgproxy output format */
9
+ export type ImgproxyFormat = 'webp' | 'avif' | 'jpg' | 'png' | 'gif' | 'ico' | 'heic' | 'bmp' | 'tiff';
10
+ /**
11
+ * Imgproxy processing options
12
+ * @see https://docs.imgproxy.net/usage/processing
13
+ */
14
+ export interface ImgproxyOptions {
15
+ /** Output format (default: 'webp') */
16
+ format?: ImgproxyFormat;
17
+ /** Resize type (default: 'fit') */
18
+ resizeType?: ImgproxyResizeType;
19
+ /** Target width (0 = auto based on height) */
20
+ width?: number;
21
+ /** Target height (0 = auto based on width) */
22
+ height?: number;
23
+ /** Quality 1-100 (0 = use server default) */
24
+ quality?: number;
25
+ /** Gravity for cropping (default: 'ce' center) */
26
+ gravity?: ImgproxyGravity;
27
+ /** Allow enlarging smaller images */
28
+ enlarge?: boolean;
29
+ /** Device pixel ratio (1-8) */
30
+ dpr?: number;
31
+ /** Blur radius (0 = no blur) */
32
+ blur?: number;
33
+ /** Sharpen sigma (0 = no sharpen) */
34
+ sharpen?: number;
35
+ }
4
36
  export interface ChanomhubConfig {
5
37
  /** API base URL */
6
38
  apiUrl: string;
7
- /** CDN base URL for images */
39
+ /** Imgproxy base URL for image processing */
8
40
  cdnUrl: string;
9
- /** Original storage base URL (fallback) */
41
+ /** Original storage base URL (source images) */
10
42
  storageUrl?: string;
43
+ /** Default imgproxy options */
44
+ imgproxyOptions?: ImgproxyOptions;
11
45
  /** Authentication token (optional) */
12
46
  token?: string;
13
47
  /** Default cache duration in seconds (0 = no cache) */
@@ -17,6 +51,7 @@ export interface ChanomhubConfig {
17
51
  /** Supabase anon key (required for OAuth) */
18
52
  supabaseAnonKey?: string;
19
53
  }
54
+ export declare const DEFAULT_IMGPROXY_OPTIONS: ImgproxyOptions;
20
55
  export declare const DEFAULT_CONFIG: ChanomhubConfig;
21
56
  /** Article status enum */
22
57
  export type ArticleStatus = 'DRAFT' | 'PENDING_REVIEW' | 'PUBLISHED' | 'ARCHIVED' | 'NOT_APPROVED' | 'NEEDS_REVISION';
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,eAAe;IAC5B,mBAAmB;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gDAAgD;IAChD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,eAAO,MAAM,cAAc,EAAE,eAK5B,CAAC;AAEF,0BAA0B;AAC1B,MAAM,MAAM,aAAa,GACnB,OAAO,GACP,gBAAgB,GAChB,WAAW,GACX,UAAU,GACV,cAAc,GACd,gBAAgB,CAAC;AAEvB,uBAAuB;AACvB,MAAM,MAAM,UAAU,GAChB,OAAO,GACP,MAAM,GACN,OAAO,GACP,QAAQ,GACR,OAAO,GACP,eAAe,GACf,SAAS,GACT,UAAU,GACV,OAAO,GACP,aAAa,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,2BAA2B;AAC3B,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,MAAM,GAAG,WAAW,GAAG,OAAO,GAAG,MAAM,CAAC;AAEjF,sCAAsC;AACtC,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEjH,6BAA6B;AAC7B,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAEvG;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC5B,sCAAsC;IACtC,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,mCAAmC;IACnC,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,qCAAqC;IACrC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,+BAA+B;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC5B,mBAAmB;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+BAA+B;IAC/B,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gDAAgD;IAChD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,eAAO,MAAM,wBAAwB,EAAE,eAEtC,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,eAM5B,CAAC;AAEF,0BAA0B;AAC1B,MAAM,MAAM,aAAa,GACnB,OAAO,GACP,gBAAgB,GAChB,WAAW,GACX,UAAU,GACV,cAAc,GACd,gBAAgB,CAAC;AAEvB,uBAAuB;AACvB,MAAM,MAAM,UAAU,GAChB,OAAO,GACP,MAAM,GACN,OAAO,GACP,QAAQ,GACR,OAAO,GACP,eAAe,GACf,SAAS,GACT,UAAU,GACV,OAAO,GACP,aAAa,CAAC"}
package/dist/config.js CHANGED
@@ -3,11 +3,15 @@
3
3
  * Chanomhub SDK Configuration
4
4
  */
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.DEFAULT_CONFIG = void 0;
6
+ exports.DEFAULT_CONFIG = exports.DEFAULT_IMGPROXY_OPTIONS = void 0;
7
+ exports.DEFAULT_IMGPROXY_OPTIONS = {
8
+ format: 'webp',
9
+ };
7
10
  exports.DEFAULT_CONFIG = {
8
11
  apiUrl: 'https://api.chanomhub.com',
9
- cdnUrl: 'https://cdn.chanomhub.com/cdn-cgi/image/format=auto',
10
- storageUrl: 'https://cdn.chanomhub.com', // Fallback to raw CDN URL
12
+ cdnUrl: 'https://imgproxy.chanomhub.com',
13
+ storageUrl: 'https://cdn.chanomhub.com',
14
+ imgproxyOptions: exports.DEFAULT_IMGPROXY_OPTIONS,
11
15
  defaultCacheSeconds: 3600,
12
16
  };
13
17
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../config.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAmBU,QAAA,cAAc,GAAoB;IAC3C,MAAM,EAAE,2BAA2B;IACnC,MAAM,EAAE,qDAAqD;IAC7D,UAAU,EAAE,2BAA2B,EAAE,0BAA0B;IACnE,mBAAmB,EAAE,IAAI;CAC5B,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../config.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAyDU,QAAA,wBAAwB,GAAoB;IACrD,MAAM,EAAE,MAAM;CACjB,CAAC;AAEW,QAAA,cAAc,GAAoB;IAC3C,MAAM,EAAE,2BAA2B;IACnC,MAAM,EAAE,gCAAgC;IACxC,UAAU,EAAE,2BAA2B;IACvC,eAAe,EAAE,gCAAwB;IACzC,mBAAmB,EAAE,IAAI;CAC5B,CAAC"}
package/dist/index.d.ts CHANGED
@@ -31,12 +31,12 @@
31
31
  * ```
32
32
  */
33
33
  import { type GraphQLFetcher } from './client';
34
- import { type ArticleRepository, type FavoritesRepository, type UsersRepository, type SearchRepository, type AuthRepository } from './repositories';
34
+ import { type ArticleRepository, type FavoritesRepository, type UsersRepository, type SearchRepository, type AuthRepository, type DownloadsRepository } from './repositories';
35
35
  import { type ChanomhubConfig } from './config';
36
36
  export * from './types';
37
37
  export * from './config';
38
38
  export * from './errors';
39
- export { resolveImageUrl, getFallbackUrl } from './transforms/imageUrl';
39
+ export { resolveImageUrl, getFallbackUrl, buildImgproxyPath } from './transforms/imageUrl';
40
40
  /** Chanomhub SDK Client interface */
41
41
  export interface ChanomhubClient {
42
42
  /** Article operations */
@@ -49,6 +49,8 @@ export interface ChanomhubClient {
49
49
  search: SearchRepository;
50
50
  /** Authentication operations (requires Supabase config for OAuth) */
51
51
  auth: AuthRepository;
52
+ /** Downloads management operations */
53
+ downloads: DownloadsRepository;
52
54
  /** Raw GraphQL fetcher for custom queries */
53
55
  graphql: GraphQLFetcher;
54
56
  /** SDK configuration */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,EAAyC,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC;AACtF,OAAO,EAMH,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAkB,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAGhE,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAExE,qCAAqC;AACrC,MAAM,WAAW,eAAe;IAC5B,yBAAyB;IACzB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,2BAA2B;IAC3B,SAAS,EAAE,mBAAmB,CAAC;IAC/B,8BAA8B;IAC9B,KAAK,EAAE,eAAe,CAAC;IACvB,wBAAwB;IACxB,MAAM,EAAE,gBAAgB,CAAC;IACzB,qEAAqE;IACrE,IAAI,EAAE,cAAc,CAAC;IACrB,6CAA6C;IAC7C,OAAO,EAAE,cAAc,CAAC;IACxB,wBAAwB;IACxB,MAAM,EAAE,eAAe,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM,GAAG,eAAe,CAuB5F;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACrC,KAAK,EAAE,MAAM,EACb,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM,GACtC,eAAe,CAMjB;AAGD,eAAe,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,EAAyC,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC;AACtF,OAAO,EAOH,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EAC3B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAkB,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAGhE,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE3F,qCAAqC;AACrC,MAAM,WAAW,eAAe;IAC5B,yBAAyB;IACzB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,2BAA2B;IAC3B,SAAS,EAAE,mBAAmB,CAAC;IAC/B,8BAA8B;IAC9B,KAAK,EAAE,eAAe,CAAC;IACvB,wBAAwB;IACxB,MAAM,EAAE,gBAAgB,CAAC;IACzB,qEAAqE;IACrE,IAAI,EAAE,cAAc,CAAC;IACrB,sCAAsC;IACtC,SAAS,EAAE,mBAAmB,CAAC;IAC/B,6CAA6C;IAC7C,OAAO,EAAE,cAAc,CAAC;IACxB,wBAAwB;IACxB,MAAM,EAAE,eAAe,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM,GAAG,eAAe,CAyB5F;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACrC,KAAK,EAAE,MAAM,EACb,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM,GACtC,eAAe,CAMjB;AAGD,eAAe,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -46,7 +46,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
46
46
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
47
47
  };
48
48
  Object.defineProperty(exports, "__esModule", { value: true });
49
- exports.getFallbackUrl = exports.resolveImageUrl = void 0;
49
+ exports.buildImgproxyPath = exports.getFallbackUrl = exports.resolveImageUrl = void 0;
50
50
  exports.createChanomhubClient = createChanomhubClient;
51
51
  exports.createAuthenticatedClient = createAuthenticatedClient;
52
52
  const client_1 = require("./client");
@@ -59,6 +59,7 @@ __exportStar(require("./errors"), exports);
59
59
  var imageUrl_1 = require("./transforms/imageUrl");
60
60
  Object.defineProperty(exports, "resolveImageUrl", { enumerable: true, get: function () { return imageUrl_1.resolveImageUrl; } });
61
61
  Object.defineProperty(exports, "getFallbackUrl", { enumerable: true, get: function () { return imageUrl_1.getFallbackUrl; } });
62
+ Object.defineProperty(exports, "buildImgproxyPath", { enumerable: true, get: function () { return imageUrl_1.buildImgproxyPath; } });
62
63
  /**
63
64
  * Creates a Chanomhub API client
64
65
  *
@@ -93,12 +94,14 @@ function createChanomhubClient(config = {}) {
93
94
  const users = (0, repositories_1.createUsersRepository)(rest);
94
95
  const search = (0, repositories_1.createSearchRepository)(graphql);
95
96
  const auth = (0, repositories_1.createAuthRepository)(rest, fullConfig);
97
+ const downloads = (0, repositories_1.createDownloadsRepository)(rest, fullConfig);
96
98
  return {
97
99
  articles,
98
100
  favorites,
99
101
  users,
100
102
  search,
101
103
  auth,
104
+ downloads,
102
105
  graphql,
103
106
  config: fullConfig,
104
107
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;;;;;;;;;;;;;;;;;AA+DH,sDAuBC;AAUD,8DASC;AAvGD,qCAAsF;AACtF,iDAWwB;AACxB,qCAAgE;AAEhE,kBAAkB;AAClB,0CAAwB;AACxB,2CAAyB;AACzB,2CAAyB;AACzB,kDAAwE;AAA/D,2GAAA,eAAe,OAAA;AAAE,0GAAA,cAAc,OAAA;AAoBxC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,SAAgB,qBAAqB,CAAC,SAAmC,EAAE;IACvE,MAAM,UAAU,GAAoB;QAChC,GAAG,uBAAc;QACjB,GAAG,MAAM;KACZ,CAAC;IAEF,MAAM,OAAO,GAAG,IAAA,4BAAmB,EAAC,UAAU,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,IAAA,yBAAgB,EAAC,UAAU,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,IAAA,sCAAuB,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,IAAA,wCAAyB,EAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,IAAA,oCAAqB,EAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAA,qCAAsB,EAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,IAAA,mCAAoB,EAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAEpD,OAAO;QACH,QAAQ;QACR,SAAS;QACT,KAAK;QACL,MAAM;QACN,IAAI;QACJ,OAAO;QACP,MAAM,EAAE,UAAU;KACrB,CAAC;AACN,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,yBAAyB,CACrC,KAAa,EACb,SAAmC,EAAE;IAErC,OAAO,qBAAqB,CAAC;QACzB,GAAG,MAAM;QACT,KAAK;QACL,mBAAmB,EAAE,CAAC,EAAE,2CAA2C;KACtE,CAAC,CAAC;AACP,CAAC;AAED,iBAAiB;AACjB,kBAAe,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;;;;;;;;;;;;;;;;;AAmEH,sDAyBC;AAUD,8DASC;AA7GD,qCAAsF;AACtF,iDAawB;AACxB,qCAAgE;AAEhE,kBAAkB;AAClB,0CAAwB;AACxB,2CAAyB;AACzB,2CAAyB;AACzB,kDAA2F;AAAlF,2GAAA,eAAe,OAAA;AAAE,0GAAA,cAAc,OAAA;AAAE,6GAAA,iBAAiB,OAAA;AAsB3D;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,SAAgB,qBAAqB,CAAC,SAAmC,EAAE;IACvE,MAAM,UAAU,GAAoB;QAChC,GAAG,uBAAc;QACjB,GAAG,MAAM;KACZ,CAAC;IAEF,MAAM,OAAO,GAAG,IAAA,4BAAmB,EAAC,UAAU,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,IAAA,yBAAgB,EAAC,UAAU,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,IAAA,sCAAuB,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,IAAA,wCAAyB,EAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,IAAA,oCAAqB,EAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAA,qCAAsB,EAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,IAAA,mCAAoB,EAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,IAAA,wCAAyB,EAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAE9D,OAAO;QACH,QAAQ;QACR,SAAS;QACT,KAAK;QACL,MAAM;QACN,IAAI;QACJ,SAAS;QACT,OAAO;QACP,MAAM,EAAE,UAAU;KACrB,CAAC;AACN,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,yBAAyB,CACrC,KAAa,EACb,SAAmC,EAAE;IAErC,OAAO,qBAAqB,CAAC;QACzB,GAAG,MAAM;QACT,KAAK;QACL,mBAAmB,EAAE,CAAC,EAAE,2CAA2C;KACtE,CAAC,CAAC;AACP,CAAC;AAED,iBAAiB;AACjB,kBAAe,qBAAqB,CAAC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Chanomhub SDK - Downloads Repository
3
+ *
4
+ * Provides API methods for managing download links.
5
+ */
6
+ import type { RestFetcher } from '../client';
7
+ import type { ChanomhubConfig } from '../config';
8
+ import type { DownloadLink, CreateDownloadLinkRequest, UpdateDownloadLinkRequest, ModerateDownloadLinkRequest, DownloadLinksListResponse, ListDownloadsOptions } from '../types/download';
9
+ export interface DownloadsRepository {
10
+ /**
11
+ * Create a new download link
12
+ * @param data - Download link data
13
+ * @returns Created download link
14
+ */
15
+ create(data: CreateDownloadLinkRequest): Promise<DownloadLink | null>;
16
+ /**
17
+ * Get all download links filtered by status (moderator/admin only)
18
+ * @param options - Filter and pagination options
19
+ * @returns Paginated list of download links
20
+ */
21
+ getAll(options?: ListDownloadsOptions): Promise<DownloadLinksListResponse | null>;
22
+ /**
23
+ * Get all download links for a specific article
24
+ * @param articleId - Article ID
25
+ * @returns Array of download links
26
+ */
27
+ getByArticle(articleId: number): Promise<DownloadLink[]>;
28
+ /**
29
+ * Get all pending download links with pagination (moderator/admin only)
30
+ * @param page - Page number (default: 1)
31
+ * @param limit - Items per page (default: 20)
32
+ * @returns Paginated list of pending download links
33
+ */
34
+ getPending(page?: number, limit?: number): Promise<DownloadLinksListResponse | null>;
35
+ /**
36
+ * Moderate a download link (moderator/admin only)
37
+ * @param id - Download link ID
38
+ * @param data - Moderation data (status)
39
+ * @returns Updated download link
40
+ */
41
+ moderate(id: number, data: ModerateDownloadLinkRequest): Promise<DownloadLink | null>;
42
+ /**
43
+ * Get a specific download link by ID
44
+ * @param id - Download link ID
45
+ * @returns Download link or null if not found
46
+ */
47
+ getById(id: number): Promise<DownloadLink | null>;
48
+ /**
49
+ * Update a download link
50
+ * @param id - Download link ID
51
+ * @param data - Update data
52
+ * @returns Updated download link
53
+ */
54
+ update(id: number, data: UpdateDownloadLinkRequest): Promise<DownloadLink | null>;
55
+ /**
56
+ * Delete a download link
57
+ * @param id - Download link ID
58
+ * @returns True if deleted successfully
59
+ */
60
+ delete(id: number): Promise<boolean>;
61
+ }
62
+ /**
63
+ * Creates a downloads repository with the given REST client
64
+ */
65
+ export declare function createDownloadsRepository(fetcher: RestFetcher, config: ChanomhubConfig): DownloadsRepository;
66
+ //# sourceMappingURL=downloadsRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"downloadsRepository.d.ts","sourceRoot":"","sources":["../../repositories/downloadsRepository.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD,OAAO,KAAK,EACR,YAAY,EACZ,yBAAyB,EACzB,yBAAyB,EACzB,2BAA2B,EAE3B,yBAAyB,EACzB,oBAAoB,EAEvB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,mBAAmB;IAChC;;;;OAIG;IACH,MAAM,CAAC,IAAI,EAAE,yBAAyB,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAEtE;;;;OAIG;IACH,MAAM,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAAC;IAElF;;;;OAIG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAEzD;;;;;OAKG;IACH,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAAC;IAErF;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,2BAA2B,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAEtF;;;;OAIG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAElD;;;;;OAKG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,yBAAyB,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAElF;;;;OAIG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACxC;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACrC,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,eAAe,GACxB,mBAAmB,CAwJrB"}
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ /**
3
+ * Chanomhub SDK - Downloads Repository
4
+ *
5
+ * Provides API methods for managing download links.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.createDownloadsRepository = createDownloadsRepository;
9
+ const errors_1 = require("../errors");
10
+ /**
11
+ * Creates a downloads repository with the given REST client
12
+ */
13
+ function createDownloadsRepository(fetcher, config) {
14
+ function requireAuth() {
15
+ if (!config.token) {
16
+ throw new errors_1.AuthenticationError('Authentication required for downloads management. Use createAuthenticatedClient() or provide a token.');
17
+ }
18
+ }
19
+ async function create(data) {
20
+ var _a;
21
+ requireAuth();
22
+ const { data: response, error } = await fetcher('/api/downloads', { method: 'POST', body: data });
23
+ if (error) {
24
+ console.error('Failed to create download link:', error);
25
+ return null;
26
+ }
27
+ return (_a = response === null || response === void 0 ? void 0 : response.downloadLink) !== null && _a !== void 0 ? _a : null;
28
+ }
29
+ async function getAll(options) {
30
+ requireAuth();
31
+ const params = new URLSearchParams();
32
+ if (options === null || options === void 0 ? void 0 : options.status)
33
+ params.set('status', options.status);
34
+ if (options === null || options === void 0 ? void 0 : options.page)
35
+ params.set('page', String(options.page));
36
+ if (options === null || options === void 0 ? void 0 : options.limit)
37
+ params.set('limit', String(options.limit));
38
+ const queryString = params.toString();
39
+ const url = `/api/downloads${queryString ? `?${queryString}` : ''}`;
40
+ const { data, error } = await fetcher(url, { method: 'GET' });
41
+ if (error) {
42
+ console.error('Failed to get download links:', error);
43
+ return null;
44
+ }
45
+ return data;
46
+ }
47
+ async function getByArticle(articleId) {
48
+ const { data, error } = await fetcher(`/api/downloads/article/${articleId}`, { method: 'GET' });
49
+ if (error) {
50
+ console.error('Failed to get download links for article:', error);
51
+ return [];
52
+ }
53
+ return data !== null && data !== void 0 ? data : [];
54
+ }
55
+ async function getPending(page = 1, limit = 20) {
56
+ requireAuth();
57
+ const params = new URLSearchParams();
58
+ params.set('page', String(page));
59
+ params.set('limit', String(limit));
60
+ const { data, error } = await fetcher(`/api/downloads/pending?${params.toString()}`, { method: 'GET' });
61
+ if (error) {
62
+ console.error('Failed to get pending download links:', error);
63
+ return null;
64
+ }
65
+ return data;
66
+ }
67
+ async function moderate(id, moderationData) {
68
+ var _a;
69
+ requireAuth();
70
+ const { data: response, error } = await fetcher(`/api/downloads/${id}/moderate`, { method: 'PATCH', body: moderationData });
71
+ if (error) {
72
+ console.error('Failed to moderate download link:', error);
73
+ return null;
74
+ }
75
+ return (_a = response === null || response === void 0 ? void 0 : response.downloadLink) !== null && _a !== void 0 ? _a : null;
76
+ }
77
+ async function getById(id) {
78
+ const { data, error } = await fetcher(`/api/downloads/${id}`, { method: 'GET' });
79
+ if (error) {
80
+ console.error('Failed to get download link:', error);
81
+ return null;
82
+ }
83
+ return data;
84
+ }
85
+ async function update(id, updateData) {
86
+ var _a;
87
+ requireAuth();
88
+ const { data: response, error } = await fetcher(`/api/downloads/${id}`, { method: 'PATCH', body: updateData });
89
+ if (error) {
90
+ console.error('Failed to update download link:', error);
91
+ return null;
92
+ }
93
+ return (_a = response === null || response === void 0 ? void 0 : response.downloadLink) !== null && _a !== void 0 ? _a : null;
94
+ }
95
+ async function deleteDownload(id) {
96
+ requireAuth();
97
+ const { error } = await fetcher(`/api/downloads/${id}`, { method: 'DELETE' });
98
+ if (error) {
99
+ console.error('Failed to delete download link:', error);
100
+ return false;
101
+ }
102
+ return true;
103
+ }
104
+ return {
105
+ create,
106
+ getAll,
107
+ getByArticle,
108
+ getPending,
109
+ moderate,
110
+ getById,
111
+ update,
112
+ delete: deleteDownload,
113
+ };
114
+ }
115
+ //# sourceMappingURL=downloadsRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"downloadsRepository.js","sourceRoot":"","sources":["../../repositories/downloadsRepository.ts"],"names":[],"mappings":"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"}
@@ -6,4 +6,5 @@ export { createFavoritesRepository, type FavoritesRepository, type FavoriteRespo
6
6
  export { createUsersRepository, type UsersRepository } from './usersRepository';
7
7
  export { createSearchRepository, type SearchRepository, type SearchOptions, } from './searchRepository';
8
8
  export { createAuthRepository, type AuthRepository } from './authRepository';
9
+ export { createDownloadsRepository, type DownloadsRepository } from './downloadsRepository';
9
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../repositories/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,uBAAuB,EAAE,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACtF,OAAO,EACH,yBAAyB,EACzB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,GACxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,qBAAqB,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EACH,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,aAAa,GACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,oBAAoB,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../repositories/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,uBAAuB,EAAE,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACtF,OAAO,EACH,yBAAyB,EACzB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,GACxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,qBAAqB,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EACH,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,aAAa,GACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,oBAAoB,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,yBAAyB,EAAE,KAAK,mBAAmB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -3,7 +3,7 @@
3
3
  * Chanomhub SDK - Repositories Index
4
4
  */
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.createAuthRepository = exports.createSearchRepository = exports.createUsersRepository = exports.createFavoritesRepository = exports.createArticleRepository = void 0;
6
+ exports.createDownloadsRepository = exports.createAuthRepository = exports.createSearchRepository = exports.createUsersRepository = exports.createFavoritesRepository = exports.createArticleRepository = void 0;
7
7
  var articleRepository_1 = require("./articleRepository");
8
8
  Object.defineProperty(exports, "createArticleRepository", { enumerable: true, get: function () { return articleRepository_1.createArticleRepository; } });
9
9
  var favoritesRepository_1 = require("./favoritesRepository");
@@ -14,4 +14,6 @@ var searchRepository_1 = require("./searchRepository");
14
14
  Object.defineProperty(exports, "createSearchRepository", { enumerable: true, get: function () { return searchRepository_1.createSearchRepository; } });
15
15
  var authRepository_1 = require("./authRepository");
16
16
  Object.defineProperty(exports, "createAuthRepository", { enumerable: true, get: function () { return authRepository_1.createAuthRepository; } });
17
+ var downloadsRepository_1 = require("./downloadsRepository");
18
+ Object.defineProperty(exports, "createDownloadsRepository", { enumerable: true, get: function () { return downloadsRepository_1.createDownloadsRepository; } });
17
19
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../repositories/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,yDAAsF;AAA7E,4HAAA,uBAAuB,OAAA;AAChC,6DAI+B;AAH3B,gIAAA,yBAAyB,OAAA;AAI7B,qDAAgF;AAAvE,wHAAA,qBAAqB,OAAA;AAC9B,uDAI4B;AAHxB,0HAAA,sBAAsB,OAAA;AAI1B,mDAA6E;AAApE,sHAAA,oBAAoB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../repositories/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,yDAAsF;AAA7E,4HAAA,uBAAuB,OAAA;AAChC,6DAI+B;AAH3B,gIAAA,yBAAyB,OAAA;AAI7B,qDAAgF;AAAvE,wHAAA,qBAAqB,OAAA;AAC9B,uDAI4B;AAHxB,0HAAA,sBAAsB,OAAA;AAI1B,mDAA6E;AAApE,sHAAA,oBAAoB,OAAA;AAC7B,6DAA4F;AAAnF,gIAAA,yBAAyB,OAAA"}
@@ -1,22 +1,38 @@
1
1
  /**
2
2
  * Image URL Transformation
3
3
  *
4
- * Transforms filename-only URLs to full CDN URLs
4
+ * Transforms filename-only URLs to imgproxy URLs with processing options
5
5
  */
6
+ import { ImgproxyOptions } from '../config';
6
7
  /**
7
- * Resolves an image URL.
8
- * - If it's just a filename (e.g., "abc.jpg"), prepends the CDN base URL
8
+ * Builds the imgproxy processing options path from ImgproxyOptions
9
+ * @see https://docs.imgproxy.net/usage/processing
10
+ */
11
+ export declare function buildImgproxyPath(options?: ImgproxyOptions): string;
12
+ /**
13
+ * Resolves an image URL using imgproxy format.
14
+ * - If it's just a filename (e.g., "abc.jpg"), creates an imgproxy URL
9
15
  * - If it's already a full URL, returns it as-is
10
16
  * - Handles null/undefined gracefully
17
+ *
18
+ * imgproxy URL format: {cdnUrl}/insecure/{options}/plain/{sourceUrl}@{format}
19
+ *
20
+ * @param imageUrl - Image filename or full URL
21
+ * @param cdnUrl - Imgproxy base URL
22
+ * @param storageUrl - Source image storage URL
23
+ * @param options - Imgproxy processing options
11
24
  */
12
- export declare function resolveImageUrl(imageUrl: string | null | undefined, cdnUrl: string): string | null;
25
+ export declare function resolveImageUrl(imageUrl: string | null | undefined, cdnUrl: string, storageUrl?: string, options?: ImgproxyOptions): string | null;
13
26
  /**
14
27
  * Generates a fallback URL (original source) for an image.
15
28
  * Useful when the CDN is unavailable or fails to load.
16
29
  *
17
- * @param imageUrl - The full image URL (potentially from CDN) or filename
18
- * @param cdnUrl - The CDN base URL to strip (if present)
19
- * @param storageUrl - The original storage base URL to prepend
30
+ * For imgproxy URLs, extracts the original source URL from the path.
31
+ * imgproxy URL format: {cdnUrl}/insecure/plain/{encodedSourceUrl}@{format}
32
+ *
33
+ * @param imageUrl - The full image URL (potentially from imgproxy) or filename
34
+ * @param cdnUrl - The imgproxy base URL to detect
35
+ * @param storageUrl - The original storage base URL (optional, used for filename-only inputs)
20
36
  */
21
37
  export declare function getFallbackUrl(imageUrl: string | null | undefined, cdnUrl: string, storageUrl?: string): string | null;
22
38
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"imageUrl.d.ts","sourceRoot":"","sources":["../../transforms/imageUrl.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;GAKG;AACH,wBAAgB,eAAe,CAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACnC,MAAM,EAAE,MAAM,GACf,MAAM,GAAG,IAAI,CAUf;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACnC,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,GACpB,MAAM,GAAG,IAAI,CAyBf;AAKD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,CAoCpE"}
1
+ {"version":3,"file":"imageUrl.d.ts","sourceRoot":"","sources":["../../transforms/imageUrl.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAA4B,MAAM,WAAW,CAAC;AAKtE;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,eAAoB,GAAG,MAAM,CAyCvE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACnC,MAAM,EAAE,MAAM,EACd,UAAU,GAAE,MAA4B,EACxC,OAAO,GAAE,eAA0C,GACpD,MAAM,GAAG,IAAI,CAyBf;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACnC,MAAM,EAAE,MAAM,EACd,UAAU,GAAE,MAA4B,GACzC,MAAM,GAAG,IAAI,CAgCf;AAKD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,CAoCpE"}
@@ -2,59 +2,129 @@
2
2
  /**
3
3
  * Image URL Transformation
4
4
  *
5
- * Transforms filename-only URLs to full CDN URLs
5
+ * Transforms filename-only URLs to imgproxy URLs with processing options
6
6
  */
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.buildImgproxyPath = buildImgproxyPath;
8
9
  exports.resolveImageUrl = resolveImageUrl;
9
10
  exports.getFallbackUrl = getFallbackUrl;
10
11
  exports.transformImageUrlsDeep = transformImageUrlsDeep;
12
+ const config_1 = require("../config");
13
+ /** Default storage URL for source images */
14
+ const DEFAULT_STORAGE_URL = 'https://cdn.chanomhub.com';
11
15
  /**
12
- * Resolves an image URL.
13
- * - If it's just a filename (e.g., "abc.jpg"), prepends the CDN base URL
16
+ * Builds the imgproxy processing options path from ImgproxyOptions
17
+ * @see https://docs.imgproxy.net/usage/processing
18
+ */
19
+ function buildImgproxyPath(options = {}) {
20
+ var _a, _b;
21
+ const parts = [];
22
+ // Resize: rs:%type:%width:%height:%enlarge
23
+ if (options.resizeType || options.width || options.height || options.enlarge !== undefined) {
24
+ const rs = [
25
+ 'rs',
26
+ options.resizeType || 'fit',
27
+ (_a = options.width) !== null && _a !== void 0 ? _a : 0,
28
+ (_b = options.height) !== null && _b !== void 0 ? _b : 0,
29
+ options.enlarge ? 1 : 0,
30
+ ];
31
+ parts.push(rs.join(':'));
32
+ }
33
+ // Quality: q:%quality
34
+ if (options.quality && options.quality > 0) {
35
+ parts.push(`q:${options.quality}`);
36
+ }
37
+ // Gravity: g:%gravity
38
+ if (options.gravity) {
39
+ parts.push(`g:${options.gravity}`);
40
+ }
41
+ // DPR: dpr:%dpr
42
+ if (options.dpr && options.dpr > 1) {
43
+ parts.push(`dpr:${options.dpr}`);
44
+ }
45
+ // Blur: bl:%sigma
46
+ if (options.blur && options.blur > 0) {
47
+ parts.push(`bl:${options.blur}`);
48
+ }
49
+ // Sharpen: sh:%sigma
50
+ if (options.sharpen && options.sharpen > 0) {
51
+ parts.push(`sh:${options.sharpen}`);
52
+ }
53
+ return parts.join('/');
54
+ }
55
+ /**
56
+ * Resolves an image URL using imgproxy format.
57
+ * - If it's just a filename (e.g., "abc.jpg"), creates an imgproxy URL
14
58
  * - If it's already a full URL, returns it as-is
15
59
  * - Handles null/undefined gracefully
60
+ *
61
+ * imgproxy URL format: {cdnUrl}/insecure/{options}/plain/{sourceUrl}@{format}
62
+ *
63
+ * @param imageUrl - Image filename or full URL
64
+ * @param cdnUrl - Imgproxy base URL
65
+ * @param storageUrl - Source image storage URL
66
+ * @param options - Imgproxy processing options
16
67
  */
17
- function resolveImageUrl(imageUrl, cdnUrl) {
68
+ function resolveImageUrl(imageUrl, cdnUrl, storageUrl = DEFAULT_STORAGE_URL, options = config_1.DEFAULT_IMGPROXY_OPTIONS) {
18
69
  if (!imageUrl)
19
70
  return null;
20
71
  // Already a full URL - return as-is
21
72
  if (imageUrl.startsWith('http://') || imageUrl.startsWith('https://')) {
22
73
  return imageUrl;
23
74
  }
24
- // Filename only - prepend CDN base URL
25
- return `${cdnUrl}/${imageUrl}`;
75
+ // Build the source URL
76
+ const sourceUrl = `${storageUrl}/${imageUrl}`;
77
+ // Build processing options path
78
+ const optionsPath = buildImgproxyPath(options);
79
+ // Get format (default: webp)
80
+ const format = options.format || 'webp';
81
+ // Build imgproxy URL: /insecure/{options}/plain/{sourceUrl}@{format}
82
+ const encodedSourceUrl = encodeURIComponent(sourceUrl);
83
+ if (optionsPath) {
84
+ return `${cdnUrl}/insecure/${optionsPath}/plain/${encodedSourceUrl}@${format}`;
85
+ }
86
+ return `${cdnUrl}/insecure/plain/${encodedSourceUrl}@${format}`;
26
87
  }
27
88
  /**
28
89
  * Generates a fallback URL (original source) for an image.
29
90
  * Useful when the CDN is unavailable or fails to load.
30
91
  *
31
- * @param imageUrl - The full image URL (potentially from CDN) or filename
32
- * @param cdnUrl - The CDN base URL to strip (if present)
33
- * @param storageUrl - The original storage base URL to prepend
92
+ * For imgproxy URLs, extracts the original source URL from the path.
93
+ * imgproxy URL format: {cdnUrl}/insecure/plain/{encodedSourceUrl}@{format}
94
+ *
95
+ * @param imageUrl - The full image URL (potentially from imgproxy) or filename
96
+ * @param cdnUrl - The imgproxy base URL to detect
97
+ * @param storageUrl - The original storage base URL (optional, used for filename-only inputs)
34
98
  */
35
- function getFallbackUrl(imageUrl, cdnUrl, storageUrl) {
99
+ function getFallbackUrl(imageUrl, cdnUrl, storageUrl = DEFAULT_STORAGE_URL) {
36
100
  if (!imageUrl)
37
101
  return null;
38
- let filename = imageUrl;
39
- // If it's a full CDN URL, strip the CDN prefix
102
+ // If it's an imgproxy URL, extract the source URL
40
103
  if (imageUrl.startsWith(cdnUrl)) {
41
- // Remove cdnUrl and any leading slash
42
- const relativePath = imageUrl.slice(cdnUrl.length);
43
- filename = relativePath.startsWith('/') ? relativePath.slice(1) : relativePath;
44
- }
45
- else if (imageUrl.startsWith('http://') || imageUrl.startsWith('https://')) {
46
- // If it's another full URL (not our CDN), return as-is or null?
47
- // Assume if it's not our CDN, we can't fallback easily unless it's just a filename
48
- // But if the input was already just a filename, we use it.
49
- // If it is some other external URL, we probably just return it as is or null.
50
- // For safety, if it doesn't start with CDN url, and is a full url, we assume it might already be the fallback or external.
104
+ // Parse imgproxy URL: {cdnUrl}/insecure/plain/{encodedSourceUrl}@{format}
105
+ const plainMatch = imageUrl.match(/\/plain\/([^@]+)(?:@\w+)?$/);
106
+ if (plainMatch) {
107
+ // Decode the source URL
108
+ return decodeURIComponent(plainMatch[1]);
109
+ }
110
+ // If it's a base64 encoded URL (no /plain/), try to decode
111
+ const base64Match = imageUrl.match(/\/insecure\/([^.]+)(?:\.\w+)?$/);
112
+ if (base64Match) {
113
+ try {
114
+ return Buffer.from(base64Match[1], 'base64url').toString('utf-8');
115
+ }
116
+ catch (_a) {
117
+ // Failed to decode, return as-is
118
+ }
119
+ }
51
120
  return imageUrl;
52
121
  }
53
- // Prepend storage URL if available
54
- if (storageUrl) {
55
- return `${storageUrl}/${filename}`;
122
+ // If it's another full URL (not our CDN), return as-is
123
+ if (imageUrl.startsWith('http://') || imageUrl.startsWith('https://')) {
124
+ return imageUrl;
56
125
  }
57
- return filename;
126
+ // Filename only - prepend storage URL
127
+ return `${storageUrl}/${imageUrl}`;
58
128
  }
59
129
  /** Known image field names */
60
130
  const IMAGE_FIELDS = new Set(['mainImage', 'backgroundImage', 'coverImage', 'image']);
@@ -1 +1 @@
1
- {"version":3,"file":"imageUrl.js","sourceRoot":"","sources":["../../transforms/imageUrl.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"imageUrl.js","sourceRoot":"","sources":["../../transforms/imageUrl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Chanomhub SDK - Download Types
3
+ */
4
+ /** Source status for moderation */
5
+ export type SourceStatus = 'PENDING' | 'APPROVED' | 'REJECTED';
6
+ /** Download link entity */
7
+ export interface DownloadLink {
8
+ id: number;
9
+ articleId: number;
10
+ createdById?: number | null;
11
+ name?: string | null;
12
+ url: string;
13
+ isActive: boolean;
14
+ status: SourceStatus;
15
+ vipOnly: boolean;
16
+ forVersion?: string | null;
17
+ createdAt: string;
18
+ updatedAt: string;
19
+ /** Included when expanded */
20
+ createdBy?: {
21
+ id: number;
22
+ name: string;
23
+ } | null;
24
+ }
25
+ /** Request to create a new download link */
26
+ export interface CreateDownloadLinkRequest {
27
+ [key: string]: unknown;
28
+ articleId: number;
29
+ name?: string;
30
+ url: string;
31
+ vipOnly?: boolean;
32
+ forVersion?: string;
33
+ }
34
+ /** Request to update a download link */
35
+ export interface UpdateDownloadLinkRequest {
36
+ [key: string]: unknown;
37
+ name?: string;
38
+ url?: string;
39
+ isActive?: boolean;
40
+ vipOnly?: boolean;
41
+ forVersion?: string;
42
+ }
43
+ /** Request to moderate a download link */
44
+ export interface ModerateDownloadLinkRequest {
45
+ [key: string]: unknown;
46
+ status: 'APPROVED' | 'REJECTED';
47
+ }
48
+ /** Response for create/update operations */
49
+ export interface DownloadLinkResponse {
50
+ downloadLink: DownloadLink;
51
+ }
52
+ /** Paginated list of download links */
53
+ export interface DownloadLinksListResponse {
54
+ items: DownloadLink[];
55
+ total: number;
56
+ page: number;
57
+ pageSize: number;
58
+ }
59
+ /** Options for listing downloads */
60
+ export interface ListDownloadsOptions {
61
+ status?: SourceStatus;
62
+ page?: number;
63
+ limit?: number;
64
+ }
65
+ //# sourceMappingURL=download.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../types/download.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,mCAAmC;AACnC,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;AAE/D,2BAA2B;AAC3B,MAAM,WAAW,YAAY;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,6BAA6B;IAC7B,SAAS,CAAC,EAAE;QACR,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;KAChB,GAAG,IAAI,CAAC;CACZ;AAED,4CAA4C;AAC5C,MAAM,WAAW,yBAAyB;IACtC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wCAAwC;AACxC,MAAM,WAAW,yBAAyB;IACtC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,0CAA0C;AAC1C,MAAM,WAAW,2BAA2B;IACxC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,MAAM,EAAE,UAAU,GAAG,UAAU,CAAC;CACnC;AAED,4CAA4C;AAC5C,MAAM,WAAW,oBAAoB;IACjC,YAAY,EAAE,YAAY,CAAC;CAC9B;AAED,uCAAuC;AACvC,MAAM,WAAW,yBAAyB;IACtC,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,oCAAoC;AACpC,MAAM,WAAW,oBAAoB;IACjC,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ /**
3
+ * Chanomhub SDK - Download Types
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=download.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download.js","sourceRoot":"","sources":["../../types/download.ts"],"names":[],"mappings":";AAAA;;GAEG"}
@@ -6,4 +6,5 @@ export * from './article';
6
6
  export * from './user';
7
7
  export type { SocialMediaLink } from './user';
8
8
  export * from './auth';
9
+ export * from './download';
9
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,YAAY,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAC9C,cAAc,QAAQ,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,YAAY,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAC9C,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC"}
@@ -21,4 +21,5 @@ __exportStar(require("./common"), exports);
21
21
  __exportStar(require("./article"), exports);
22
22
  __exportStar(require("./user"), exports);
23
23
  __exportStar(require("./auth"), exports);
24
+ __exportStar(require("./download"), exports);
24
25
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../types/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;AAEH,2CAAyB;AACzB,4CAA0B;AAC1B,yCAAuB;AAEvB,yCAAuB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../types/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;AAEH,2CAAyB;AACzB,4CAA0B;AAC1B,yCAAuB;AAEvB,yCAAuB;AACvB,6CAA2B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chanomhub/sdk",
3
- "version": "1.2.2",
3
+ "version": "1.2.4",
4
4
  "description": "ChanomHub SDK",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",