UNPKG

2.84 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 function register(value, name) {
102 var registered;
103 if (typeof window === 'object') {
104 /* global window */
105 window[name] = value;
106 registered = true;
107 }
108 if (typeof global === 'object') {
109 global[name] = value;
110 registered = true;
111 }
112
113 if (!registered) {
114 throw new Error('Do not know how to register ' + name);
115 }
116 }
117
118 register(lazyAss, 'lazyAss');
119 register(lazyAss, 'la');
120 register(lazyAssync, 'lazyAssync');
121 register(lazyAssync, 'lac');
122
123}());