@flighthq/image-codec 0.3.0-next.1392.f0bd0cc → 0.3.0-next.1422.b585c0c
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/dist/contract.d.ts +2 -0
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +2 -0
- package/dist/contract.js.map +1 -1
- package/dist/explainImageDecodeFailure.d.ts +3 -0
- package/dist/explainImageDecodeFailure.d.ts.map +1 -0
- package/dist/explainImageDecodeFailure.js +13 -0
- package/dist/explainImageDecodeFailure.js.map +1 -0
- package/dist/explainImageEncodeFailure.d.ts +3 -0
- package/dist/explainImageEncodeFailure.d.ts.map +1 -0
- package/dist/explainImageEncodeFailure.js +9 -0
- package/dist/explainImageEncodeFailure.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/decodeImage.test.ts +8 -1
- package/src/explainImageDecodeFailure.test.ts +37 -0
- package/src/explainImageEncodeFailure.test.ts +24 -0
package/dist/contract.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export * from './decodeImage';
|
|
2
2
|
export * from './detectImageMimeType';
|
|
3
3
|
export * from './encodeImage';
|
|
4
|
+
export * from './explainImageDecodeFailure';
|
|
5
|
+
export * from './explainImageEncodeFailure';
|
|
4
6
|
export * from './imageDecoderRegistry';
|
|
5
7
|
export * from './imageEncoderRegistry';
|
|
6
8
|
export * from './registerWebImageDecoders';
|
package/dist/contract.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC"}
|
|
1
|
+
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC"}
|
package/dist/contract.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export * from './decodeImage';
|
|
2
2
|
export * from './detectImageMimeType';
|
|
3
3
|
export * from './encodeImage';
|
|
4
|
+
export * from './explainImageDecodeFailure';
|
|
5
|
+
export * from './explainImageEncodeFailure';
|
|
4
6
|
export * from './imageDecoderRegistry';
|
|
5
7
|
export * from './imageEncoderRegistry';
|
|
6
8
|
export * from './registerWebImageDecoders';
|
package/dist/contract.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC"}
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explainImageDecodeFailure.d.ts","sourceRoot":"","sources":["../src/explainImageDecodeFailure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AAO9E,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,EAC3B,QAAQ,CAAC,EAAE,MAAM,GAChB,6BAA6B,GAAG,IAAI,CAKtC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { detectImageMimeType } from './detectImageMimeType';
|
|
2
|
+
import { getImageDecoder } from './imageDecoderRegistry';
|
|
3
|
+
// Explains the two dispatcher failures that decodeImage represents with null. Returns null when the
|
|
4
|
+
// same request can reach a registered decoder. This is a read-only query and never invokes the codec.
|
|
5
|
+
export function explainImageDecodeFailure(bytes, mimeType) {
|
|
6
|
+
const type = mimeType ?? detectImageMimeType(bytes);
|
|
7
|
+
if (type === null)
|
|
8
|
+
return { mimeType: null, reason: 'mime-type-undetected' };
|
|
9
|
+
if (getImageDecoder(type) === null)
|
|
10
|
+
return { mimeType: type, reason: 'decoder-not-registered' };
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=explainImageDecodeFailure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explainImageDecodeFailure.js","sourceRoot":"","sources":["../src/explainImageDecodeFailure.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,oGAAoG;AACpG,sGAAsG;AACtG,MAAM,UAAU,yBAAyB,CACvC,KAA2B,EAC3B,QAAiB;IAEjB,MAAM,IAAI,GAAG,QAAQ,IAAI,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACpD,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC;IAC7E,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC;IAChG,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explainImageEncodeFailure.d.ts","sourceRoot":"","sources":["../src/explainImageEncodeFailure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AAM9E,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,6BAA6B,GAAG,IAAI,CAGhG"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { getImageEncoder } from './imageEncoderRegistry';
|
|
2
|
+
// Explains the dispatcher failure that encodeImage represents with null. Returns null when an encoder
|
|
3
|
+
// is registered for the requested MIME type. This is a read-only query and never invokes the codec.
|
|
4
|
+
export function explainImageEncodeFailure(mimeType) {
|
|
5
|
+
if (getImageEncoder(mimeType) !== null)
|
|
6
|
+
return null;
|
|
7
|
+
return { mimeType, reason: 'encoder-not-registered' };
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=explainImageEncodeFailure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explainImageEncodeFailure.js","sourceRoot":"","sources":["../src/explainImageEncodeFailure.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,sGAAsG;AACtG,oGAAoG;AACpG,MAAM,UAAU,yBAAyB,CAAC,QAAgB;IACxD,IAAI,eAAe,CAAC,QAAQ,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC;AACxD,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { clearImageDecoders, clearImageEncoders, decodeImage, decodeImagePremultiplied, detectImageMimeType, encodeImage, getImageDecoder, getImageDecoderMimeTypes, getImageEncoder, getImageEncoderMimeTypes, hasImageDecoder, hasImageEncoder, registerImageDecoder, registerImageEncoder, registerWebImageDecoders, registerWebImageEncoders, unregisterImageDecoder, unregisterImageEncoder, } from './contract';
|
|
1
|
+
export { clearImageDecoders, clearImageEncoders, decodeImage, decodeImagePremultiplied, detectImageMimeType, encodeImage, explainImageDecodeFailure, explainImageEncodeFailure, getImageDecoder, getImageDecoderMimeTypes, getImageEncoder, getImageEncoderMimeTypes, hasImageDecoder, hasImageEncoder, registerImageDecoder, registerImageEncoder, registerWebImageDecoders, registerWebImageEncoders, unregisterImageDecoder, unregisterImageEncoder, } from './contract';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,WAAW,EACX,wBAAwB,EACxB,mBAAmB,EACnB,WAAW,EACX,eAAe,EACf,wBAAwB,EACxB,eAAe,EACf,wBAAwB,EACxB,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,WAAW,EACX,wBAAwB,EACxB,mBAAmB,EACnB,WAAW,EACX,yBAAyB,EACzB,yBAAyB,EACzB,eAAe,EACf,wBAAwB,EACxB,eAAe,EACf,wBAAwB,EACxB,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { clearImageDecoders, clearImageEncoders, decodeImage, decodeImagePremultiplied, detectImageMimeType, encodeImage, getImageDecoder, getImageDecoderMimeTypes, getImageEncoder, getImageEncoderMimeTypes, hasImageDecoder, hasImageEncoder, registerImageDecoder, registerImageEncoder, registerWebImageDecoders, registerWebImageEncoders, unregisterImageDecoder, unregisterImageEncoder, } from './contract';
|
|
1
|
+
export { clearImageDecoders, clearImageEncoders, decodeImage, decodeImagePremultiplied, detectImageMimeType, encodeImage, explainImageDecodeFailure, explainImageEncodeFailure, getImageDecoder, getImageDecoderMimeTypes, getImageEncoder, getImageEncoderMimeTypes, hasImageDecoder, hasImageEncoder, registerImageDecoder, registerImageEncoder, registerWebImageDecoders, registerWebImageEncoders, unregisterImageDecoder, unregisterImageEncoder, } from './contract';
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,WAAW,EACX,wBAAwB,EACxB,mBAAmB,EACnB,WAAW,EACX,eAAe,EACf,wBAAwB,EACxB,eAAe,EACf,wBAAwB,EACxB,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,WAAW,EACX,wBAAwB,EACxB,mBAAmB,EACnB,WAAW,EACX,yBAAyB,EACzB,yBAAyB,EACzB,eAAe,EACf,wBAAwB,EACxB,eAAe,EACf,wBAAwB,EACxB,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,YAAY,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flighthq/image-codec",
|
|
3
|
-
"version": "0.3.0-next.
|
|
3
|
+
"version": "0.3.0-next.1422.b585c0c",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/flighthq/flight.git",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@flighthq/types": "0.3.0-next.
|
|
39
|
+
"@flighthq/types": "0.3.0-next.1422.b585c0c"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"typescript": "^5.3.0"
|
package/src/decodeImage.test.ts
CHANGED
|
@@ -53,7 +53,14 @@ describe('decodeImagePremultiplied', () => {
|
|
|
53
53
|
fakeDecoded(),
|
|
54
54
|
);
|
|
55
55
|
registerImageDecoder('image/png', decoder);
|
|
56
|
-
await decodeImagePremultiplied(pngBytes);
|
|
56
|
+
await decodeImagePremultiplied(pngBytes, 'image/png');
|
|
57
|
+
expect(decoder).toHaveBeenCalledWith(pngBytes, { premultiplyAlpha: true });
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it('auto-detects the MIME type when omitted', async () => {
|
|
61
|
+
const decoder = vi.fn(async () => fakeDecoded());
|
|
62
|
+
registerImageDecoder('image/png', decoder);
|
|
63
|
+
expect(await decodeImagePremultiplied(pngBytes)).toEqual(fakeDecoded());
|
|
57
64
|
expect(decoder).toHaveBeenCalledWith(pngBytes, { premultiplyAlpha: true });
|
|
58
65
|
});
|
|
59
66
|
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { vi } from 'vitest';
|
|
2
|
+
|
|
3
|
+
import { explainImageDecodeFailure } from './explainImageDecodeFailure';
|
|
4
|
+
import { clearImageDecoders, registerImageDecoder } from './imageDecoderRegistry';
|
|
5
|
+
|
|
6
|
+
const pngBytes = new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);
|
|
7
|
+
|
|
8
|
+
afterEach(() => {
|
|
9
|
+
clearImageDecoders();
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
describe('explainImageDecodeFailure', () => {
|
|
13
|
+
it('distinguishes an undetected MIME type from a missing decoder', () => {
|
|
14
|
+
expect(explainImageDecodeFailure(new Uint8Array([0, 1, 2, 3]))).toEqual({
|
|
15
|
+
mimeType: null,
|
|
16
|
+
reason: 'mime-type-undetected',
|
|
17
|
+
});
|
|
18
|
+
expect(explainImageDecodeFailure(pngBytes)).toEqual({
|
|
19
|
+
mimeType: 'image/png',
|
|
20
|
+
reason: 'decoder-not-registered',
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it('reports the explicit MIME type when its decoder is missing', () => {
|
|
25
|
+
expect(explainImageDecodeFailure(pngBytes, 'image/custom')).toEqual({
|
|
26
|
+
mimeType: 'image/custom',
|
|
27
|
+
reason: 'decoder-not-registered',
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it('returns null without invoking a registered decoder', () => {
|
|
32
|
+
const decoder = vi.fn();
|
|
33
|
+
registerImageDecoder('image/png', decoder);
|
|
34
|
+
expect(explainImageDecodeFailure(pngBytes)).toBeNull();
|
|
35
|
+
expect(decoder).not.toHaveBeenCalled();
|
|
36
|
+
});
|
|
37
|
+
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { vi } from 'vitest';
|
|
2
|
+
|
|
3
|
+
import { explainImageEncodeFailure } from './explainImageEncodeFailure';
|
|
4
|
+
import { clearImageEncoders, registerImageEncoder } from './imageEncoderRegistry';
|
|
5
|
+
|
|
6
|
+
afterEach(() => {
|
|
7
|
+
clearImageEncoders();
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
describe('explainImageEncodeFailure', () => {
|
|
11
|
+
it('reports a missing encoder and its requested MIME type', () => {
|
|
12
|
+
expect(explainImageEncodeFailure('image/custom')).toEqual({
|
|
13
|
+
mimeType: 'image/custom',
|
|
14
|
+
reason: 'encoder-not-registered',
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it('returns null without invoking a registered encoder', () => {
|
|
19
|
+
const encoder = vi.fn();
|
|
20
|
+
registerImageEncoder('image/png', encoder);
|
|
21
|
+
expect(explainImageEncodeFailure('image/png')).toBeNull();
|
|
22
|
+
expect(encoder).not.toHaveBeenCalled();
|
|
23
|
+
});
|
|
24
|
+
});
|