pomljs
Version:
Prompt Orchestration Markup Language
145 lines (142 loc) • 4.56 kB
JavaScript
import { readFileSync } from './fs.js';
import path__default from 'path';
const deepMerge = (target, source) => {
// Object can not be array or class instance (like children).
const isObject = (item) => {
return (item !== undefined &&
item !== null &&
typeof item === 'object' &&
!Array.isArray(item) &&
!('$$typeof' in item) &&
// https://stackoverflow.com/questions/57227185/how-to-detect-if-a-variable-is-a-pure-javascript-object
item.constructor === Object);
};
if (isObject(target) && isObject(source)) {
target = { ...target }; // Copy target;
for (const key in source) {
if (isObject(source[key])) {
if (!target[key]) {
Object.assign(target, { [key]: {} });
}
if (isObject(target[key])) {
target[key] = deepMerge(target[key], source[key]);
}
else {
Object.assign(target, { [key]: source[key] });
}
}
else {
Object.assign(target, { [key]: source[key] });
}
}
}
return target;
};
const readSource = (source, directory, type) => {
// Read file content and convert to type.
// Check whether path is absolute or relative.
source = !path__default.isAbsolute(source) && directory ? path__default.join(directory, source) : source;
if (type === 'buffer') {
const buffer = readFileSync(source);
return buffer;
}
else {
const text = readFileSync(source, 'utf8');
return parseText(text, type);
}
};
const parseText = (object, type) => {
if (typeof object === 'string') {
if (type === 'buffer') {
return Buffer.from(object);
}
else if (type === 'string') {
return object;
}
else if (!type) {
return guessStringType(object)[0];
}
else if (type === 'integer') {
return parseInt(object);
}
else if (type === 'float') {
return parseFloat(object);
}
else if (type === 'boolean') {
if (object.toLowerCase() === 'true' || object === '1') {
return true;
}
else if (object.toLowerCase() === 'false' || object === '0') {
return false;
}
else {
throw new Error('Invalid boolean value: ' + object);
}
}
else if (type === 'array' || type === 'object') {
return JSON.parse(object);
}
else if (type === 'null') {
return null;
}
else if (type === 'undefined') {
return undefined;
}
else {
throw new Error('Invalid type: ' + type);
}
}
else if (Buffer.isBuffer(object)) {
if (type === 'buffer') {
return object;
}
else {
return parseText(object.toString(), type);
}
}
else {
throw new Error('Invalid object type (expect buffer or string): ' + typeof object);
}
};
const guessStringType = (value) => {
if (value.toLowerCase() === 'null' || value === '') {
return [null, 'null'];
}
else if (value.toLowerCase() === 'undefined') {
return [undefined, 'undefined'];
}
else if (value.toLowerCase() === 'true') {
return [true, 'boolean'];
}
else if (value.toLowerCase() === 'false') {
return [false, 'boolean'];
}
else if (!isNaN(Number(value))) {
// https://stackoverflow.com/questions/16775547/javascript-guess-data-type-from-string
if (parseFloat(value) === parseInt(value)) {
return [parseInt(value), "integer"];
}
else {
return [parseFloat(value), "float"];
}
}
else if (/^\d*(\.|,)\d*$/.test(value) || /^(\d{0,3}(,)?)+\.\d*$/.test(value) || /^(\d{0,3}(\.)?)+,\d*$/.test(value)) {
return [Number(value), "float"];
}
else {
try {
const parsed = JSON.parse(value);
if (Array.isArray(parsed)) {
return [parsed, 'array'];
}
else {
return [parsed, 'object'];
}
}
catch (e) {
return [value, 'string'];
}
}
};
export { deepMerge, guessStringType, parseText, readSource };
//# sourceMappingURL=index.js.map