docs: function processConfig(config){
      // make a copy of config
      config = slice(config);
  
      // extend by default settings
      complete(config, {
        implicitExt: NODE_ENV ? true : false  // true, false, 'warn'
      });
  
      // warn about extProto in basis-config, this option was removed in 1.3.0
      /** @cut */ if ('extProto' in config)
      /** @cut */   consoleMethods.warn('basis-config: `extProto` option in basis-config is not support anymore');
  
      // warn about path in basis-config, this option was deprecated in 1.3.0
      /** @cut */ if ('path' in config)
      /** @cut */   consoleMethods.warn('basis-config: `path` option in basis-config is deprecated, use `modules` instead');
  
      // build modules list
      var autoload = [];
      var modules = merge(config.path, config.modules, {
        basis: basisFilename
      });
  
      // reset modules
      config.modules = {};
  
      // process autoload
      if (config.autoload)
      {
        // [path/to/][name][.rest.ext] -> {
        //   name: name,
        //   filename: path + name + rest
        // }
  
        var m = String(config.autoload).match(/^((?:[^\/]*\/)*)([a-z$_][a-z0-9$_]*)((?:\.[a-z$_][a-z0-9$_]*)*)$/i);
        if (m)
        {
          modules[m[2]] = {
            autoload: true,
            filename: m[1] + m[2] + (m[3] || '.js')
          };
        }
        else
        {
          /** @cut */ consoleMethods.warn('basis-config: wrong `autoload` value (setting ignored): ' + config.autoload);
        }
  
        delete config.autoload;
      }
  
      // process modules
      for (var name in modules)
      {
        // name: {
        //   autoload: boolean,
        //   path: 'path/to',
        //   filename: 'module.js'
        // }
        //
        // or
        //
        // name: 'filename'
  
        var module = modules[name];
  
        // if value is string, convert to config
        if (typeof module == 'string')
          // value is filename
          module = {
            // if path ends with `/` add `[name].js` to the end
            filename: module.replace(/\/$/, '/' + name + '.js')
          };
  
        // get and resolve path and filename
        var filename = module.filename;
        var path = module.path;
  
        // if no path but filename
        // let filename equals to 'path/to/file[.ext]', then
        //   path = 'path/to/file'
        //   filename = '../file[.ext]'
        if (filename && !path)
        {
          filename = pathUtils.resolve(filename);
          path = filename.substr(0, filename.length - pathUtils.extname(filename).length);
          filename = '../' + pathUtils.basename(filename);
        }
  
        // path should be absolute
        // at this point path is defined in any case
        path = pathUtils.resolve(path);
  
        // if no filename but path
        // let path equals to 'path/to/file[.ext]', then
        //   path = 'path/to'
        //   filename = 'file[.ext]'
        if (!filename && path)
        {
          filename = pathUtils.basename(path);
          path = pathUtils.dirname(path);
        }
  
        // if filename has no extension, adds `.js`
        if (!pathUtils.extname(filename))
          filename += '.js';
  
        // resolve filename
        filename = pathUtils.resolve(path, filename);
  
        // store results
        config.modules[name] = {
          path: path,
          filename: filename
        };
  
        // store autoload modules
        if (module.autoload)
        {
          config.autoload = autoload;
          autoload.push(name);
        }
      }
  
      return config;
    }