diff --git a/package-lock.json b/package-lock.json index eb6ac02..cdf8666 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,8 @@ "@types/pino": "^6.3.8", "7zip-bin": "^5.1.1", "fs-extra": "^10.0.0", + "imghash": "^0.0.9", + "leven": "^3.1.0", "lodash": "^4.17.21", "moleculer": "^0.14.16", "moleculer-db": "^0.8.13", @@ -490,6 +492,31 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "node_modules/@canvas/image": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@canvas/image/-/image-1.0.1.tgz", + "integrity": "sha512-nQ6Qt/marzeQkFikxw32qMep5Rs1U/7DdjqHlCn8ck78IX56CFnXjdfRCXOiM4kx8yvS4SmcPXuJjfpczRjFqA==", + "dependencies": { + "@canvas/image-data": "^1.0.0", + "@cwasm/jpeg-turbo": "^0.1.1", + "@cwasm/lodepng": "^0.1.2", + "@cwasm/nsbmp": "^0.1.0", + "@cwasm/nsgif": "^0.1.0", + "@cwasm/webp": "^0.1.3", + "fast-base64-decode": "^1.0.0", + "fast-base64-encode": "^1.0.0", + "fast-base64-length": "^1.0.0", + "simple-get": "^3.1.0" + }, + "engines": { + "node": ">=8.3" + } + }, + "node_modules/@canvas/image-data": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@canvas/image-data/-/image-data-1.0.0.tgz", + "integrity": "sha512-BxOqI5LgsIQP1odU5KMwV9yoijleOPzHL18/YvNqF9KFSGF2K/DLlYAbDQsWqd/1nbaFuSkYD/191dpMtNh4vw==" + }, "node_modules/@cnakazawa/watch": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", @@ -506,6 +533,46 @@ "node": ">=0.1.95" } }, + "node_modules/@cwasm/jpeg-turbo": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@cwasm/jpeg-turbo/-/jpeg-turbo-0.1.3.tgz", + "integrity": "sha512-FkZxwwC6r4zhzlqM0nYGaMj/MDSrZPxLOdPdM6ySlgsMfOpNAZcLQkpNF4jP+DmsuUvRoeUD0YSMBvg3jYfK6w==", + "dependencies": { + "@canvas/image-data": "^1.0.0" + } + }, + "node_modules/@cwasm/lodepng": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@cwasm/lodepng/-/lodepng-0.1.4.tgz", + "integrity": "sha512-UY5iB3ywNTgonNF4RmcxEc/eeNcAZBnX9MlSeNUogyruG7ZNPgpKotwPyiLWbqOjlXULz4wdArPEko0Zm3+cGQ==", + "dependencies": { + "@canvas/image-data": "^1.0.0" + } + }, + "node_modules/@cwasm/nsbmp": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@cwasm/nsbmp/-/nsbmp-0.1.2.tgz", + "integrity": "sha512-ZQGNDOI9ZxokqbNPmvcLKR8gBhfHjeFVuqE2eYysrbGiraQ93KeeIVrtiGKOMLW2JJOq9PbGBU0NX47qkpKWWA==", + "dependencies": { + "@canvas/image-data": "^1.0.0" + } + }, + "node_modules/@cwasm/nsgif": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@cwasm/nsgif/-/nsgif-0.1.2.tgz", + "integrity": "sha512-LOD5HlL0O5jpnIAl+dLSZcB3v0RBNBjtoaymdCEPe2kyKzaP20BF+jy/QUyOZogQsgMVjusZES3tgwwoiiJ2rA==", + "dependencies": { + "@canvas/image-data": "^1.0.0" + } + }, + "node_modules/@cwasm/webp": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@cwasm/webp/-/webp-0.1.5.tgz", + "integrity": "sha512-ceIZQkyxK+s7mmItNcWqqHdOBiJAxYxTnrnPNgUNjldB1M9j+Bp/3eVIVwC8rUFyN/zoFwuT0331pyY3ackaNA==", + "dependencies": { + "@canvas/image-data": "^1.0.0" + } + }, "node_modules/@hapi/bourne": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-2.0.0.tgz", @@ -2168,6 +2235,11 @@ "safe-buffer": "^5.1.1" } }, + "node_modules/blockhash-core": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/blockhash-core/-/blockhash-core-0.1.0.tgz", + "integrity": "sha512-Cv7BgBo0jjVPaeuel4cvxf9LqIGsYNIPz9DAGvvrF9LRlEq9Q3HXu+S8bklPCae0sCxAXic4HGMoImf3FeO3Nw==" + }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -4152,6 +4224,21 @@ "resolved": "https://registry.npmjs.org/fakerator/-/fakerator-0.3.2.tgz", "integrity": "sha512-Yw2ilaImRDctUsXJaIaHIIwsCzqNHIRPzdqkHNeGJl14kswt48QT3s8Df8i8pyL7f3X0MiMfp36v8OaNoOsG3g==" }, + "node_modules/fast-base64-decode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz", + "integrity": "sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==" + }, + "node_modules/fast-base64-encode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-base64-encode/-/fast-base64-encode-1.0.0.tgz", + "integrity": "sha512-z2XCzVK4fde2cuTEHu2QGkLD6BPtJNKJPn0Z7oINvmhq/quUuIIVPYKUdN0gYeZqOyurjJjBH/bUzK5gafyHvw==" + }, + "node_modules/fast-base64-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-base64-length/-/fast-base64-length-1.0.0.tgz", + "integrity": "sha512-MV+/ioblHx6SMjc/1l4EAnRJyAku6+6DxZ6RW0FoFCF1Aol/Ldb6FqwE3Kn3Ju1aam2m1KCIVoCljhgcG+Umzg==" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -4224,6 +4311,14 @@ "node": ">=4" } }, + "node_modules/file-type": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-10.11.0.tgz", + "integrity": "sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==", + "engines": { + "node": ">=6" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -4818,6 +4913,31 @@ "node": ">= 4" } }, + "node_modules/image-type": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/image-type/-/image-type-4.1.0.tgz", + "integrity": "sha512-CFJMJ8QK8lJvRlTCEgarL4ro6hfDQKif2HjSvYCdQZESaIPV4v9imrf7BQHK+sQeTeNeMpWciR9hyC/g8ybXEg==", + "dependencies": { + "file-type": "^10.10.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/imghash": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/imghash/-/imghash-0.0.9.tgz", + "integrity": "sha512-fvxoWZVlx2dSQQMitTFHVFooD/ODf57jzmZWjRiHQ4qYb6kKcydkV2IvcWa8+efuAwYn3n5/cJFMdpZ6D88yew==", + "dependencies": { + "@canvas/image": "^1.0.0", + "blockhash-core": "^0.1.0", + "image-type": "^4.1.0", + "jpeg-js": "^0.4.1" + }, + "engines": { + "node": ">=8.x.x" + } + }, "node_modules/immediate": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", @@ -7042,6 +7162,11 @@ "node": ">=6" } }, + "node_modules/jpeg-js": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.3.tgz", + "integrity": "sha512-ru1HWKek8octvUHFHvE5ZzQ1yAsJmIvRdGWvSoKV52XKyuyYA437QWDttXT8eZXDSbuMpHlLzPDZUPd6idIz+Q==" + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -7221,7 +7346,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, "engines": { "node": ">=6" } @@ -12502,6 +12626,28 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "@canvas/image": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@canvas/image/-/image-1.0.1.tgz", + "integrity": "sha512-nQ6Qt/marzeQkFikxw32qMep5Rs1U/7DdjqHlCn8ck78IX56CFnXjdfRCXOiM4kx8yvS4SmcPXuJjfpczRjFqA==", + "requires": { + "@canvas/image-data": "^1.0.0", + "@cwasm/jpeg-turbo": "^0.1.1", + "@cwasm/lodepng": "^0.1.2", + "@cwasm/nsbmp": "^0.1.0", + "@cwasm/nsgif": "^0.1.0", + "@cwasm/webp": "^0.1.3", + "fast-base64-decode": "^1.0.0", + "fast-base64-encode": "^1.0.0", + "fast-base64-length": "^1.0.0", + "simple-get": "^3.1.0" + } + }, + "@canvas/image-data": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@canvas/image-data/-/image-data-1.0.0.tgz", + "integrity": "sha512-BxOqI5LgsIQP1odU5KMwV9yoijleOPzHL18/YvNqF9KFSGF2K/DLlYAbDQsWqd/1nbaFuSkYD/191dpMtNh4vw==" + }, "@cnakazawa/watch": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", @@ -12512,6 +12658,46 @@ "minimist": "^1.2.0" } }, + "@cwasm/jpeg-turbo": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@cwasm/jpeg-turbo/-/jpeg-turbo-0.1.3.tgz", + "integrity": "sha512-FkZxwwC6r4zhzlqM0nYGaMj/MDSrZPxLOdPdM6ySlgsMfOpNAZcLQkpNF4jP+DmsuUvRoeUD0YSMBvg3jYfK6w==", + "requires": { + "@canvas/image-data": "^1.0.0" + } + }, + "@cwasm/lodepng": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@cwasm/lodepng/-/lodepng-0.1.4.tgz", + "integrity": "sha512-UY5iB3ywNTgonNF4RmcxEc/eeNcAZBnX9MlSeNUogyruG7ZNPgpKotwPyiLWbqOjlXULz4wdArPEko0Zm3+cGQ==", + "requires": { + "@canvas/image-data": "^1.0.0" + } + }, + "@cwasm/nsbmp": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@cwasm/nsbmp/-/nsbmp-0.1.2.tgz", + "integrity": "sha512-ZQGNDOI9ZxokqbNPmvcLKR8gBhfHjeFVuqE2eYysrbGiraQ93KeeIVrtiGKOMLW2JJOq9PbGBU0NX47qkpKWWA==", + "requires": { + "@canvas/image-data": "^1.0.0" + } + }, + "@cwasm/nsgif": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@cwasm/nsgif/-/nsgif-0.1.2.tgz", + "integrity": "sha512-LOD5HlL0O5jpnIAl+dLSZcB3v0RBNBjtoaymdCEPe2kyKzaP20BF+jy/QUyOZogQsgMVjusZES3tgwwoiiJ2rA==", + "requires": { + "@canvas/image-data": "^1.0.0" + } + }, + "@cwasm/webp": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@cwasm/webp/-/webp-0.1.5.tgz", + "integrity": "sha512-ceIZQkyxK+s7mmItNcWqqHdOBiJAxYxTnrnPNgUNjldB1M9j+Bp/3eVIVwC8rUFyN/zoFwuT0331pyY3ackaNA==", + "requires": { + "@canvas/image-data": "^1.0.0" + } + }, "@hapi/bourne": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-2.0.0.tgz", @@ -13834,6 +14020,11 @@ "safe-buffer": "^5.1.1" } }, + "blockhash-core": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/blockhash-core/-/blockhash-core-0.1.0.tgz", + "integrity": "sha512-Cv7BgBo0jjVPaeuel4cvxf9LqIGsYNIPz9DAGvvrF9LRlEq9Q3HXu+S8bklPCae0sCxAXic4HGMoImf3FeO3Nw==" + }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -15453,6 +15644,21 @@ "resolved": "https://registry.npmjs.org/fakerator/-/fakerator-0.3.2.tgz", "integrity": "sha512-Yw2ilaImRDctUsXJaIaHIIwsCzqNHIRPzdqkHNeGJl14kswt48QT3s8Df8i8pyL7f3X0MiMfp36v8OaNoOsG3g==" }, + "fast-base64-decode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz", + "integrity": "sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==" + }, + "fast-base64-encode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-base64-encode/-/fast-base64-encode-1.0.0.tgz", + "integrity": "sha512-z2XCzVK4fde2cuTEHu2QGkLD6BPtJNKJPn0Z7oINvmhq/quUuIIVPYKUdN0gYeZqOyurjJjBH/bUzK5gafyHvw==" + }, + "fast-base64-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-base64-length/-/fast-base64-length-1.0.0.tgz", + "integrity": "sha512-MV+/ioblHx6SMjc/1l4EAnRJyAku6+6DxZ6RW0FoFCF1Aol/Ldb6FqwE3Kn3Ju1aam2m1KCIVoCljhgcG+Umzg==" + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -15513,6 +15719,11 @@ "flat-cache": "^2.0.1" } }, + "file-type": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-10.11.0.tgz", + "integrity": "sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==" + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -15960,6 +16171,25 @@ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, + "image-type": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/image-type/-/image-type-4.1.0.tgz", + "integrity": "sha512-CFJMJ8QK8lJvRlTCEgarL4ro6hfDQKif2HjSvYCdQZESaIPV4v9imrf7BQHK+sQeTeNeMpWciR9hyC/g8ybXEg==", + "requires": { + "file-type": "^10.10.0" + } + }, + "imghash": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/imghash/-/imghash-0.0.9.tgz", + "integrity": "sha512-fvxoWZVlx2dSQQMitTFHVFooD/ODf57jzmZWjRiHQ4qYb6kKcydkV2IvcWa8+efuAwYn3n5/cJFMdpZ6D88yew==", + "requires": { + "@canvas/image": "^1.0.0", + "blockhash-core": "^0.1.0", + "image-type": "^4.1.0", + "jpeg-js": "^0.4.1" + } + }, "immediate": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", @@ -17643,6 +17873,11 @@ "resolved": "https://registry.npmjs.org/joycon/-/joycon-2.2.5.tgz", "integrity": "sha512-YqvUxoOcVPnCp0VU1/56f+iKSdvIRJYPznH22BdXV3xMk75SFXhWeJkZ8C9XxUWt1b5x2X1SxuFygW1U0FmkEQ==" }, + "jpeg-js": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.3.tgz", + "integrity": "sha512-ru1HWKek8octvUHFHvE5ZzQ1yAsJmIvRdGWvSoKV52XKyuyYA437QWDttXT8eZXDSbuMpHlLzPDZUPd6idIz+Q==" + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -17784,8 +18019,7 @@ "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" }, "levn": { "version": "0.3.0", diff --git a/package.json b/package.json index bbe8f1a..f8bec7c 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,8 @@ "@types/pino": "^6.3.8", "7zip-bin": "^5.1.1", "fs-extra": "^10.0.0", + "imghash": "^0.0.9", + "leven": "^3.1.0", "lodash": "^4.17.21", "moleculer": "^0.14.16", "moleculer-db": "^0.8.13", diff --git a/services/imagetransformation.service.ts b/services/imagetransformation.service.ts index c6818ac..830805e 100644 --- a/services/imagetransformation.service.ts +++ b/services/imagetransformation.service.ts @@ -6,7 +6,13 @@ import { ServiceSchema, Errors, } from "moleculer"; -import { resizeImage } from "../utils/imagetransformation.utils"; +import { + resizeImage, + calculateLevenshteinDistance, +} from "../utils/imagetransformation.utils"; +import https from "https"; +import fs from "fs"; +import path from "path"; export default class ProductsService extends Service { // @ts-ignore @@ -52,6 +58,44 @@ export default class ProductsService extends Service { return { resizeOperationStatus: resizeResult }; }, }, + calculateLevenshteinDistance: { + rest: "POST /calculateLevenshteinDistance", + params: {}, + async handler( + ctx: Context<{ + imagePath: string; + imagePath2: string; + options: { + match_id: string, + }; + }> + ) { + const fileName = ctx.params.options.match_id + "_" + path.basename( + ctx.params.imagePath + ); + return new Promise((resolve, reject) => { + https.get(ctx.params.imagePath2, (response) => { + const fileStream = response.pipe( + fs.createWriteStream( + `./userdata/temporary/${fileName}` + ) + ); + fileStream.on("finish", async () => { + const levenshteinDistance = await calculateLevenshteinDistance( + ctx.params.imagePath, + path.resolve( + `./userdata/temporary/${fileName}` + ) + ); + resolve(levenshteinDistance); + }); + + }).end(); + }); + + + }, + }, }, methods: {}, }, diff --git a/utils/imagetransformation.utils.ts b/utils/imagetransformation.utils.ts index 13c4ebb..68b17cb 100644 --- a/utils/imagetransformation.utils.ts +++ b/utils/imagetransformation.utils.ts @@ -1,4 +1,8 @@ const sharp = require("sharp"); +const imghash = require("imghash"); +const leven = require("leven"); +import path from "path"; +import { isNull, reject } from "lodash"; import { logger } from "./logger.utils"; export const extractMetadataFromImage = async ( @@ -32,3 +36,20 @@ export const resizeImage = async ( return info; }); }; + +export const calculateLevenshteinDistance = async ( + imagePath1: string, + imagePath2: string +): Promise> => { + console.log("AGANTUK", imagePath1) + const hash1 = await imghash.hash(imagePath1); + const hash2 = await imghash.hash(imagePath2); + console.log("HASHISH", hash1) + if (!isNull(hash1) && !isNull(hash2)) { + return new Promise((resolve, reject) => { + resolve({ levenshteinDistance: leven(hash1, hash2) }); + }); + } else { + reject("Can't calculate the Levenshtein distance") + } +}; diff --git a/yarn.lock b/yarn.lock index f66aa55..62247b4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -280,6 +280,27 @@ "resolved" "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" "version" "0.2.3" +"@canvas/image-data@^1.0.0": + "integrity" "sha512-BxOqI5LgsIQP1odU5KMwV9yoijleOPzHL18/YvNqF9KFSGF2K/DLlYAbDQsWqd/1nbaFuSkYD/191dpMtNh4vw==" + "resolved" "https://registry.npmjs.org/@canvas/image-data/-/image-data-1.0.0.tgz" + "version" "1.0.0" + +"@canvas/image@^1.0.0": + "integrity" "sha512-nQ6Qt/marzeQkFikxw32qMep5Rs1U/7DdjqHlCn8ck78IX56CFnXjdfRCXOiM4kx8yvS4SmcPXuJjfpczRjFqA==" + "resolved" "https://registry.npmjs.org/@canvas/image/-/image-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "@canvas/image-data" "^1.0.0" + "@cwasm/jpeg-turbo" "^0.1.1" + "@cwasm/lodepng" "^0.1.2" + "@cwasm/nsbmp" "^0.1.0" + "@cwasm/nsgif" "^0.1.0" + "@cwasm/webp" "^0.1.3" + "fast-base64-decode" "^1.0.0" + "fast-base64-encode" "^1.0.0" + "fast-base64-length" "^1.0.0" + "simple-get" "^3.1.0" + "@cnakazawa/watch@^1.0.3": "integrity" "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==" "resolved" "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz" @@ -288,6 +309,41 @@ "exec-sh" "^0.3.2" "minimist" "^1.2.0" +"@cwasm/jpeg-turbo@^0.1.1": + "integrity" "sha512-FkZxwwC6r4zhzlqM0nYGaMj/MDSrZPxLOdPdM6ySlgsMfOpNAZcLQkpNF4jP+DmsuUvRoeUD0YSMBvg3jYfK6w==" + "resolved" "https://registry.npmjs.org/@cwasm/jpeg-turbo/-/jpeg-turbo-0.1.3.tgz" + "version" "0.1.3" + dependencies: + "@canvas/image-data" "^1.0.0" + +"@cwasm/lodepng@^0.1.2": + "integrity" "sha512-UY5iB3ywNTgonNF4RmcxEc/eeNcAZBnX9MlSeNUogyruG7ZNPgpKotwPyiLWbqOjlXULz4wdArPEko0Zm3+cGQ==" + "resolved" "https://registry.npmjs.org/@cwasm/lodepng/-/lodepng-0.1.4.tgz" + "version" "0.1.4" + dependencies: + "@canvas/image-data" "^1.0.0" + +"@cwasm/nsbmp@^0.1.0": + "integrity" "sha512-ZQGNDOI9ZxokqbNPmvcLKR8gBhfHjeFVuqE2eYysrbGiraQ93KeeIVrtiGKOMLW2JJOq9PbGBU0NX47qkpKWWA==" + "resolved" "https://registry.npmjs.org/@cwasm/nsbmp/-/nsbmp-0.1.2.tgz" + "version" "0.1.2" + dependencies: + "@canvas/image-data" "^1.0.0" + +"@cwasm/nsgif@^0.1.0": + "integrity" "sha512-LOD5HlL0O5jpnIAl+dLSZcB3v0RBNBjtoaymdCEPe2kyKzaP20BF+jy/QUyOZogQsgMVjusZES3tgwwoiiJ2rA==" + "resolved" "https://registry.npmjs.org/@cwasm/nsgif/-/nsgif-0.1.2.tgz" + "version" "0.1.2" + dependencies: + "@canvas/image-data" "^1.0.0" + +"@cwasm/webp@^0.1.3": + "integrity" "sha512-ceIZQkyxK+s7mmItNcWqqHdOBiJAxYxTnrnPNgUNjldB1M9j+Bp/3eVIVwC8rUFyN/zoFwuT0331pyY3ackaNA==" + "resolved" "https://registry.npmjs.org/@cwasm/webp/-/webp-0.1.5.tgz" + "version" "0.1.5" + dependencies: + "@canvas/image-data" "^1.0.0" + "@hapi/bourne@^2.0.0": "integrity" "sha512-WEezM1FWztfbzqIUbsDzFRVMxSoLy3HugVcux6KDDtTqzPsLE8NDRHfXvev66aH1i2oOKKar3/XDjbvh/OUBdg==" "resolved" "https://registry.npmjs.org/@hapi/bourne/-/bourne-2.0.0.tgz" @@ -1141,6 +1197,11 @@ "inherits" "^2.0.4" "readable-stream" "^3.4.0" +"blockhash-core@^0.1.0": + "integrity" "sha512-Cv7BgBo0jjVPaeuel4cvxf9LqIGsYNIPz9DAGvvrF9LRlEq9Q3HXu+S8bklPCae0sCxAXic4HGMoImf3FeO3Nw==" + "resolved" "https://registry.npmjs.org/blockhash-core/-/blockhash-core-0.1.0.tgz" + "version" "0.1.0" + "bluebird@^3.7.2": "integrity" "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" "resolved" "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" @@ -2336,6 +2397,21 @@ "resolved" "https://registry.npmjs.org/fakerator/-/fakerator-0.3.2.tgz" "version" "0.3.2" +"fast-base64-decode@^1.0.0": + "integrity" "sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==" + "resolved" "https://registry.npmjs.org/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz" + "version" "1.0.0" + +"fast-base64-encode@^1.0.0": + "integrity" "sha512-z2XCzVK4fde2cuTEHu2QGkLD6BPtJNKJPn0Z7oINvmhq/quUuIIVPYKUdN0gYeZqOyurjJjBH/bUzK5gafyHvw==" + "resolved" "https://registry.npmjs.org/fast-base64-encode/-/fast-base64-encode-1.0.0.tgz" + "version" "1.0.0" + +"fast-base64-length@^1.0.0": + "integrity" "sha512-MV+/ioblHx6SMjc/1l4EAnRJyAku6+6DxZ6RW0FoFCF1Aol/Ldb6FqwE3Kn3Ju1aam2m1KCIVoCljhgcG+Umzg==" + "resolved" "https://registry.npmjs.org/fast-base64-length/-/fast-base64-length-1.0.0.tgz" + "version" "1.0.0" + "fast-deep-equal@^3.1.1": "integrity" "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" "resolved" "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" @@ -2387,6 +2463,11 @@ dependencies: "flat-cache" "^2.0.1" +"file-type@^10.10.0": + "integrity" "sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==" + "resolved" "https://registry.npmjs.org/file-type/-/file-type-10.11.0.tgz" + "version" "10.11.0" + "fill-range@^4.0.0": "integrity" "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=" "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz" @@ -2765,6 +2846,23 @@ "resolved" "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz" "version" "4.0.6" +"image-type@^4.1.0": + "integrity" "sha512-CFJMJ8QK8lJvRlTCEgarL4ro6hfDQKif2HjSvYCdQZESaIPV4v9imrf7BQHK+sQeTeNeMpWciR9hyC/g8ybXEg==" + "resolved" "https://registry.npmjs.org/image-type/-/image-type-4.1.0.tgz" + "version" "4.1.0" + dependencies: + "file-type" "^10.10.0" + +"imghash@^0.0.9": + "integrity" "sha512-fvxoWZVlx2dSQQMitTFHVFooD/ODf57jzmZWjRiHQ4qYb6kKcydkV2IvcWa8+efuAwYn3n5/cJFMdpZ6D88yew==" + "resolved" "https://registry.npmjs.org/imghash/-/imghash-0.0.9.tgz" + "version" "0.0.9" + dependencies: + "@canvas/image" "^1.0.0" + "blockhash-core" "^0.1.0" + "image-type" "^4.1.0" + "jpeg-js" "^0.4.1" + "immediate@~3.0.5": "integrity" "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" "resolved" "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz" @@ -3538,6 +3636,11 @@ "resolved" "https://registry.npmjs.org/joycon/-/joycon-2.2.5.tgz" "version" "2.2.5" +"jpeg-js@^0.4.1": + "integrity" "sha512-ru1HWKek8octvUHFHvE5ZzQ1yAsJmIvRdGWvSoKV52XKyuyYA437QWDttXT8eZXDSbuMpHlLzPDZUPd6idIz+Q==" + "resolved" "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.3.tgz" + "version" "0.4.3" + "js-tokens@^4.0.0": "integrity" "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" "resolved" "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"