@midscene/shared 1.11.0 → 1.11.1-beta-20260818123028.0

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.
@@ -5,7 +5,7 @@ import { assert } from "../utils.mjs";
5
5
  import { maskConfig, parseJson } from "./helper.mjs";
6
6
  import { initDebugConfig } from "./init-debug.mjs";
7
7
  const MODEL_CONFIG_DOC_URL = 'https://midscenejs.com/model-common-config.html';
8
- const getCurrentVersion = ()=>"1.11.0";
8
+ const getCurrentVersion = ()=>"1.11.1-beta-20260818123028.0";
9
9
  const getInvalidModelFamilyMessage = (modelFamily)=>`Invalid MIDSCENE_MODEL_FAMILY value: ${modelFamily}. Current version v${getCurrentVersion()} accepts the following model families: ${MODEL_FAMILY_VALUES.join(', ')}. You can also visit ${MODEL_CONFIG_DOC_URL} for the latest configuration information.`;
10
10
  const KEYS_MAP = {
11
11
  insight: INSIGHT_MODEL_CONFIG_KEYS,
@@ -1,4 +1,4 @@
1
1
  import { imageInfoOfBase64, isValidImageBuffer, isValidJPEGImageBuffer, isValidPNGImageBuffer, validateScreenshotBuffer } from "./info.mjs";
2
- import { convertImgBufferToJpeg, createImgBase64ByFormat, cropByRect, httpImg2Base64, inferBase64ImageFormat, localImg2Base64, normalizeBase64Image, normalizeScreenshotBase64, paddingToMatchBlockByBase64, parseBase64, preProcessImageUrl, resizeAndConvertImgBuffer, resizeImgBase64, saveBase64Image, scaleImage, zoomForGPT4o } from "./transform.mjs";
2
+ import { convertImgBufferToJpeg, convertPngBase64ToJpeg, createImgBase64ByFormat, cropByRect, httpImg2Base64, inferBase64ImageFormat, localImg2Base64, normalizeBase64Image, normalizeScreenshotBase64, paddingToMatchBlockByBase64, parseBase64, preProcessImageUrl, resizeAndConvertImgBuffer, resizeImgBase64, saveBase64Image, scaleImage, zoomForGPT4o } from "./transform.mjs";
3
3
  import { annotateRects, compositeElementInfoImg, compositePointMarkerImg, processImageElementInfo } from "./box-select.mjs";
4
- export { annotateRects, compositeElementInfoImg, compositePointMarkerImg, convertImgBufferToJpeg, createImgBase64ByFormat, cropByRect, httpImg2Base64, imageInfoOfBase64, inferBase64ImageFormat, isValidImageBuffer, isValidJPEGImageBuffer, isValidPNGImageBuffer, localImg2Base64, normalizeBase64Image, normalizeScreenshotBase64, paddingToMatchBlockByBase64, parseBase64, preProcessImageUrl, processImageElementInfo, resizeAndConvertImgBuffer, resizeImgBase64, saveBase64Image, scaleImage, validateScreenshotBuffer, zoomForGPT4o };
4
+ export { annotateRects, compositeElementInfoImg, compositePointMarkerImg, convertImgBufferToJpeg, convertPngBase64ToJpeg, createImgBase64ByFormat, cropByRect, httpImg2Base64, imageInfoOfBase64, inferBase64ImageFormat, isValidImageBuffer, isValidJPEGImageBuffer, isValidPNGImageBuffer, localImg2Base64, normalizeBase64Image, normalizeScreenshotBase64, paddingToMatchBlockByBase64, parseBase64, preProcessImageUrl, processImageElementInfo, resizeAndConvertImgBuffer, resizeImgBase64, saveBase64Image, scaleImage, validateScreenshotBuffer, zoomForGPT4o };
@@ -322,6 +322,12 @@ const parseBase64 = (fullBase64String)=>{
322
322
  });
323
323
  }
324
324
  };
325
+ async function convertPngBase64ToJpeg(imageBase64, quality = 90) {
326
+ const { mimeType, body } = parseBase64(imageBase64);
327
+ if ('image/png' !== mimeType.toLowerCase()) return imageBase64;
328
+ const jpegBuffer = await convertImgBufferToJpeg(Buffer.from(body, 'base64'), quality);
329
+ return createImgBase64ByFormat('jpeg', jpegBuffer.toString('base64'));
330
+ }
325
331
  async function scaleImage(imageBase64, scale) {
326
332
  if (scale <= 0) throw new Error('Scale factor must be positive');
327
333
  const { body } = parseBase64(imageBase64);
@@ -377,4 +383,4 @@ async function scaleImage(imageBase64, scale) {
377
383
  imageBase64: base64
378
384
  };
379
385
  }
380
- export { convertImgBufferToJpeg, createImgBase64ByFormat, cropByRect, httpImg2Base64, inferBase64ImageFormat, localImg2Base64, normalizeBase64Body, normalizeBase64Image, normalizeScreenshotBase64, paddingToMatchBlock, paddingToMatchBlockByBase64, parseBase64, photonFromBase64, photonToBase64, preProcessImageUrl, resizeAndConvertImgBuffer, resizeImgBase64, saveBase64Image, scaleImage, zoomForGPT4o };
386
+ export { convertImgBufferToJpeg, convertPngBase64ToJpeg, createImgBase64ByFormat, cropByRect, httpImg2Base64, inferBase64ImageFormat, localImg2Base64, normalizeBase64Body, normalizeBase64Image, normalizeScreenshotBase64, paddingToMatchBlock, paddingToMatchBlockByBase64, parseBase64, photonFromBase64, photonToBase64, preProcessImageUrl, resizeAndConvertImgBuffer, resizeImgBase64, saveBase64Image, scaleImage, zoomForGPT4o };
@@ -37,7 +37,7 @@ const external_utils_js_namespaceObject = require("../utils.js");
37
37
  const external_helper_js_namespaceObject = require("./helper.js");
38
38
  const external_init_debug_js_namespaceObject = require("./init-debug.js");
39
39
  const MODEL_CONFIG_DOC_URL = 'https://midscenejs.com/model-common-config.html';
40
- const getCurrentVersion = ()=>"1.11.0";
40
+ const getCurrentVersion = ()=>"1.11.1-beta-20260818123028.0";
41
41
  const getInvalidModelFamilyMessage = (modelFamily)=>`Invalid MIDSCENE_MODEL_FAMILY value: ${modelFamily}. Current version v${getCurrentVersion()} accepts the following model families: ${external_types_js_namespaceObject.MODEL_FAMILY_VALUES.join(', ')}. You can also visit ${MODEL_CONFIG_DOC_URL} for the latest configuration information.`;
42
42
  const KEYS_MAP = {
43
43
  insight: external_constants_js_namespaceObject.INSIGHT_MODEL_CONFIG_KEYS,
@@ -39,14 +39,15 @@ __webpack_require__.d(__webpack_exports__, {
39
39
  annotateRects: ()=>external_box_select_js_namespaceObject.annotateRects,
40
40
  compositeElementInfoImg: ()=>external_box_select_js_namespaceObject.compositeElementInfoImg,
41
41
  isValidPNGImageBuffer: ()=>external_info_js_namespaceObject.isValidPNGImageBuffer,
42
- normalizeBase64Image: ()=>external_transform_js_namespaceObject.normalizeBase64Image,
43
- compositePointMarkerImg: ()=>external_box_select_js_namespaceObject.compositePointMarkerImg,
44
42
  cropByRect: ()=>external_transform_js_namespaceObject.cropByRect,
43
+ compositePointMarkerImg: ()=>external_box_select_js_namespaceObject.compositePointMarkerImg,
44
+ normalizeBase64Image: ()=>external_transform_js_namespaceObject.normalizeBase64Image,
45
45
  isValidJPEGImageBuffer: ()=>external_info_js_namespaceObject.isValidJPEGImageBuffer,
46
+ convertPngBase64ToJpeg: ()=>external_transform_js_namespaceObject.convertPngBase64ToJpeg,
46
47
  processImageElementInfo: ()=>external_box_select_js_namespaceObject.processImageElementInfo,
47
48
  scaleImage: ()=>external_transform_js_namespaceObject.scaleImage,
48
- zoomForGPT4o: ()=>external_transform_js_namespaceObject.zoomForGPT4o,
49
49
  createImgBase64ByFormat: ()=>external_transform_js_namespaceObject.createImgBase64ByFormat,
50
+ zoomForGPT4o: ()=>external_transform_js_namespaceObject.zoomForGPT4o,
50
51
  imageInfoOfBase64: ()=>external_info_js_namespaceObject.imageInfoOfBase64,
51
52
  httpImg2Base64: ()=>external_transform_js_namespaceObject.httpImg2Base64
52
53
  });
@@ -57,6 +58,7 @@ exports.annotateRects = __webpack_exports__.annotateRects;
57
58
  exports.compositeElementInfoImg = __webpack_exports__.compositeElementInfoImg;
58
59
  exports.compositePointMarkerImg = __webpack_exports__.compositePointMarkerImg;
59
60
  exports.convertImgBufferToJpeg = __webpack_exports__.convertImgBufferToJpeg;
61
+ exports.convertPngBase64ToJpeg = __webpack_exports__.convertPngBase64ToJpeg;
60
62
  exports.createImgBase64ByFormat = __webpack_exports__.createImgBase64ByFormat;
61
63
  exports.cropByRect = __webpack_exports__.cropByRect;
62
64
  exports.httpImg2Base64 = __webpack_exports__.httpImg2Base64;
@@ -83,6 +85,7 @@ for(var __rspack_i in __webpack_exports__)if (-1 === [
83
85
  "compositeElementInfoImg",
84
86
  "compositePointMarkerImg",
85
87
  "convertImgBufferToJpeg",
88
+ "convertPngBase64ToJpeg",
86
89
  "createImgBase64ByFormat",
87
90
  "cropByRect",
88
91
  "httpImg2Base64",
@@ -39,7 +39,7 @@ __webpack_require__.d(__webpack_exports__, {
39
39
  paddingToMatchBlockByBase64: ()=>paddingToMatchBlockByBase64,
40
40
  photonFromBase64: ()=>photonFromBase64,
41
41
  parseBase64: ()=>parseBase64,
42
- httpImg2Base64: ()=>httpImg2Base64,
42
+ photonToBase64: ()=>photonToBase64,
43
43
  resizeAndConvertImgBuffer: ()=>resizeAndConvertImgBuffer,
44
44
  resizeImgBase64: ()=>resizeImgBase64,
45
45
  saveBase64Image: ()=>saveBase64Image,
@@ -50,9 +50,10 @@ __webpack_require__.d(__webpack_exports__, {
50
50
  normalizeBase64Image: ()=>normalizeBase64Image,
51
51
  normalizeBase64Body: ()=>normalizeBase64Body,
52
52
  zoomForGPT4o: ()=>zoomForGPT4o,
53
+ convertPngBase64ToJpeg: ()=>convertPngBase64ToJpeg,
53
54
  createImgBase64ByFormat: ()=>createImgBase64ByFormat,
54
55
  paddingToMatchBlock: ()=>paddingToMatchBlock,
55
- photonToBase64: ()=>photonToBase64
56
+ httpImg2Base64: ()=>httpImg2Base64
56
57
  });
57
58
  const external_node_assert_namespaceObject = require("node:assert");
58
59
  var external_node_assert_default = /*#__PURE__*/ __webpack_require__.n(external_node_assert_namespaceObject);
@@ -382,6 +383,12 @@ const parseBase64 = (fullBase64String)=>{
382
383
  });
383
384
  }
384
385
  };
386
+ async function convertPngBase64ToJpeg(imageBase64, quality = 90) {
387
+ const { mimeType, body } = parseBase64(imageBase64);
388
+ if ('image/png' !== mimeType.toLowerCase()) return imageBase64;
389
+ const jpegBuffer = await convertImgBufferToJpeg(external_node_buffer_namespaceObject.Buffer.from(body, 'base64'), quality);
390
+ return createImgBase64ByFormat('jpeg', jpegBuffer.toString('base64'));
391
+ }
385
392
  async function scaleImage(imageBase64, scale) {
386
393
  if (scale <= 0) throw new Error('Scale factor must be positive');
387
394
  const { body } = parseBase64(imageBase64);
@@ -438,6 +445,7 @@ async function scaleImage(imageBase64, scale) {
438
445
  };
439
446
  }
440
447
  exports.convertImgBufferToJpeg = __webpack_exports__.convertImgBufferToJpeg;
448
+ exports.convertPngBase64ToJpeg = __webpack_exports__.convertPngBase64ToJpeg;
441
449
  exports.createImgBase64ByFormat = __webpack_exports__.createImgBase64ByFormat;
442
450
  exports.cropByRect = __webpack_exports__.cropByRect;
443
451
  exports.httpImg2Base64 = __webpack_exports__.httpImg2Base64;
@@ -459,6 +467,7 @@ exports.scaleImage = __webpack_exports__.scaleImage;
459
467
  exports.zoomForGPT4o = __webpack_exports__.zoomForGPT4o;
460
468
  for(var __rspack_i in __webpack_exports__)if (-1 === [
461
469
  "convertImgBufferToJpeg",
470
+ "convertPngBase64ToJpeg",
462
471
  "createImgBase64ByFormat",
463
472
  "cropByRect",
464
473
  "httpImg2Base64",
@@ -1,3 +1,3 @@
1
1
  export { imageInfoOfBase64, isValidPNGImageBuffer, isValidJPEGImageBuffer, isValidImageBuffer, validateScreenshotBuffer, type ValidateScreenshotBufferOptions, } from './info';
2
- export { resizeAndConvertImgBuffer, convertImgBufferToJpeg, resizeImgBase64, zoomForGPT4o, saveBase64Image, paddingToMatchBlockByBase64, cropByRect, scaleImage, localImg2Base64, httpImg2Base64, preProcessImageUrl, parseBase64, createImgBase64ByFormat, inferBase64ImageFormat, normalizeBase64Image, normalizeScreenshotBase64, type NormalizeScreenshotBase64Options, } from './transform';
2
+ export { resizeAndConvertImgBuffer, convertImgBufferToJpeg, convertPngBase64ToJpeg, resizeImgBase64, zoomForGPT4o, saveBase64Image, paddingToMatchBlockByBase64, cropByRect, scaleImage, localImg2Base64, httpImg2Base64, preProcessImageUrl, parseBase64, createImgBase64ByFormat, inferBase64ImageFormat, normalizeBase64Image, normalizeScreenshotBase64, type NormalizeScreenshotBase64Options, } from './transform';
3
3
  export { processImageElementInfo, compositeElementInfoImg, compositePointMarkerImg, annotateRects, } from './box-select';
@@ -94,6 +94,13 @@ export declare const parseBase64: (fullBase64String: string) => {
94
94
  mimeType: string;
95
95
  body: string;
96
96
  };
97
+ /**
98
+ * Convert a PNG base64 image to JPEG while leaving other image formats unchanged.
99
+ * @param imageBase64 - Image data URL or raw base64 body.
100
+ * @param quality - JPEG quality from 1 to 100.
101
+ * @returns A JPEG data URL for PNG input, otherwise the original input.
102
+ */
103
+ export declare function convertPngBase64ToJpeg(imageBase64: string, quality?: number): Promise<string>;
97
104
  /**
98
105
  * Scales an image by a specified factor using Sharp or Photon
99
106
  * @param imageBase64 - Base64 encoded image
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@midscene/shared",
3
- "version": "1.11.0",
3
+ "version": "1.11.1-beta-20260818123028.0",
4
4
  "repository": "https://github.com/web-infra-dev/midscene",
5
5
  "homepage": "https://midscenejs.com/",
6
6
  "types": "./dist/types/index.d.ts",
package/src/img/index.ts CHANGED
@@ -9,6 +9,7 @@ export {
9
9
  export {
10
10
  resizeAndConvertImgBuffer,
11
11
  convertImgBufferToJpeg,
12
+ convertPngBase64ToJpeg,
12
13
  resizeImgBase64,
13
14
  zoomForGPT4o,
14
15
  saveBase64Image,
@@ -615,6 +615,26 @@ export const parseBase64 = (
615
615
  }
616
616
  };
617
617
 
618
+ /**
619
+ * Convert a PNG base64 image to JPEG while leaving other image formats unchanged.
620
+ * @param imageBase64 - Image data URL or raw base64 body.
621
+ * @param quality - JPEG quality from 1 to 100.
622
+ * @returns A JPEG data URL for PNG input, otherwise the original input.
623
+ */
624
+ export async function convertPngBase64ToJpeg(
625
+ imageBase64: string,
626
+ quality = 90,
627
+ ): Promise<string> {
628
+ const { mimeType, body } = parseBase64(imageBase64);
629
+ if (mimeType.toLowerCase() !== 'image/png') return imageBase64;
630
+
631
+ const jpegBuffer = await convertImgBufferToJpeg(
632
+ Buffer.from(body, 'base64'),
633
+ quality,
634
+ );
635
+ return createImgBase64ByFormat('jpeg', jpegBuffer.toString('base64'));
636
+ }
637
+
618
638
  /**
619
639
  * Scales an image by a specified factor using Sharp or Photon
620
640
  * @param imageBase64 - Base64 encoded image