Jsx.js

import config from './config';
import loadMoreTransformers from './transformers';
import { createJSV, transform } from '@kitmi/jsonv';

export function createJSX(_config) {
    let _jsv;

    if (_config == null) {
        _jsv = createJSV();
        _config = _jsv.config;

        loadMoreTransformers(_config);
    } else {
        _jsv = createJSV(_config);
    }

    /**
     * JSON eXpression Syntax
     * @class
     */
    class JSX {
        static get JSV() {
            return _jsv;
        }

        static get config() {
            return _config;
        }

        static evaluate(value, jsx, context) {
            return transform(value, jsx, { config: this.config, ...context });
        }

        /**
         * @param {object} value
         */
        constructor(value) {
            this.value = value;
        }

        /**
         * Evaluate a JSON expression against the value and update the value
         * @param {object} - JSON operation expression
         * @returns {JSX}
         */
        evaluate(jsx) {
            this.value = transform(this.value, jsx, { config: this.constructor.config });
            return this;
        }
    }

    return JSX;
}

loadMoreTransformers(config);

const defaultJSX = createJSX(config);

export default defaultJSX;