Welcome to mirror list, hosted at ThFree Co, Russian Federation.

Loader.js « loader « internal « lib - github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: a409d397f85dd6e4cd47aa9b2b79a335905b0bc2 (plain)
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
'use strict';

const { URL } = require('url');
const { getURLFromFilePath } = require('internal/url');

const {
  getNamespaceOfModuleWrap
} = require('internal/loader/ModuleWrap');

const ModuleMap = require('internal/loader/ModuleMap');
const ModuleJob = require('internal/loader/ModuleJob');
const resolveRequestUrl = require('internal/loader/resolveRequestUrl');
const errors = require('internal/errors');

function getBase() {
  try {
    return getURLFromFilePath(`${process.cwd()}/`);
  } catch (e) {
    e.stack;
    // If the current working directory no longer exists.
    if (e.code === 'ENOENT') {
      return undefined;
    }
    throw e;
  }
}

class Loader {
  constructor(base = getBase()) {
    this.moduleMap = new ModuleMap();
    if (typeof base !== 'undefined' && base instanceof URL !== true) {
      throw new errors.TypeError('ERR_INVALID_ARG_TYPE', 'base', 'URL');
    }
    this.base = base;
  }

  async resolve(specifier) {
    const request = resolveRequestUrl(this.base, specifier);
    if (request.url.protocol !== 'file:') {
      throw new errors.Error('ERR_INVALID_PROTOCOL',
                             request.url.protocol, 'file:');
    }
    return request.url;
  }

  async getModuleJob(dependentJob, specifier) {
    if (!this.moduleMap.has(dependentJob.url)) {
      throw new errors.Error('ERR_MISSING_MODULE', dependentJob.url);
    }
    const request = await resolveRequestUrl(dependentJob.url, specifier);
    const url = `${request.url}`;
    if (this.moduleMap.has(url)) {
      return this.moduleMap.get(url);
    }
    const dependencyJob = new ModuleJob(this, request);
    this.moduleMap.set(url, dependencyJob);
    return dependencyJob;
  }

  async import(specifier) {
    const request = await resolveRequestUrl(this.base, specifier);
    const url = `${request.url}`;
    let job;
    if (this.moduleMap.has(url)) {
      job = this.moduleMap.get(url);
    } else {
      job = new ModuleJob(this, request);
      this.moduleMap.set(url, job);
    }
    const module = await job.run();
    return getNamespaceOfModuleWrap(module);
  }
}
Object.setPrototypeOf(Loader.prototype, null);
module.exports = Loader;