diginext-utils 3.13.7 → 3.13.9
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/device/browser.js +26 -5
- package/dist/images/loadImage.js +1 -1
- package/dist/string/guessMimeType.d.ts +2 -1
- package/dist/string/guessMimeType.js +73 -8
- package/dist/string/random.js +7 -1
- package/esm/device/browser.js +26 -5
- package/esm/images/loadImage.js +1 -1
- package/esm/string/guessMimeType.d.ts +2 -1
- package/esm/string/guessMimeType.js +72 -5
- package/esm/string/random.js +7 -1
- package/package.json +1 -1
package/dist/device/browser.js
CHANGED
|
@@ -28,10 +28,31 @@ const isFacebookWebview = () => {
|
|
|
28
28
|
};
|
|
29
29
|
exports.isFacebookWebview = isFacebookWebview;
|
|
30
30
|
const isInAppWebview = () => {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
31
|
+
try {
|
|
32
|
+
const ua = navigator.userAgent;
|
|
33
|
+
const vendor = navigator.vendor;
|
|
34
|
+
// Detect iOS WebView
|
|
35
|
+
const isIOSWebView = /(iPhone|iPod|iPad)(?!.*Safari\/)/i.test(ua);
|
|
36
|
+
// Detect iOS apps that use WKWebView
|
|
37
|
+
const isIOSWKWebView = /AppleWebKit/.test(ua) && /Mobile\/\w+/.test(ua) && !/(Cr|Fx|OP|OPR)\//.test(ua);
|
|
38
|
+
// Additional check for iOS in-app browsers, excluding Chrome
|
|
39
|
+
const isIOSInAppBrowser = isIOSWebView ||
|
|
40
|
+
(/(iPhone|iPod|iPad)/.test(ua) &&
|
|
41
|
+
!/Safari/.test(ua) &&
|
|
42
|
+
!/(CriOS|FxiOS|OPiOS)/.test(ua) &&
|
|
43
|
+
vendor === "Apple Computer, Inc.");
|
|
44
|
+
// Detect Android WebView
|
|
45
|
+
const isAndroidWebView = /Android.*wv|Android.*Version\/[0-9]\.0/.test(ua);
|
|
46
|
+
// Exclude Chrome, Firefox, and Samsung Internet on Android
|
|
47
|
+
const isAndroidStockBrowser = /Android.*Version\//.test(ua);
|
|
48
|
+
const isAndroidChrome = /Android.*Chrome\//.test(ua) && !/Version\//.test(ua);
|
|
49
|
+
const isAndroidFirefox = /Android.*Firefox\//.test(ua);
|
|
50
|
+
const isAndroidSamsung = /Android.*SamsungBrowser\//.test(ua);
|
|
51
|
+
return (isIOSInAppBrowser ||
|
|
52
|
+
(isAndroidWebView && !isAndroidStockBrowser && !isAndroidChrome && !isAndroidFirefox && !isAndroidSamsung));
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
36
57
|
};
|
|
37
58
|
exports.isInAppWebview = isInAppWebview;
|
package/dist/images/loadImage.js
CHANGED
|
@@ -7,7 +7,7 @@ async function loadImage(list) {
|
|
|
7
7
|
return await Promise.all(list.map((url) => {
|
|
8
8
|
return new Promise((resolve, reject) => {
|
|
9
9
|
const img = new Image();
|
|
10
|
-
img.onload = resolve;
|
|
10
|
+
img.onload = () => resolve(url);
|
|
11
11
|
img.onerror = reject;
|
|
12
12
|
img.src = url;
|
|
13
13
|
return img;
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export
|
|
1
|
+
export declare function guessMimeType(filepath: string): Promise<string>;
|
|
2
|
+
export default guessMimeType;
|
|
@@ -1,12 +1,77 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
|
|
7
|
-
const
|
|
8
|
-
function guessMimeType(filepath) {
|
|
9
|
-
|
|
10
|
-
|
|
3
|
+
exports.guessMimeType = void 0;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
async function guessMimeType(filepath) {
|
|
6
|
+
return new Promise((resolve, reject) => {
|
|
7
|
+
const stream = (0, fs_1.createReadStream)(filepath, {
|
|
8
|
+
start: 0,
|
|
9
|
+
end: 11, // Read only first 12 bytes
|
|
10
|
+
});
|
|
11
|
+
let buffer = new Uint8Array(0);
|
|
12
|
+
stream.on("data", (chunk) => {
|
|
13
|
+
const chunkArray = new Uint8Array(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
14
|
+
// Manual concatenation
|
|
15
|
+
const newBuffer = new Uint8Array(buffer.length + chunkArray.length);
|
|
16
|
+
newBuffer.set(buffer);
|
|
17
|
+
newBuffer.set(chunkArray, buffer.length);
|
|
18
|
+
buffer = newBuffer;
|
|
19
|
+
});
|
|
20
|
+
stream.on("end", () => {
|
|
21
|
+
// Convert to hex string
|
|
22
|
+
const toHex = (arr, start, end) => {
|
|
23
|
+
return Array.from(arr.slice(start, end))
|
|
24
|
+
.map((b) => b.toString(16).padStart(2, "0"))
|
|
25
|
+
.join("");
|
|
26
|
+
};
|
|
27
|
+
const signature = toHex(buffer, 0, 4);
|
|
28
|
+
switch (signature) {
|
|
29
|
+
case "89504e47":
|
|
30
|
+
resolve("image/png");
|
|
31
|
+
break;
|
|
32
|
+
case "47494638":
|
|
33
|
+
resolve("image/gif");
|
|
34
|
+
break;
|
|
35
|
+
case "52494646":
|
|
36
|
+
if (buffer.length >= 12) {
|
|
37
|
+
const webpSignature = toHex(buffer, 8, 12);
|
|
38
|
+
if (webpSignature === "57454250") {
|
|
39
|
+
resolve("image/webp");
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
resolve("unknown");
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
resolve("unknown");
|
|
47
|
+
}
|
|
48
|
+
break;
|
|
49
|
+
case "00000018":
|
|
50
|
+
case "0000001c":
|
|
51
|
+
case "00000020":
|
|
52
|
+
resolve("video/mp4");
|
|
53
|
+
break;
|
|
54
|
+
case "66747970":
|
|
55
|
+
resolve("video/quicktime");
|
|
56
|
+
break;
|
|
57
|
+
case "1a45dfa3":
|
|
58
|
+
resolve("video/webm");
|
|
59
|
+
break;
|
|
60
|
+
case "000001ba":
|
|
61
|
+
case "000001b3":
|
|
62
|
+
resolve("video/mpeg");
|
|
63
|
+
break;
|
|
64
|
+
default:
|
|
65
|
+
if (signature.startsWith("ffd8ff")) {
|
|
66
|
+
resolve("image/jpeg");
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
resolve("application/octet-stream");
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
stream.on("error", reject);
|
|
74
|
+
});
|
|
11
75
|
}
|
|
76
|
+
exports.guessMimeType = guessMimeType;
|
|
12
77
|
exports.default = guessMimeType;
|
package/dist/string/random.js
CHANGED
|
@@ -40,5 +40,11 @@ const randomFileName = (start = "file", length = 4) => {
|
|
|
40
40
|
return `${start}-${+new Date()}-${(0, exports.randomStringAndNumberByLength)(length)}`;
|
|
41
41
|
};
|
|
42
42
|
exports.randomFileName = randomFileName;
|
|
43
|
-
const random = {
|
|
43
|
+
const random = {
|
|
44
|
+
randAllCharacterByLength: exports.randAllCharacterByLength,
|
|
45
|
+
randomStringByLength: exports.randomStringByLength,
|
|
46
|
+
randomStringAndNumberByLength: exports.randomStringAndNumberByLength,
|
|
47
|
+
uniqueSortByTime: exports.uniqueSortByTime,
|
|
48
|
+
randomFileName: exports.randomFileName,
|
|
49
|
+
};
|
|
44
50
|
exports.default = random;
|
package/esm/device/browser.js
CHANGED
|
@@ -21,9 +21,30 @@ export const isFacebookWebview = () => {
|
|
|
21
21
|
return _ua.indexOf("FBAN") > -1 || _ua.indexOf("FBAV") > -1;
|
|
22
22
|
};
|
|
23
23
|
export const isInAppWebview = () => {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
24
|
+
try {
|
|
25
|
+
const ua = navigator.userAgent;
|
|
26
|
+
const vendor = navigator.vendor;
|
|
27
|
+
// Detect iOS WebView
|
|
28
|
+
const isIOSWebView = /(iPhone|iPod|iPad)(?!.*Safari\/)/i.test(ua);
|
|
29
|
+
// Detect iOS apps that use WKWebView
|
|
30
|
+
const isIOSWKWebView = /AppleWebKit/.test(ua) && /Mobile\/\w+/.test(ua) && !/(Cr|Fx|OP|OPR)\//.test(ua);
|
|
31
|
+
// Additional check for iOS in-app browsers, excluding Chrome
|
|
32
|
+
const isIOSInAppBrowser = isIOSWebView ||
|
|
33
|
+
(/(iPhone|iPod|iPad)/.test(ua) &&
|
|
34
|
+
!/Safari/.test(ua) &&
|
|
35
|
+
!/(CriOS|FxiOS|OPiOS)/.test(ua) &&
|
|
36
|
+
vendor === "Apple Computer, Inc.");
|
|
37
|
+
// Detect Android WebView
|
|
38
|
+
const isAndroidWebView = /Android.*wv|Android.*Version\/[0-9]\.0/.test(ua);
|
|
39
|
+
// Exclude Chrome, Firefox, and Samsung Internet on Android
|
|
40
|
+
const isAndroidStockBrowser = /Android.*Version\//.test(ua);
|
|
41
|
+
const isAndroidChrome = /Android.*Chrome\//.test(ua) && !/Version\//.test(ua);
|
|
42
|
+
const isAndroidFirefox = /Android.*Firefox\//.test(ua);
|
|
43
|
+
const isAndroidSamsung = /Android.*SamsungBrowser\//.test(ua);
|
|
44
|
+
return (isIOSInAppBrowser ||
|
|
45
|
+
(isAndroidWebView && !isAndroidStockBrowser && !isAndroidChrome && !isAndroidFirefox && !isAndroidSamsung));
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
29
50
|
};
|
package/esm/images/loadImage.js
CHANGED
|
@@ -5,7 +5,7 @@ export default async function loadImage(list) {
|
|
|
5
5
|
return await Promise.all(list.map((url) => {
|
|
6
6
|
return new Promise((resolve, reject) => {
|
|
7
7
|
const img = new Image();
|
|
8
|
-
img.onload = resolve;
|
|
8
|
+
img.onload = () => resolve(url);
|
|
9
9
|
img.onerror = reject;
|
|
10
10
|
img.src = url;
|
|
11
11
|
return img;
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export
|
|
1
|
+
export declare function guessMimeType(filepath: string): Promise<string>;
|
|
2
|
+
export default guessMimeType;
|
|
@@ -1,6 +1,73 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import { createReadStream } from "fs";
|
|
2
|
+
export async function guessMimeType(filepath) {
|
|
3
|
+
return new Promise((resolve, reject) => {
|
|
4
|
+
const stream = createReadStream(filepath, {
|
|
5
|
+
start: 0,
|
|
6
|
+
end: 11, // Read only first 12 bytes
|
|
7
|
+
});
|
|
8
|
+
let buffer = new Uint8Array(0);
|
|
9
|
+
stream.on("data", (chunk) => {
|
|
10
|
+
const chunkArray = new Uint8Array(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
11
|
+
// Manual concatenation
|
|
12
|
+
const newBuffer = new Uint8Array(buffer.length + chunkArray.length);
|
|
13
|
+
newBuffer.set(buffer);
|
|
14
|
+
newBuffer.set(chunkArray, buffer.length);
|
|
15
|
+
buffer = newBuffer;
|
|
16
|
+
});
|
|
17
|
+
stream.on("end", () => {
|
|
18
|
+
// Convert to hex string
|
|
19
|
+
const toHex = (arr, start, end) => {
|
|
20
|
+
return Array.from(arr.slice(start, end))
|
|
21
|
+
.map((b) => b.toString(16).padStart(2, "0"))
|
|
22
|
+
.join("");
|
|
23
|
+
};
|
|
24
|
+
const signature = toHex(buffer, 0, 4);
|
|
25
|
+
switch (signature) {
|
|
26
|
+
case "89504e47":
|
|
27
|
+
resolve("image/png");
|
|
28
|
+
break;
|
|
29
|
+
case "47494638":
|
|
30
|
+
resolve("image/gif");
|
|
31
|
+
break;
|
|
32
|
+
case "52494646":
|
|
33
|
+
if (buffer.length >= 12) {
|
|
34
|
+
const webpSignature = toHex(buffer, 8, 12);
|
|
35
|
+
if (webpSignature === "57454250") {
|
|
36
|
+
resolve("image/webp");
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
resolve("unknown");
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
resolve("unknown");
|
|
44
|
+
}
|
|
45
|
+
break;
|
|
46
|
+
case "00000018":
|
|
47
|
+
case "0000001c":
|
|
48
|
+
case "00000020":
|
|
49
|
+
resolve("video/mp4");
|
|
50
|
+
break;
|
|
51
|
+
case "66747970":
|
|
52
|
+
resolve("video/quicktime");
|
|
53
|
+
break;
|
|
54
|
+
case "1a45dfa3":
|
|
55
|
+
resolve("video/webm");
|
|
56
|
+
break;
|
|
57
|
+
case "000001ba":
|
|
58
|
+
case "000001b3":
|
|
59
|
+
resolve("video/mpeg");
|
|
60
|
+
break;
|
|
61
|
+
default:
|
|
62
|
+
if (signature.startsWith("ffd8ff")) {
|
|
63
|
+
resolve("image/jpeg");
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
resolve("application/octet-stream");
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
stream.on("error", reject);
|
|
71
|
+
});
|
|
6
72
|
}
|
|
73
|
+
export default guessMimeType;
|
package/esm/string/random.js
CHANGED
|
@@ -32,5 +32,11 @@ export const uniqueSortByTime = (length = 6, str = `${textLowCase}${numeric}`) =
|
|
|
32
32
|
export const randomFileName = (start = "file", length = 4) => {
|
|
33
33
|
return `${start}-${+new Date()}-${randomStringAndNumberByLength(length)}`;
|
|
34
34
|
};
|
|
35
|
-
const random = {
|
|
35
|
+
const random = {
|
|
36
|
+
randAllCharacterByLength,
|
|
37
|
+
randomStringByLength,
|
|
38
|
+
randomStringAndNumberByLength,
|
|
39
|
+
uniqueSortByTime,
|
|
40
|
+
randomFileName,
|
|
41
|
+
};
|
|
36
42
|
export default random;
|