raiutils 8.7.2 → 8.7.4
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.
- package/README.md +1 -0
- package/package.json +1 -1
- package/router.js +13 -9
- package/schema.js +37 -20
- package/utils.js +109 -51
- package/utils.min.js +1 -1
- package/uuid.js +10 -6
package/README.md
CHANGED
|
@@ -65,6 +65,7 @@ For client-side use, the minified *utils.min.js* is recommended (Minified with h
|
|
|
65
65
|
- `utils.copy(o[,sub]) returns Object` Deep (recursive) Object.create. Copies down to given sub levels, all levels if undefined.
|
|
66
66
|
- `utils.skinnedInput(el)` Fallback for when css *'appearance:none'* doesn't work. Generates container for input field for css skinning on unsupported browsers.
|
|
67
67
|
- `utils.numField(field[,min[,max[,decMax[,sym]]]])` Turns your boring input field into a mobile-friendly integer, decimal, or financial entry field with max/min & negative support!
|
|
68
|
+
- `utils.autosize(el, maxRows=5, minRows=1)` Auto-resizing textarea, dynamically scales lineHeight based on input.
|
|
68
69
|
- `utils.formatCost(n[,sym]) returns String` Format Number as currency. Uses '$' by default.
|
|
69
70
|
- `utils.fromDateTimeBox(el) returns Date` Convert value from 'datetime-local' input to Date object.
|
|
70
71
|
- `utils.toDateTimeBox(d[,sec]) returns String` Convert Date object into format to set 'datetime-local' optionally including seconds if 'sec' is **true**.
|
package/package.json
CHANGED
package/router.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//Node Webserver v3.4.
|
|
1
|
+
//Node Webserver v3.4.2, Pecacheu 2025. GNU GPL v3
|
|
2
2
|
|
|
3
3
|
import path from 'path';
|
|
4
4
|
import fs from 'fs/promises';
|
|
@@ -19,17 +19,15 @@ const types = {
|
|
|
19
19
|
'.webm': "video/webm"
|
|
20
20
|
};
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
async function handle(dir, req, res, virtualDirs) {
|
|
22
|
+
//etag: If number, max file size to calc hash, else if true, use fast etag mode (modified date)
|
|
23
|
+
async function handle(dir, req, res, virtualDirs, etag=true) {
|
|
26
24
|
let f;
|
|
27
25
|
try {
|
|
28
26
|
let fn=await resolve(dir, new URL(req.url,'http://a').pathname, virtualDirs),
|
|
29
27
|
hdr={}, stat=200, ext=path.extname(fn), ct=types[ext], rng=req.headers.range, str;
|
|
30
28
|
if(ct) hdr["content-type"] = ct;
|
|
31
29
|
f=await fs.open(fn);
|
|
32
|
-
let
|
|
30
|
+
let st=await f.stat(), dl=st.size;
|
|
33
31
|
if(rng) { //Range
|
|
34
32
|
if(!rng.startsWith('bytes=') || (rng=rng.slice(6).split('-'))
|
|
35
33
|
.length !== 2 || !rng[0]) return await rngErr(f,dl,rng,res);
|
|
@@ -40,12 +38,12 @@ async function handle(dir, req, res, virtualDirs) {
|
|
|
40
38
|
hdr["accept-ranges"] = 'bytes';
|
|
41
39
|
hdr["content-range"] = `bytes ${rs}-${re}/${dl}`;
|
|
42
40
|
stat=206;
|
|
43
|
-
} else if(
|
|
41
|
+
} else if(typeof etag==='number') {if(dl <= MAX_ETAG) {
|
|
44
42
|
str=await f.readFile();
|
|
45
43
|
let h=crypto.createHash('sha1');
|
|
46
44
|
h.update(str);
|
|
47
45
|
hdr.etag=h.digest('base64url');
|
|
48
|
-
} else if(
|
|
46
|
+
}} else if(etag) hdr.etag=st.mtime.toISOString();
|
|
49
47
|
|
|
50
48
|
if(hdr.etag && hdr.etag === req.headers['if-none-match'])
|
|
51
49
|
return res.writeHead(304,''),res.end(),f.close();
|
|
@@ -63,6 +61,11 @@ async function handle(dir, req, res, virtualDirs) {
|
|
|
63
61
|
}
|
|
64
62
|
}
|
|
65
63
|
|
|
64
|
+
async function serve(fn, req, res, etag=true) {
|
|
65
|
+
let u=req.url; req.url='/';
|
|
66
|
+
return handle(fn, req, res, null, etag).finally(() => req.url=u);
|
|
67
|
+
}
|
|
68
|
+
|
|
66
69
|
async function rngErr(f,fl,rng,res) {
|
|
67
70
|
if(debug) err("-- Bad Range",rng);
|
|
68
71
|
let h={"content-range": 'bytes */'+fl};
|
|
@@ -80,6 +83,7 @@ function log(name, ct) {console.log(chalk.dim("-- Served "+name+(ct?" with type
|
|
|
80
83
|
async function resolve(dir, uri, vDir) {
|
|
81
84
|
if(uri.indexOf('..') !== -1) throw "Bad path";
|
|
82
85
|
let fn = parseUri(dir, uri, vDir);
|
|
86
|
+
if(fn.endsWith('/')) fn=fn.slice(0,-1);
|
|
83
87
|
try {
|
|
84
88
|
let stat = await fs.stat(fn);
|
|
85
89
|
if(stat.isDirectory()) return path.join(fn,'/index.html'); //Try index
|
|
@@ -100,6 +104,6 @@ function parseUri(root, uri, vDir) {
|
|
|
100
104
|
return root+uri;
|
|
101
105
|
}
|
|
102
106
|
|
|
103
|
-
const ex={handle, types};
|
|
107
|
+
const ex={handle, serve, types};
|
|
104
108
|
Object.defineProperty(ex, 'debug', {set:d => debug=d});
|
|
105
109
|
export default ex;
|
package/schema.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//ChuSchema v1.1, Pecacheu 2025. GNU GPL v3
|
|
1
|
+
//ChuSchema v1.2.1, Pecacheu 2025. GNU GPL v3
|
|
2
2
|
|
|
3
3
|
function errAt(k,e,l) {
|
|
4
4
|
let es=e.message||e;
|
|
@@ -7,41 +7,57 @@ function errAt(k,e,l) {
|
|
|
7
7
|
return e;
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
-
function isDict(d) {return typeof d==='object' && !Array.isArray(d)}
|
|
11
|
-
function
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
function isDict(d) {return typeof d==='object' && d!==null && !Array.isArray(d)}
|
|
11
|
+
function oobStr(s) {return ` out-of-bounds (${s.min||'*'}-${s.max||'*'})`}
|
|
12
|
+
function checkType(d,sr) {
|
|
13
|
+
if(typeof sr.t!=='string') throw "Missing type";
|
|
14
|
+
let tl=sr.t.split('|'),el=[],s,l,k,n,dt;
|
|
14
15
|
tl.forEach((t,i) => {
|
|
15
|
-
|
|
16
|
+
//Get prop cache
|
|
17
|
+
if(!(s=sr[k='$'+i])) {
|
|
18
|
+
s=sr[k]={};
|
|
19
|
+
for(k in sr) s[k]=Array.isArray(sr[k])?sr[k][i]:sr[k];
|
|
20
|
+
}
|
|
21
|
+
//Check type
|
|
16
22
|
try {switch(t) {
|
|
17
23
|
case 'str':
|
|
18
24
|
if(typeof d!=='string') throw -1;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
-
if(!f.test(d)) throw `Str '${d}' does not match format`;
|
|
25
|
+
l=d.length;
|
|
26
|
+
if(l<s.min || l>s.max) throw "Str len "+l+oobStr(s);
|
|
27
|
+
if(typeof s.f==='string') s.f=new RegExp(`^(?:${s.f})$`);
|
|
28
|
+
if(s.f instanceof RegExp && !s.f.test(d)) throw `Str '${d}' does not match format`;
|
|
25
29
|
break; case 'int': case 'float':
|
|
26
30
|
if(typeof d!=='number' || !(t==='int'?Number.isSafeInteger(d):Number.isFinite(d))) throw -1;
|
|
27
|
-
if(d<s.min || d>s.max) throw
|
|
31
|
+
if(d<s.min || d>s.max) throw "Num "+d+oobStr(s);
|
|
28
32
|
break; case 'bool':
|
|
29
33
|
if(typeof d!=='boolean') throw -1;
|
|
30
34
|
break; case 'list':
|
|
31
35
|
if(!Array.isArray(d)) throw -1;
|
|
32
|
-
|
|
36
|
+
l=d.length; if(!l) throw "Empty list";
|
|
33
37
|
if(s.len && l!==s.len) throw "Array size must be "+s.len;
|
|
34
|
-
|
|
35
|
-
if(
|
|
36
|
-
|
|
38
|
+
if(l<s.min || l>s.max) throw "Array size "+l+oobStr(s);
|
|
39
|
+
if(typeof s.c==='string') s.c={t:s.c};
|
|
40
|
+
n=0, dt=isDict(s.f)?2:isDict(s.c)?1:0;
|
|
41
|
+
if(!dt) throw "List schema lacks format or childType";
|
|
42
|
+
if(dt===2 && s.c) throw "Cannot require both format and childType";
|
|
43
|
+
for(; n<l; ++n) try {dt===2?checkSchema(d[n],s.f):checkType(d[n],s.c)}
|
|
44
|
+
catch(e) {throw errAt(n,e,1)}
|
|
45
|
+
break; case 'dict':
|
|
46
|
+
if(!isDict(d)) throw -1;
|
|
47
|
+
k=Object.keys(d), l=k.length; if(!l) throw "Empty dict";
|
|
48
|
+
if(s.f) throw "Dict schema does not support format (use childType instead)";
|
|
49
|
+
if(typeof s.c==='string') s.c={t:s.c};
|
|
50
|
+
dt=isDict(s.f)?2:isDict(s.c)?1:0;
|
|
51
|
+
if(!dt) throw "Dict schema lacks format or childType";
|
|
52
|
+
if(dt===2 && s.c) throw "Cannot require both format and childType";
|
|
53
|
+
for(n of k) try {dt===2?checkSchema(d[n],s.f):checkType(d[n],s.c)}
|
|
37
54
|
catch(e) {throw errAt(n,e,1)}
|
|
38
|
-
//TODO 'dict' type for unstructured dict
|
|
39
55
|
break; default:
|
|
40
56
|
throw `Unknown type ${s.t} in schema`;
|
|
41
57
|
}} catch(e) {el.push(e)}
|
|
42
58
|
});
|
|
43
59
|
if(el.length >= tl.length) {
|
|
44
|
-
let e,m="Must be of type "+
|
|
60
|
+
let e,m="Must be of type "+sr.t;
|
|
45
61
|
for(e of el) if(e!==-1) m=e;
|
|
46
62
|
throw m;
|
|
47
63
|
}
|
|
@@ -49,7 +65,7 @@ function checkType(d,s) {
|
|
|
49
65
|
|
|
50
66
|
const R_FN=/\W+|(\w+)/g;
|
|
51
67
|
|
|
52
|
-
function checkSchema(data, schema) {
|
|
68
|
+
function checkSchema(data, schema, ignoreReq) {
|
|
53
69
|
if(!isDict(data)) throw "Data must be dict";
|
|
54
70
|
if(!isDict(schema)) throw "Schema must be dict";
|
|
55
71
|
let k,d,s,r,n,m;
|
|
@@ -59,6 +75,7 @@ function checkSchema(data, schema) {
|
|
|
59
75
|
if(k.startsWith('$')) throw "Key cannot start with $";
|
|
60
76
|
checkType(d,s);
|
|
61
77
|
} catch(e) {throw errAt(k,e)}
|
|
78
|
+
if(ignoreReq) return;
|
|
62
79
|
for(k in schema) if(!(k in data)) { //Check missing
|
|
63
80
|
s=schema[k], r=typeof s.req==='string';
|
|
64
81
|
if(r) { //Conditional req
|
package/utils.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
//https://github.com/Pecacheu/Utils.js; GNU GPL v3
|
|
2
2
|
|
|
3
3
|
'use strict';
|
|
4
|
-
const utils = {VER:'v8.7.
|
|
4
|
+
const utils = {VER:'v8.7.4'},
|
|
5
5
|
_uNJS = typeof global!='undefined';
|
|
6
6
|
|
|
7
7
|
//Node.js compat
|
|
@@ -27,27 +27,39 @@ utils.proto = (obj, name, val, st) => {
|
|
|
27
27
|
else Object.defineProperty(obj,name,t);
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
//
|
|
31
|
-
utils.setCookie = (
|
|
32
|
-
let c
|
|
30
|
+
//Cookies! (Yum)
|
|
31
|
+
utils.setCookie = (key,value,exp,secure) => {
|
|
32
|
+
let c=`${encodeURIComponent(key)}=${value==null?'':encodeURIComponent(value)};path=/`;
|
|
33
33
|
if(exp != null) {
|
|
34
|
-
if(
|
|
35
|
-
c+=';expires='+exp.toUTCString();
|
|
34
|
+
if(exp === -1) exp=new Date(Number.MAX_SAFE_INTEGER/10);
|
|
35
|
+
if(exp instanceof Date) c+=';expires='+exp.toUTCString();
|
|
36
|
+
else c+=';max-age='+exp;
|
|
36
37
|
}
|
|
37
38
|
if(secure) c+=';secure';
|
|
38
39
|
if(_uNJS) return c;
|
|
39
40
|
document.cookie=c;
|
|
40
41
|
}
|
|
41
|
-
utils.remCookie =
|
|
42
|
-
|
|
42
|
+
utils.remCookie = key => {
|
|
43
|
+
let c=encodeURIComponent(key)+'=;max-age=0';
|
|
44
|
+
if(_uNJS) return c;
|
|
45
|
+
document.cookie=c;
|
|
43
46
|
}
|
|
44
|
-
utils.
|
|
45
|
-
if(
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
47
|
+
utils.getCookies = ckStr => {
|
|
48
|
+
if(ckStr == null) ckStr=document.cookie;
|
|
49
|
+
if(!ckStr) return {};
|
|
50
|
+
let l=ckStr.split('; '),c,e,d={};
|
|
51
|
+
for(c of l) {
|
|
52
|
+
e=c.indexOf('=');
|
|
53
|
+
d[decodeURIComponent(c.slice(0,e))]=decodeURIComponent(c.slice(e+1));
|
|
50
54
|
}
|
|
55
|
+
return d;
|
|
56
|
+
}
|
|
57
|
+
utils.getCookie = (key, ckStr) => {
|
|
58
|
+
if(ckStr == null) ckStr=document.cookie;
|
|
59
|
+
key=encodeURIComponent(key)+'=';
|
|
60
|
+
let l=ckStr.split('; '),c;
|
|
61
|
+
for(c of l) if(c.startsWith(key))
|
|
62
|
+
return decodeURIComponent(c.slice(key.length));
|
|
51
63
|
}
|
|
52
64
|
|
|
53
65
|
//Wrap a function so that it always has a preset argument list when called
|
|
@@ -71,29 +83,29 @@ utils.copy = (o, sub) => {
|
|
|
71
83
|
utils.deviceInfo = ua => {
|
|
72
84
|
const d={}; if(!ua) ua=navigator.userAgent;
|
|
73
85
|
if(!ua.startsWith("Mozilla/5.0 ")) return d;
|
|
74
|
-
let o=ua.indexOf(')'), os=d.rawOS=ua.
|
|
86
|
+
let o=ua.indexOf(')'), os=d.rawOS=ua.slice(13,o), o2,o3;
|
|
75
87
|
if(os.startsWith("Windows")) {
|
|
76
88
|
o2=os.split('; '), d.os = "Windows";
|
|
77
89
|
d.type = o2.indexOf('WOW64')!=-1?'x64 PC; x86 Browser':o2.indexOf('x64')!=-1?'x64 PC':'x86 PC';
|
|
78
|
-
o2=os.indexOf("Windows NT "), d.version = os.
|
|
90
|
+
o2=os.indexOf("Windows NT "), d.version = os.slice(o2+11,os.indexOf(';',o2+12));
|
|
79
91
|
} else if(os.startsWith("iP")) {
|
|
80
|
-
o2=os.indexOf("OS"), d.os = "iOS", d.type = os.
|
|
81
|
-
d.version = os.
|
|
92
|
+
o2=os.indexOf("OS"), d.os = "iOS", d.type = os.slice(0,os.indexOf(';'));
|
|
93
|
+
d.version = os.slice(o2+3, os.indexOf(' ',o2+4)).replace(/_/g,'.');
|
|
82
94
|
} else if(os.startsWith("Macintosh;")) {
|
|
83
|
-
o2=os.indexOf(" Mac OS X"), d.os = "MacOS", d.type = os.
|
|
84
|
-
d.version = os.
|
|
95
|
+
o2=os.indexOf(" Mac OS X"), d.os = "MacOS", d.type = os.slice(11,o2)+" Mac";
|
|
96
|
+
d.version = os.slice(o2+10).replace(/_/g,'.');
|
|
85
97
|
} else if((o2=os.indexOf("Android"))!=-1) {
|
|
86
|
-
d.os = "Android", d.version = os.
|
|
98
|
+
d.os = "Android", d.version = os.slice(o2+8, os.indexOf(';',o2+9));
|
|
87
99
|
o2=os.lastIndexOf(';'), o3=os.indexOf(" Build",o2+2);
|
|
88
|
-
d.type = os.
|
|
100
|
+
d.type = os.slice(o2+2, o3==-1?undefined:o3);
|
|
89
101
|
} else if(os.startsWith("X11;")) {
|
|
90
|
-
os=os.
|
|
102
|
+
os=os.slice(5).split(/[;\s]+/), o2=os.length;
|
|
91
103
|
d.os = (os[0]=="Linux"?'':"Linux ")+os[0];
|
|
92
104
|
d.type = os[o2-2], d.version = os[o2-1];
|
|
93
105
|
}
|
|
94
106
|
if(o2=Number(d.version)) d.version=o2;
|
|
95
107
|
o2=ua.indexOf(' ',o+2), o3=ua.indexOf(')',o2+1), o3=o3==-1?o2+1:o3+2;
|
|
96
|
-
d.engine = ua.
|
|
108
|
+
d.engine = ua.slice(o+2,o2), d.browser = ua.slice(o3);
|
|
97
109
|
d.mobile = !!ua.match(/Mobi/i); return d;
|
|
98
110
|
}
|
|
99
111
|
|
|
@@ -215,6 +227,32 @@ utils.numField=(f, min, max, decMax, sym) => {
|
|
|
215
227
|
return f;
|
|
216
228
|
}
|
|
217
229
|
|
|
230
|
+
//Auto-resizing textarea, dynamically scales lineHeight based on input
|
|
231
|
+
//Use `el.set(value)` to set value & update size
|
|
232
|
+
//By Rick Kukiela @ StackOverflow
|
|
233
|
+
utils.autosize = (el, maxRows=5, minRows=1) => {
|
|
234
|
+
el.set=v => {el.value=v,cb()};
|
|
235
|
+
let s=el.style;
|
|
236
|
+
s.maxHeight=s.resize='none', s.minHeight=0, s.height='auto';
|
|
237
|
+
el.setAttribute('rows',minRows);
|
|
238
|
+
function cb() {
|
|
239
|
+
if(el.scrollHeight===0) return setTimeout(cb,1); //Still loading
|
|
240
|
+
el.setAttribute('rows',1);
|
|
241
|
+
//Override style
|
|
242
|
+
let cs=getComputedStyle(el);
|
|
243
|
+
s.setProperty('overflow','hidden','important');
|
|
244
|
+
s.width=el.innerRect.w+'px', s.boxSizing='content-box', s.borderWidth=s.paddingInline=0;
|
|
245
|
+
//Calc scroll height
|
|
246
|
+
let pad=parseFloat(cs.paddingTop) + parseFloat(cs.paddingBottom),
|
|
247
|
+
lh=cs.lineHeight==='normal' ? parseFloat(cs.height) : parseFloat(cs.lineHeight),
|
|
248
|
+
rows=Math.round((Math.round(el.scrollHeight) - pad)/lh);
|
|
249
|
+
//Undo overrides & apply
|
|
250
|
+
s.overflow=s.width=s.boxSizing=s.borderWidth=s.paddingInline='';
|
|
251
|
+
el.setAttribute('rows',utils.bounds(rows, minRows, maxRows));
|
|
252
|
+
}
|
|
253
|
+
el.addEventListener('input',cb);
|
|
254
|
+
}
|
|
255
|
+
|
|
218
256
|
//Format Number as currency. Uses '$' by default
|
|
219
257
|
utils.formatCost = (n, sym='$') => {
|
|
220
258
|
if(!n) return sym+'0.00';
|
|
@@ -261,7 +299,7 @@ utils.formatDate = (d,opt={}) => {
|
|
|
261
299
|
if(opt.time==null||opt.time) {
|
|
262
300
|
let h=d.getHours(),pm=''; if(!opt.h24) {pm=' AM'; if(h>=12) pm=' PM',h-=12; if(!h) h=12}
|
|
263
301
|
t=h+':'+fixed2(d.getMinutes())+(opt.sec?':'+fixed2(d.getSeconds())
|
|
264
|
-
+(opt.ms?(d.getMilliseconds()/1000).toFixed(Number.isFinite(opt.ms)?opt.ms:3).
|
|
302
|
+
+(opt.ms?(d.getMilliseconds()/1000).toFixed(Number.isFinite(opt.ms)?opt.ms:3).slice(1):''):'');
|
|
265
303
|
t+=pm; if(opt.time) return t;
|
|
266
304
|
}
|
|
267
305
|
dd=d.getDate();
|
|
@@ -549,15 +587,15 @@ utils.cutStr = (s, rem) => {
|
|
|
549
587
|
//index: Optional object. index.s and index.t will be set to start and end indexes
|
|
550
588
|
utils.dCut = (d, ss, es, sd, st) => {
|
|
551
589
|
let is = d.indexOf(ss,st?st:undefined)+ss.length, it = d.indexOf(es,is);
|
|
552
|
-
if(sd) sd.s=is,sd.t=it; return (is < ss.length || it <= is)?'':d.
|
|
590
|
+
if(sd) sd.s=is,sd.t=it; return (is < ss.length || it <= is)?'':d.slice(is,it);
|
|
553
591
|
}
|
|
554
592
|
utils.dCutToLast = (d, ss, es, sd, st) => {
|
|
555
593
|
let is = d.indexOf(ss,st?st:undefined)+ss.length, it = d.lastIndexOf(es);
|
|
556
|
-
if(sd) sd.s=is,sd.t=it; return (is < ss.length || it <= is)?'':d.
|
|
594
|
+
if(sd) sd.s=is,sd.t=it; return (is < ss.length || it <= is)?'':d.slice(is,it);
|
|
557
595
|
}
|
|
558
596
|
utils.dCutLast = (d, ss, es, sd, st) => {
|
|
559
597
|
let is = d.lastIndexOf(ss,st?st:undefined)+ss.length, it = d.indexOf(es,is);
|
|
560
|
-
if(sd) sd.s=is,sd.t=it; return (is < ss.length || it <= is)?'':d.
|
|
598
|
+
if(sd) sd.s=is,sd.t=it; return (is < ss.length || it <= is)?'':d.slice(is,it);
|
|
561
599
|
}
|
|
562
600
|
|
|
563
601
|
//Given CSS property value 'prop', returns object with
|
|
@@ -574,16 +612,14 @@ utils.parseCSS = prop => {
|
|
|
574
612
|
}
|
|
575
613
|
while(prop.length > 0) {
|
|
576
614
|
if(prop[0] == '(' && prop.indexOf(')') !== -1 && pKey) {
|
|
577
|
-
let end=prop.indexOf(')'), pStr=prop.
|
|
615
|
+
let end=prop.indexOf(')'), pStr=prop.slice(1,end);
|
|
578
616
|
pArr[pKey] = parseInner(pStr);
|
|
579
|
-
pKey = ""; prop = prop.
|
|
617
|
+
pKey = ""; prop = prop.slice(end+1);
|
|
580
618
|
} else if(prop.search(/[#!\w]/) == 0) {
|
|
581
619
|
if(pKey) pArr[keyNum++] = pKey;
|
|
582
620
|
let end=prop.search(/[^#!\w-%]/); if(end==-1) end=prop.length;
|
|
583
|
-
pKey = prop.
|
|
584
|
-
} else
|
|
585
|
-
prop = prop.substring(1);
|
|
586
|
-
}
|
|
621
|
+
pKey = prop.slice(0,end); prop = prop.slice(end);
|
|
622
|
+
} else prop = prop.slice(1);
|
|
587
623
|
}
|
|
588
624
|
if(pKey) pArr[keyNum] = pKey; return pArr;
|
|
589
625
|
}
|
|
@@ -595,7 +631,7 @@ utils.buildCSS = propArr => {
|
|
|
595
631
|
const k=keyArr[i], v=propArr[keyArr[i]]; ++i;
|
|
596
632
|
if(0<=Number(k)) pStr+=v+' '; else pStr+=`${k}(${v}) `;
|
|
597
633
|
}
|
|
598
|
-
return pStr.
|
|
634
|
+
return pStr.slice(0,-1);
|
|
599
635
|
}
|
|
600
636
|
|
|
601
637
|
function defaultStyle() {
|
|
@@ -638,10 +674,28 @@ utils.removeSelector = name => {
|
|
|
638
674
|
|
|
639
675
|
//Converts HEX color to 24-bit RGB
|
|
640
676
|
utils.hexToRgb = hex => {
|
|
641
|
-
const c = parseInt(hex.
|
|
677
|
+
const c = parseInt(hex.slice(1),16);
|
|
642
678
|
return [(c >> 16) & 255, (c >> 8) & 255, c & 255];
|
|
643
679
|
}
|
|
644
680
|
|
|
681
|
+
//By mjackson @ GitHub
|
|
682
|
+
utils.rgbToHsl = (r,g,b) => {
|
|
683
|
+
r /= 255, g /= 255, b /= 255;
|
|
684
|
+
let max=Math.max(r,g,b), min=Math.min(r,g,b), h,s,l=(max+min)/2;
|
|
685
|
+
if(max===min) h=s=0; //Achromatic
|
|
686
|
+
else {
|
|
687
|
+
let d=max-min;
|
|
688
|
+
s=l>.5 ? d/(2-max-min) : d/(max+min);
|
|
689
|
+
switch(max) {
|
|
690
|
+
case r: h=(g-b)/d + (g<b?6:0); break;
|
|
691
|
+
case g: h=(b-r)/d + 2; break;
|
|
692
|
+
case b: h=(r-g)/d + 4;
|
|
693
|
+
}
|
|
694
|
+
h /= 6;
|
|
695
|
+
}
|
|
696
|
+
return [h*360, s*100, l*100];
|
|
697
|
+
}
|
|
698
|
+
|
|
645
699
|
//Generates random integer from min to max
|
|
646
700
|
utils.rand = (min, max, res, ease) => {
|
|
647
701
|
res=res||1; max*=res,min*=res; let r=Math.random();
|
|
@@ -650,26 +704,30 @@ utils.rand = (min, max, res, ease) => {
|
|
|
650
704
|
|
|
651
705
|
//Parses a url query string into an Object
|
|
652
706
|
utils.fromQuery = str => {
|
|
653
|
-
if(str.startsWith('?')) str
|
|
654
|
-
function parse(
|
|
655
|
-
const pair
|
|
656
|
-
key
|
|
657
|
-
|
|
658
|
-
//Handle multiple
|
|
659
|
-
if(
|
|
660
|
-
else if(
|
|
661
|
-
else
|
|
662
|
-
return pairs.length
|
|
663
|
-
}
|
|
707
|
+
if(str.startsWith('?')) str=str.slice(1);
|
|
708
|
+
function parse(pl, pairs) {
|
|
709
|
+
const pair=pairs[0], spl=pair.indexOf('='),
|
|
710
|
+
key=decodeURIComponent(pair.slice(0,spl)),
|
|
711
|
+
val=decodeURIComponent(pair.slice(spl+1));
|
|
712
|
+
//Handle multiple params of the same name
|
|
713
|
+
if(pl[key] == null) pl[key] = val;
|
|
714
|
+
else if(Array.isArray(pl[key])) pl[key].push(val);
|
|
715
|
+
else pl[key] = [pl[key],val];
|
|
716
|
+
return pairs.length===1 ? pl : parse(pl, pairs.slice(1));
|
|
717
|
+
}
|
|
718
|
+
return str ? parse({}, str.split('&')) : {};
|
|
664
719
|
}
|
|
665
720
|
|
|
666
721
|
//Converts an object into a url query string
|
|
667
722
|
utils.toQuery = obj => {
|
|
668
|
-
let str
|
|
669
|
-
|
|
670
|
-
|
|
723
|
+
let str='',key,val;
|
|
724
|
+
if(typeof obj !== 'object') return encodeURIComponent(obj);
|
|
725
|
+
for(key in obj) {
|
|
726
|
+
val = obj[key];
|
|
727
|
+
if(typeof val === 'object' && val != null) val = JSON.stringify(val);
|
|
671
728
|
str += '&'+key+'='+encodeURIComponent(val);
|
|
672
|
-
}
|
|
729
|
+
}
|
|
730
|
+
return str.slice(1);
|
|
673
731
|
}
|
|
674
732
|
|
|
675
733
|
//Various methods of centering objects using JavaScript
|
package/utils.min.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
//https://github.com/Pecacheu/Utils.js GNU GPL v3
|
|
2
|
-
"use strict";const utils={VER:"v8.7.2"},_uNJS="undefined"!=typeof global;let UtilRect,P="undefined"==typeof window?[{},{back(){},forward(){}},class{},class{},class{},class{},()=>{}]:[window,history,DOMRect,HTMLCollection,Element,NodeList,addEventListener];(()=>{let[t,e,i,l,n,s,r]=P;function o(){switch(this.type){case"datetime-local":this.siT.textContent=utils.formatDate(utils.fromDateTimeBox(this));break;case"select-one":this.siT.textContent=u(this);break;case"select-multiple":this.siT.textContent=a(this)}}function u(t){let e=t.options;return -1!=e.selectedIndex?e[e.selectedIndex].label:"No Options Selected"}function a(t){let e=t.options,i="";for(let l=0,n=e.length;l<n;++l)e[l].selected&&(i+=(i?", ":"")+e[l].label);return i||"No Options Selected"}function d(t){return t<=9?"0"+t:t}utils.define=(t,e,i,l)=>{let n={};if(i&&(n.get=i),l&&(n.set=l),Array.isArray(e))for(let s of e)Object.defineProperty(t,s,n);else Object.defineProperty(t,e,n)},utils.proto=(t,e,i,l)=>{let n={value:i};if(l||(t=t.prototype),Array.isArray(e))for(let s of e)Object.defineProperty(t,s,n);else Object.defineProperty(t,e,n)},utils.setCookie=(t,e,i,l)=>{let n=encodeURIComponent(t)+"="+(null==e?"":encodeURIComponent(e))+";path=/";if(null!=i&&(i instanceof Date||(i=new Date(i)),n+=";expires="+i.toUTCString()),l&&(n+=";secure"),_uNJS)return n;document.cookie=n},utils.remCookie=t=>{document.cookie=encodeURIComponent(t)+"=;expires="+new Date(0).toUTCString()},utils.getCookie=(t,e)=>{null==e&&(e=document.cookie);let i=encodeURIComponent(t),l=" "+i,n=e.split(";");for(let s=0,r=n.length,o,u,a;s<r;++s)if(u=(o=n[s]).indexOf("="),(a=o.substr(0,u))==i||a==l)return decodeURIComponent(o.substr(u+1))},utils.proto(Function,"wrap",function(){let t=this,e=arguments;return function(){t.apply(arguments,e)}}),utils.copy=(t,e)=>{if(0===e||"object"!=typeof t)return t;e=e>0?e-1:null;let i;if(Array.isArray(t))i=Array(t.length),t.forEach((t,l)=>{i[l]=utils.copy(t,e)});else for(let l in i={},t)i[l]=utils.copy(t[l],e);return i},utils.deviceInfo=t=>{let e={};if(t||(t=navigator.userAgent),!t.startsWith("Mozilla/5.0 "))return e;let i=t.indexOf(")"),l=e.rawOS=t.substring(13,i),n,s;return l.startsWith("Windows")?(n=l.split("; "),e.os="Windows",e.type=-1!=n.indexOf("WOW64")?"x64 PC; x86 Browser":-1!=n.indexOf("x64")?"x64 PC":"x86 PC",n=l.indexOf("Windows NT "),e.version=l.substring(n+11,l.indexOf(";",n+12))):l.startsWith("iP")?(n=l.indexOf("OS"),e.os="iOS",e.type=l.substr(0,l.indexOf(";")),e.version=l.substring(n+3,l.indexOf(" ",n+4)).replace(/_/g,".")):l.startsWith("Macintosh;")?(n=l.indexOf(" Mac OS X"),e.os="MacOS",e.type=l.substring(11,n)+" Mac",e.version=l.substr(n+10).replace(/_/g,".")):-1!=(n=l.indexOf("Android"))?(e.os="Android",e.version=l.substring(n+8,l.indexOf(";",n+9)),n=l.lastIndexOf(";"),s=l.indexOf(" Build",n+2),e.type=l.substring(n+2,-1==s?void 0:s)):l.startsWith("X11;")&&(n=(l=l.substr(5).split(/[;\s]+/)).length,e.os=("Linux"==l[0]?"":"Linux ")+l[0],e.type=l[n-2],e.version=l[n-1]),(n=Number(e.version))&&(e.version=n),n=t.indexOf(" ",i+2),s=-1==(s=t.indexOf(")",n+1))?n+1:s+2,e.engine=t.substring(i+2,n),e.browser=t.substring(s),e.mobile=!!t.match(/Mobi/i),e},_uNJS||(utils.device=utils.deviceInfo(),utils.mobile=utils.device.mobile),t.TouchList&&utils.proto(TouchList,"get",function(t){for(let e in this)if(this[e].identifier==t)return this[e];return 0}),utils.skinnedInput=t=>{let e=utils.mkDiv(null,t.className),i=t.style,l=t.type;if(t.className+=" isSub","datetime-local"==l||"select-one"==l||"select-multiple"==l){i.opacity=0,i.top="-100%",t.siT=utils.mkEl("span",e,"isText"),utils.mkEl("span",e,"isArrow",{borderTopColor:getComputedStyle(t).color});let n=o.bind(t);t.addEventListener("change",n),t.forceUpdate=n,n()}t.replaceWith(e),e.appendChild(t),document.isStyles||(document.isStyles=!0,utils.mkEl("style",document.body,null,null,".isSub {width:100% !important; height:100% !important; border:none !important; display:inline-block !important;position:relative !important; box-shadow:none !important; margin:0 !important; padding:initial !important;} .isText {display:inline-block; height:100%; max-width:95%;overflow:hidden; text-overflow:ellipsis; white-space:nowrap;} .isArrow {width:0; height:0; display:inline-block; float:right; top:38%; position:relative;border-left:3px solid transparent; border-right:3px solid transparent;border-top:6px solid #000; vertical-align:middle;}"))},utils.numField=(t,e,i,l,n)=>{let s=RegExp(`[,${n?RegExp.escape(n):""}]`,"g");return t.type=utils.mobile||l||n?"tel":"number",t.setAttribute("pattern","\\d*"),null==e&&(e=Number.MIN_SAFE_INTEGER),null==i&&(i=Number.MAX_SAFE_INTEGER),null==l&&(l=n?2:0),t.step||(t.step=1),t.num=Math.max(0,e),t.ns="",t.value=n?utils.formatCost(t.num,n):t.num.toString(),t.addEventListener("keydown",s=>{if(s.ctrlKey)return;let r=s.key,o=1==r.length&&Number.isFinite(Number(r)),u=t.ns,a=u.length,d=u.indexOf(".");if("Tab"!=r&&"Enter"!=r){if(o?(-1==d||a-d<l+1)&&(u+=r):"."==r||"*"==r?l&&-1==d&&t.num!=i&&(e>=0||t.num!=e)&&(!a&&e>0?u=Math.floor(e)+".":u+="."):"Backspace"==r||"Delete"==r?u=e>0&&t.num==e&&u.endsWith(".")?"":u.slice(0,-1):"-"==r||"#"==r?e<0&&!a&&(u="-"):"ArrowUp"==r?(u=null,t.set(t.num+Number(t.step))):"ArrowDown"==r&&(u=null,t.set(t.num-Number(t.step))),null!==u&&u!==t.ns){let f="-"==u||"-."==u,c=Number(f?"0":u+(u.endsWith(".")?"0":"")),h=Math.min(i,Math.max(e,c));(!o||t.num!==h||c===e)&&(t.ns=u,t.num=h,t.value=n?f?n+"-0.00":utils.formatCost(h,n):(f?"-":"")+h+(u.endsWith(".")&&(e<=0||h!=e)?".0":""),t.onnuminput&&t.onnuminput.call(t))}s.preventDefault()}}),t.set=r=>{"string"==typeof r&&(r=r.replace(s,"")),r=Math.min(i,Math.max(e,Number(r)||0)),t.num=l?Number(r.toFixed(l)):Math.round(r),t.ns=t.num.toString(),t.value=n?utils.formatCost(t.num,n):t.ns,t.ns=t.ns.replace(/^(-?)0+/,"$1"),t.onnuminput&&t.onnuminput.call(t)},t.setRange=(t,n,s)=>{e=t,i=n,l=s},t.addEventListener("input",()=>t.set(t.value)),t.addEventListener("paste",e=>{t.set(e.clipboardData.getData("text")),e.preventDefault()}),t},utils.formatCost=(t,e="$")=>{if(!t)return e+"0.00";let i=t.toFixed(2).split(".");return e+i[0].split("").reverse().reduce((t,e,i)=>"-"==e?e+t:e+(i&&!(i%3)?",":"")+t,"")+"."+i[1]},utils.fromDateTimeBox=t=>{let e=t.value;return e?new Date(e.replace(/-/g,"/").replace(/T/g," ")):new Date},utils.fixedNum=function(t,e,i=10){let l=Math.abs(t).toString(i).toUpperCase();return(t<0?"-":"")+(16==i?"0x":2==i?"0b":"")+"0".repeat(Math.max(e-l.length,0))+l},utils.months=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],utils.toDateTimeBox=(t,e)=>t.getFullYear()+"-"+d(t.getMonth()+1)+"-"+d(t.getDate())+"T"+d(t.getHours())+":"+d(t.getMinutes())+(e?":"+d(t.getSeconds()):""),utils.formatDate=(t,e={})=>{let i="",l,n;if(null==t||!t.getDate||!((l=t.getFullYear())>1969))return"[Invalid Date]";if(null==e.time||e.time){let s=t.getHours(),r="";if(e.h24||(r=" AM",s>=12&&(r=" PM",s-=12),s||(s=12)),i=s+":"+d(t.getMinutes())+(e.sec?":"+d(t.getSeconds())+(e.ms?(t.getMilliseconds()/1e3).toFixed(Number.isFinite(e.ms)?e.ms:3).substr(1):""):""),i+=r,e.time)return i}return n=t.getDate(),n=utils.months[t.getMonth()]+" "+(null==e.suf||e.suf?utils.suffix(n):n),(null==e.year||e.year)&&e.year!==l&&(n=n+", "+l),e.df?n+(i&&" "+i):(i&&i+" ")+n},utils.suffix=t=>{let e=t%10,i=t%100;return 1==e&&11!=i?t+"st":2==e&&12!=i?t+"nd":3==e&&13!=i?t+"rd":t+"th"};let f=e;function c(t){utils.onNav&&utils.onNav.call(null,t)}function h(t,e,i){let n=this.length,s=Math.max(e<0?n+e:e||0,0),r;for(null!=i&&(n=Math.min(i<0?n+i:i,n));s<n;++s)if("!"===(r=t(this[s],s,n)))this instanceof l?this[s].remove():this.splice(s,1),--s,--n;else if(null!=r)return r}async function p(t,e,i,n=!0){let s=this.length,r=e=Math.max(e<0?s+e:e||0,0),o,u=[];for(null!=i&&(s=Math.min(i<0?s+i:i,s));r<s;++r){if(o=t(this[r],r,s),!n&&"!"!==(o=await o)&&null!=o)return o;u.push(o)}for(n&&(u=await Promise.all(u)),r=e,o=0;r<s;++r,++o)if("!"===u[o])this instanceof l?this[r].remove():this.splice(r,1),--r,--s;else if(null!=u[o])return u[o]}utils.goBack=f.back.bind(f),utils.goForward=f.forward.bind(f),utils.go=(t,e)=>{f.pushState(e,"",t||location.pathname),c(e)},r("popstate",t=>c(t.state)),r("load",()=>setTimeout(c.wrap(f.state),1)),utils.mkEl=(t,e,i,l,n)=>{let s=document.createElement(t);if(null!=i&&(s.className=i),null!=n&&(s.innerHTML=n),l&&"object"==typeof l)for(let r in l)r in s.style?s.style[r]=l[r]:s.style.setProperty(r,l[r]);return null!=e&&e.appendChild(s),s},utils.mkDiv=(t,e,i,l)=>utils.mkEl("div",t,e,i,l),utils.addText=(t,e)=>t.appendChild(document.createTextNode(e)),utils.textWidth=(e,i)=>{let l=t.TWCanvas||(t.TWCanvas=utils.mkEl("canvas")),n=l.getContext("2d");return n.font=i,n.measureText(e).width},utils.define(utils,"w",()=>innerWidth),utils.define(utils,"h",()=>innerHeight),utils.setPropSafe=(t,e,i,l=!1)=>{"string"==typeof e&&(e=e.split("."));let n=e.length-1;return(e.each(e=>{t="object"==typeof t[e]?t[e]:t[e]={}},0,n),n=e[n],l&&null!=t[n])?t[n]:t[n]=i},utils.getPropSafe=(t,e)=>{"string"==typeof e&&(e=e.split("."));try{for(let i of e)t=t[i];return t}catch(l){}},utils.proto(Array,"clean",function(t){for(let e=0,i,l=this.length;e<l;++e)i=this[e],(utils.isBlank(i)||!1===i||!t&&0===i)&&(this.splice(e--,1),l--);return this}),utils.proto(Array,"remove",function(t){let e=this.indexOf(t);return -1!=e&&(this.splice(e,1),!0)}),[Array,l,s].forEach(t=>{utils.proto(t,"each",h),utils.proto(t,"eachAsync",p)});let $="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",_=$.replace("+/","-_"),g={43:62,47:63,48:52,49:53,50:54,51:55,52:56,53:57,54:58,55:59,56:60,57:61,65:0,66:1,67:2,68:3,69:4,70:5,71:6,72:7,73:8,74:9,75:10,76:11,77:12,78:13,79:14,80:15,81:16,82:17,83:18,84:19,85:20,86:21,87:22,88:23,89:24,90:25,97:26,98:27,99:28,100:29,101:30,102:31,103:32,104:33,105:34,106:35,107:36,108:37,109:38,110:39,111:40,112:41,113:42,114:43,115:44,116:45,117:46,118:47,119:48,120:49,121:50,122:51,45:62,95:63};function m(t,e){if(null==(t=g[t.charCodeAt(e)]))throw"Bad char at "+e;return t}"toBase64"in Uint8Array.prototype||utils.proto(Uint8Array,"toBase64",function(t){let e=this.byteLength,i=e%3,l=t&&"base64url"===t.alphabet?_:$,n=0,s="",r;for(e-=i;n<e;n+=3)s+=l[(16515072&(r=this[n]<<16|this[n+1]<<8|this[n+2]))>>18]+l[(258048&r)>>12]+l[(4032&r)>>6]+l[63&r];return 1==i?(s+=l[(252&(r=this[e]))>>2]+l[(3&r)<<4],t&&t.omitPadding||(s+="=")):2!=i||(s+=l[(64512&(r=this[e]<<8|this[e+1]))>>10]+l[(1008&r)>>4]+l[(15&r)<<2],t&&t.omitPadding||(s+="==")),s}),"fromBase64"in Uint8Array||utils.proto(Uint8Array,"fromBase64",t=>{let e=t.length,i=e-1;for(;i>=0&&61===t.charCodeAt(i);--i);e=i+1,i=0;let l=e%4;if(e-=l,1==l)throw"Bad b64 len";let n=new Uint8Array(3*e/4+(l?l-1:0)),s=-1,r;for(;i<e;i+=4)r=m(t,i)<<18|m(t,i+1)<<12|m(t,i+2)<<6|m(t,i+3),n[++s]=r>>16,n[++s]=r>>8,n[++s]=r;return 2==l?n[++s]=m(t,i)<<2|m(t,i+1)>>4:3==l&&(r=m(t,i)<<10|m(t,i+1)<<4|m(t,i+2)>>2,n[++s]=r>>8,n[++s]=r),n},1);let y=/[|\\{}()[\]^$+*?.]/g,x=/-/g;function b(t,e){for(;t>=e;)t-=e;return t}function v(){let t=document.styleSheets;for(let e=0,i=t.length;e<i;++e)try{return t[e].cssRules,t[e]}catch(l){}let n=utils.mkEl("style",document.head);return utils.addText(n,""),n.sheet}function O(t){return t.replace(/[A-Z]/g,t=>"-"+t.toLowerCase())}"escape"in RegExp||utils.proto(RegExp,"escape",t=>t.replace(y,"\\$&").replace(x,"\\x2d"),1),utils.define(n.prototype,"index",function(){let t=this.parentElement;return t?Array.prototype.indexOf.call(t.children,this):-1}),utils.proto(n,"insertChildAt",function(t,e){e<0&&(e=0),e>=this.children.length?this.appendChild(t):this.insertBefore(t,this.children[e])}),utils.boundingRect=t=>new UtilRect(t.getBoundingClientRect()),utils.innerRect=t=>{let e=t.getBoundingClientRect(),i=getComputedStyle(t);return new UtilRect(e.top+parseFloat(i.paddingTop)+parseFloat(i.borderTopWidth),e.bottom-parseFloat(i.paddingBottom)-parseFloat(i.borderBottomWidth),e.left+parseFloat(i.paddingLeft)+parseFloat(i.borderLeftWidth),e.right-parseFloat(i.paddingRight)-parseFloat(i.borderRightWidth))},utils.define(n.prototype,"boundingRect",function(){return utils.boundingRect(this)}),utils.define(n.prototype,"innerRect",function(){return utils.innerRect(this)}),Math.cot=t=>1/Math.tan(t),utils.isBlank=t=>null==t||("string"==typeof t?!/\S/.test(t):"object"==typeof t&&("number"==typeof t.length?0===t.length:0===Object.keys(t).length)),utils.firstEmpty=t=>{let e=t.length;for(let i=0;i<e;++i)if(null==t[i])return i;return e},utils.firstEmptyChar=t=>{let e=Object.keys(t),i=e.length;for(let l=0;l<i;++l)if(null==t[e[l]])return e[l];return utils.numToChar(i)},utils.numToChar=t=>{if(t<=25)return String.fromCharCode(t+97);if(t>=26&&t<=51)return String.fromCharCode(t+39);let e,i;if(t<2756)e=b(Math.floor(t/52)-1,52),i=b(t,52);else if(t<143364)e=b(Math.floor((t-52)/2704)-1,52),i=b(t-52,2704)+52;else{if(!(t<7454980))return!1;e=b(Math.floor((t-2756)/140608)-1,52),i=b(t-2756,140608)+2756}return utils.numToChar(e)+utils.numToChar(i)},utils.merge=function(t){for(let e=1,i=arguments.length,l,n,s;e<i;++e)for(let r in l=arguments[e]){if(n=t[r],s=l[r],n&&s){if(n.length>=0&&s.length>=0){for(let o=0,u=s.length,a=n.length;o<u;++o)n[o+a]=s[o];continue}if("object"==typeof n&&"object"==typeof s){for(let d in s)n[d]=s[d];continue}}t[r]=s}return t},utils.bounds=(t,e=0,i=1)=>t>=e?t<=i?t:i:e,utils.norm=utils.normalize=(t,e=0,i=1)=>{let l=Math.abs(i-e);if(t<e)for(;t<e;)t+=l;else for(;t>=i;)t-=l;return t},utils.cutStr=(t,e)=>{let i;for(;-1!=(i=t.indexOf(e));)t=t.slice(0,i)+t.slice(i+e.length);return t},utils.dCut=(t,e,i,l,n)=>{let s=t.indexOf(e,n||void 0)+e.length,r=t.indexOf(i,s);return l&&(l.s=s,l.t=r),s<e.length||r<=s?"":t.substring(s,r)},utils.dCutToLast=(t,e,i,l,n)=>{let s=t.indexOf(e,n||void 0)+e.length,r=t.lastIndexOf(i);return l&&(l.s=s,l.t=r),s<e.length||r<=s?"":t.substring(s,r)},utils.dCutLast=(t,e,i,l,n)=>{let s=t.lastIndexOf(e,n||void 0)+e.length,r=t.indexOf(i,s);return l&&(l.s=s,l.t=r),s<e.length||r<=s?"":t.substring(s,r)},utils.parseCSS=t=>{let e={},i="",l=0;function n(t){if(-1!==t.indexOf(",")){let e=utils.clean(t.split(","));for(let i=0,l=e.length;i<l;++i)e[i]=e[i].trim();return e}return t.trim()}for(t=t.trim();t.length>0;)if("("==t[0]&&-1!==t.indexOf(")")&&i){let s=t.indexOf(")"),r=t.substring(1,s);e[i]=n(r),i="",t=t.substring(s+1)}else if(0==t.search(/[#!\w]/)){i&&(e[l++]=i);let o=t.search(/[^#!\w-%]/);-1==o&&(o=t.length),i=t.substring(0,o),t=t.substring(o)}else t=t.substring(1);return i&&(e[l]=i),e},utils.buildCSS=t=>{let e=Object.keys(t),i=e.length,l="",n=0;for(;n<i;){let s=e[n],r=t[e[n]];++n,0<=Number(s)?l+=r+" ":l+=`${s}(${r}) `}return l.substring(0,l.length-1)},utils.addClass=(t,e)=>{let i=v(),l=Object.keys(e),n="";for(let s=0,r=l.length;s<r;++s)n+=O(l[s])+":"+e[l[s]]+";";i.addRule("."+t,n)},utils.addId=(t,e)=>{let i=v(),l=Object.keys(e),n="";for(let s=0,r=l.length;s<r;++s)n+=O(l[s])+":"+e[l[s]]+";";i.addRule("#"+t,n)},utils.addKeyframe=(t,e)=>{v().addRule("@keyframes "+t,e)},utils.removeSelector=t=>{for(let e=0,i,l,n=document.styleSheets.length;e<n;++e){i=document.styleSheets[e];try{l=i.cssRules}catch(s){continue}for(let r in l)"CSSStyleRule"==l[r].constructor.name&&l[r].selectorText==t&&i.deleteRule(r)}},utils.hexToRgb=t=>{let e=parseInt(t.substr(1),16);return[e>>16&255,e>>8&255,255&e]},utils.rand=(t,e,i,l)=>{e*=i=i||1,t*=i;let n=Math.random();return Math.round((l?l(n):n)*(e-t)+t)/i},utils.fromQuery=t=>{function e(t,i){let l=i[0],n=l.indexOf("="),s=decodeURIComponent(l.substr(0,n)),r=decodeURIComponent(l.substr(n+1));return null==t[s]?t[s]=r:"array"==typeof t[s]?t[s].push(r):t[s]=[t[s],r],1==i.length?t:e(t,i.slice(1))}return t.startsWith("?")&&(t=t.substr(1)),0==t.length?{}:e({},t.split("&"))},utils.toQuery=t=>{let e="";if("object"!=typeof t)return encodeURIComponent(t);for(let i in t){let l=t[i];"object"==typeof l&&(l=JSON.stringify(l)),e+="&"+i+"="+encodeURIComponent(l)}return e.slice(1)},utils.center=(t,e,i)=>{let l=t.style;if(l.position||(l.position="absolute"),"calc"==i)e&&"x"!=e||(l.left=`calc(50% - ${t.clientWidth/2}px)`),e&&"y"!=e||(l.top=`calc(50% - ${t.clientHeight/2}px)`);else if("move"==i)e&&"x"!=e||(l.left=`${utils.w/2-t.clientWidth/2}px`),e&&"y"!=e||(l.top=`${utils.h/2-t.clientHeight/2}px`);else if("trans"==i){let n=utils.cutStr(l.transform,"translateX(-50%)");n=utils.cutStr(n,"translateY(-50%)"),e&&"x"!=e||(l.left="50%",n+="translateX(-50%)"),e&&"y"!=e||(l.top="50%",n+="translateY(-50%)"),n&&(l.transform=n)}else utils.mkEl("div",t.parentNode,null,{display:"table",position:"absolute",top:0,left:0,width:"100%",height:"100%"}).appendChild(t),l.display="table-cell",e&&"x"!=e||(l.textAlign="center"),e&&"y"!=e||(l.verticalAlign="middle"),l.position="relative"},utils.loadAjax=(t,e,i,l,n)=>{let s;try{s=new XMLHttpRequest}catch(r){return e(r)}if(n)for(let o in n)s.setRequestHeader(o,n[o]);s.open(i||"GET",t),s.onreadystatechange=()=>{let t=s.status||-1;s.readyState==s.DONE&&e(200==t?0:t,s.response,s)},s.send(l||void 0)},utils.loadFile=(t,e,i)=>{let l=utils.mkEl("object",document.body,null,{position:"fixed",opacity:0});l.data=t;let n=setTimeout(()=>{l.remove(),n=null,e(!1)},i||4e3);l.onload=()=>{n&&(clearTimeout(n),e(l.contentDocument.documentElement.outerHTML),l.remove())}},utils.loadJSONP=(t,e,i)=>{let l=utils.mkEl("script",document.head),n=utils.firstEmptyChar(utils.lJSONCall);l.type="application/javascript",l.src=t+(-1==t.indexOf("?")?"?":"&")+"callback=utils.lJSONCall."+n;let s=setTimeout(()=>{delete utils.lJSONCall[n],e(!1)},i||4e3);utils.lJSONCall[n]=t=>{s&&clearTimeout(s),delete utils.lJSONCall[n],e(t)},document.head.removeChild(l)},utils.lJSONCall=[],utils.dlFile=(t,e)=>fetch(e).then(t=>{if(200!=t.status)throw"Code "+t.status;return t.blob()}).then(e=>{utils.dlData(t,e)}),utils.dlData=(t,e)=>{let i,l=utils.mkEl("a",document.body,null,{display:"none"});"string"==typeof e?i=e:(e instanceof Blob||(e=Blob(e)),i=URL.createObjectURL(e)),l.href=i,l.download=t,l.click(),l.remove(),URL.revokeObjectURL(i)},utils.deg=t=>180*t/Math.PI,utils.rad=t=>t*Math.PI/180,utils.map=(t,e,i,l,n,s)=>{let r=(t-e)/(i-e);return(s?s(r):r)*(n-l)+l},utils.delay=t=>new Promise(e=>setTimeout(e,t)),UtilRect=function(t,e,l,n){if(!(this instanceof UtilRect))return new UtilRect(t,e,l,n);let s=Number.isFinite,r=0,o=0,u=0,a=0;utils.define(this,"x",()=>u,t=>{s(t)&&(a+=t-u,u=t)}),utils.define(this,"y",()=>r,t=>{s(t)&&(o+=t-r,r=t)}),utils.define(this,"top",()=>r,t=>{r=s(t)?t:0}),utils.define(this,["bottom","y2"],()=>o,t=>{o=s(t)?t:0}),utils.define(this,"left",()=>u,t=>{u=s(t)?t:0}),utils.define(this,["right","x2"],()=>a,t=>{a=s(t)?t:0}),utils.define(this,["width","w"],()=>a-u,t=>{a=t>=0?u+t:0}),utils.define(this,["height","h"],()=>o-r,t=>{o=t>=0?r+t:0}),utils.define(this,"centerX",()=>u/2+a/2),utils.define(this,"centerY",()=>r/2+o/2),t instanceof i||t instanceof UtilRect?(r=t.top,o=t.bottom,u=t.left,a=t.right):(r=t,o=e,u=l,a=n)},utils.proto(UtilRect,"contains",function(t,e){return t instanceof n?this.contains(t.boundingRect):t instanceof UtilRect?t.x>=this.x&&t.x2<=this.x2&&t.y>=this.y&&t.y2<=this.y2:t>=this.x&&t<=this.x2&&e>=this.y&&e<=this.y2}),utils.proto(UtilRect,"overlaps",function(t){if(t instanceof n)return this.overlaps(t.boundingRect);if(!(t instanceof UtilRect))return 0;let e,i;return e=t.x2-t.x>=this.x2-this.x?this.x>=t.x&&this.x<=t.x2||this.x2>=t.x&&this.x2<=t.x2:t.x>=this.x&&t.x<=this.x2||t.x2>=this.x&&t.x2<=this.x2,i=t.y2-t.y>=this.y2-this.y?this.y>=t.y&&this.y<=t.y2||this.y2>=t.y&&this.y2<=t.y2:t.y>=this.y&&t.y<=this.y2||t.y2>=this.y&&t.y2<=this.y2,e&&i}),utils.proto(UtilRect,"dist",function(t,e){if(t instanceof n)return this.dist(t.boundingRect);let i=t instanceof UtilRect;return e=Math.abs((i?t.centerY:e)-this.centerY),Math.sqrt((t=Math.abs((i?t.centerX:t)-this.centerX))*t+e*e)}),utils.proto(UtilRect,"expand",function(t){return this.top-=t,this.left-=t,this.bottom+=t,this.right+=t,this})})();const Easing={linear:t=>t,easeInQuad:t=>t*t,easeOutQuad:t=>t*(2-t),easeInOutQuad:t=>t<.5?2*t*t:-1+(4-2*t)*t,easeInCubic:t=>t*t*t,easeOutCubic:t=>--t*t*t+1,easeInOutCubic:t=>t<.5?4*t*t*t:(t-1)*(2*t-2)*(2*t-2)+1,easeInQuart:t=>t*t*t*t,easeOutQuart:t=>1- --t*t*t*t,easeInOutQuart:t=>t<.5?8*t*t*t*t:1-8*--t*t*t*t,easeInQuint:t=>t*t*t*t*t,easeOutQuint:t=>1+--t*t*t*t*t,easeInOutQuint:t=>t<.5?16*t*t*t*t*t:1+16*--t*t*t*t*t};if(_uNJS&&!global.utils){let t=import("os").then(e=>t=e);utils.getIPs=()=>{let e=[],i=t.networkInterfaces();for(let l in i)i[l].forEach(t=>{!t.internal&&"IPv4"==t.family&&"00:00:00:00:00:00"!=t.mac&&t.address&&e.push(t.address)});return e.length?e:0},utils.getOS=()=>{let e,i,l;switch(t.platform()){case"win32":e="Windows";break;case"darwin":e="MacOS";break;case"linux":e="Linux";break;default:e=t.platform()}switch(t.arch()){case"ia32":i="32-bit";break;case"x64":i="64-bit";break;case"arm":i="ARM";break;default:i=t.arch()}return[e,i,l=t.cpus()[0].model]},global.utils=utils,global.UtilRect=UtilRect,global.Easing=Easing}
|
|
2
|
+
"use strict";const utils={VER:"v8.7.4"},_uNJS="undefined"!=typeof global;let UtilRect,P="undefined"==typeof window?[{},{back(){},forward(){}},class{},class{},class{},class{},()=>{}]:[window,history,DOMRect,HTMLCollection,Element,NodeList,addEventListener];(()=>{let[t,e,i,l,n,s,r]=P;function o(){switch(this.type){case"datetime-local":this.siT.textContent=utils.formatDate(utils.fromDateTimeBox(this));break;case"select-one":this.siT.textContent=u(this);break;case"select-multiple":this.siT.textContent=a(this)}}function u(t){let e=t.options;return -1!=e.selectedIndex?e[e.selectedIndex].label:"No Options Selected"}function a(t){let e=t.options,i="";for(let l=0,n=e.length;l<n;++l)e[l].selected&&(i+=(i?", ":"")+e[l].label);return i||"No Options Selected"}function c(t){return t<=9?"0"+t:t}utils.define=(t,e,i,l)=>{let n={};if(i&&(n.get=i),l&&(n.set=l),Array.isArray(e))for(let s of e)Object.defineProperty(t,s,n);else Object.defineProperty(t,e,n)},utils.proto=(t,e,i,l)=>{let n={value:i};if(l||(t=t.prototype),Array.isArray(e))for(let s of e)Object.defineProperty(t,s,n);else Object.defineProperty(t,e,n)},utils.setCookie=(t,e,i,l)=>{let n=`${encodeURIComponent(t)}=${null==e?"":encodeURIComponent(e)};path=/`;if(null!=i&&(-1===i&&(i=new Date(Number.MAX_SAFE_INTEGER/10)),i instanceof Date?n+=";expires="+i.toUTCString():n+=";max-age="+i),l&&(n+=";secure"),_uNJS)return n;document.cookie=n},utils.remCookie=t=>{let e=encodeURIComponent(t)+"=;max-age=0";if(_uNJS)return e;document.cookie=e},utils.getCookies=t=>{if(null==t&&(t=document.cookie),!t)return{};let e=t.split("; "),i,l,n={};for(i of e)l=i.indexOf("="),n[decodeURIComponent(i.slice(0,l))]=decodeURIComponent(i.slice(l+1));return n},utils.getCookie=(t,e)=>{null==e&&(e=document.cookie),t=encodeURIComponent(t)+"=";let i=e.split("; "),l;for(l of i)if(l.startsWith(t))return decodeURIComponent(l.slice(t.length))},utils.proto(Function,"wrap",function(){let t=this,e=arguments;return function(){t.apply(arguments,e)}}),utils.copy=(t,e)=>{if(0===e||"object"!=typeof t)return t;e=e>0?e-1:null;let i;if(Array.isArray(t))i=Array(t.length),t.forEach((t,l)=>{i[l]=utils.copy(t,e)});else for(let l in i={},t)i[l]=utils.copy(t[l],e);return i},utils.deviceInfo=t=>{let e={};if(t||(t=navigator.userAgent),!t.startsWith("Mozilla/5.0 "))return e;let i=t.indexOf(")"),l=e.rawOS=t.slice(13,i),n,s;return l.startsWith("Windows")?(n=l.split("; "),e.os="Windows",e.type=-1!=n.indexOf("WOW64")?"x64 PC; x86 Browser":-1!=n.indexOf("x64")?"x64 PC":"x86 PC",n=l.indexOf("Windows NT "),e.version=l.slice(n+11,l.indexOf(";",n+12))):l.startsWith("iP")?(n=l.indexOf("OS"),e.os="iOS",e.type=l.slice(0,l.indexOf(";")),e.version=l.slice(n+3,l.indexOf(" ",n+4)).replace(/_/g,".")):l.startsWith("Macintosh;")?(n=l.indexOf(" Mac OS X"),e.os="MacOS",e.type=l.slice(11,n)+" Mac",e.version=l.slice(n+10).replace(/_/g,".")):-1!=(n=l.indexOf("Android"))?(e.os="Android",e.version=l.slice(n+8,l.indexOf(";",n+9)),n=l.lastIndexOf(";"),s=l.indexOf(" Build",n+2),e.type=l.slice(n+2,-1==s?void 0:s)):l.startsWith("X11;")&&(n=(l=l.slice(5).split(/[;\s]+/)).length,e.os=("Linux"==l[0]?"":"Linux ")+l[0],e.type=l[n-2],e.version=l[n-1]),(n=Number(e.version))&&(e.version=n),n=t.indexOf(" ",i+2),s=-1==(s=t.indexOf(")",n+1))?n+1:s+2,e.engine=t.slice(i+2,n),e.browser=t.slice(s),e.mobile=!!t.match(/Mobi/i),e},_uNJS||(utils.device=utils.deviceInfo(),utils.mobile=utils.device.mobile),t.TouchList&&utils.proto(TouchList,"get",function(t){for(let e in this)if(this[e].identifier==t)return this[e];return 0}),utils.skinnedInput=t=>{let e=utils.mkDiv(null,t.className),i=t.style,l=t.type;if(t.className+=" isSub","datetime-local"==l||"select-one"==l||"select-multiple"==l){i.opacity=0,i.top="-100%",t.siT=utils.mkEl("span",e,"isText"),utils.mkEl("span",e,"isArrow",{borderTopColor:getComputedStyle(t).color});let n=o.bind(t);t.addEventListener("change",n),t.forceUpdate=n,n()}t.replaceWith(e),e.appendChild(t),document.isStyles||(document.isStyles=!0,utils.mkEl("style",document.body,null,null,".isSub {width:100% !important; height:100% !important; border:none !important; display:inline-block !important;position:relative !important; box-shadow:none !important; margin:0 !important; padding:initial !important;} .isText {display:inline-block; height:100%; max-width:95%;overflow:hidden; text-overflow:ellipsis; white-space:nowrap;} .isArrow {width:0; height:0; display:inline-block; float:right; top:38%; position:relative;border-left:3px solid transparent; border-right:3px solid transparent;border-top:6px solid #000; vertical-align:middle;}"))},utils.numField=(t,e,i,l,n)=>{let s=RegExp(`[,${n?RegExp.escape(n):""}]`,"g");return t.type=utils.mobile||l||n?"tel":"number",t.setAttribute("pattern","\\d*"),null==e&&(e=Number.MIN_SAFE_INTEGER),null==i&&(i=Number.MAX_SAFE_INTEGER),null==l&&(l=n?2:0),t.step||(t.step=1),t.num=Math.max(0,e),t.ns="",t.value=n?utils.formatCost(t.num,n):t.num.toString(),t.addEventListener("keydown",s=>{if(s.ctrlKey)return;let r=s.key,o=1==r.length&&Number.isFinite(Number(r)),u=t.ns,a=u.length,c=u.indexOf(".");if("Tab"!=r&&"Enter"!=r){if(o?(-1==c||a-c<l+1)&&(u+=r):"."==r||"*"==r?l&&-1==c&&t.num!=i&&(e>=0||t.num!=e)&&(!a&&e>0?u=Math.floor(e)+".":u+="."):"Backspace"==r||"Delete"==r?u=e>0&&t.num==e&&u.endsWith(".")?"":u.slice(0,-1):"-"==r||"#"==r?e<0&&!a&&(u="-"):"ArrowUp"==r?(u=null,t.set(t.num+Number(t.step))):"ArrowDown"==r&&(u=null,t.set(t.num-Number(t.step))),null!==u&&u!==t.ns){let d="-"==u||"-."==u,f=Number(d?"0":u+(u.endsWith(".")?"0":"")),h=Math.min(i,Math.max(e,f));(!o||t.num!==h||f===e)&&(t.ns=u,t.num=h,t.value=n?d?n+"-0.00":utils.formatCost(h,n):(d?"-":"")+h+(u.endsWith(".")&&(e<=0||h!=e)?".0":""),t.onnuminput&&t.onnuminput.call(t))}s.preventDefault()}}),t.set=r=>{"string"==typeof r&&(r=r.replace(s,"")),r=Math.min(i,Math.max(e,Number(r)||0)),t.num=l?Number(r.toFixed(l)):Math.round(r),t.ns=t.num.toString(),t.value=n?utils.formatCost(t.num,n):t.ns,t.ns=t.ns.replace(/^(-?)0+/,"$1"),t.onnuminput&&t.onnuminput.call(t)},t.setRange=(t,n,s)=>{e=t,i=n,l=s},t.addEventListener("input",()=>t.set(t.value)),t.addEventListener("paste",e=>{t.set(e.clipboardData.getData("text")),e.preventDefault()}),t},utils.autosize=(t,e=5,i=1)=>{t.set=e=>{t.value=e,n()};let l=t.style;function n(){if(0===t.scrollHeight)return setTimeout(n,1);t.setAttribute("rows",1);let s=getComputedStyle(t);l.setProperty("overflow","hidden","important"),l.width=t.innerRect.w+"px",l.boxSizing="content-box",l.borderWidth=l.paddingInline=0;let r=parseFloat(s.paddingTop)+parseFloat(s.paddingBottom),o="normal"===s.lineHeight?parseFloat(s.height):parseFloat(s.lineHeight),u=Math.round((Math.round(t.scrollHeight)-r)/o);l.overflow=l.width=l.boxSizing=l.borderWidth=l.paddingInline="",t.setAttribute("rows",utils.bounds(u,i,e))}l.maxHeight=l.resize="none",l.minHeight=0,l.height="auto",t.setAttribute("rows",i),t.addEventListener("input",n)},utils.formatCost=(t,e="$")=>{if(!t)return e+"0.00";let i=t.toFixed(2).split(".");return e+i[0].split("").reverse().reduce((t,e,i)=>"-"==e?e+t:e+(i&&!(i%3)?",":"")+t,"")+"."+i[1]},utils.fromDateTimeBox=t=>{let e=t.value;return e?new Date(e.replace(/-/g,"/").replace(/T/g," ")):new Date},utils.fixedNum=function(t,e,i=10){let l=Math.abs(t).toString(i).toUpperCase();return(t<0?"-":"")+(16==i?"0x":2==i?"0b":"")+"0".repeat(Math.max(e-l.length,0))+l},utils.months=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],utils.toDateTimeBox=(t,e)=>t.getFullYear()+"-"+c(t.getMonth()+1)+"-"+c(t.getDate())+"T"+c(t.getHours())+":"+c(t.getMinutes())+(e?":"+c(t.getSeconds()):""),utils.formatDate=(t,e={})=>{let i="",l,n;if(null==t||!t.getDate||!((l=t.getFullYear())>1969))return"[Invalid Date]";if(null==e.time||e.time){let s=t.getHours(),r="";if(e.h24||(r=" AM",s>=12&&(r=" PM",s-=12),s||(s=12)),i=s+":"+c(t.getMinutes())+(e.sec?":"+c(t.getSeconds())+(e.ms?(t.getMilliseconds()/1e3).toFixed(Number.isFinite(e.ms)?e.ms:3).slice(1):""):""),i+=r,e.time)return i}return n=t.getDate(),n=utils.months[t.getMonth()]+" "+(null==e.suf||e.suf?utils.suffix(n):n),(null==e.year||e.year)&&e.year!==l&&(n=n+", "+l),e.df?n+(i&&" "+i):(i&&i+" ")+n},utils.suffix=t=>{let e=t%10,i=t%100;return 1==e&&11!=i?t+"st":2==e&&12!=i?t+"nd":3==e&&13!=i?t+"rd":t+"th"};let d=e;function f(t){utils.onNav&&utils.onNav.call(null,t)}function h(t,e,i){let n=this.length,s=Math.max(e<0?n+e:e||0,0),r;for(null!=i&&(n=Math.min(i<0?n+i:i,n));s<n;++s)if("!"===(r=t(this[s],s,n)))this instanceof l?this[s].remove():this.splice(s,1),--s,--n;else if(null!=r)return r}async function p(t,e,i,n=!0){let s=this.length,r=e=Math.max(e<0?s+e:e||0,0),o,u=[];for(null!=i&&(s=Math.min(i<0?s+i:i,s));r<s;++r){if(o=t(this[r],r,s),!n&&"!"!==(o=await o)&&null!=o)return o;u.push(o)}for(n&&(u=await Promise.all(u)),r=e,o=0;r<s;++r,++o)if("!"===u[o])this instanceof l?this[r].remove():this.splice(r,1),--r,--s;else if(null!=u[o])return u[o]}utils.goBack=d.back.bind(d),utils.goForward=d.forward.bind(d),utils.go=(t,e)=>{d.pushState(e,"",t||location.pathname),f(e)},r("popstate",t=>f(t.state)),r("load",()=>setTimeout(f.wrap(d.state),1)),utils.mkEl=(t,e,i,l,n)=>{let s=document.createElement(t);if(null!=i&&(s.className=i),null!=n&&(s.innerHTML=n),l&&"object"==typeof l)for(let r in l)r in s.style?s.style[r]=l[r]:s.style.setProperty(r,l[r]);return null!=e&&e.appendChild(s),s},utils.mkDiv=(t,e,i,l)=>utils.mkEl("div",t,e,i,l),utils.addText=(t,e)=>t.appendChild(document.createTextNode(e)),utils.textWidth=(e,i)=>{let l=t.TWCanvas||(t.TWCanvas=utils.mkEl("canvas")),n=l.getContext("2d");return n.font=i,n.measureText(e).width},utils.define(utils,"w",()=>innerWidth),utils.define(utils,"h",()=>innerHeight),utils.setPropSafe=(t,e,i,l=!1)=>{"string"==typeof e&&(e=e.split("."));let n=e.length-1;return(e.each(e=>{t="object"==typeof t[e]?t[e]:t[e]={}},0,n),n=e[n],l&&null!=t[n])?t[n]:t[n]=i},utils.getPropSafe=(t,e)=>{"string"==typeof e&&(e=e.split("."));try{for(let i of e)t=t[i];return t}catch(l){}},utils.proto(Array,"clean",function(t){for(let e=0,i,l=this.length;e<l;++e)i=this[e],(utils.isBlank(i)||!1===i||!t&&0===i)&&(this.splice(e--,1),l--);return this}),utils.proto(Array,"remove",function(t){let e=this.indexOf(t);return -1!=e&&(this.splice(e,1),!0)}),[Array,l,s].forEach(t=>{utils.proto(t,"each",h),utils.proto(t,"eachAsync",p)});let $="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",_=$.replace("+/","-_"),m={43:62,47:63,48:52,49:53,50:54,51:55,52:56,53:57,54:58,55:59,56:60,57:61,65:0,66:1,67:2,68:3,69:4,70:5,71:6,72:7,73:8,74:9,75:10,76:11,77:12,78:13,79:14,80:15,81:16,82:17,83:18,84:19,85:20,86:21,87:22,88:23,89:24,90:25,97:26,98:27,99:28,100:29,101:30,102:31,103:32,104:33,105:34,106:35,107:36,108:37,109:38,110:39,111:40,112:41,113:42,114:43,115:44,116:45,117:46,118:47,119:48,120:49,121:50,122:51,45:62,95:63};function g(t,e){if(null==(t=m[t.charCodeAt(e)]))throw"Bad char at "+e;return t}"toBase64"in Uint8Array.prototype||utils.proto(Uint8Array,"toBase64",function(t){let e=this.byteLength,i=e%3,l=t&&"base64url"===t.alphabet?_:$,n=0,s="",r;for(e-=i;n<e;n+=3)s+=l[(16515072&(r=this[n]<<16|this[n+1]<<8|this[n+2]))>>18]+l[(258048&r)>>12]+l[(4032&r)>>6]+l[63&r];return 1==i?(s+=l[(252&(r=this[e]))>>2]+l[(3&r)<<4],t&&t.omitPadding||(s+="=")):2!=i||(s+=l[(64512&(r=this[e]<<8|this[e+1]))>>10]+l[(1008&r)>>4]+l[(15&r)<<2],t&&t.omitPadding||(s+="==")),s}),"fromBase64"in Uint8Array||utils.proto(Uint8Array,"fromBase64",t=>{let e=t.length,i=e-1;for(;i>=0&&61===t.charCodeAt(i);--i);e=i+1,i=0;let l=e%4;if(e-=l,1==l)throw"Bad b64 len";let n=new Uint8Array(3*e/4+(l?l-1:0)),s=-1,r;for(;i<e;i+=4)r=g(t,i)<<18|g(t,i+1)<<12|g(t,i+2)<<6|g(t,i+3),n[++s]=r>>16,n[++s]=r>>8,n[++s]=r;return 2==l?n[++s]=g(t,i)<<2|g(t,i+1)>>4:3==l&&(r=g(t,i)<<10|g(t,i+1)<<4|g(t,i+2)>>2,n[++s]=r>>8,n[++s]=r),n},1);let y=/[|\\{}()[\]^$+*?.]/g,x=/-/g;function b(t,e){for(;t>=e;)t-=e;return t}function v(){let t=document.styleSheets;for(let e=0,i=t.length;e<i;++e)try{return t[e].cssRules,t[e]}catch(l){}let n=utils.mkEl("style",document.head);return utils.addText(n,""),n.sheet}function w(t){return t.replace(/[A-Z]/g,t=>"-"+t.toLowerCase())}"escape"in RegExp||utils.proto(RegExp,"escape",t=>t.replace(y,"\\$&").replace(x,"\\x2d"),1),utils.define(n.prototype,"index",function(){let t=this.parentElement;return t?Array.prototype.indexOf.call(t.children,this):-1}),utils.proto(n,"insertChildAt",function(t,e){e<0&&(e=0),e>=this.children.length?this.appendChild(t):this.insertBefore(t,this.children[e])}),utils.boundingRect=t=>new UtilRect(t.getBoundingClientRect()),utils.innerRect=t=>{let e=t.getBoundingClientRect(),i=getComputedStyle(t);return new UtilRect(e.top+parseFloat(i.paddingTop)+parseFloat(i.borderTopWidth),e.bottom-parseFloat(i.paddingBottom)-parseFloat(i.borderBottomWidth),e.left+parseFloat(i.paddingLeft)+parseFloat(i.borderLeftWidth),e.right-parseFloat(i.paddingRight)-parseFloat(i.borderRightWidth))},utils.define(n.prototype,"boundingRect",function(){return utils.boundingRect(this)}),utils.define(n.prototype,"innerRect",function(){return utils.innerRect(this)}),Math.cot=t=>1/Math.tan(t),utils.isBlank=t=>null==t||("string"==typeof t?!/\S/.test(t):"object"==typeof t&&("number"==typeof t.length?0===t.length:0===Object.keys(t).length)),utils.firstEmpty=t=>{let e=t.length;for(let i=0;i<e;++i)if(null==t[i])return i;return e},utils.firstEmptyChar=t=>{let e=Object.keys(t),i=e.length;for(let l=0;l<i;++l)if(null==t[e[l]])return e[l];return utils.numToChar(i)},utils.numToChar=t=>{if(t<=25)return String.fromCharCode(t+97);if(t>=26&&t<=51)return String.fromCharCode(t+39);let e,i;if(t<2756)e=b(Math.floor(t/52)-1,52),i=b(t,52);else if(t<143364)e=b(Math.floor((t-52)/2704)-1,52),i=b(t-52,2704)+52;else{if(!(t<7454980))return!1;e=b(Math.floor((t-2756)/140608)-1,52),i=b(t-2756,140608)+2756}return utils.numToChar(e)+utils.numToChar(i)},utils.merge=function(t){for(let e=1,i=arguments.length,l,n,s;e<i;++e)for(let r in l=arguments[e]){if(n=t[r],s=l[r],n&&s){if(n.length>=0&&s.length>=0){for(let o=0,u=s.length,a=n.length;o<u;++o)n[o+a]=s[o];continue}if("object"==typeof n&&"object"==typeof s){for(let c in s)n[c]=s[c];continue}}t[r]=s}return t},utils.bounds=(t,e=0,i=1)=>t>=e?t<=i?t:i:e,utils.norm=utils.normalize=(t,e=0,i=1)=>{let l=Math.abs(i-e);if(t<e)for(;t<e;)t+=l;else for(;t>=i;)t-=l;return t},utils.cutStr=(t,e)=>{let i;for(;-1!=(i=t.indexOf(e));)t=t.slice(0,i)+t.slice(i+e.length);return t},utils.dCut=(t,e,i,l,n)=>{let s=t.indexOf(e,n||void 0)+e.length,r=t.indexOf(i,s);return l&&(l.s=s,l.t=r),s<e.length||r<=s?"":t.slice(s,r)},utils.dCutToLast=(t,e,i,l,n)=>{let s=t.indexOf(e,n||void 0)+e.length,r=t.lastIndexOf(i);return l&&(l.s=s,l.t=r),s<e.length||r<=s?"":t.slice(s,r)},utils.dCutLast=(t,e,i,l,n)=>{let s=t.lastIndexOf(e,n||void 0)+e.length,r=t.indexOf(i,s);return l&&(l.s=s,l.t=r),s<e.length||r<=s?"":t.slice(s,r)},utils.parseCSS=t=>{let e={},i="",l=0;function n(t){if(-1!==t.indexOf(",")){let e=utils.clean(t.split(","));for(let i=0,l=e.length;i<l;++i)e[i]=e[i].trim();return e}return t.trim()}for(t=t.trim();t.length>0;)if("("==t[0]&&-1!==t.indexOf(")")&&i){let s=t.indexOf(")"),r=t.slice(1,s);e[i]=n(r),i="",t=t.slice(s+1)}else if(0==t.search(/[#!\w]/)){i&&(e[l++]=i);let o=t.search(/[^#!\w-%]/);-1==o&&(o=t.length),i=t.slice(0,o),t=t.slice(o)}else t=t.slice(1);return i&&(e[l]=i),e},utils.buildCSS=t=>{let e=Object.keys(t),i=e.length,l="",n=0;for(;n<i;){let s=e[n],r=t[e[n]];++n,0<=Number(s)?l+=r+" ":l+=`${s}(${r}) `}return l.slice(0,-1)},utils.addClass=(t,e)=>{let i=v(),l=Object.keys(e),n="";for(let s=0,r=l.length;s<r;++s)n+=w(l[s])+":"+e[l[s]]+";";i.addRule("."+t,n)},utils.addId=(t,e)=>{let i=v(),l=Object.keys(e),n="";for(let s=0,r=l.length;s<r;++s)n+=w(l[s])+":"+e[l[s]]+";";i.addRule("#"+t,n)},utils.addKeyframe=(t,e)=>{v().addRule("@keyframes "+t,e)},utils.removeSelector=t=>{for(let e=0,i,l,n=document.styleSheets.length;e<n;++e){i=document.styleSheets[e];try{l=i.cssRules}catch(s){continue}for(let r in l)"CSSStyleRule"==l[r].constructor.name&&l[r].selectorText==t&&i.deleteRule(r)}},utils.hexToRgb=t=>{let e=parseInt(t.slice(1),16);return[e>>16&255,e>>8&255,255&e]},utils.rgbToHsl=(t,e,i)=>{t/=255;let l=Math.max(t,e/=255,i/=255),n=Math.min(t,e,i),s,r,o=(l+n)/2;if(l===n)s=r=0;else{let u=l-n;switch(r=o>.5?u/(2-l-n):u/(l+n),l){case t:s=(e-i)/u+(e<i?6:0);break;case e:s=(i-t)/u+2;break;case i:s=(t-e)/u+4}s/=6}return[360*s,100*r,100*o]},utils.rand=(t,e,i,l)=>{e*=i=i||1,t*=i;let n=Math.random();return Math.round((l?l(n):n)*(e-t)+t)/i},utils.fromQuery=t=>{function e(t,i){let l=i[0],n=l.indexOf("="),s=decodeURIComponent(l.slice(0,n)),r=decodeURIComponent(l.slice(n+1));return null==t[s]?t[s]=r:Array.isArray(t[s])?t[s].push(r):t[s]=[t[s],r],1===i.length?t:e(t,i.slice(1))}return t.startsWith("?")&&(t=t.slice(1)),t?e({},t.split("&")):{}},utils.toQuery=t=>{let e="",i,l;if("object"!=typeof t)return encodeURIComponent(t);for(i in t)"object"==typeof(l=t[i])&&null!=l&&(l=JSON.stringify(l)),e+="&"+i+"="+encodeURIComponent(l);return e.slice(1)},utils.center=(t,e,i)=>{let l=t.style;if(l.position||(l.position="absolute"),"calc"==i)e&&"x"!=e||(l.left=`calc(50% - ${t.clientWidth/2}px)`),e&&"y"!=e||(l.top=`calc(50% - ${t.clientHeight/2}px)`);else if("move"==i)e&&"x"!=e||(l.left=`${utils.w/2-t.clientWidth/2}px`),e&&"y"!=e||(l.top=`${utils.h/2-t.clientHeight/2}px`);else if("trans"==i){let n=utils.cutStr(l.transform,"translateX(-50%)");n=utils.cutStr(n,"translateY(-50%)"),e&&"x"!=e||(l.left="50%",n+="translateX(-50%)"),e&&"y"!=e||(l.top="50%",n+="translateY(-50%)"),n&&(l.transform=n)}else utils.mkEl("div",t.parentNode,null,{display:"table",position:"absolute",top:0,left:0,width:"100%",height:"100%"}).appendChild(t),l.display="table-cell",e&&"x"!=e||(l.textAlign="center"),e&&"y"!=e||(l.verticalAlign="middle"),l.position="relative"},utils.loadAjax=(t,e,i,l,n)=>{let s;try{s=new XMLHttpRequest}catch(r){return e(r)}if(n)for(let o in n)s.setRequestHeader(o,n[o]);s.open(i||"GET",t),s.onreadystatechange=()=>{let t=s.status||-1;s.readyState==s.DONE&&e(200==t?0:t,s.response,s)},s.send(l||void 0)},utils.loadFile=(t,e,i)=>{let l=utils.mkEl("object",document.body,null,{position:"fixed",opacity:0});l.data=t;let n=setTimeout(()=>{l.remove(),n=null,e(!1)},i||4e3);l.onload=()=>{n&&(clearTimeout(n),e(l.contentDocument.documentElement.outerHTML),l.remove())}},utils.loadJSONP=(t,e,i)=>{let l=utils.mkEl("script",document.head),n=utils.firstEmptyChar(utils.lJSONCall);l.type="application/javascript",l.src=t+(-1==t.indexOf("?")?"?":"&")+"callback=utils.lJSONCall."+n;let s=setTimeout(()=>{delete utils.lJSONCall[n],e(!1)},i||4e3);utils.lJSONCall[n]=t=>{s&&clearTimeout(s),delete utils.lJSONCall[n],e(t)},document.head.removeChild(l)},utils.lJSONCall=[],utils.dlFile=(t,e)=>fetch(e).then(t=>{if(200!=t.status)throw"Code "+t.status;return t.blob()}).then(e=>{utils.dlData(t,e)}),utils.dlData=(t,e)=>{let i,l=utils.mkEl("a",document.body,null,{display:"none"});"string"==typeof e?i=e:(e instanceof Blob||(e=Blob(e)),i=URL.createObjectURL(e)),l.href=i,l.download=t,l.click(),l.remove(),URL.revokeObjectURL(i)},utils.deg=t=>180*t/Math.PI,utils.rad=t=>t*Math.PI/180,utils.map=(t,e,i,l,n,s)=>{let r=(t-e)/(i-e);return(s?s(r):r)*(n-l)+l},utils.delay=t=>new Promise(e=>setTimeout(e,t)),UtilRect=function(t,e,l,n){if(!(this instanceof UtilRect))return new UtilRect(t,e,l,n);let s=Number.isFinite,r=0,o=0,u=0,a=0;utils.define(this,"x",()=>u,t=>{s(t)&&(a+=t-u,u=t)}),utils.define(this,"y",()=>r,t=>{s(t)&&(o+=t-r,r=t)}),utils.define(this,"top",()=>r,t=>{r=s(t)?t:0}),utils.define(this,["bottom","y2"],()=>o,t=>{o=s(t)?t:0}),utils.define(this,"left",()=>u,t=>{u=s(t)?t:0}),utils.define(this,["right","x2"],()=>a,t=>{a=s(t)?t:0}),utils.define(this,["width","w"],()=>a-u,t=>{a=t>=0?u+t:0}),utils.define(this,["height","h"],()=>o-r,t=>{o=t>=0?r+t:0}),utils.define(this,"centerX",()=>u/2+a/2),utils.define(this,"centerY",()=>r/2+o/2),t instanceof i||t instanceof UtilRect?(r=t.top,o=t.bottom,u=t.left,a=t.right):(r=t,o=e,u=l,a=n)},utils.proto(UtilRect,"contains",function(t,e){return t instanceof n?this.contains(t.boundingRect):t instanceof UtilRect?t.x>=this.x&&t.x2<=this.x2&&t.y>=this.y&&t.y2<=this.y2:t>=this.x&&t<=this.x2&&e>=this.y&&e<=this.y2}),utils.proto(UtilRect,"overlaps",function(t){if(t instanceof n)return this.overlaps(t.boundingRect);if(!(t instanceof UtilRect))return 0;let e,i;return e=t.x2-t.x>=this.x2-this.x?this.x>=t.x&&this.x<=t.x2||this.x2>=t.x&&this.x2<=t.x2:t.x>=this.x&&t.x<=this.x2||t.x2>=this.x&&t.x2<=this.x2,i=t.y2-t.y>=this.y2-this.y?this.y>=t.y&&this.y<=t.y2||this.y2>=t.y&&this.y2<=t.y2:t.y>=this.y&&t.y<=this.y2||t.y2>=this.y&&t.y2<=this.y2,e&&i}),utils.proto(UtilRect,"dist",function(t,e){if(t instanceof n)return this.dist(t.boundingRect);let i=t instanceof UtilRect;return e=Math.abs((i?t.centerY:e)-this.centerY),Math.sqrt((t=Math.abs((i?t.centerX:t)-this.centerX))*t+e*e)}),utils.proto(UtilRect,"expand",function(t){return this.top-=t,this.left-=t,this.bottom+=t,this.right+=t,this})})();const Easing={linear:t=>t,easeInQuad:t=>t*t,easeOutQuad:t=>t*(2-t),easeInOutQuad:t=>t<.5?2*t*t:-1+(4-2*t)*t,easeInCubic:t=>t*t*t,easeOutCubic:t=>--t*t*t+1,easeInOutCubic:t=>t<.5?4*t*t*t:(t-1)*(2*t-2)*(2*t-2)+1,easeInQuart:t=>t*t*t*t,easeOutQuart:t=>1- --t*t*t*t,easeInOutQuart:t=>t<.5?8*t*t*t*t:1-8*--t*t*t*t,easeInQuint:t=>t*t*t*t*t,easeOutQuint:t=>1+--t*t*t*t*t,easeInOutQuint:t=>t<.5?16*t*t*t*t*t:1+16*--t*t*t*t*t};if(_uNJS&&!global.utils){let t=import("os").then(e=>t=e);utils.getIPs=()=>{let e=[],i=t.networkInterfaces();for(let l in i)i[l].forEach(t=>{!t.internal&&"IPv4"==t.family&&"00:00:00:00:00:00"!=t.mac&&t.address&&e.push(t.address)});return e.length?e:0},utils.getOS=()=>{let e,i,l;switch(t.platform()){case"win32":e="Windows";break;case"darwin":e="MacOS";break;case"linux":e="Linux";break;default:e=t.platform()}switch(t.arch()){case"ia32":i="32-bit";break;case"x64":i="64-bit";break;case"arm":i="ARM";break;default:i=t.arch()}return[e,i,l=t.cpus()[0].model]},global.utils=utils,global.UtilRect=UtilRect,global.Easing=Easing}
|
package/uuid.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//Chu ID v1.
|
|
1
|
+
//Chu ID v1.4, Pecacheu 2025. GNU GPL v3
|
|
2
2
|
|
|
3
3
|
import os from 'os';
|
|
4
4
|
import fs from 'fs/promises';
|
|
@@ -26,6 +26,7 @@ class UUID {
|
|
|
26
26
|
toString(f) {return this.id.toString(f||'base64url')}
|
|
27
27
|
toHexLE() {return swapHex(this.id.toString('hex'))}
|
|
28
28
|
toLong() {return mdb.Long.fromString(this.id.toString('hex'),16)}
|
|
29
|
+
getMagic() {return this.id.readUInt8(1)}
|
|
29
30
|
getDate() {
|
|
30
31
|
let d=this.id.readUInt32LE(4)*10000;
|
|
31
32
|
return new Date(d<1621543800000?0:d);
|
|
@@ -46,12 +47,15 @@ async function loadId() {
|
|
|
46
47
|
|
|
47
48
|
UUID.randBytes = promisify(crypto.randomBytes);
|
|
48
49
|
|
|
49
|
-
UUID.genUUID = async dateMs => {
|
|
50
|
+
UUID.genUUID = async (dateMs, magic) => {
|
|
50
51
|
if(IDCount==null) await loadId();
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
u.writeUInt8(os.uptime()&255);
|
|
54
|
-
|
|
52
|
+
const rb=await UUID.randBytes(magic!=null?1:2),
|
|
53
|
+
u=Buffer.allocUnsafe(8);
|
|
54
|
+
u.writeUInt8((os.uptime()*10)&255);
|
|
55
|
+
if(magic != null) {
|
|
56
|
+
u.writeUInt8(magic&255,1);
|
|
57
|
+
u.writeUInt8(rb.readUInt8(),2);
|
|
58
|
+
} else u.writeUInt16LE(rb.readUInt16LE(),1);
|
|
55
59
|
u.writeUInt8(IDCount,3);
|
|
56
60
|
u.writeUInt32LE((dateMs||Date.now())/10000,4);
|
|
57
61
|
if(++IDCount > 255) IDCount=0;
|