diff --git a/packages/image-shrink/src/utils/render/fallback.test.ts b/packages/image-shrink/src/utils/render/fallback.test.ts
new file mode 100644
index 00000000..6bc363c7
--- /dev/null
+++ b/packages/image-shrink/src/utils/render/fallback.test.ts
@@ -0,0 +1,42 @@
+///
+import { describe, expect, it } from 'vitest'
+import { fallback } from './fallback'
+import { loadImageAsBlob } from '../../test/helpers/loadImageAsBlob'
+import { imageLoader } from '../../utils/image/imageLoader'
+
+describe('fallback', () => {
+ it('should work', async () => {
+ const originalFile = await loadImageAsBlob(
+ () => import('../../test/samples/2000x2000.jpeg')
+ )
+ const image = await imageLoader(URL.createObjectURL(originalFile))
+ URL.revokeObjectURL(image.src)
+
+ const canvas = await fallback({
+ img: image,
+ sourceW: image.width,
+ targetW: 100,
+ targetH: 100,
+ step: 0.71
+ })
+
+ expect(canvas.width).toBe(100)
+ })
+
+ it('should throw if not supported', async () => {
+ const originalFile = await loadImageAsBlob(
+ () => import('../../test/samples/2000x2000.jpeg')
+ )
+ const image = await imageLoader(URL.createObjectURL(originalFile))
+ URL.revokeObjectURL(image.src)
+
+ const promise = fallback({
+ img: image,
+ sourceW: image.width,
+ targetW: 65535 + 1,
+ targetH: 65535 + 1,
+ step: 0.71
+ })
+ expect(promise).rejects.toThrow('Not supported')
+ })
+})
diff --git a/packages/image-shrink/src/utils/render/fallback.ts b/packages/image-shrink/src/utils/render/fallback.ts
index a5d37550..80a82653 100644
--- a/packages/image-shrink/src/utils/render/fallback.ts
+++ b/packages/image-shrink/src/utils/render/fallback.ts
@@ -59,14 +59,17 @@ export const fallback = ({
const steps = calcShrinkSteps({ sourceW, targetW, targetH, step })
return steps.reduce(
- (chain, [w, h]) => {
+ (chain, [w, h], idx) => {
return chain.then((canvas) => {
- return (
- testCanvasSize(w, h)
- .then(() => canvasResize(canvas, w, h))
- // Here we assume that at least one step will be supported and HTMLImageElement will be converted to HTMLCanvasElement
- .catch(() => canvas as unknown as HTMLCanvasElement)
- )
+ return testCanvasSize(w, h)
+ .then(() => canvasResize(canvas, w, h))
+ .catch(() => {
+ if (idx === steps.length - 1) {
+ // If the last step is failed then we assume that we can't shrink the image at all
+ throw new Error('Not supported')
+ }
+ return canvas as unknown as HTMLCanvasElement
+ })
})
},
Promise.resolve(img as HTMLCanvasElement | HTMLImageElement)
diff --git a/packages/rest-client/src/index.ts b/packages/rest-client/src/index.ts
index 17978547..a97ab82a 100644
--- a/packages/rest-client/src/index.ts
+++ b/packages/rest-client/src/index.ts
@@ -77,7 +77,10 @@ export {
export { getUserAgent } from '@uploadcare/api-client-utils'
/** Tools */
-export { RestClientError } from './tools/RestClientError'
+export {
+ RestClientError,
+ RestClientErrorOptions
+} from './tools/RestClientError'
export { paginate, Paginator } from './tools/paginate'
export { addonJobPoller, AddonJobPollerOptions } from './tools/addonJobPoller'
export {
diff --git a/packages/upload-client/src/index.ts b/packages/upload-client/src/index.ts
index 033633ae..e83fa477 100644
--- a/packages/upload-client/src/index.ts
+++ b/packages/upload-client/src/index.ts
@@ -79,7 +79,7 @@ export {
CancelError,
UploadcareError
} from '@uploadcare/api-client-utils'
-export { Queue } from './tools/Queue'
+export { Queue, Task } from './tools/Queue'
import { NetworkError } from '@uploadcare/api-client-utils'
/** @deprecated Please use NetworkError instead. */
@@ -90,6 +90,7 @@ export { Headers, ErrorRequestInfo } from './request/types'
export { UploadcareFile } from './tools/UploadcareFile'
export { UploadcareGroup } from './tools/UploadcareGroup'
export { UploadError, ErrorResponseInfo } from './tools/UploadError'
+export { ServerErrorCode } from './tools/ServerErrorCode'
import { UploadError } from './tools/UploadError'
/** @deprecated Please use UploadError instead. */
@@ -114,4 +115,4 @@ export {
ComputableProgressInfo,
UnknownProgressInfo
} from './api/types'
-export { isReadyPoll } from './tools/isReadyPoll'
+export { isReadyPoll, IsReadyPoolOptions } from './tools/isReadyPoll'
diff --git a/packages/upload-client/src/tools/Queue.ts b/packages/upload-client/src/tools/Queue.ts
index 057352e8..0151609b 100644
--- a/packages/upload-client/src/tools/Queue.ts
+++ b/packages/upload-client/src/tools/Queue.ts
@@ -1,4 +1,4 @@
-type Task = () => Promise
+export type Task = () => Promise
type Resolver = (value: unknown) => void
type Rejector = (error: unknown) => void
diff --git a/tsconfig.json b/tsconfig.json
index 05be5bf8..99bb9811 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -7,7 +7,7 @@
"strictNullChecks": true,
"strict": true,
"resolveJsonModule": true,
- "moduleResolution": "node",
+ "moduleResolution": "bundler",
"allowSyntheticDefaultImports": true,
"esModuleInterop": true
},