added require() method for commonJS compliancy

This commit is contained in:
azivner 2018-03-10 11:53:51 -05:00
parent 354999f37a
commit f6c7f6a0f2
3 changed files with 33 additions and 4 deletions

View File

@ -1,8 +1,22 @@
function ScriptContext(startNote, allNotes) { function ScriptContext(startNote, allNotes) {
const modules = {};
return { return {
modules: {}, modules: modules,
notes: toObject(allNotes, note => [note.noteId, note]), notes: toObject(allNotes, note => [note.noteId, note]),
apis: toObject(allNotes, note => [note.noteId, ScriptApi(startNote, note)]), apis: toObject(allNotes, note => [note.noteId, ScriptApi(startNote, note)]),
require: moduleNoteIds => {
return moduleName => {
const candidates = allNotes.filter(note => moduleNoteIds.includes(note.noteId));
const note = candidates.find(c => c.title === moduleName);
if (!note) {
throw new Error("Could not find module note " + moduleName);
}
return modules[note.noteId].exports;
}
}
}; };
} }

View File

@ -111,13 +111,15 @@ async function getScriptBundle(note, root = true, scriptEnv = null, includedNote
} }
} }
const moduleNoteIds = modules.map(mod => mod.noteId);
if (note.isJavaScript()) { if (note.isJavaScript()) {
bundle.script += ` bundle.script += `
apiContext.modules['${note.noteId}'] = {}; apiContext.modules['${note.noteId}'] = {};
${root ? 'return ' : ''}await (async function(exports, module, api` + (modules.length > 0 ? ', ' : '') + ${root ? 'return ' : ''}await (async function(exports, module, require, api` + (modules.length > 0 ? ', ' : '') +
modules.map(child => sanitizeVariableName(child.title)).join(', ') + `) { modules.map(child => sanitizeVariableName(child.title)).join(', ') + `) {
${note.content} ${note.content}
})({}, apiContext.modules['${note.noteId}'], apiContext.apis['${note.noteId}']` + (modules.length > 0 ? ', ' : '') + })({}, apiContext.modules['${note.noteId}'], apiContext.require(${JSON.stringify(moduleNoteIds)}), apiContext.apis['${note.noteId}']` + (modules.length > 0 ? ', ' : '') +
modules.map(mod => `apiContext.modules['${mod.noteId}'].exports`).join(', ') + `); modules.map(mod => `apiContext.modules['${mod.noteId}'].exports`).join(', ') + `);
`; `;
} }

View File

@ -15,6 +15,18 @@ function ScriptContext(dataKey, startNote, allNotes) {
this.modules = {}; this.modules = {};
this.notes = utils.toObject(allNotes, note => [note.noteId, note]); this.notes = utils.toObject(allNotes, note => [note.noteId, note]);
this.apis = utils.toObject(allNotes, note => [note.noteId, new ScriptApi(dataKey, startNote, note)]); this.apis = utils.toObject(allNotes, note => [note.noteId, new ScriptApi(dataKey, startNote, note)]);
this.require = moduleNoteIds => {
return moduleName => {
const candidates = allNotes.filter(note => moduleNoteIds.includes(note.noteId));
const note = candidates.find(c => c.title === moduleName);
if (!note) {
throw new Error("Could not find module note " + moduleName);
}
return this.modules[note.noteId].exports;
}
};
} }
function ScriptApi(dataKey, startNote, currentNote) { function ScriptApi(dataKey, startNote, currentNote) {
@ -26,7 +38,8 @@ function ScriptApi(dataKey, startNote, currentNote) {
this.utils = { this.utils = {
unescapeHtml: utils.unescapeHtml, unescapeHtml: utils.unescapeHtml,
isoDateTimeStr: utils.dateStr isoDateTimeStr: utils.dateStr,
isoDateStr: date => utils.dateStr(date).substr(0, 10)
}; };
this.getInstanceName = () => config.General ? config.General.instanceName : null; this.getInstanceName = () => config.General ? config.General.instanceName : null;