All files / lib/internal/modules/esm create_dynamic_module.js

100% Statements 64/64
90.91% Branches 10/11
85.71% Functions 6/7
100% Lines 64/64

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 6589x 89x 89x 89x 89x 89x 3x 3x 3x 3x 3x 89x 2133x 2133x 2133x 2133x 2133x 2133x 2133x 2133x 2133x 89x 89x 212x 212x 212x 212x 212x 212x 212x 212x 212x 212x 212x 212x 212x 212x 212x 212x 212x 212x 212x 212x 126x 126x 126x 126x 126x 126x 126x 35x 35x 35x 126x 212x 212x 212x 212x 212x 212x 212x 89x 89x 89x  
'use strict';
 
const { ArrayPrototype, JSON, Object } = primordials;
 
const debug = require('internal/util/debuglog').debuglog('esm');
 
function createImport(impt, index) {
  const imptPath = JSON.stringify(impt);
  return `import * as $import_${index} from ${imptPath};
import.meta.imports[${imptPath}] = $import_${index};`;
}
 
function createExport(expt) {
  const name = `${expt}`;
  return `let $${name};
export { $${name} as ${name} };
import.meta.exports.${name} = {
  get: () => $${name},
  set: (v) => $${name} = v,
};`;
}
 
const createDynamicModule = (imports, exports, url = '', evaluate) => {
  debug('creating ESM facade for %s with exports: %j', url, exports);
  const source = `
${ArrayPrototype.join(ArrayPrototype.map(imports, createImport), '\n')}
${ArrayPrototype.join(ArrayPrototype.map(exports, createExport), '\n')}
import.meta.done();
`;
  const { ModuleWrap, callbackMap } = internalBinding('module_wrap');
  const m = new ModuleWrap(source, `${url}`);
 
  const readyfns = new Set();
  const reflect = {
    exports: Object.create(null),
    onReady: (cb) => { readyfns.add(cb); },
  };
 
  if (imports.length)
    reflect.imports = Object.create(null);
 
  callbackMap.set(m, {
    initializeImportMeta: (meta, wrap) => {
      meta.exports = reflect.exports;
      if (reflect.imports)
        meta.imports = reflect.imports;
      meta.done = () => {
        evaluate(reflect);
        reflect.onReady = (cb) => cb(reflect);
        for (const fn of readyfns) {
          readyfns.delete(fn);
          fn(reflect);
        }
      };
    },
  });
 
  return {
    module: m,
    reflect,
  };
};
 
module.exports = createDynamicModule;