123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- 'use strict';
- const fs = require('fs');
- const path = require('path');
- const ConfigChain = require('config-chain').ConfigChain;
- const util = require('./util');
-
- class Conf extends ConfigChain {
- // https://github.com/npm/npm/blob/latest/lib/config/core.js#L208-L222
- constructor(base) {
- super(base);
- this.root = base;
- }
-
- // https://github.com/npm/npm/blob/latest/lib/config/core.js#L332-L342
- add(data, marker) {
- try {
- for (const x of Object.keys(data)) {
- data[x] = util.parseField(data[x], x);
- }
- } catch (err) {
- throw err;
- }
-
- return super.add(data, marker);
- }
-
- // https://github.com/npm/npm/blob/latest/lib/config/core.js#L312-L325
- addFile(file, name) {
- name = name || file;
-
- const marker = {__source__: name};
-
- this.sources[name] = {path: file, type: 'ini'};
- this.push(marker);
- this._await();
-
- try {
- const contents = fs.readFileSync(file, 'utf8');
- this.addString(contents, file, 'ini', marker);
- } catch (err) {
- this.add({}, marker);
- }
-
- return this;
- }
-
- // https://github.com/npm/npm/blob/latest/lib/config/core.js#L344-L360
- addEnv(env) {
- env = env || process.env;
-
- const conf = {};
-
- Object.keys(env)
- .filter(x => /^npm_config_/i.test(x))
- .forEach(x => {
- if (!env[x]) {
- return;
- }
-
- const p = x.toLowerCase()
- .replace(/^npm_config_/, '')
- .replace(/(?!^)_/g, '-');
-
- conf[p] = env[x];
- });
-
- return super.addEnv('', conf, 'env');
- }
-
- // https://github.com/npm/npm/blob/latest/lib/config/load-prefix.js
- loadPrefix() {
- const cli = this.list[0];
-
- Object.defineProperty(this, 'prefix', {
- enumerable: true,
- set: prefix => {
- const g = this.get('global');
- this[g ? 'globalPrefix' : 'localPrefix'] = prefix;
- },
- get: () => {
- const g = this.get('global');
- return g ? this.globalPrefix : this.localPrefix;
- }
- });
-
- Object.defineProperty(this, 'globalPrefix', {
- enumerable: true,
- set: prefix => {
- this.set('prefix', prefix);
- },
- get: () => {
- return path.resolve(this.get('prefix'));
- }
- });
-
- let p;
-
- Object.defineProperty(this, 'localPrefix', {
- enumerable: true,
- set: prefix => {
- p = prefix;
- },
- get: () => {
- return p;
- }
- });
-
- if (Object.prototype.hasOwnProperty.call(cli, 'prefix')) {
- p = path.resolve(cli.prefix);
- } else {
- try {
- const prefix = util.findPrefix(process.cwd());
- p = prefix;
- } catch (err) {
- throw err;
- }
- }
-
- return p;
- }
-
- // https://github.com/npm/npm/blob/latest/lib/config/load-cafile.js
- loadCAFile(file) {
- if (!file) {
- return;
- }
-
- try {
- const contents = fs.readFileSync(file, 'utf8');
- const delim = '-----END CERTIFICATE-----';
- const output = contents
- .split(delim)
- .filter(x => Boolean(x.trim()))
- .map(x => x.trimLeft() + delim);
-
- this.set('ca', output);
- } catch (err) {
- if (err.code === 'ENOENT') {
- return;
- }
-
- throw err;
- }
- }
-
- // https://github.com/npm/npm/blob/latest/lib/config/set-user.js
- loadUser() {
- const defConf = this.root;
-
- if (this.get('global')) {
- return;
- }
-
- if (process.env.SUDO_UID) {
- defConf.user = Number(process.env.SUDO_UID);
- return;
- }
-
- const prefix = path.resolve(this.get('prefix'));
-
- try {
- const stats = fs.statSync(prefix);
- defConf.user = stats.uid;
- } catch (err) {
- if (err.code === 'ENOENT') {
- return;
- }
-
- throw err;
- }
- }
- }
-
- module.exports = Conf;
|