docs: function parse_id (id, env) {
    var origin = id;
  
    // commonjs parser could not parse non-literal argument of `require`
    // So, users might pass a null value into `require()`
    id || err('null id');
  
    env || (env = {});
    var map = env.map || {};
  
    // 3 kinds of id:
    // - relative module path
    // - package name
    // - a module with path loaded by `facade` or `neuron._use`
  
    // './a' -> 'module@1.0.0/a.js'
    // 'jquery' -> 'jquery'
    id = map[id] || id;
  
    // If the `id` is still a relative path,
    // there must be something wrong.
    // For most cases,
    is_path_relative(id) && module_not_found(origin);
  
    // Adds version to a package name
    // 'jquery' -> 'jquery@^1.9.3'
    id = env.m && env.m[id] || id;
  
    // 'jquery' -> {n: 'jquery', v: '*', p: ''}
    // 'jquery@^1.9.3' -> {n: 'jquery', v: '^1.9.3', p: ''}
    var parsed = parse_module_id(id);
  
    if (parsed.k === env.k) {
      // if inside the same package of the parent module,
      // it uses a same sub graph of the package
      parsed.graph = env.graph;
  
    } else {
      // We route a package of certain range to a specific version according to `config.graph`
      // so several modules may point to a same exports
      // if is foreign module, we should parses the graph to the the sub graph
      // For more details about graph, see '../doc/graph.md'
      var sub_graph = get_sub_graph(parsed.k, env.graph)
        // If sub_graph not found, set it as `[]`
        || [];
      parsed.graph = sub_graph;
  
      // If the range is not defined in the graph,
      // range will remain and not convert to version,
      // which indicate that loader might try to load a module
      //   like 'jquery@^1.9.2'.
      // For most cases, it will not happen,
      //   or the module that matches the range indeed does not exist.
      parsed.v = sub_graph[0] || parsed.v;
      format_parsed(parsed);
    }
  
    return parsed;
  }