import { $NAME, MetaContext, MetaObject } from '../../MetaContext'; export const $STRINGIFY = '$stringify'; export type Stringify = (obj: T) => string; export type $Stringify = { [$STRINGIFY]: Stringify }; export const withStringify = MetaContext>(MetaContextBase: TMetaContextBase) => class extends MetaContextBase { [$STRINGIFY](value: T) { return this.resolveValue(value)[$STRINGIFY](value, this) as string; } }; export type GenericStringify = (obj: T, stringifyfn: Stringify, context: any) => string; export type StringifyWrapper = (metaObject: MetaObject, contents: string) => string; export function deepStringify(genericStringify: GenericStringify, stringifyWrapper: StringifyWrapper) { return function $stringify(this: MetaObject, obj: T, context: MetaContext & $Stringify) { const stringifyfn = context[$STRINGIFY]; return (this[$STRINGIFY] = function $stringify(this: MetaObject, obj: T, context: any) { return stringifyWrapper(this, genericStringify(obj, stringifyfn, context)); }).call(this, obj, context) as string; }; } export function memberToString(obj: T) { return obj.toString(); } export function castString(obj: T) { return String(obj); } export function quoteString(str: string) { return `'${str.replace(/'/g, "\\'")}'`; } export function quoteKey(key: string) { return /^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(key) ? key : quoteString(key); } export function stringifyArrayWrapper(_: MetaObject, contents: string) { return contents ? `[ ${contents} ]` : '[]'; } export function stringifyArrayLikeWrapper(metaObject: MetaObject, contents: string) { return contents ? `${metaObject[$NAME]} [ ${contents} ]` : `${metaObject[$NAME]} []`; } export function stringifyObjectWrapper(_: MetaObject, contents: string) { return contents ? `{ ${contents} }` : '{}'; } export function stringifyObjectLikeWrapper(metaObject: MetaObject, contents: string) { return contents ? `${metaObject[$NAME]} { ${contents} }` : `${metaObject[$NAME]} {}`; } export function stringifyFunctionWrapper(metaObject: MetaObject, _: string) { return `${metaObject[$NAME]}() {}`; }