Files
dbgate/packages/tools/src/stringTools.ts
2023-02-16 13:14:56 +01:00

130 lines
3.3 KiB
TypeScript

import _isString from 'lodash/isString';
import _isArray from 'lodash/isArray';
import _isPlainObject from 'lodash/isPlainObject';
export function arrayToHexString(byteArray) {
return byteArray.reduce((output, elem) => output + ('0' + elem.toString(16)).slice(-2), '').toUpperCase();
}
export function hexStringToArray(inputString) {
var hex = inputString.toString();
var res = [];
for (var n = 0; n < hex.length; n += 2) {
res.push(parseInt(hex.substr(n, 2), 16));
}
return res;
}
export function parseCellValue(value) {
if (!_isString(value)) return value;
if (value == '(NULL)') return null;
const mHex = value.match(/^0x([0-9a-fA-F][0-9a-fA-F])+$/);
if (mHex) {
return {
type: 'Buffer',
data: hexStringToArray(value.substring(2)),
};
}
const mOid = value.match(/^ObjectId\("([0-9a-f]{24})"\)$/);
if (mOid) {
return { $oid: mOid[1] };
}
return value;
}
export function stringifyCellValue(value) {
if (value === null) return '(NULL)';
if (value === undefined) return '(NoField)';
if (value?.type == 'Buffer' && _isArray(value.data)) return '0x' + arrayToHexString(value.data);
if (value?.$oid) return `ObjectId("${value?.$oid}")`;
if (_isPlainObject(value) || _isArray(value)) return JSON.stringify(value);
return value;
}
export function safeJsonParse(json, defaultValue?, logError = false) {
if (_isArray(json) || _isPlainObject(json)) {
return json;
}
try {
return JSON.parse(json);
} catch (err) {
if (logError) {
console.error(`Error parsing JSON value "${json}"`, err);
}
return defaultValue;
}
}
export function isJsonLikeLongString(value) {
return _isString(value) && value.length > 100 && value.match(/^\s*\{.*\}\s*$|^\s*\[.*\]\s*$/);
}
export function getIconForRedisType(type) {
switch (type) {
case 'dir':
return 'img folder';
case 'string':
return 'img type-string';
case 'hash':
return 'img type-hash';
case 'set':
return 'img type-set';
case 'list':
return 'img type-list';
case 'zset':
return 'img type-zset';
case 'stream':
return 'img type-stream';
case 'binary':
return 'img type-binary';
case 'ReJSON-RL':
return 'img type-rejson';
default:
return null;
}
}
export function isWktGeometry(s) {
if (!_isString(s)) return false;
// return !!s.match(/^POINT\s*\(|/)
return !!s.match(
/^POINT\s*\(|^LINESTRING\s*\(|^POLYGON\s*\(|^MULTIPOINT\s*\(|^MULTILINESTRING\s*\(|^MULTIPOLYGON\s*\(|^GEOMCOLLECTION\s*\(|^GEOMETRYCOLLECTION\s*\(/
);
}
export function arrayBufferToBase64(buffer) {
var binary = '';
var bytes = [].slice.call(new Uint8Array(buffer));
bytes.forEach(b => (binary += String.fromCharCode(b)));
return btoa(binary);
}
export function getAsImageSrc(obj) {
if (obj?.type == 'Buffer' && _isArray(obj?.data)) {
return `data:image/png;base64, ${arrayBufferToBase64(obj?.data)}`;
}
if (_isString(obj) && (obj.startsWith('http://') || obj.startsWith('https://'))) {
return obj;
}
return null;
}
export function parseSqlDefaultValue(value: string) {
if (!value) return undefined;
if (!_isString(value)) return undefined;
if (value.startsWith("'") && value.endsWith("'")) {
return value.slice(1, -1);
}
if (!isNaN(value as any) && !isNaN(parseFloat(value))) {
return parseFloat(value);
}
return undefined;
}