UNPKG

3.13 kBJavaScriptView Raw
1(function initLazyAss() {
2
3 function isArrayLike(a) {
4 return a && typeof a.length === 'number';
5 }
6
7 function toStringArray(arr) {
8 return 'array with ' + arr.length + ' items.\n[' +
9 arr.map(toString).join(',') + ']\n';
10 }
11
12 function isPrimitive(arg) {
13 return typeof arg === 'string' ||
14 typeof arg === 'number' ||
15 typeof arg === 'boolean';
16 }
17
18 function toString(arg, k) {
19 if (isPrimitive(arg)) {
20 return JSON.stringify(arg);
21 }
22 if (arg instanceof Error) {
23 return arg.name + ' ' + arg.message;
24 }
25
26 if (Array.isArray(arg)) {
27 return toStringArray(arg);
28 }
29 if (isArrayLike(arg)) {
30 return toStringArray(Array.prototype.slice.call(arg, 0));
31 }
32 var argString;
33 try {
34 argString = JSON.stringify(arg, null, 2);
35 } catch (err) {
36 argString = '{ cannot stringify arg ' + k + ', it has type "' + typeof arg + '"';
37 if (typeof arg === 'object') {
38 argString += ' with keys ' + Object.keys(arg).join(', ') + ' }';
39 } else {
40 argString += ' }';
41 }
42 }
43 return argString;
44 }
45
46 function formMessage(args) {
47 var msg = args.reduce(function (total, arg, k) {
48 if (k) {
49 total += ' ';
50 }
51 if (typeof arg === 'string') {
52 return total + arg;
53 }
54 if (typeof arg === 'function') {
55 var fnResult;
56 try {
57 fnResult = arg();
58 } catch (err) {
59 // ignore the error
60 fnResult = '[function ' + arg.name + ' threw error!]';
61 }
62 return total + fnResult;
63 }
64 var argString = toString(arg, k);
65 return total + argString;
66 }, '');
67 return msg;
68 }
69
70 function lazyAssLogic(condition) {
71 var fn = typeof condition === 'function' ? condition : null;
72
73 if (fn) {
74 condition = fn();
75 }
76 if (!condition) {
77 var args = [].slice.call(arguments, 1);
78 if (fn) {
79 args.unshift(fn.toString());
80 }
81 return new Error(formMessage(args));
82 }
83 }
84
85 var lazyAss = function lazyAss() {
86 var err = lazyAssLogic.apply(null, arguments);
87 if (err) {
88 throw err;
89 }
90 };
91
92 var lazyAssync = function lazyAssync() {
93 var err = lazyAssLogic.apply(null, arguments);
94 if (err) {
95 setTimeout(function () {
96 throw err;
97 }, 0);
98 }
99 };
100
101 lazyAss.async = lazyAssync;
102
103 function isNode() {
104 return typeof global === 'object';
105 }
106
107 function isBrowser() {
108 return typeof window === 'object';
109 }
110
111 function isCommonJS() {
112 return typeof module === 'object';
113 }
114
115 function globalRegister() {
116 if (isNode()) {
117 /* global global */
118 register(global, lazyAss, 'lazyAss', 'la');
119 register(global, lazyAssync, 'lazyAssync', 'lac');
120 }
121 }
122
123 function register(root, value, name, alias) {
124 root[name] = root[alias] = value;
125 }
126
127 lazyAss.globalRegister = globalRegister;
128
129 if (isBrowser()) {
130 /* global window */
131 register(window, lazyAss, 'lazyAss', 'la');
132 register(window, lazyAssync, 'lazyAssync', 'lac');
133 }
134
135 if (isCommonJS()) {
136 /* global module */
137 module.exports = lazyAss;
138 }
139
140}());