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 },