UNPKG

3.74 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 isError(e) {
19 return e instanceof Error;
20 }
21
22 /*
23 custom JSON.stringify replacer to make sure we do not
24 hide properties that have value "undefined"
25 var o = {
26 foo: 42,
27 bar: undefined
28 }
29 // standard JSON.stringify returns '{"foo": 42}'
30 // this replacer returns '{"foo": 42, "bar": null}'
31 */
32 function replacer(key, value) {
33 if (value === undefined) {
34 return null;
35 }
36 return value;
37 }
38
39 function toString(arg, k) {
40 if (isPrimitive(arg)) {
41 return JSON.stringify(arg);
42 }
43 if (arg instanceof Error) {
44 return arg.name + ' ' + arg.message;
45 }
46
47 if (Array.isArray(arg)) {
48 return toStringArray(arg);
49 }
50 if (isArrayLike(arg)) {
51 return toStringArray(Array.prototype.slice.call(arg, 0));
52 }
53 var argString;
54 try {
55 argString = JSON.stringify(arg, replacer, 2);
56 } catch (err) {
57 argString = '{ cannot stringify arg ' + k + ', it has type "' + typeof arg + '"';
58 if (typeof arg === 'object') {
59 argString += ' with keys ' + Object.keys(arg).join(', ') + ' }';
60 } else {
61 argString += ' }';
62 }
63 }
64 return argString;
65 }
66
67 function endsWithNewLine(s) {
68 return /\n$/.test(s);
69 }
70
71 function formMessage(args) {
72 var msg = args.reduce(function (total, arg, k) {
73 if (k && !endsWithNewLine(total)) {
74 total += ' ';
75 }
76 if (typeof arg === 'string') {
77 return total + arg;
78 }
79 if (typeof arg === 'function') {
80 var fnResult;
81 try {
82 fnResult = arg();
83 } catch (err) {
84 // ignore the error
85 fnResult = '[function ' + arg.name + ' threw error!]';
86 }
87 return total + fnResult;
88 }
89 var argString = toString(arg, k);
90 return total + argString;
91 }, '');
92 return msg;
93 }
94
95 function lazyAssLogic(condition) {
96 if (isError(condition)) {
97 return condition;
98 }
99
100 var fn = typeof condition === 'function' ? condition : null;
101
102 if (fn) {
103 condition = fn();
104 }
105 if (!condition) {
106 var args = [].slice.call(arguments, 1);
107 if (fn) {
108 args.unshift(fn.toString());
109 }
110 return new Error(formMessage(args));
111 }
112 }
113
114 var lazyAss = function lazyAss() {
115 var err = lazyAssLogic.apply(null, arguments);
116 if (err) {
117 throw err;
118 }
119 };
120
121 var lazyAssync = function lazyAssync() {
122 var err = lazyAssLogic.apply(null, arguments);
123 if (err) {
124 setTimeout(function () {
125 throw err;
126 }, 0);
127 }
128 };
129
130 lazyAss.async = lazyAssync;
131
132 function isNode() {
133 return typeof global === 'object';
134 }
135
136 function isBrowser() {
137 return typeof window === 'object';
138 }
139
140 function isCommonJS() {
141 return typeof module === 'object';
142 }
143
144 function globalRegister() {
145 if (isNode()) {
146 /* global global */
147 register(global, lazyAss, 'lazyAss', 'la');
148 register(global, lazyAssync, 'lazyAssync', 'lac');
149 }
150 }
151
152 function register(root, value, name, alias) {
153 root[name] = root[alias] = value;
154 }
155
156 lazyAss.globalRegister = globalRegister;
157
158 if (isBrowser()) {
159 /* global window */
160 register(window, lazyAss, 'lazyAss', 'la');
161 register(window, lazyAssync, 'lazyAssync', 'lac');
162 }
163
164 if (isCommonJS()) {
165 /* global module */
166 module.exports = lazyAss;
167 }
168
169}());