Skip to content

Commit

Permalink
🤖 Merge PR DefinitelyTyped#65464 chore: update types to reflect state…
Browse files Browse the repository at this point in the history
… of package by @StampixSMO

* chore: update types to reflect state of package

* chore: update types to reflect state of package

* refactor: prettier

* chore: add requiresMetaData

* chore: add fetchBlob

* chore: add transform

* chore: add global

* chore: add readFile, isInstanceOf, createObjectUrl, revokeObjectUrl

* fix: typo

* fix: return type

* refactor: prettier
  • Loading branch information
StampixSMO authored and Desplandis committed Jul 3, 2023
1 parent 8c6e836 commit 5bf520d
Show file tree
Hide file tree
Showing 2 changed files with 122 additions and 66 deletions.
133 changes: 77 additions & 56 deletions types/blueimp-load-image/blueimp-load-image-tests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,78 +5,99 @@ import loadImage = require('blueimp-load-image');
// 2x1px JPEG (color white, with the Exif orientation flag set to 6 and the
// IPTC ObjectName (2:5) set to 'objectname'):
const b64DataJPEG =
'/9j/4AAQSkZJRgABAQEAYABgAAD/4QAiRXhpZgAASUkqAAgAAAABABIBAwABAAAA' +
'BgASAAAAAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAA8cAgUACm9iamVj' +
'dG5hbWUA/9sAQwABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB' +
'AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB/9sAQwEBAQEBAQEBAQEBAQEBAQEB' +
'AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB' +
'/8AAEQgAAQACAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYH' +
'CAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGh' +
'CCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldY' +
'WVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1' +
'tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8B' +
'AAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAEC' +
'dwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBka' +
'JicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWG' +
'h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ' +
'2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A/v4ooooA/9k=';
'/9j/4AAQSkZJRgABAQEAYABgAAD/4QAiRXhpZgAASUkqAAgAAAABABIBAwABAAAA' +
'BgASAAAAAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAA8cAgUACm9iamVj' +
'dG5hbWUA/9sAQwABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB' +
'AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB/9sAQwEBAQEBAQEBAQEBAQEBAQEB' +
'AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB' +
'/8AAEQgAAQACAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYH' +
'CAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGh' +
'CCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldY' +
'WVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1' +
'tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8B' +
'AAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAEC' +
'dwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBka' +
'JicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWG' +
'h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ' +
'2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A/v4ooooA/9k=';
const imageUrlJPEG = 'data:image/jpeg;base64,' + b64DataJPEG;
const imageBlob = new Blob([imageUrlJPEG]);

// Callback style
loadImage(imageUrlJPEG, (image: Event | HTMLCanvasElement | HTMLImageElement, data?: loadImage.MetaData): void => {
const canvas = image as HTMLCanvasElement;
console.log(data);
canvas.toBlob((blob: Blob | null): void => {
const url = canvas.toDataURL("image/png");
console.log(url);
});
}, { canvas: true, orientation: true, maxWidth: 100, maxHeight: 100, crop: true });
loadImage(
imageUrlJPEG,
(image: Event | HTMLCanvasElement | HTMLImageElement, data?: loadImage.MetaData): void => {
const canvas = image as HTMLCanvasElement;
console.log(data);
canvas.toBlob((blob: Blob | null): void => {
const url = canvas.toDataURL('image/png');
console.log(url);
});
},
{ canvas: true, orientation: true, maxWidth: 100, maxHeight: 100, crop: true },
);

// Promise style
loadImage(imageUrlJPEG, { canvas: true, orientation: true, maxWidth: 100, maxHeight: 100, crop: true }).then((data) => {
const canvas = (<any> data.image) as HTMLCanvasElement;
console.log(data);
canvas.toBlob((blob: Blob | null): void => {
const url = canvas.toDataURL("image/png");
console.log(url);
});
loadImage(imageUrlJPEG, { canvas: true, orientation: true, maxWidth: 100, maxHeight: 100, crop: true }).then(data => {
const canvas = data.image as any as HTMLCanvasElement;
console.log(data);
canvas.toBlob((blob: Blob | null): void => {
const url = canvas.toDataURL('image/png');
console.log(url);
});
});

// Parse metadata using callback
loadImage.parseMetaData(imageUrlJPEG, (metadata) => {
console.log(metadata.exif && metadata.exif.get('Orientation'));
console.log(metadata.exif && metadata.exif[0x0112]);
loadImage.parseMetaData(imageUrlJPEG, metadata => {
console.log(metadata.exif && metadata.exif.get('Orientation'));
console.log(metadata.exif && metadata.exif[0x0112]);
});

// Parse metadata using promise
loadImage.parseMetaData(imageUrlJPEG).then((metadata) => {
console.log(metadata.exif && metadata.exif.get('Orientation'));
console.log(metadata.exif && metadata.exif[0x0112]);
loadImage.parseMetaData(imageUrlJPEG).then(metadata => {
console.log(metadata.exif && metadata.exif.get('Orientation'));
console.log(metadata.exif && metadata.exif[0x0112]);
});

// Replace image head, using callback
loadImage(imageUrlJPEG, (_: Event | HTMLCanvasElement | HTMLImageElement, data?: loadImage.MetaData): void => {
if (data?.imageHead) {
loadImage.replaceHead(imageBlob, data.imageHead, (blob) => {
console.log(blob?.size);
});
}
}, {});
loadImage(
imageUrlJPEG,
(_: Event | HTMLCanvasElement | HTMLImageElement, data?: loadImage.MetaData): void => {
if (data?.imageHead) {
loadImage.replaceHead(imageBlob, data.imageHead, blob => {
console.log(blob?.size);
});
}
},
{},
);

// Replace image head, using promise
loadImage(imageUrlJPEG, (_: Event | HTMLCanvasElement | HTMLImageElement, data?: loadImage.MetaData): void => {
if (data?.imageHead) {
loadImage.replaceHead(imageBlob, data.imageHead).then((blob) => {
console.log(blob?.size);
});
}
}, {});
loadImage(
imageUrlJPEG,
(_: Event | HTMLCanvasElement | HTMLImageElement, data?: loadImage.MetaData): void => {
if (data?.imageHead) {
loadImage.replaceHead(imageBlob, data.imageHead).then(blob => {
console.log(blob?.size);
});
}
},
{},
);

// Write Exif data
loadImage(imageUrlJPEG, (_: Event | HTMLCanvasElement | HTMLImageElement, data?: loadImage.MetaData): void => {
if (data?.imageHead) {
const newBuffer: ArrayBuffer | Uint8Array = loadImage.writeExifData(data.imageHead, data, 'Orientation', 1);
console.log(newBuffer.byteLength);
}
}, {});
loadImage(
imageUrlJPEG,
(_: Event | HTMLCanvasElement | HTMLImageElement, data?: loadImage.MetaData): void => {
if (data?.imageHead && data?.exif && data?.exifOffsets) {
const newBuffer: ArrayBuffer | Uint8Array = loadImage.writeExifData(
data.imageHead,
{ exifOffsets: data.exifOffsets, exif: data.exif },
'Orientation',
1,
);
console.log(newBuffer.byteLength);
}
},
{},
);
55 changes: 45 additions & 10 deletions types/blueimp-load-image/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,11 @@ declare namespace loadImage {

type ExifTagValue = number | string | string[];

type ExifMap = Record<number, number>;

interface Exif {
[tag: number]: ExifTagValue;
map: Record<string, number>;
get: (tagName: 'Orientation' | 'Thumbnail' | 'Exif' | 'GPSInfo' | 'Interoperability') => ExifTagValue;
}

Expand All @@ -34,6 +37,12 @@ declare namespace loadImage {
originalHeight?: number | undefined;
exif?: Exif | undefined;
iptc?: Iptc | undefined;
exifOffsets?: ExifMap;
}

interface WriteExifData {
exif: Pick<Exif, 'map'>;
exifOffsets: ExifMap;
}

interface BasicOptions {
Expand Down Expand Up @@ -102,6 +111,15 @@ declare namespace loadImage {

// Disables creating the imageHead property.
disableImageHead?: boolean | undefined;

disableExif?: boolean | undefined;
disableExifOffsets?: boolean | undefined;
includeExifTags?: Record<number, boolean> | undefined;
excludeExifTags?: Record<number, boolean> | undefined;
disableIptc?: boolean | undefined;
disableIptcOffsets?: boolean | undefined;
includeIptcTags?: Record<number, boolean> | undefined;
excludeIptcTags?: Record<number, boolean> | undefined;
}

type LoadImageOptions = BasicOptions & CanvasOptions & CropOptions & MetaOptions;
Expand All @@ -122,15 +140,15 @@ interface ParseMetadata {
}

interface ReplaceHead {
(
blob: Blob,
head: ArrayBuffer | Uint8Array,
callback: (blob: Blob|null) => void
): void;
(
blob: Blob,
head: ArrayBuffer | Uint8Array,
): Promise<Blob|null>;
(blob: Blob, head: ArrayBuffer | Uint8Array, callback: (blob: Blob | null) => void): void;
(blob: Blob, head: ArrayBuffer | Uint8Array): Promise<Blob | null>;
}

interface Scale {
<O extends loadImage.LoadImageOptions>(
image: HTMLImageElement | HTMLCanvasElement,
options?: O,
): O extends loadImage.CanvasTrueOptions ? HTMLCanvasElement : HTMLImageElement;
}

// loadImage is implemented as a callable object.
Expand All @@ -149,7 +167,24 @@ interface LoadImage {
// Replaces the image head of a JPEG blob with the given one
replaceHead: ReplaceHead;

writeExifData: (buffer: ArrayBuffer | Uint8Array, data: loadImage.MetaData, id: number | string, value: loadImage.ExifTagValue) => ArrayBuffer | Uint8Array;
writeExifData: (
buffer: ArrayBuffer | Uint8Array,
data: loadImage.WriteExifData,
id: number | string,
value: loadImage.ExifTagValue,
) => ArrayBuffer | Uint8Array;

scale: Scale;

// Internal functions, undocumented
requiresMetaData: (options: loadImage.LoadImageOptions) => boolean;
fetchBlob: (url: string, callback: () => void) => void;
transform: (img: unknown, options: unknown, callback: () => void, file: unknown, data: unknown) => void;
global: Window;
readFile: unknown;
isInstanceOf: unknown;
createObjectURL: (blob: Blob) => string | false;
revokeObjectURL: (url: string) => void | false;
}

declare const loadImage: LoadImage;
Expand Down

0 comments on commit 5bf520d

Please sign in to comment.