aboutsummaryrefslogtreecommitdiff
path: root/node_modules/lazy-cache/index.js
blob: 751fcbb5c7bf4adc0265d66ab7d0c2908c096d4f (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
'use strict';

var set = require('set-getter');

/**
 * Cache results of the first function call to ensure only calling once.
 *
 * ```js
 * var utils = require('lazy-cache')(require);
 * // cache the call to `require('ansi-yellow')`
 * utils('ansi-yellow', 'yellow');
 * // use `ansi-yellow`
 * console.log(utils.yellow('this is yellow'));
 * ```
 *
 * @param  {Function} `fn` Function that will be called only once.
 * @return {Function} Function that can be called to get the cached function
 * @api public
 */

function lazyCache(requireFn) {
  var cache = {};

  return function proxy(name, alias) {
    var key = alias;

    // camel-case the module `name` if `alias` is not defined
    if (typeof key !== 'string') {
      key = camelcase(name);
    }

    // create a getter to lazily invoke the module the first time it's called
    function getter() {
      return cache[key] || (cache[key] = requireFn(name));
    }

    // trip the getter if `process.env.UNLAZY` is defined
    if (unlazy(process.env)) {
      getter();
    }

    set(proxy, key, getter);
    return getter;
  };
}

/**
 * Return true if `process.env.LAZY` is true, or travis is running.
 */

function unlazy(env) {
  return env.UNLAZY === 'true' || env.UNLAZY === true || env.TRAVIS;
}

/**
 * Camelcase the the given module `name`.
 */

function camelcase(str) {
  if (str.length === 1) {
    return str.toLowerCase();
  }
  str = str.replace(/^[\W_]+|[\W_]+$/g, '').toLowerCase();
  return str.replace(/[\W_]+(\w|$)/g, function(_, ch) {
    return ch.toUpperCase();
  });
}

/**
 * Expose `lazyCache`
 */

module.exports = lazyCache;