NeilFraser / JS-Interpreter

A sandboxed JavaScript interpreter in JavaScript.
Apache License 2.0
1.96k stars 352 forks source link

import momentjs library #241

Open DanieleRosada opened 1 year ago

DanieleRosada commented 1 year ago

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);
    }    
cpcallen commented 1 year ago

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.

DanieleRosada commented 1 year ago

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

semireg commented 2 months ago

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');