efront 3.9.15 → 3.10.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,22 +1,14 @@
1
- var FormData = this.FormData;
2
- var cookiesMap = {};
3
- // ///// 1 ////////// 2 /////// 3 //// 4 //
4
- var domainReg = /^(?:(https?)\:)?\/\/(.*?)(?:\/(.*?))?([\?#].*)?$/i;
5
- var base = domainReg.test(location.href) ? '/' : "http://efront.cc/";
6
- var location_host = location.href.replace(domainReg, '$1://$2/');
7
- var setHost = function (host) {
8
- var parsed = parseURL(host);
9
- if (!host) return console.error("cross_host格式不正确", host);
10
- var host = parsed.host + (parsed.pathname || '/');
11
- host = (/^https/.test(location_host) ? "https://" : "http://") + host;
12
- base = host;
13
- };
1
+ var { cookiesMap, saveCookie } = cookie;
2
+ var saveCookie = lazy(function () {
3
+ sessionStorage.setItem(cookieItemsInSessionStorageKey, JSON.stringify(cookiesMap));
4
+ }, 20);
14
5
  var { efrontURI, cross_host = efrontURI } = this;
15
- if (cross_host) setHost(cross_host);
16
- var HeadersKeys = ["Content-Type"];
6
+ var location_href = parseURL(location.href);
7
+ location_href = `${location_href.protocol}//${location_href.host}/`;
8
+ _cross.setLocation(location_href);
9
+
17
10
  var cookieItemsInSessionStorageKey = "--zimoli-coms-cross";
18
11
  var cookiesData = sessionStorage.getItem(cookieItemsInSessionStorageKey);
19
- var cors_hosts = [];
20
12
  if (cookiesData) {
21
13
  try {
22
14
  extend(cookiesMap, JSON.parse(cookiesData));
@@ -24,363 +16,45 @@ if (cookiesData) {
24
16
  console.warn("加载cookie出错!");
25
17
  }
26
18
  }
27
- function getDomainPath(url) {
28
- return url.replace(domainReg, "$2/$3");
29
- }
30
- function getRequestProtocol(url) {
31
- if (/^https:/i.test(url)) {
32
- return "https:";
33
- }
34
- return "http:";
35
- }
36
- function getCookies(domainPath) {
37
- var cookieObject = {};
38
- var splited = domainPath.split("/");
39
- var domain = splited[0];
40
- do {
41
- var copy = splited.slice(0);
42
- do {
43
- domainPath = copy.join("/");
44
- var cookie = cookiesMap[domainPath];
45
- if (cookie) {
46
- for (var k in cookie) {
47
- if (!cookieObject[k]) {
48
- cookieObject[k] = cookie[k];
49
- }
50
- }
51
- }
52
- copy.pop();
53
- } while (copy.length);
54
- domain = domain.replace(/^.*?(\.|$)/, "");
55
- splited[0] = domain;
56
- } while (domain.length);
57
- return serialize(cookieObject, ";");
58
- }
59
- function addCookie(cookie, originDomain = "") {
60
- if (cookie) {
61
- clearTimeout(addCookie.save_timer);
62
- addCookie.save_timer = setTimeout(function () {
63
- sessionStorage.setItem(cookieItemsInSessionStorageKey, JSON.stringify(cookiesMap));
64
- }, 20);
65
- cookie.replace(/(^|;|,)\s*(expires)=(\w*),([^=]*)(;|$)/ig, "$1$2=$3.$4$5")
66
- .split(/,\s*/).map(function (cookie) {
67
- var cookieObject = {};
68
- var result = cookie.split(/;\s*/);
69
- result.slice(1).map(function (kev) {
70
- var kvs = /^(.+?)\=(.+?)$/.exec(kev);
71
- if (kvs) {
72
- var [, k, v] = kvs;
73
- cookieObject[k.toLowerCase()] = v;
74
- }
75
- });
76
- var { path, domain } = cookieObject;
77
- if (!domain) {
78
- domain = originDomain.replace(/[^\/]+$/, "");
79
- }
80
- if (/^\./.test(domain)) {
81
- domain = domain.replace(/^\.+/, "");
82
- }
83
- var destPath;
84
- if (/^\//.test(path)) {
85
- destPath = domain.replace(/\/.*$/, "") + path;
86
- } else {
87
- destPath = domain;
88
- }
89
- destPath = destPath.replace(/\/+$/, "");
90
- if (originDomain.indexOf(destPath) >= 0) {
91
- var cookieMap = parseKV(result[0], ";");
92
- if (!cookiesMap[destPath]) {
93
- cookiesMap[destPath] = cookieMap;
94
- } else {
95
- extend(cookiesMap[destPath], cookieMap);
96
- }
97
- }
98
- });
99
- }
100
- }
101
- function isChildPath(relative, path) {
102
- return relative.replace(/^(.*\/)[^\/]*$/, path);
103
- }
19
+
104
20
  var digest = function () {
105
21
  dispatch('render', window);
106
22
  };
107
23
 
108
- var getCrossUrl = function (domain, headers) {
109
- if (notCross(domain)) return domain;
110
- var originDomain = getDomainPath(domain);
111
- var _cookies = getCookies(originDomain);
112
- var _headers = {};
113
- if (_cookies) {
114
- _headers.Cookie = _cookies;
115
- }
116
- extend(_headers, headers);
117
- _headers = serialize(_headers);
118
- if (_headers) _headers = "," + _headers;
119
- return domain
120
- .replace(/^(s?)(\/\/)/i, "http$1:$2")
121
- .replace(domainReg, base + `*${/^(https\:|s\/\/)/i.test(domain) ? "*" : ""}$2${_headers}/$3$4`);
122
- };
123
- function cross(method, url, headers) {
124
- var originDomain = getDomainPath(url);
125
- if (!originDomain) throw new Error("Unsupposed url format!");
126
- var _cookies = getCookies(originDomain);
127
- var _headers = {};
128
- if (_cookies) {
129
- _headers.Cookie = _cookies;
130
- }
131
- extend(_headers, headers);
132
- if (/^[mc]/i.test(method)) {
133
- _headers["User-Agent"] = /^m/i.test(method)
134
- ? "Efront/1.9 (iPhone) Safari/602.1"
135
- : "Efront/1.9 (Windows) Chrome/77.0.3865.90";
136
- method = method.slice(1);
137
- }
138
- if (/^jsonp/i.test(method)) {
139
- var cb = method.split('\-')[1] || 'callback';
140
- setTimeout(function () {
141
- if (!isEmpty(jsondata) && isEmpty(datas)) {
142
- datas = serialize(jsondata);
143
- }
144
- if (datas) {
145
- xhr.src += "&" + datas;
146
- }
147
- });
148
- var xhr = jsonp(url, {
149
- [cb](a) {
150
- xhr.response = xhr.responseText = JSON.stringify(a);
151
- onload(xhr);
152
- }
153
- });
154
- xhr.onerror = function (e) {
155
- onerror(e);
156
- };
157
- xhr.abort = function () {
158
- removeFromList(requests, this);
159
- remove(this);
160
- };
161
- } else {
162
- var nocross = notCross(url);
163
- var xhr = new XMLHttpRequest;
164
- var abort = xhr.abort;
165
- xhr.abort = function () {
166
- xhr.onreadystatechange = null;
167
- removeFromList(requests, this);
168
- abort.call(this);
169
- clearTimeout(sendtimer);
170
- };
24
+ var cross = _cross.bind(function (callback, onerror) {
25
+ var xhr = new XMLHttpRequest;
26
+ var abort = xhr.abort;
27
+ xhr.abort = function () {
28
+ xhr.onreadystatechange = null;
29
+ abort.call(this);
30
+ };
31
+ xhr.onerror = onerror;
171
32
 
172
- xhr.onreadystatechange = function () {
173
- if (xhr.readyState === 4) {
174
- if (xhr.getResponseHeader && !nocross) {
175
- var cookie = xhr.getResponseHeader("efront-cookie");
176
- addCookie(cookie, originDomain);
177
- }
178
- switch (xhr.status) {
179
- case 0:
180
- if (!navigator.onLine) {
181
- onerror({ status: "网络断开" });
182
- break;
183
- }
184
- if (!xhr.response) {
185
- onerror({ status: "无法访问服务器" });
186
- break;
187
- }
188
- case 200:
189
- case 201:
190
- case 304:
191
- onload(xhr);
33
+ xhr.onreadystatechange = function () {
34
+ if (xhr.readyState === 4) {
35
+ dispatch(window, 'render');
36
+ switch (xhr.status) {
37
+ case 0:
38
+ if (!navigator.onLine) {
39
+ onerror({ status: "网络断开" });
192
40
  break;
193
- case 302:
194
- case 301:
195
- if (xhr.isRedirected > 2 || nocross) break;
196
- var location = xhr.getResponseHeader("efront-location");
197
- if (!domainReg.test(location)) {
198
- if (/^\//.test(location)) {
199
- location = originDomain.replace(/\/.*$/, location);
200
- } else {
201
- location = originDomain.replace(/[^\/+]$/, location);
202
- }
203
- location = getRequestProtocol(url) + "//" + location;
204
- }
205
- var crs = cross("get", location, headers);
206
- crs.isRedirected = (xhr.isRedirected || 0) + 1;
207
- crs.done(onload, false);
208
- crs.error(onerror, false);
209
- break;
210
- default:
211
- onerror(xhr);
212
- }
213
- dispatch(window, 'render');
214
- }
215
- };
216
- var setRequestHeader = xhr.setRequestHeader;
217
- var realHeaders = Object.create(null);
218
- xhr.setRequestHeader = function (key, value) {
219
- realHeaders[key] = value;
220
- };
221
- xhr.then = function (ok, oh) {
222
- onloads.push(ok);
223
- onerrors.push(oh);
224
- flush();
225
- };
226
- var fire = function () {
227
- var isform = /^f/i.test(method);
228
- if (isform) {
229
- if (method === 'form') method = 'post';
230
- else method = method.slice(1);
231
- }
232
- if (!isEmpty(jsondata) && isEmpty(datas)) {
233
- if (/^(get|head|trace)$/i.test(method)) {
234
- url = url.replace(/#[\s\S]*/, '');
235
- datas = serialize(jsondata);
236
- if (datas) url += (/\?/.test(url) ? "&" : "?") + datas;
237
- } else if (isform) {
238
- xhr.form(jsondata);
239
- } else {
240
- datas = JSON.stringify(jsondata);
241
- if (datas === "{}" || datas === "[]") {
242
- datas = '';
243
- } else {
244
- realHeaders["Content-Type"] = "application/json;charset=UTF-8";
245
41
  }
246
- }
42
+ break;
43
+ default:
44
+ callback();
247
45
  }
248
- if (nocross) {
249
- extend(realHeaders, _headers);
250
- xhr.open(method, url);
251
- } else {
252
- xhr.open(method, getCrossUrl(url, _headers));
253
- }
254
- Object.keys(realHeaders).forEach(key => setRequestHeader.call(xhr, key, realHeaders[key]));
255
- send.call(xhr, datas);
256
- digest();
257
- };
258
- var sendtimer = setTimeout(fire, 0);
259
- }
260
- var loaded, errored;
261
- var onload = function (xhr) {
262
- removeFromList(requests, xhr);
263
- if (xhr.decoder) {
264
- xhr = xhr.decoder(xhr);
265
- }
266
- loaded = xhr;
267
- flush();
268
- digest();
269
- };
270
- var onerror1 = function (e) {
271
- removeFromList(requests, e);
272
- errored = e || "未知错误!";
273
- flush();
274
- digest();
275
- };
276
- var onerror = async function (e) {
277
- for (var r of reforms) {
278
- var r = await reform(r, { method, url, status: xhr.status, headers: _headers }, fire, onerror1, e);
279
- if (r === false) return;
280
- }
281
- onerror1(e);
282
- };
283
- var flush = function () {
284
- var then = xhr.then;
285
- delete xhr.then;
286
- if (loaded) onloads.splice(0, onloads.length).map(e => e instanceof Function && e(xhr));
287
- if (errored) onerrors.splice(0, onerrors.length).map(e => e instanceof Function && e(errored));
288
- xhr.then = then;
289
- };
290
- var onloads = [], onerrors = [];
291
- xhr.done = xhr.success = function (on, asqueue = true) {
292
- if (!asqueue) onloads.splice(0, onloads.length);
293
- onloads.push(on);
294
- flush();
295
- return xhr;
296
- };
297
- var send = xhr.send;
298
- var datas = "";
299
- var jsondata = null;
300
- xhr.json = xhr.data = xhr.send = function (data, value) {
301
- if (!jsondata && !(isEmpty(data) && isEmpty(value))) jsondata = data instanceof Array ? [] : {};
302
- if (FormData && data instanceof FormData) {
303
- datas = data;
304
- } else if (isObject(data) && !isFile(data)) {
305
- extend(jsondata, data);
306
- } else if (!isEmpty(value)) {
307
- extend(jsondata, { [data]: value });
308
- } else if (isString(data) && value !== false && /^\s*\{|\=/.test(data)) {
309
- var data = /^\s*\{/.test(data) ? JSON.parse(data) : parseKV(data, "&", "=");
310
- extend(jsondata, data);
311
- } else {
312
- datas = data;
313
- }
314
- return xhr;
315
- };
316
- xhr.form = function (data) {
317
- xhr.data(data);
318
- if (FormData) {
319
- datas = new FormData;
320
- for (var k in jsondata) {
321
- datas.append(k, jsondata[k]);
322
- }
323
- } else {
324
- realHeaders["Content-Type"] = "application/x-www-form-urlencoded";
325
- datas = serialize(jsondata, "&", "=");
326
- }
327
- };
328
- xhr.fail = xhr.error = function (on, asqueue = true) {
329
- if (!asqueue) {
330
- onerrors.splice(0, onerrors.length);
46
+ saveCookie();
331
47
  }
332
- onerrors.push(on);
333
- flush();
334
- return xhr;
335
48
  };
336
- requests.push(xhr);
49
+
337
50
  return xhr;
338
- }
339
- function addDirect(a) {
340
- if (cors_hosts.indexOf(a) >= 0) return;
341
- if (typeof a === 'string' || a instanceof RegExp) cors_hosts.push(a);
342
- }
343
- function notCross(domain) {
344
- if (location_host === domain.slice(0, location_host.length) || !/^https?\:\/\/|^s?\/\//.test(domain)) return true;
345
- for (var cx = 0, dx = cors_hosts.length; cx < dx; cx++) {
346
- var host = cors_hosts[cx];
347
- if (host instanceof RegExp) {
348
- if (host.test(domain)) return true;
349
- } else {
350
- host = host.replace(domainReg, '$2/$3');
351
- if (domain.replace(domainReg, '$2/$3').slice(0, host.length) === host) return true;
352
- }
353
- }
354
- return false;
355
- }
51
+ }, jsonp, digest);
356
52
 
357
- var requests = [];
358
- var reforms = [];
359
- function reform(r, info, fire, cancel, e) {
360
- var fired = false;
361
- return r(info, function () {
362
- if (fired) return;
363
- fired = true;
364
- fire();
365
- }, function () {
366
- if (fired) return;
367
- fired = true;
368
- cancel(e);
369
- })
370
- }
371
- function addReform(r) {
372
- if (isFunction(r)) reforms.push(r);
373
- }
374
- extend(cross, {
375
- requests,
376
- abortAll() {
377
- var rs = requests.splice(0, requests.length);
378
- for (var r of rs) r.abort();
379
- },
380
- setHost,
381
- addReform,
382
- getCookies,
383
- addCookie,
384
- addDirect,
385
- getCrossUrl
386
- });
53
+ cross.setHost = function (host) {
54
+ var parsed = parseURL(host);
55
+ if (!host) return console.error("cross_host格式不正确", host);
56
+ var host = parsed.host + (parsed.pathname || '/');
57
+ host = (/^https/.test(location_href) ? "https://" : "http://") + host;
58
+ _cross.setHost(host);
59
+ };
60
+ if (cross_host) cross.setHost(cross_host);
@@ -962,7 +962,7 @@ var data = {
962
962
  instanceDataMap[instanceId] = data;
963
963
  }
964
964
  setItem(instanceId, data, rememberWithStorage);
965
- fireListener(instanceId);
965
+ fireListener(instanceId, data);
966
966
  return instanceDataMap[instanceId];
967
967
  },
968
968
  patchInstance(instanceId, data, rememberWithStorage = 0) {
@@ -999,7 +999,7 @@ var data = {
999
999
  if (!~listeners.indexOf(callback)) {
1000
1000
  listeners.push(callback);
1001
1001
  }
1002
- callback(this.getInstance(instanceId));
1002
+ if (hasItem(instanceId)) callback(getItem(instanceId));
1003
1003
  },
1004
1004
  unbindInstance(instanceId, callback) {
1005
1005
  if (!instanceListenerMap[instanceId]) return;
@@ -1047,12 +1047,14 @@ function getItem(instanceId, onlyFromLocalStorage = false) {
1047
1047
  }
1048
1048
  return data;
1049
1049
  }
1050
+ function hasItem(instanceId) {
1051
+ return sessionStorage.getItem(instanceId) || localStorage.getItem(instanceId);
1052
+ }
1050
1053
  var instanceListenerMap = {};
1051
- var fireListener = function (instanceId) {
1054
+ var fireListener = function (instanceId, data) {
1052
1055
  var listeners = instanceListenerMap[instanceId];
1053
1056
  if (!listeners) return;
1054
- var instance = instanceDataMap[instanceId];
1055
- listeners.forEach(a => a(instance));
1057
+ listeners.forEach(a => a(data));
1056
1058
  };
1057
1059
  data.setItem = data.setInstance;
1058
1060
  data.getItem = data.getInstance;
@@ -23,5 +23,8 @@ function jsonp(url, params) {
23
23
  url += /\?/.test(url) ? "&" + search : "?" + search;
24
24
  }
25
25
  var s = script(url);
26
+ s.abort = function () {
27
+ remove(this);
28
+ };
26
29
  return s;
27
30
  }
@@ -38,6 +38,9 @@ function main(children, multiple, addable) {
38
38
  item.name = option.name || option.innerHTML;
39
39
  var icon = option.getAttribute ? option.getAttribute("icon") : option.icon;
40
40
  if (icon) {
41
+ if (!hasIcon) {
42
+ page.setAttribute('iconed', '');
43
+ }
41
44
  hasIcon = true;
42
45
  css(item, { backgroundImage: `url('${icon}')` });
43
46
  }
@@ -125,9 +128,6 @@ function main(children, multiple, addable) {
125
128
  });
126
129
  adder.setAttribute("adder", '');
127
130
  }
128
- if (hasIcon) {
129
- page.setAttribute('iconed', '');
130
- }
131
131
  page.icon = iconed;
132
132
  on('mousedown')(page, e => e.preventDefault());
133
133
  return page;
@@ -36,10 +36,22 @@
36
36
  }
37
37
 
38
38
  &[iconed] {
39
- border-left: 30px solid #f2f4f6;
39
+ padding-left: 30px;
40
+
41
+ &:before {
42
+ content: "";
43
+ display: block;
44
+ position: absolute;
45
+ height: 100%;
46
+ top: 0;
47
+ left: 0;
48
+ width: 30px;
49
+ background: #f2f4f6;
50
+ }
40
51
 
41
52
  >div {
42
53
  filter: grayscale(1);
54
+ position: relative;
43
55
 
44
56
  &:hover,
45
57
  &:active,
@@ -125,6 +125,6 @@ body>& {
125
125
  .button {
126
126
  min-width: 60px;
127
127
  padding: 0 20px;
128
- margin-right: 10px;
128
+ margin-left: 10px;
129
129
  }
130
130
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "efront",
3
- "version": "3.9.15",
3
+ "version": "3.10.5",
4
4
  "description": "一个开发工具,开放源代码,自带组件库和编译环境,可以用来开发web组件,web应用或nodejs模块,或做为已有代码的加密工具,也可以做为静态页面服务器或跨域中转服务器使用",
5
5
  "main": "public/efront.js",
6
6
  "directories": {