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 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
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 |
|
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 |
|
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 |
|
160 | register(window, lazyAss, 'lazyAss', 'la');
|
161 | register(window, lazyAssync, 'lazyAssync', 'lac');
|
162 | }
|
163 |
|
164 | if (isCommonJS()) {
|
165 |
|
166 | module.exports = lazyAss;
|
167 | }
|
168 |
|
169 | }());
|