JS-Interpreter icon indicating copy to clipboard operation
JS-Interpreter copied to clipboard

import momentjs library

Open DanieleRosada opened this issue 2 years ago • 3 comments

I'm trying to import momentjs library. When I use moment().format(), the library pass this to next function, but this is the object of JS-Interpreter and not momentjs. This is my test:

import moment from 'moment';
let myInterpreter = new Interpreter(condition, (interpreter: any, globalObject: any) => {});
myInterpreter.setValueToScope('moment', myInterpreter.nativeToPseudo(moment));
myInterpreter.run();

Momentjs code generating problem:

function format(inputString) {
        if (!inputString) {
            inputString = this.isUtc()
                ? hooks.defaultFormatUtc
                : hooks.defaultFormat;
        }
        var output = formatMoment(this, inputString); // HERE is the problem
        return this.localeData().postformat(output);
}
function formatMoment(m, format) {
        if (!m.isValid()) {
            return m.localeData().invalidDate();
        }

        format = expandFormat(format, m.localeData());
        formatFunctions[format] =
            formatFunctions[format] || makeFormatFunction(format);

        return formatFunctions[format](m);
    }    

DanieleRosada avatar Jan 12 '23 15:01 DanieleRosada

Can you restructure this as a complete example that runs (but, presumably, generates an error)? Specifically, in "this is my test", you don't specify a value for condition.

cpcallen avatar Jan 12 '23 17:01 cpcallen

Thank you for the fast answer. Snippet code here: https://stackblitz.com/edit/typescript-cro98o?file=index.ts,package.json

DanieleRosada avatar Jan 13 '23 09:01 DanieleRosada

I spent a few minutes trying to mimic the moment API using the moment constructor, but gave up and created this working one-shot wrapper.

      const momentFormatWrapper = (dateInput: string, format: string) => {
        return moment(dateInput).format(format);
      };
      interpreter.setProperty(globalObject, 'momentFormat', interpreter.createNativeFunction(momentFormatWrapper));

You may then use within the interpreter e.g. momentFormat('6 Mar 2017', 'MM/DD/YY');

semireg avatar May 10 '24 13:05 semireg