All files / lib/internal/main check_syntax.js

100% Statements 82/82
100% Branches 17/17
100% Functions 2/2
100% Lines 82/82

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 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 8338x 38x 38x 38x 38x 38x 38x 38x 38x 38x 38x 38x 38x 38x 38x 38x 38x 38x 38x 38x 38x 38x 38x 38x 38x 38x 38x 30x 30x 30x 30x 30x 30x 30x 30x 30x 30x 30x 30x 30x 38x 8x 8x 8x 8x 8x 8x 38x 34x 34x 34x 34x 34x 2x 2x 2x 2x 32x 34x 38x 34x 34x 34x 8x 34x 26x 26x 26x 26x 26x 26x 34x 34x 6x 6x 6x 6x 28x 28x 28x 28x 34x  
'use strict';
 
// If user passed `-c` or `--check` arguments to Node, check its syntax
// instead of actually running the file.
 
const { getOptionValue } = require('internal/options');
const {
  prepareMainThreadExecution
} = require('internal/bootstrap/pre_execution');
 
const {
  readStdin
} = require('internal/process/execution');
 
const { pathToFileURL } = require('url');
 
const {
  Module: {
    _resolveFilename: resolveCJSModuleName,
  },
  wrapSafe,
} = require('internal/modules/cjs/loader');
 
// TODO(joyeecheung): not every one of these are necessary
prepareMainThreadExecution(true);
 
if (process.argv[1] && process.argv[1] !== '-') {
  // Expand process.argv[1] into a full path.
  const path = require('path');
  process.argv[1] = path.resolve(process.argv[1]);
 
  // Read the source.
  const filename = resolveCJSModuleName(process.argv[1]);
 
  const fs = require('fs');
  const source = fs.readFileSync(filename, 'utf-8');
 
  markBootstrapComplete();
 
  loadESMIfNeeded(() => checkSyntax(source, filename));
} else {
  markBootstrapComplete();
 
  loadESMIfNeeded(() => readStdin((code) => {
    checkSyntax(code, '[stdin]');
  }));
}
 
function loadESMIfNeeded(cb) {
  const { getOptionValue } = require('internal/options');
  const hasModulePreImport = getOptionValue('--import').length > 0;
 
  if (hasModulePreImport) {
    const { loadESM } = require('internal/process/esm_loader');
    loadESM(cb);
    return;
  }
  cb();
}
 
async function checkSyntax(source, filename) {
  let isModule = true;
  if (filename === '[stdin]' || filename === '[eval]') {
    isModule = getOptionValue('--input-type') === 'module';
  } else {
    const { defaultResolve } = require('internal/modules/esm/resolve');
    const { defaultGetFormat } = require('internal/modules/esm/get_format');
    const { url } = await defaultResolve(pathToFileURL(filename).toString());
    const format = await defaultGetFormat(url);
    isModule = format === 'module';
  }
 
  if (isModule) {
    const { ModuleWrap } = internalBinding('module_wrap');
    new ModuleWrap(filename, undefined, source, 0, 0);
    return;
  }
 
  const { loadESM } = require('internal/process/esm_loader');
  const { handleMainPromise } = require('internal/modules/run_main');
  handleMainPromise(loadESM((loader) => wrapSafe(filename, source)));
}