abi.js
Version:
[![typescript-icon]][typescript-link] [![license-icon]][license-link] [![status-icon]][status-link] [![ci-icon]][ci-link] [![twitter-icon]][twitter-link]
136 lines (135 loc) • 3.27 kB
JavaScript
export function parse_val(val) {
if (typeof val !== 'string') {
return val;
}
val = val.trim();
const lc_val = val.toLowerCase();
if (lc_val === 'null') {
return null;
}
if (lc_val === 'undefined') {
return undefined;
}
if (lc_val === 'true') {
return true;
}
if (lc_val === 'false') {
return false;
}
if (!Number.isNaN(Number(val))) {
return Number(val);
}
if (/^('|")(.*?)\1$/gms.test(val)) {
return parse_str(val);
}
if (/^\[(.*?)\]$/gms.test(val)) {
return parse_arr(val);
}
if (/^\{(.*?)\}$/gms.test(val)) {
return parse_obj(val);
}
return val;
}
export function parse_str(val) {
val = val.trim();
const res = /^('|")(.*?)\1$/gms.exec(val);
if (res) {
val = res[2];
}
return val;
}
export function parse_arr(val) {
const res = /^\[(.*?)\]$/gms.exec(val);
if (res) {
val = res[1];
}
const arr = [];
const items = val.split(',');
for (const i in items) {
arr[i] = parse_val(items[i]);
}
return arr;
}
export function parse_obj(val) {
const res = /^\{(.*?)\}$/gms.exec(val);
if (res) {
val = res[1];
}
const obj = {};
const items = val.split(',');
for (const item of items) {
const [key, val] = parse_prop(item);
obj[key] = val;
}
return obj;
}
export function parse_params(val) {
const res = /^\((.*?)\)$/gms.exec(val);
if (res) {
val = res[1];
}
const params = {};
const items = val.split(',');
for (const item of items) {
let [name, val] = parse_param(item);
if (val !== undefined) {
val = parse_val(val);
}
params[name] = val;
}
return params;
}
export function parse_args(val) {
const res = /^\((.*?)\)$/gms.exec(val);
if (res) {
val = res[1];
}
const args = {};
const items = val.split(',');
for (const item of items) {
const [key, val] = parse_prop(item);
args[key] = val;
}
return args;
}
export function parse_props(val) {
const res = /^\{(.*?)\}$/gms.exec(val);
if (res) {
val = res[1];
}
return parse_args(val);
}
export function parse_prop(val) {
if (/^([a-zA-Z0-9_\$]*)\s*\:\s*(.+)$/gms.test(val)) {
return parse_arg(val);
}
return parse_param(val);
}
export function parse_arg(val) {
val = val.trim();
const res = /^([a-zA-Z0-9_\$]*)\s*\:\s*(.+)$/gms.exec(val);
if (res) {
const key = parse_val(res[1]);
let value = parse_val(res[2]);
if (value !== undefined) {
value = parse_val(value);
}
if (typeof value === 'string') {
const [_, param] = parse_param(value);
return [key, param ?? value];
}
if (value === undefined) {
return parse_param(key);
}
return [key, value];
}
return parse_param(val);
}
export function parse_param(val) {
val = val.trim();
const res = /^([a-zA-Z0-9_\$]+[a-zA-Z0-9_\$]*)\s*\=\s*(.+)$/gms.exec(val);
if (res) {
return [parse_str(res[1]), parse_val(res[2])];
}
return [parse_val(val)];
}