pref: move `lib.init.init` out.
This commit is contained in:
parent
800c74eb10
commit
b6d3c94a54
|
@ -53,7 +53,7 @@ new Promise(resolve => {
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
const module = import('../noname.js');
|
const module = import('../noname.js');
|
||||||
|
|
||||||
module.then(({ ai, game, get, lib, _status, ui }) => {
|
module.then(({ ai, game, get, lib, _status, ui, boot }) => {
|
||||||
const coreAndVersion = get.coreInfo();
|
const coreAndVersion = get.coreInfo();
|
||||||
const core = coreAndVersion[0], version = coreAndVersion[1];
|
const core = coreAndVersion[0], version = coreAndVersion[1];
|
||||||
if (core == 'chrome' && !isNaN(version) && version < 77) {
|
if (core == 'chrome' && !isNaN(version) && version < 77) {
|
||||||
|
@ -65,6 +65,6 @@ new Promise(resolve => {
|
||||||
window.open('https://github.com/libccy/noname/releases/tag/chromium77-client');
|
window.open('https://github.com/libccy/noname/releases/tag/chromium77-client');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
lib.init.init();
|
boot();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
530
game/path.js
530
game/path.js
|
@ -1,530 +0,0 @@
|
||||||
// 'path' module extracted from Node.js v8.11.1 (only the posix part)
|
|
||||||
// transplited with Babel
|
|
||||||
|
|
||||||
// Copyright Joyent, Inc. and other Node contributors.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
|
||||||
// copy of this software and associated documentation files (the
|
|
||||||
// "Software"), to deal in the Software without restriction, including
|
|
||||||
// without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
|
||||||
// persons to whom the Software is furnished to do so, subject to the
|
|
||||||
// following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included
|
|
||||||
// in all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
||||||
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|
||||||
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
||||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
||||||
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|
||||||
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
{
|
|
||||||
"use strict"
|
|
||||||
function assertPath(path) {
|
|
||||||
if (typeof path !== 'string') {
|
|
||||||
throw new TypeError('Path must be a string. Received ' + JSON.stringify(path));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Resolves . and .. elements in a path with directory names
|
|
||||||
function normalizeStringPosix(path, allowAboveRoot) {
|
|
||||||
var res = '';
|
|
||||||
var lastSegmentLength = 0;
|
|
||||||
var lastSlash = -1;
|
|
||||||
var dots = 0;
|
|
||||||
var code;
|
|
||||||
for (var i = 0; i <= path.length; ++i) {
|
|
||||||
if (i < path.length)
|
|
||||||
code = path.charCodeAt(i);
|
|
||||||
else if (code === 47 /*/*/)
|
|
||||||
break;
|
|
||||||
else
|
|
||||||
code = 47 /*/*/;
|
|
||||||
if (code === 47 /*/*/) {
|
|
||||||
if (lastSlash === i - 1 || dots === 1) {
|
|
||||||
// NOOP
|
|
||||||
} else if (lastSlash !== i - 1 && dots === 2) {
|
|
||||||
if (res.length < 2 || lastSegmentLength !== 2 || res.charCodeAt(res.length - 1) !== 46 /*.*/ || res.charCodeAt(res.length - 2) !== 46 /*.*/) {
|
|
||||||
if (res.length > 2) {
|
|
||||||
var lastSlashIndex = res.lastIndexOf('/');
|
|
||||||
if (lastSlashIndex !== res.length - 1) {
|
|
||||||
if (lastSlashIndex === -1) {
|
|
||||||
res = '';
|
|
||||||
lastSegmentLength = 0;
|
|
||||||
} else {
|
|
||||||
res = res.slice(0, lastSlashIndex);
|
|
||||||
lastSegmentLength = res.length - 1 - res.lastIndexOf('/');
|
|
||||||
}
|
|
||||||
lastSlash = i;
|
|
||||||
dots = 0;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
} else if (res.length === 2 || res.length === 1) {
|
|
||||||
res = '';
|
|
||||||
lastSegmentLength = 0;
|
|
||||||
lastSlash = i;
|
|
||||||
dots = 0;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (allowAboveRoot) {
|
|
||||||
if (res.length > 0)
|
|
||||||
res += '/..';
|
|
||||||
else
|
|
||||||
res = '..';
|
|
||||||
lastSegmentLength = 2;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (res.length > 0)
|
|
||||||
res += '/' + path.slice(lastSlash + 1, i);
|
|
||||||
else
|
|
||||||
res = path.slice(lastSlash + 1, i);
|
|
||||||
lastSegmentLength = i - lastSlash - 1;
|
|
||||||
}
|
|
||||||
lastSlash = i;
|
|
||||||
dots = 0;
|
|
||||||
} else if (code === 46 /*.*/ && dots !== -1) {
|
|
||||||
++dots;
|
|
||||||
} else {
|
|
||||||
dots = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
function _format(sep, pathObject) {
|
|
||||||
var dir = pathObject.dir || pathObject.root;
|
|
||||||
var base = pathObject.base || (pathObject.name || '') + (pathObject.ext || '');
|
|
||||||
if (!dir) {
|
|
||||||
return base;
|
|
||||||
}
|
|
||||||
if (dir === pathObject.root) {
|
|
||||||
return dir + base;
|
|
||||||
}
|
|
||||||
return dir + sep + base;
|
|
||||||
}
|
|
||||||
|
|
||||||
var posix = {
|
|
||||||
// path.resolve([from ...], to)
|
|
||||||
resolve: function resolve() {
|
|
||||||
var resolvedPath = '';
|
|
||||||
var resolvedAbsolute = false;
|
|
||||||
var cwd;
|
|
||||||
|
|
||||||
for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
|
|
||||||
var path;
|
|
||||||
if (i >= 0)
|
|
||||||
path = arguments[i];
|
|
||||||
else {
|
|
||||||
if (cwd === undefined)
|
|
||||||
cwd = process.cwd();
|
|
||||||
path = cwd;
|
|
||||||
}
|
|
||||||
|
|
||||||
assertPath(path);
|
|
||||||
|
|
||||||
// Skip empty entries
|
|
||||||
if (path.length === 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
resolvedPath = path + '/' + resolvedPath;
|
|
||||||
resolvedAbsolute = path.charCodeAt(0) === 47 /*/*/;
|
|
||||||
}
|
|
||||||
|
|
||||||
// At this point the path should be resolved to a full absolute path, but
|
|
||||||
// handle relative paths to be safe (might happen when process.cwd() fails)
|
|
||||||
|
|
||||||
// Normalize the path
|
|
||||||
resolvedPath = normalizeStringPosix(resolvedPath, !resolvedAbsolute);
|
|
||||||
|
|
||||||
if (resolvedAbsolute) {
|
|
||||||
if (resolvedPath.length > 0)
|
|
||||||
return '/' + resolvedPath;
|
|
||||||
else
|
|
||||||
return '/';
|
|
||||||
} else if (resolvedPath.length > 0) {
|
|
||||||
return resolvedPath;
|
|
||||||
} else {
|
|
||||||
return '.';
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
normalize: function normalize(path) {
|
|
||||||
assertPath(path);
|
|
||||||
|
|
||||||
if (path.length === 0) return '.';
|
|
||||||
|
|
||||||
var isAbsolute = path.charCodeAt(0) === 47 /*/*/;
|
|
||||||
var trailingSeparator = path.charCodeAt(path.length - 1) === 47 /*/*/;
|
|
||||||
|
|
||||||
// Normalize the path
|
|
||||||
path = normalizeStringPosix(path, !isAbsolute);
|
|
||||||
|
|
||||||
if (path.length === 0 && !isAbsolute) path = '.';
|
|
||||||
if (path.length > 0 && trailingSeparator) path += '/';
|
|
||||||
|
|
||||||
if (isAbsolute) return '/' + path;
|
|
||||||
return path;
|
|
||||||
},
|
|
||||||
|
|
||||||
isAbsolute: function isAbsolute(path) {
|
|
||||||
assertPath(path);
|
|
||||||
return path.length > 0 && path.charCodeAt(0) === 47 /*/*/;
|
|
||||||
},
|
|
||||||
|
|
||||||
join: function join() {
|
|
||||||
if (arguments.length === 0)
|
|
||||||
return '.';
|
|
||||||
var joined;
|
|
||||||
for (var i = 0; i < arguments.length; ++i) {
|
|
||||||
var arg = arguments[i];
|
|
||||||
assertPath(arg);
|
|
||||||
if (arg.length > 0) {
|
|
||||||
if (joined === undefined)
|
|
||||||
joined = arg;
|
|
||||||
else
|
|
||||||
joined += '/' + arg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (joined === undefined)
|
|
||||||
return '.';
|
|
||||||
return posix.normalize(joined);
|
|
||||||
},
|
|
||||||
|
|
||||||
relative: function relative(from, to) {
|
|
||||||
assertPath(from);
|
|
||||||
assertPath(to);
|
|
||||||
|
|
||||||
if (from === to) return '';
|
|
||||||
|
|
||||||
from = posix.resolve(from);
|
|
||||||
to = posix.resolve(to);
|
|
||||||
|
|
||||||
if (from === to) return '';
|
|
||||||
|
|
||||||
// Trim any leading backslashes
|
|
||||||
var fromStart = 1;
|
|
||||||
for (; fromStart < from.length; ++fromStart) {
|
|
||||||
if (from.charCodeAt(fromStart) !== 47 /*/*/)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
var fromEnd = from.length;
|
|
||||||
var fromLen = fromEnd - fromStart;
|
|
||||||
|
|
||||||
// Trim any leading backslashes
|
|
||||||
var toStart = 1;
|
|
||||||
for (; toStart < to.length; ++toStart) {
|
|
||||||
if (to.charCodeAt(toStart) !== 47 /*/*/)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
var toEnd = to.length;
|
|
||||||
var toLen = toEnd - toStart;
|
|
||||||
|
|
||||||
// Compare paths to find the longest common path from root
|
|
||||||
var length = fromLen < toLen ? fromLen : toLen;
|
|
||||||
var lastCommonSep = -1;
|
|
||||||
var i = 0;
|
|
||||||
for (; i <= length; ++i) {
|
|
||||||
if (i === length) {
|
|
||||||
if (toLen > length) {
|
|
||||||
if (to.charCodeAt(toStart + i) === 47 /*/*/) {
|
|
||||||
// We get here if `from` is the exact base path for `to`.
|
|
||||||
// For example: from='/foo/bar'; to='/foo/bar/baz'
|
|
||||||
return to.slice(toStart + i + 1);
|
|
||||||
} else if (i === 0) {
|
|
||||||
// We get here if `from` is the root
|
|
||||||
// For example: from='/'; to='/foo'
|
|
||||||
return to.slice(toStart + i);
|
|
||||||
}
|
|
||||||
} else if (fromLen > length) {
|
|
||||||
if (from.charCodeAt(fromStart + i) === 47 /*/*/) {
|
|
||||||
// We get here if `to` is the exact base path for `from`.
|
|
||||||
// For example: from='/foo/bar/baz'; to='/foo/bar'
|
|
||||||
lastCommonSep = i;
|
|
||||||
} else if (i === 0) {
|
|
||||||
// We get here if `to` is the root.
|
|
||||||
// For example: from='/foo'; to='/'
|
|
||||||
lastCommonSep = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
var fromCode = from.charCodeAt(fromStart + i);
|
|
||||||
var toCode = to.charCodeAt(toStart + i);
|
|
||||||
if (fromCode !== toCode)
|
|
||||||
break;
|
|
||||||
else if (fromCode === 47 /*/*/)
|
|
||||||
lastCommonSep = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
var out = '';
|
|
||||||
// Generate the relative path based on the path difference between `to`
|
|
||||||
// and `from`
|
|
||||||
for (i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i) {
|
|
||||||
if (i === fromEnd || from.charCodeAt(i) === 47 /*/*/) {
|
|
||||||
if (out.length === 0)
|
|
||||||
out += '..';
|
|
||||||
else
|
|
||||||
out += '/..';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Lastly, append the rest of the destination (`to`) path that comes after
|
|
||||||
// the common path parts
|
|
||||||
if (out.length > 0)
|
|
||||||
return out + to.slice(toStart + lastCommonSep);
|
|
||||||
else {
|
|
||||||
toStart += lastCommonSep;
|
|
||||||
if (to.charCodeAt(toStart) === 47 /*/*/)
|
|
||||||
++toStart;
|
|
||||||
return to.slice(toStart);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_makeLong: function _makeLong(path) {
|
|
||||||
return path;
|
|
||||||
},
|
|
||||||
|
|
||||||
dirname: function dirname(path) {
|
|
||||||
assertPath(path);
|
|
||||||
if (path.length === 0) return '.';
|
|
||||||
var code = path.charCodeAt(0);
|
|
||||||
var hasRoot = code === 47 /*/*/;
|
|
||||||
var end = -1;
|
|
||||||
var matchedSlash = true;
|
|
||||||
for (var i = path.length - 1; i >= 1; --i) {
|
|
||||||
code = path.charCodeAt(i);
|
|
||||||
if (code === 47 /*/*/) {
|
|
||||||
if (!matchedSlash) {
|
|
||||||
end = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// We saw the first non-path separator
|
|
||||||
matchedSlash = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (end === -1) return hasRoot ? '/' : '.';
|
|
||||||
if (hasRoot && end === 1) return '//';
|
|
||||||
return path.slice(0, end);
|
|
||||||
},
|
|
||||||
|
|
||||||
basename: function basename(path, ext) {
|
|
||||||
if (ext !== undefined && typeof ext !== 'string') throw new TypeError('"ext" argument must be a string');
|
|
||||||
assertPath(path);
|
|
||||||
|
|
||||||
var start = 0;
|
|
||||||
var end = -1;
|
|
||||||
var matchedSlash = true;
|
|
||||||
var i;
|
|
||||||
|
|
||||||
if (ext !== undefined && ext.length > 0 && ext.length <= path.length) {
|
|
||||||
if (ext.length === path.length && ext === path) return '';
|
|
||||||
var extIdx = ext.length - 1;
|
|
||||||
var firstNonSlashEnd = -1;
|
|
||||||
for (i = path.length - 1; i >= 0; --i) {
|
|
||||||
var code = path.charCodeAt(i);
|
|
||||||
if (code === 47 /*/*/) {
|
|
||||||
// If we reached a path separator that was not part of a set of path
|
|
||||||
// separators at the end of the string, stop now
|
|
||||||
if (!matchedSlash) {
|
|
||||||
start = i + 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (firstNonSlashEnd === -1) {
|
|
||||||
// We saw the first non-path separator, remember this index in case
|
|
||||||
// we need it if the extension ends up not matching
|
|
||||||
matchedSlash = false;
|
|
||||||
firstNonSlashEnd = i + 1;
|
|
||||||
}
|
|
||||||
if (extIdx >= 0) {
|
|
||||||
// Try to match the explicit extension
|
|
||||||
if (code === ext.charCodeAt(extIdx)) {
|
|
||||||
if (--extIdx === -1) {
|
|
||||||
// We matched the extension, so mark this as the end of our path
|
|
||||||
// component
|
|
||||||
end = i;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Extension does not match, so our result is the entire path
|
|
||||||
// component
|
|
||||||
extIdx = -1;
|
|
||||||
end = firstNonSlashEnd;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (start === end) end = firstNonSlashEnd; else if (end === -1) end = path.length;
|
|
||||||
return path.slice(start, end);
|
|
||||||
} else {
|
|
||||||
for (i = path.length - 1; i >= 0; --i) {
|
|
||||||
if (path.charCodeAt(i) === 47 /*/*/) {
|
|
||||||
// If we reached a path separator that was not part of a set of path
|
|
||||||
// separators at the end of the string, stop now
|
|
||||||
if (!matchedSlash) {
|
|
||||||
start = i + 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else if (end === -1) {
|
|
||||||
// We saw the first non-path separator, mark this as the end of our
|
|
||||||
// path component
|
|
||||||
matchedSlash = false;
|
|
||||||
end = i + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (end === -1) return '';
|
|
||||||
return path.slice(start, end);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
extname: function extname(path) {
|
|
||||||
assertPath(path);
|
|
||||||
var startDot = -1;
|
|
||||||
var startPart = 0;
|
|
||||||
var end = -1;
|
|
||||||
var matchedSlash = true;
|
|
||||||
// Track the state of characters (if any) we see before our first dot and
|
|
||||||
// after any path separator we find
|
|
||||||
var preDotState = 0;
|
|
||||||
for (var i = path.length - 1; i >= 0; --i) {
|
|
||||||
var code = path.charCodeAt(i);
|
|
||||||
if (code === 47 /*/*/) {
|
|
||||||
// If we reached a path separator that was not part of a set of path
|
|
||||||
// separators at the end of the string, stop now
|
|
||||||
if (!matchedSlash) {
|
|
||||||
startPart = i + 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (end === -1) {
|
|
||||||
// We saw the first non-path separator, mark this as the end of our
|
|
||||||
// extension
|
|
||||||
matchedSlash = false;
|
|
||||||
end = i + 1;
|
|
||||||
}
|
|
||||||
if (code === 46 /*.*/) {
|
|
||||||
// If this is our first dot, mark it as the start of our extension
|
|
||||||
if (startDot === -1)
|
|
||||||
startDot = i;
|
|
||||||
else if (preDotState !== 1)
|
|
||||||
preDotState = 1;
|
|
||||||
} else if (startDot !== -1) {
|
|
||||||
// We saw a non-dot and non-path separator before our dot, so we should
|
|
||||||
// have a good chance at having a non-empty extension
|
|
||||||
preDotState = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (startDot === -1 || end === -1 ||
|
|
||||||
// We saw a non-dot character immediately before the dot
|
|
||||||
preDotState === 0 ||
|
|
||||||
// The (right-most) trimmed path component is exactly '..'
|
|
||||||
preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
return path.slice(startDot, end);
|
|
||||||
},
|
|
||||||
|
|
||||||
format: function format(pathObject) {
|
|
||||||
if (pathObject === null || typeof pathObject !== 'object') {
|
|
||||||
throw new TypeError('The "pathObject" argument must be of type Object. Received type ' + typeof pathObject);
|
|
||||||
}
|
|
||||||
return _format('/', pathObject);
|
|
||||||
},
|
|
||||||
|
|
||||||
parse: function parse(path) {
|
|
||||||
assertPath(path);
|
|
||||||
|
|
||||||
var ret = { root: '', dir: '', base: '', ext: '', name: '' };
|
|
||||||
if (path.length === 0) return ret;
|
|
||||||
var code = path.charCodeAt(0);
|
|
||||||
var isAbsolute = code === 47 /*/*/;
|
|
||||||
var start;
|
|
||||||
if (isAbsolute) {
|
|
||||||
ret.root = '/';
|
|
||||||
start = 1;
|
|
||||||
} else {
|
|
||||||
start = 0;
|
|
||||||
}
|
|
||||||
var startDot = -1;
|
|
||||||
var startPart = 0;
|
|
||||||
var end = -1;
|
|
||||||
var matchedSlash = true;
|
|
||||||
var i = path.length - 1;
|
|
||||||
|
|
||||||
// Track the state of characters (if any) we see before our first dot and
|
|
||||||
// after any path separator we find
|
|
||||||
var preDotState = 0;
|
|
||||||
|
|
||||||
// Get non-dir info
|
|
||||||
for (; i >= start; --i) {
|
|
||||||
code = path.charCodeAt(i);
|
|
||||||
if (code === 47 /*/*/) {
|
|
||||||
// If we reached a path separator that was not part of a set of path
|
|
||||||
// separators at the end of the string, stop now
|
|
||||||
if (!matchedSlash) {
|
|
||||||
startPart = i + 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (end === -1) {
|
|
||||||
// We saw the first non-path separator, mark this as the end of our
|
|
||||||
// extension
|
|
||||||
matchedSlash = false;
|
|
||||||
end = i + 1;
|
|
||||||
}
|
|
||||||
if (code === 46 /*.*/) {
|
|
||||||
// If this is our first dot, mark it as the start of our extension
|
|
||||||
if (startDot === -1) startDot = i; else if (preDotState !== 1) preDotState = 1;
|
|
||||||
} else if (startDot !== -1) {
|
|
||||||
// We saw a non-dot and non-path separator before our dot, so we should
|
|
||||||
// have a good chance at having a non-empty extension
|
|
||||||
preDotState = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (startDot === -1 || end === -1 ||
|
|
||||||
// We saw a non-dot character immediately before the dot
|
|
||||||
preDotState === 0 ||
|
|
||||||
// The (right-most) trimmed path component is exactly '..'
|
|
||||||
preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {
|
|
||||||
if (end !== -1) {
|
|
||||||
if (startPart === 0 && isAbsolute) ret.base = ret.name = path.slice(1, end); else ret.base = ret.name = path.slice(startPart, end);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (startPart === 0 && isAbsolute) {
|
|
||||||
ret.name = path.slice(1, startDot);
|
|
||||||
ret.base = path.slice(1, end);
|
|
||||||
} else {
|
|
||||||
ret.name = path.slice(startPart, startDot);
|
|
||||||
ret.base = path.slice(startPart, end);
|
|
||||||
}
|
|
||||||
ret.ext = path.slice(startDot, end);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (startPart > 0) ret.dir = path.slice(0, startPart - 1); else if (isAbsolute) ret.dir = '/';
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
},
|
|
||||||
|
|
||||||
sep: '/',
|
|
||||||
delimiter: ':',
|
|
||||||
win32: null,
|
|
||||||
posix: null
|
|
||||||
};
|
|
||||||
|
|
||||||
posix.posix = posix;
|
|
||||||
|
|
||||||
window._noname_path = posix;
|
|
||||||
}
|
|
|
@ -6,6 +6,8 @@ import { Library as lib } from './noname/library/index.js';
|
||||||
import { status as _status } from './noname/status/index.js';
|
import { status as _status } from './noname/status/index.js';
|
||||||
import { UI as ui } from './noname/ui/index.js';
|
import { UI as ui } from './noname/ui/index.js';
|
||||||
|
|
||||||
|
export { boot } from './noname/init/index.js';
|
||||||
|
|
||||||
export {
|
export {
|
||||||
gnc,
|
gnc,
|
||||||
ai,
|
ai,
|
||||||
|
@ -13,5 +15,5 @@ export {
|
||||||
get,
|
get,
|
||||||
lib,
|
lib,
|
||||||
_status,
|
_status,
|
||||||
ui
|
ui,
|
||||||
}
|
}
|
|
@ -0,0 +1,218 @@
|
||||||
|
// @ts-nocheck
|
||||||
|
import { Get as get } from '../get/index.js';
|
||||||
|
import { Library as lib } from '../library/index.js';
|
||||||
|
import { Game as game } from '../game/index.js';
|
||||||
|
import { status as _status } from '../status/index.js';
|
||||||
|
import { UI as ui } from '../ui/index.js';
|
||||||
|
|
||||||
|
export function cordovaReady() {
|
||||||
|
lib.path = (await import('../library/path.js')).default;
|
||||||
|
if (lib.device == 'android') {
|
||||||
|
document.addEventListener("pause", function () {
|
||||||
|
if (!_status.paused2 && (typeof _status.event.isMine == 'function' && !_status.event.isMine())) {
|
||||||
|
ui.click.pause();
|
||||||
|
}
|
||||||
|
if (ui.backgroundMusic) {
|
||||||
|
ui.backgroundMusic.pause();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
document.addEventListener("resume", () => {
|
||||||
|
if (ui.backgroundMusic) ui.backgroundMusic.play();
|
||||||
|
});
|
||||||
|
document.addEventListener("backbutton", function () {
|
||||||
|
if (ui.arena && ui.arena.classList.contains('menupaused')) {
|
||||||
|
if (window.saveNonameInput) {
|
||||||
|
window.saveNonameInput();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ui.click.configMenu();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (lib.config.confirm_exit) {
|
||||||
|
navigator.notification.confirm(
|
||||||
|
'是否退出游戏?',
|
||||||
|
function (index) {
|
||||||
|
switch (index) {
|
||||||
|
case 2: game.reload(); break;
|
||||||
|
case 3: navigator.app.exitApp(); break;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'确认退出',
|
||||||
|
['取消', '重新开始', '退出']
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
navigator.app.exitApp();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if ("cordova" in window && "plugins" in window.cordova && "permissions" in window.cordova.plugins) {
|
||||||
|
const permissions = cordova.plugins.permissions;
|
||||||
|
const requests = ["WRITE_EXTERNAL_STORAGE", "READ_EXTERNAL_STORAGE"]
|
||||||
|
requests.forEach(request => {
|
||||||
|
permissions.checkPermission(permissions[request], status => {
|
||||||
|
if (!status.hasPermission) {
|
||||||
|
permissions.requestPermission(permissions[request], lib.other.ignore, lib.other.ignore);
|
||||||
|
}
|
||||||
|
}, lib.other.ignore);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
game.download = function (url, folder, onsuccess, onerror, dev, onprogress) {
|
||||||
|
if (!url.startsWith('http')) {
|
||||||
|
url = get.url(dev) + url;
|
||||||
|
}
|
||||||
|
var fileTransfer = new FileTransfer();
|
||||||
|
folder = lib.assetURL + folder;
|
||||||
|
if (onprogress) {
|
||||||
|
fileTransfer.onprogress = function (progressEvent) {
|
||||||
|
onprogress(progressEvent.loaded, progressEvent.total);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
lib.config.brokenFile.add(folder);
|
||||||
|
game.saveConfigValue('brokenFile');
|
||||||
|
fileTransfer.download(encodeURI(url), encodeURI(folder), function () {
|
||||||
|
lib.config.brokenFile.remove(folder);
|
||||||
|
game.saveConfigValue('brokenFile');
|
||||||
|
if (onsuccess) {
|
||||||
|
onsuccess();
|
||||||
|
}
|
||||||
|
}, onerror);
|
||||||
|
};
|
||||||
|
game.readFile = function (filename, callback, onerror) {
|
||||||
|
window.resolveLocalFileSystemURL(lib.assetURL, function (entry) {
|
||||||
|
entry.getFile(filename, {}, function (fileEntry) {
|
||||||
|
fileEntry.file(function (fileToLoad) {
|
||||||
|
var fileReader = new FileReader();
|
||||||
|
fileReader.onload = function (e) {
|
||||||
|
callback(e.target.result);
|
||||||
|
};
|
||||||
|
fileReader.readAsArrayBuffer(fileToLoad, "UTF-8");
|
||||||
|
}, onerror);
|
||||||
|
}, onerror);
|
||||||
|
}, onerror);
|
||||||
|
};
|
||||||
|
game.readFileAsText = function (filename, callback, onerror) {
|
||||||
|
window.resolveLocalFileSystemURL(lib.assetURL, function (entry) {
|
||||||
|
entry.getFile(filename, {}, function (fileEntry) {
|
||||||
|
fileEntry.file(function (fileToLoad) {
|
||||||
|
var fileReader = new FileReader();
|
||||||
|
fileReader.onload = function (e) {
|
||||||
|
callback(e.target.result);
|
||||||
|
};
|
||||||
|
fileReader.readAsText(fileToLoad, "UTF-8");
|
||||||
|
}, onerror);
|
||||||
|
}, onerror);
|
||||||
|
}, onerror);
|
||||||
|
};
|
||||||
|
game.writeFile = function (data, path, name, callback) {
|
||||||
|
game.ensureDirectory(path, function () {
|
||||||
|
if (Object.prototype.toString.call(data) == '[object File]') {
|
||||||
|
var fileReader = new FileReader();
|
||||||
|
fileReader.onload = function (e) {
|
||||||
|
game.writeFile(e.target.result, path, name, callback);
|
||||||
|
};
|
||||||
|
fileReader.readAsArrayBuffer(data, "UTF-8");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
window.resolveLocalFileSystemURL(lib.assetURL + path, function (entry) {
|
||||||
|
entry.getFile(name, { create: true }, function (fileEntry) {
|
||||||
|
fileEntry.createWriter(function (fileWriter) {
|
||||||
|
fileWriter.onwriteend = callback;
|
||||||
|
fileWriter.write(data);
|
||||||
|
}, callback);
|
||||||
|
}, callback);
|
||||||
|
}, callback);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
game.removeFile = function (dir, callback) {
|
||||||
|
window.resolveLocalFileSystemURL(lib.assetURL, function (entry) {
|
||||||
|
entry.getFile(dir, {}, function (fileEntry) {
|
||||||
|
fileEntry.remove();
|
||||||
|
if (callback) callback();
|
||||||
|
}, callback || function () { });
|
||||||
|
}, callback || function () { });
|
||||||
|
};
|
||||||
|
game.getFileList = (dir, success, failure) => {
|
||||||
|
var files = [], folders = [];
|
||||||
|
window.resolveLocalFileSystemURL(lib.assetURL + dir, entry => {
|
||||||
|
var dirReader = entry.createReader();
|
||||||
|
var entries = [];
|
||||||
|
var readEntries = () => {
|
||||||
|
dirReader.readEntries(results => {
|
||||||
|
if (!results.length) {
|
||||||
|
entries.sort();
|
||||||
|
for (var i = 0; i < entries.length; i++) {
|
||||||
|
if (entries[i].isDirectory) {
|
||||||
|
folders.push(entries[i].name);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
files.push(entries[i].name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
success(folders, files);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
entries = entries.concat(Array.from(results));
|
||||||
|
readEntries();
|
||||||
|
}
|
||||||
|
}, failure);
|
||||||
|
};
|
||||||
|
readEntries();
|
||||||
|
}, failure);
|
||||||
|
};
|
||||||
|
game.ensureDirectory = (list, callback, file) => {
|
||||||
|
const directoryList = typeof list == 'string' ? [list] : list.slice().reverse(), num = file ? 1 : 0, access = (entry, directory, createDirectory) => {
|
||||||
|
if (directory.length <= num) {
|
||||||
|
createDirectory();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const str = directory.pop();
|
||||||
|
return new Promise((resolve, reject) => entry.getDirectory(str, {
|
||||||
|
create: false
|
||||||
|
}, resolve, reject)).catch(() => new Promise(resolve => entry.getDirectory(str, {
|
||||||
|
create: true
|
||||||
|
}, resolve))).then(directoryEntry => access(directoryEntry, directory, createDirectory));
|
||||||
|
};
|
||||||
|
return new Promise((resolve, reject) => window.resolveLocalFileSystemURL(lib.assetURL, rootEntry => {
|
||||||
|
const createDirectory = () => {
|
||||||
|
if (directoryList.length) access(rootEntry, directoryList.pop().split('/').reverse(), createDirectory);
|
||||||
|
if (typeof callback == 'function') callback();
|
||||||
|
resolve();
|
||||||
|
};
|
||||||
|
createDirectory();
|
||||||
|
}, reject));
|
||||||
|
};
|
||||||
|
if (ui.updateUpdate) {
|
||||||
|
ui.updateUpdate();
|
||||||
|
}
|
||||||
|
var showbar = function () {
|
||||||
|
if (window.StatusBar) {
|
||||||
|
if (lib.device == 'android') {
|
||||||
|
if (lib.config.show_statusbar_android) {
|
||||||
|
window.StatusBar.overlaysWebView(false);
|
||||||
|
window.StatusBar.backgroundColorByName('black');
|
||||||
|
window.StatusBar.show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (lib.device == 'ios') {
|
||||||
|
if (lib.config.show_statusbar_ios != 'off' && lib.config.show_statusbar_ios != 'auto') {
|
||||||
|
if (lib.config.show_statusbar_ios == 'default') {
|
||||||
|
window.StatusBar.overlaysWebView(false);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
window.StatusBar.overlaysWebView(true);
|
||||||
|
}
|
||||||
|
window.StatusBar.backgroundColorByName('black');
|
||||||
|
window.StatusBar.show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (lib.arenaReady) {
|
||||||
|
lib.arenaReady.push(showbar);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
showbar();
|
||||||
|
}
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,161 @@
|
||||||
|
// @ts-nocheck
|
||||||
|
import { Get as get } from '../get/index.js';
|
||||||
|
import { Library as lib } from '../library/index.js';
|
||||||
|
import { Game as game } from '../game/index.js';
|
||||||
|
import { status as _status } from '../status/index.js';
|
||||||
|
import { UI as ui } from '../ui/index.js';
|
||||||
|
|
||||||
|
export function nodeReady() {
|
||||||
|
lib.node = {
|
||||||
|
fs: require('fs'),
|
||||||
|
path: require("path"),
|
||||||
|
debug: function () {
|
||||||
|
require('electron').remote.getCurrentWindow().toggleDevTools();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
lib.path = lib.node.path;
|
||||||
|
game.download = function (url, folder, onsuccess, onerror, dev, onprogress) {
|
||||||
|
if (!url.startsWith('http')) {
|
||||||
|
url = get.url(dev) + url;
|
||||||
|
}
|
||||||
|
game.ensureDirectory(folder, function () {
|
||||||
|
try {
|
||||||
|
var file = lib.node.fs.createWriteStream(__dirname + '/' + folder);
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
onerror();
|
||||||
|
}
|
||||||
|
lib.config.brokenFile.add(folder);
|
||||||
|
game.saveConfigValue('brokenFile');
|
||||||
|
if (!lib.node.http) lib.node.http = require('http');
|
||||||
|
if (!lib.node.https) lib.node.https = require('https');
|
||||||
|
var opts = require('url').parse(encodeURI(url));
|
||||||
|
opts.headers = { 'User-Agent': 'AppleWebkit' };
|
||||||
|
(url.startsWith('https') ? lib.node.https : lib.node.http).get(opts, function (response) {
|
||||||
|
var stream = response.pipe(file);
|
||||||
|
stream.on('finish', function () {
|
||||||
|
lib.config.brokenFile.remove(folder);
|
||||||
|
game.saveConfigValue('brokenFile');
|
||||||
|
if (onsuccess) {
|
||||||
|
onsuccess();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
stream.on('error', onerror);
|
||||||
|
if (onprogress) {
|
||||||
|
var streamInterval = setInterval(function () {
|
||||||
|
if (stream.closed) {
|
||||||
|
clearInterval(streamInterval);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
onprogress(stream.bytesWritten);
|
||||||
|
}
|
||||||
|
}, 200);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}, true);
|
||||||
|
};
|
||||||
|
game.readFile = function (filename, callback, onerror) {
|
||||||
|
lib.node.fs.readFile(__dirname + '/' + filename, function (err, data) {
|
||||||
|
if (err) {
|
||||||
|
onerror(err);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
callback(data);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
game.readFileAsText = function (filename, callback, onerror) {
|
||||||
|
lib.node.fs.readFile(__dirname + '/' + filename, 'utf-8', function (err, data) {
|
||||||
|
if (err) {
|
||||||
|
onerror(err);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
callback(data);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
game.writeFile = function (data, path, name, callback) {
|
||||||
|
game.ensureDirectory(path, function () {
|
||||||
|
if (Object.prototype.toString.call(data) == '[object File]') {
|
||||||
|
var fileReader = new FileReader();
|
||||||
|
fileReader.onload = function (e) {
|
||||||
|
game.writeFile(e.target.result, path, name, callback);
|
||||||
|
};
|
||||||
|
fileReader.readAsArrayBuffer(data, "UTF-8");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
get.zip(function (zip) {
|
||||||
|
zip.file('i', data);
|
||||||
|
lib.node.fs.writeFile(__dirname + '/' + path + '/' + name, zip.files.i.asNodeBuffer(), null, callback);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
game.removeFile = function (filename, callback) {
|
||||||
|
lib.node.fs.unlink(__dirname + '/' + filename, callback || function () { });
|
||||||
|
};
|
||||||
|
game.getFileList = (dir, success, failure) => {
|
||||||
|
var files = [], folders = [];
|
||||||
|
dir = __dirname + '/' + dir;
|
||||||
|
if (typeof failure == "undefined") {
|
||||||
|
failure = err => {
|
||||||
|
throw err;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else if (failure == null) {
|
||||||
|
failure = () => { };
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
lib.node.fs.readdir(dir, (err, filelist) => {
|
||||||
|
if (err) {
|
||||||
|
failure(err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (var i = 0; i < filelist.length; i++) {
|
||||||
|
if (filelist[i][0] != '.' && filelist[i][0] != '_') {
|
||||||
|
if (lib.node.fs.statSync(dir + '/' + filelist[i]).isDirectory()) {
|
||||||
|
folders.push(filelist[i]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
files.push(filelist[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
success(folders, files);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
failure(e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
game.ensureDirectory = (list, callback, file) => {
|
||||||
|
const directoryList = typeof list == 'string' ? [list] : list.slice().reverse(), number = file ? 1 : 0, access = (path, directory, createDirectory) => {
|
||||||
|
if (directory.length <= number) {
|
||||||
|
createDirectory();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
path += `/${directory.pop()}`;
|
||||||
|
const fullPath = `${__dirname}${path}`;
|
||||||
|
return new Promise((resolve, reject) => lib.node.fs.access(fullPath, errnoException => {
|
||||||
|
if (errnoException) reject();
|
||||||
|
else resolve();
|
||||||
|
})).catch(() => new Promise((resolve, reject) => lib.node.fs.mkdir(fullPath, errnoException => {
|
||||||
|
if (errnoException) reject(errnoException);
|
||||||
|
else resolve();
|
||||||
|
}))).then(() => access(path, directory, createDirectory), console.log);
|
||||||
|
};
|
||||||
|
return new Promise(resolve => {
|
||||||
|
const createDirectory = () => {
|
||||||
|
if (directoryList.length) access('', directoryList.pop().split('/').reverse(), createDirectory);
|
||||||
|
else {
|
||||||
|
if (typeof callback == 'function') callback();
|
||||||
|
resolve();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
createDirectory();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
if (ui.updateUpdate) {
|
||||||
|
ui.updateUpdate();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,517 @@
|
||||||
|
// @ts-nocheck
|
||||||
|
import { Get as get } from '../get/index.js';
|
||||||
|
import { Library as lib } from '../library/index.js';
|
||||||
|
import { Game as game } from '../game/index.js';
|
||||||
|
import { status as _status } from '../status/index.js';
|
||||||
|
import { UI as ui } from '../ui/index.js';
|
||||||
|
|
||||||
|
HTMLDivElement.prototype.animate = function (name, time) {
|
||||||
|
var that;
|
||||||
|
if (get.is.mobileMe(this) && name == 'target') {
|
||||||
|
that = ui.mebg;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
that = this;
|
||||||
|
}
|
||||||
|
that.classList.add(name);
|
||||||
|
setTimeout(function () {
|
||||||
|
that.classList.remove(name);
|
||||||
|
}, time || 1000);
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
HTMLDivElement.prototype.hide = function () {
|
||||||
|
this.classList.add('hidden');
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
HTMLDivElement.prototype.unfocus = function () {
|
||||||
|
if (lib.config.transparent_dialog) this.classList.add('transparent');
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
HTMLDivElement.prototype.refocus = function () {
|
||||||
|
this.classList.remove('transparent');
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
HTMLDivElement.prototype.show = function () {
|
||||||
|
this.classList.remove('hidden');
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
HTMLDivElement.prototype.delete = function (time, callback) {
|
||||||
|
if (this.timeout) {
|
||||||
|
clearTimeout(this.timeout);
|
||||||
|
delete this.timeout;
|
||||||
|
}
|
||||||
|
if (!this._listeningEnd || this._transitionEnded) {
|
||||||
|
if (typeof time != 'number') time = 500;
|
||||||
|
this.classList.add('removing');
|
||||||
|
var that = this;
|
||||||
|
this.timeout = setTimeout(function () {
|
||||||
|
that.remove();
|
||||||
|
that.classList.remove('removing');
|
||||||
|
if (typeof callback == 'function') {
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
}, time);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this._onEndDelete = true;
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
HTMLDivElement.prototype.goto = function (position, time) {
|
||||||
|
if (this.timeout) {
|
||||||
|
clearTimeout(this.timeout);
|
||||||
|
delete this.timeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof time != 'number') time = 500;
|
||||||
|
this.classList.add('removing');
|
||||||
|
|
||||||
|
var that = this;
|
||||||
|
this.timeout = setTimeout(function () {
|
||||||
|
if (!that._selfDestroyed) {
|
||||||
|
position.appendChild(that);
|
||||||
|
}
|
||||||
|
that.classList.remove('removing');
|
||||||
|
delete that.destiny;
|
||||||
|
}, time);
|
||||||
|
this.destiny = position;
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
HTMLDivElement.prototype.fix = function () {
|
||||||
|
clearTimeout(this.timeout);
|
||||||
|
delete this.timeout;
|
||||||
|
delete this.destiny;
|
||||||
|
this.classList.remove('removing');
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
Reflect.defineProperty(HTMLDivElement.prototype, 'setBackground', {
|
||||||
|
configurable: true,
|
||||||
|
enumerable: false,
|
||||||
|
writable: true,
|
||||||
|
value: function (name, type, ext, subfolder) {
|
||||||
|
if (!name) return;
|
||||||
|
let src;
|
||||||
|
if (ext == 'noskin') ext = '.jpg';
|
||||||
|
ext = ext || '.jpg';
|
||||||
|
subfolder = subfolder || 'default';
|
||||||
|
if (type) {
|
||||||
|
let dbimage = null, extimage = null, modeimage = null, nameinfo, gzbool = false;
|
||||||
|
const mode = get.mode();
|
||||||
|
if (type == 'character') {
|
||||||
|
if (lib.characterPack[`mode_${mode}`] && lib.characterPack[`mode_${mode}`][name]) {
|
||||||
|
if (mode == 'guozhan') {
|
||||||
|
nameinfo = lib.character[name];
|
||||||
|
if (name.startsWith('gz_shibing')) name = name.slice(3, 11);
|
||||||
|
else {
|
||||||
|
if (lib.config.mode_config.guozhan.guozhanSkin && lib.character[name] && lib.character[name][4].contains('gzskin')) gzbool = true;
|
||||||
|
name = name.slice(3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else modeimage = mode;
|
||||||
|
}
|
||||||
|
else if (name.includes('::')) {
|
||||||
|
name = name.split('::');
|
||||||
|
modeimage = name[0];
|
||||||
|
name = name[1];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
nameinfo = get.character(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!modeimage && nameinfo && nameinfo[4]) for (const value of nameinfo[4]) {
|
||||||
|
if (value.startsWith('ext:')) {
|
||||||
|
extimage = value;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (value.startsWith('db:')) {
|
||||||
|
dbimage = value;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (value.startsWith('mode:')) {
|
||||||
|
modeimage = value.slice(5);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (value.startsWith('character:')) {
|
||||||
|
name = value.slice(10);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (extimage) src = extimage.replace(/^ext:/, 'extension/');
|
||||||
|
else if (dbimage) {
|
||||||
|
this.setBackgroundDB(dbimage.slice(3));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
else if (modeimage) src = `image/mode/${modeimage}/character/${name}${ext}`;
|
||||||
|
else if (type == 'character' && lib.config.skin[name] && arguments[2] != 'noskin') src = `image/skin/${name}/${lib.config.skin[name]}${ext}`;
|
||||||
|
else if (type == 'character') {
|
||||||
|
src = `image/character/${gzbool ? 'gz_' : ''}${name}${ext}`;
|
||||||
|
}
|
||||||
|
else src = `image/${type}/${subfolder}/${name}${ext}`;
|
||||||
|
}
|
||||||
|
else src = `image/${name}${ext}`;
|
||||||
|
this.setBackgroundImage(src);
|
||||||
|
this.style.backgroundPositionX = 'center';
|
||||||
|
this.style.backgroundSize = 'cover';
|
||||||
|
if (type === 'character') {
|
||||||
|
const nameinfo = get.character(name);
|
||||||
|
const sex = nameinfo ? nameinfo[0] : 'male';
|
||||||
|
this.style.backgroundImage = [
|
||||||
|
this.style.backgroundImage,
|
||||||
|
`url("${lib.assetURL}image/character/default_silhouette_${sex}${ext}")`,
|
||||||
|
`url("${lib.assetURL}image/character/default_silhouette_male${ext}")`,
|
||||||
|
].join(",");
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
HTMLDivElement.prototype.setBackgroundDB = function (img) {
|
||||||
|
return game.getDB('image', img).then(src => {
|
||||||
|
this.style.backgroundImage = `url('${src}')`;
|
||||||
|
this.style.backgroundSize = "cover";
|
||||||
|
return this;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
HTMLDivElement.prototype.setBackgroundImage = function (img) {
|
||||||
|
this.style.backgroundImage = `url("${lib.assetURL}${img}")`;
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
HTMLDivElement.prototype.listen = function (func) {
|
||||||
|
if (lib.config.touchscreen) {
|
||||||
|
this.addEventListener('touchend', function (e) {
|
||||||
|
if (!_status.dragged) {
|
||||||
|
func.call(this, e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var fallback = function (e) {
|
||||||
|
if (!_status.touchconfirmed) {
|
||||||
|
func.call(this, e);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.removeEventListener('click', fallback);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.addEventListener('click', fallback);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.addEventListener('click', func);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
HTMLDivElement.prototype.listenTransition = function (func, time) {
|
||||||
|
let done = false;
|
||||||
|
const callback = () => {
|
||||||
|
if (!done) {
|
||||||
|
done = true;
|
||||||
|
func.call(this);
|
||||||
|
}
|
||||||
|
clearTimeout(timer);
|
||||||
|
this.removeEventListener('webkitTransitionEnd', callback);
|
||||||
|
};
|
||||||
|
const timer = setTimeout(callback, time || 1000);
|
||||||
|
this.addEventListener('webkitTransitionEnd', callback);
|
||||||
|
return timer;
|
||||||
|
};
|
||||||
|
HTMLDivElement.prototype.setPosition = function () {
|
||||||
|
var position;
|
||||||
|
if (arguments.length == 4) {
|
||||||
|
position = [];
|
||||||
|
for (var i = 0; i < arguments.length; i++) position.push(arguments[i]);
|
||||||
|
}
|
||||||
|
else if (arguments.length == 1 && Array.isArray(arguments[0]) && arguments[0].length == 4) {
|
||||||
|
position = arguments[0];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
var top = 'calc(' + position[0] + '% ';
|
||||||
|
if (position[1] > 0) top += '+ ' + position[1] + 'px)';
|
||||||
|
else top += '- ' + Math.abs(position[1]) + 'px)';
|
||||||
|
var left = 'calc(' + position[2] + '% ';
|
||||||
|
if (position[3] > 0) left += '+ ' + position[3] + 'px)';
|
||||||
|
else left += '- ' + Math.abs(position[3]) + 'px)';
|
||||||
|
this.style.top = top;
|
||||||
|
this.style.left = left;
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
HTMLDivElement.prototype.css = function (style) {
|
||||||
|
for (var i in style) {
|
||||||
|
if (i == 'innerHTML') {
|
||||||
|
this.innerHTML = style[i];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.style[i] = style[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
HTMLTableElement.prototype.get = function (row, col) {
|
||||||
|
if (row < this.childNodes.length) {
|
||||||
|
return this.childNodes[row].childNodes[col];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
/*处理lib.nature的兼容性问题*/
|
||||||
|
const mapHasFunc = function (item) {
|
||||||
|
return this.has(item)
|
||||||
|
};
|
||||||
|
Object.defineProperty(Map.prototype, "contains", {
|
||||||
|
configurable: true,
|
||||||
|
enumerable: false,
|
||||||
|
writable: true,
|
||||||
|
value: mapHasFunc
|
||||||
|
});
|
||||||
|
Object.defineProperty(Map.prototype, "includes", {
|
||||||
|
configurable: true,
|
||||||
|
enumerable: false,
|
||||||
|
writable: true,
|
||||||
|
value: mapHasFunc
|
||||||
|
});
|
||||||
|
const mapAddFunc = function (item) {
|
||||||
|
this.set(item, 0);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
Object.defineProperty(Map.prototype, "add", {
|
||||||
|
configurable: true,
|
||||||
|
enumerable: false,
|
||||||
|
writable: true,
|
||||||
|
value: mapAddFunc
|
||||||
|
});
|
||||||
|
Object.defineProperty(Map.prototype, "push", {
|
||||||
|
configurable: true,
|
||||||
|
enumerable: false,
|
||||||
|
writable: true,
|
||||||
|
value: mapAddFunc
|
||||||
|
});
|
||||||
|
Object.defineProperty(Map.prototype, "addArray", {
|
||||||
|
configurable: true,
|
||||||
|
enumerable: false,
|
||||||
|
writable: true,
|
||||||
|
value: function (arr) {
|
||||||
|
for (var i = 0; i < arr.length; i++) {
|
||||||
|
this.add(arr[i]);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Object.defineProperty(Map.prototype, "remove", {
|
||||||
|
configurable: true,
|
||||||
|
enumerable: false,
|
||||||
|
writable: true,
|
||||||
|
value: function (item) {
|
||||||
|
this.delete(item);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
/*Map prototype end*/
|
||||||
|
Object.defineProperty(Array.prototype, "filterInD", {
|
||||||
|
configurable: true,
|
||||||
|
enumerable: false,
|
||||||
|
writable: true,
|
||||||
|
value: function (pos) {
|
||||||
|
if (typeof pos != 'string') pos = 'o';
|
||||||
|
return this.filter(card => pos.includes(get.position(card, true)));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Object.defineProperty(Array.prototype, "someInD", {
|
||||||
|
configurable: true,
|
||||||
|
enumerable: false,
|
||||||
|
writable: true,
|
||||||
|
value: function (pos) {
|
||||||
|
if (typeof pos != 'string') pos = 'o';
|
||||||
|
return this.some(card => pos.includes(get.position(card, true)));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Object.defineProperty(Array.prototype, "everyInD", {
|
||||||
|
configurable: true,
|
||||||
|
enumerable: false,
|
||||||
|
writable: true,
|
||||||
|
value: function (pos) {
|
||||||
|
if (typeof pos != 'string') pos = 'o';
|
||||||
|
return this.every(card => pos.includes(get.position(card, true)));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
/**
|
||||||
|
*@legacy Use {@link Array#includes} instead.
|
||||||
|
*/
|
||||||
|
Object.defineProperty(Array.prototype, "contains", {
|
||||||
|
configurable: true,
|
||||||
|
enumerable: false,
|
||||||
|
writable: true,
|
||||||
|
value: Array.prototype.includes
|
||||||
|
});
|
||||||
|
Object.defineProperty(Array.prototype, "containsSome", {
|
||||||
|
configurable: true,
|
||||||
|
enumerable: false,
|
||||||
|
writable: true,
|
||||||
|
value: function () {
|
||||||
|
return Array.from(arguments).some(i => this.includes(i));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Object.defineProperty(Array.prototype, "containsAll", {
|
||||||
|
configurable: true,
|
||||||
|
enumerable: false,
|
||||||
|
writable: true,
|
||||||
|
value: function () {
|
||||||
|
return Array.from(arguments).every(i => this.includes(i));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Object.defineProperty(Array.prototype, "add", {
|
||||||
|
configurable: true,
|
||||||
|
enumerable: false,
|
||||||
|
writable: true,
|
||||||
|
value: function () {
|
||||||
|
for (const arg of arguments) {
|
||||||
|
if (this.contains(arg)) continue;
|
||||||
|
this.push(arg);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Object.defineProperty(Array.prototype, "addArray", {
|
||||||
|
configurable: true,
|
||||||
|
enumerable: false,
|
||||||
|
writable: true,
|
||||||
|
value: function () {
|
||||||
|
for (const arr of arguments) {
|
||||||
|
for (const item of arr) this.add(item);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Object.defineProperty(Array.prototype, "remove", {
|
||||||
|
configurable: true,
|
||||||
|
enumerable: false,
|
||||||
|
writable: true,
|
||||||
|
value: function () {
|
||||||
|
for (const item of arguments) {
|
||||||
|
let pos = -1;
|
||||||
|
if (typeof item == 'number' && isNaN(item)) {
|
||||||
|
pos = this.findIndex(v => isNaN(v))
|
||||||
|
} else {
|
||||||
|
pos = this.indexOf(item);
|
||||||
|
}
|
||||||
|
if (pos == -1) continue;
|
||||||
|
this.splice(pos, 1);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Object.defineProperty(Array.prototype, "removeArray", {
|
||||||
|
configurable: true,
|
||||||
|
enumerable: false,
|
||||||
|
writable: true,
|
||||||
|
value: function () {
|
||||||
|
for (const i of Array.from(arguments)) this.remove(...i);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Object.defineProperty(Array.prototype, "unique", {
|
||||||
|
configurable: true,
|
||||||
|
enumerable: false,
|
||||||
|
writable: true,
|
||||||
|
value: function () {
|
||||||
|
let uniqueArray = [...new Set(this)];
|
||||||
|
this.length = uniqueArray.length;
|
||||||
|
for (let i = 0; i < uniqueArray.length; i++) this[i] = uniqueArray[i];
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Object.defineProperty(Array.prototype, "toUniqued", {
|
||||||
|
configurable: true,
|
||||||
|
enumerable: false,
|
||||||
|
writable: true,
|
||||||
|
value: function () {
|
||||||
|
return [...new Set(this)];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Object.defineProperty(Array.prototype, "randomGet", {
|
||||||
|
configurable: true,
|
||||||
|
enumerable: false,
|
||||||
|
writable: true,
|
||||||
|
value: function () {
|
||||||
|
let arr = this.slice(0);
|
||||||
|
arr.removeArray(Array.from(arguments));
|
||||||
|
return arr[Math.floor(Math.random() * arr.length)];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Object.defineProperty(Array.prototype, "randomGets", {
|
||||||
|
configurable: true,
|
||||||
|
enumerable: false,
|
||||||
|
writable: true,
|
||||||
|
value: function (num) {
|
||||||
|
if (num > this.length) num = this.length;
|
||||||
|
let arr = this.slice(0);
|
||||||
|
let list = [];
|
||||||
|
for (let i = 0; i < num; i++) {
|
||||||
|
list.push(arr.splice(Math.floor(Math.random() * arr.length), 1)[0]);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Object.defineProperty(Array.prototype, "randomRemove", {
|
||||||
|
configurable: true,
|
||||||
|
enumerable: false,
|
||||||
|
writable: true,
|
||||||
|
value: function (num) {
|
||||||
|
if (typeof num == 'number') {
|
||||||
|
let list = [];
|
||||||
|
for (let i = 0; i < num; i++) {
|
||||||
|
if (!this.length) break;
|
||||||
|
list.push(this.randomRemove());
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
return this.splice(Math.floor(Math.random() * this.length), 1)[0];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Object.defineProperty(Array.prototype, "randomSort", {
|
||||||
|
configurable: true,
|
||||||
|
enumerable: false,
|
||||||
|
writable: true,
|
||||||
|
value: function () {
|
||||||
|
let list = [];
|
||||||
|
while (this.length) {
|
||||||
|
list.push(this.randomRemove());
|
||||||
|
}
|
||||||
|
for (let i = 0; i < list.length; i++) {
|
||||||
|
this.push(list[i]);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Object.defineProperty(Array.prototype, "sortBySeat", {
|
||||||
|
configurable: true,
|
||||||
|
enumerable: false,
|
||||||
|
writable: true,
|
||||||
|
value: function (target) {
|
||||||
|
lib.tempSortSeat = target;
|
||||||
|
this.sort(lib.sort.seat);
|
||||||
|
delete lib.tempSortSeat;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
/**
|
||||||
|
*@description 从数组中寻找某个特征最大的,且通过筛选的第一个元素
|
||||||
|
*/
|
||||||
|
Object.defineProperty(Array.prototype, "maxBy", {
|
||||||
|
configurable: true,
|
||||||
|
enumerable: false,
|
||||||
|
writable: true,
|
||||||
|
value: function (sortBy, filter) {
|
||||||
|
let list = this.filter(filter || (() => true));
|
||||||
|
if (sortBy && typeof sortBy == 'function') list.sort((a, b) => sortBy(a) - sortBy(b));
|
||||||
|
else list.sort();
|
||||||
|
return list[list.length - 1];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Object.defineProperty(Array.prototype, "minBy", {
|
||||||
|
configurable: true,
|
||||||
|
enumerable: false,
|
||||||
|
writable: true,
|
||||||
|
value: function (sortBy, filter) {
|
||||||
|
let list = this.filter(filter || (() => true));
|
||||||
|
if (sortBy && typeof sortBy == 'function') list.sort((a, b) => sortBy(a) - sortBy(b));
|
||||||
|
else list.sort();
|
||||||
|
return list[0];
|
||||||
|
}
|
||||||
|
});
|
|
@ -0,0 +1,51 @@
|
||||||
|
export interface IAnnounceSubscriber {
|
||||||
|
subscribe(name: string): void;
|
||||||
|
unsubscribe(name: string): void;
|
||||||
|
|
||||||
|
get isEmpty(): boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
export type AnnounceSubscriberType<T> = new (
|
||||||
|
content: (value: T, name: string) => void,
|
||||||
|
target: EventTarget
|
||||||
|
) => IAnnounceSubscriber;
|
||||||
|
|
||||||
|
export class Announce {
|
||||||
|
constructor(eventTarget: EventTarget, records: WeakMap<((arg0: any) => void), IAnnounceSubscriber>, SubscriberType: AnnounceSubscriberType<any> = AnnounceSubscriber)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 推送任意数据给所有监听了指定事件的订阅者,并返回给定的数据
|
||||||
|
*
|
||||||
|
* 若不存在订阅指定事件的订阅者,则推送的数据将无意义
|
||||||
|
*
|
||||||
|
* @param name - 要推送事件的名称
|
||||||
|
* @param values - 要推送的数据
|
||||||
|
*/
|
||||||
|
publish<T>(name: string, values: T): T
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 订阅给定名字的事件,并返回给定的函数
|
||||||
|
*
|
||||||
|
* 在事件触发时执行给定的函数
|
||||||
|
*
|
||||||
|
* 给定的函数将被存储至当前实例中,用于取消订阅时获取
|
||||||
|
*
|
||||||
|
* @param name - 要订阅事件的名称
|
||||||
|
* @param method - 事件触发时执行的函数
|
||||||
|
*/
|
||||||
|
subscribe<T>(name: string, method: (values: T) => void): (values: T) => void
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 取消指定事件某一个函数的订阅,并返回该函数
|
||||||
|
*
|
||||||
|
* 给定的函数将不再于事件触发时执行,其余同事件需触发的函数不受限制
|
||||||
|
*
|
||||||
|
* @param name - 要取消订阅事件的名称
|
||||||
|
* @param method - 订阅指定事件的函数
|
||||||
|
*/
|
||||||
|
unsubscribe<T>(name: string, method: (values: T) => void): (values: T) => void
|
||||||
|
}
|
||||||
|
|
||||||
|
export class AnnounceSubscriber<T> implements IAnnounceSubscriber {
|
||||||
|
constructor(content: (value: T, name: string) => void, target: EventTarget)
|
||||||
|
}
|
|
@ -5,6 +5,14 @@
|
||||||
*/
|
*/
|
||||||
const vm = new WeakMap();
|
const vm = new WeakMap();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @template T
|
||||||
|
* @typedef {import("./index").AnnounceSubscriberType<T>} AnnounceSubscriberType
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @typedef {import("./index").IAnnounceSubscriber} IAnnounceSubscriber
|
||||||
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
@ -15,20 +23,20 @@ export class Announce {
|
||||||
#eventTarget;
|
#eventTarget;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @type {WeakMap<function(any): void, AnnounceSubscriber>}
|
* @type {WeakMap<function(any): void, IAnnounceSubscriber>}
|
||||||
*/
|
*/
|
||||||
#records;
|
#records;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @type {FunctionConstructor}
|
* @type {AnnounceSubscriberType<any>}
|
||||||
*/
|
*/
|
||||||
#SubscriberType;
|
#SubscriberType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param {EventTarget} eventTarget
|
* @param {EventTarget} eventTarget
|
||||||
* @param {WeakMap<function(any): void, AnnounceSubscriber>} records
|
* @param {WeakMap<function(any): void, IAnnounceSubscriber>} records
|
||||||
* @param {FunctionConstructor} [SubscriberType]
|
* @param {AnnounceSubscriberType<any>} [SubscriberType]
|
||||||
*/
|
*/
|
||||||
constructor(eventTarget, records, SubscriberType = AnnounceSubscriber) {
|
constructor(eventTarget, records, SubscriberType = AnnounceSubscriber) {
|
||||||
this.#eventTarget = eventTarget;
|
this.#eventTarget = eventTarget;
|
||||||
|
@ -73,6 +81,7 @@ export class Announce {
|
||||||
subscriber = new this.#SubscriberType(method, this.#eventTarget);
|
subscriber = new this.#SubscriberType(method, this.#eventTarget);
|
||||||
this.#records.set(method, subscriber);
|
this.#records.set(method, subscriber);
|
||||||
}
|
}
|
||||||
|
if (!subscriber) throw new Error()
|
||||||
subscriber.subscribe(name);
|
subscriber.subscribe(name);
|
||||||
return method;
|
return method;
|
||||||
}
|
}
|
||||||
|
@ -90,6 +99,7 @@ export class Announce {
|
||||||
unsubscribe(name, method) {
|
unsubscribe(name, method) {
|
||||||
if (this.#records.has(method)) {
|
if (this.#records.has(method)) {
|
||||||
const subscriber = this.#records.get(method);
|
const subscriber = this.#records.get(method);
|
||||||
|
if (!subscriber) throw new Error()
|
||||||
subscriber.unsubscribe(name);
|
subscriber.unsubscribe(name);
|
||||||
if (subscriber.isEmpty)
|
if (subscriber.isEmpty)
|
||||||
this.#records.delete(method);
|
this.#records.delete(method);
|
||||||
|
@ -101,7 +111,7 @@ export class Announce {
|
||||||
/**
|
/**
|
||||||
* @template T
|
* @template T
|
||||||
*/
|
*/
|
||||||
class AnnounceSubscriber {
|
export class AnnounceSubscriber {
|
||||||
/**
|
/**
|
||||||
* @type {function(CustomEvent): void}
|
* @type {function(CustomEvent): void}
|
||||||
*/
|
*/
|
||||||
|
@ -134,12 +144,19 @@ class AnnounceSubscriber {
|
||||||
* @param {string} name
|
* @param {string} name
|
||||||
*/
|
*/
|
||||||
subscribe(name) {
|
subscribe(name) {
|
||||||
|
// @ts-expect-error MustHave
|
||||||
vm.get(this).addEventListener(name, this.#content);
|
vm.get(this).addEventListener(name, this.#content);
|
||||||
|
// @ts-expect-error NonameDefine
|
||||||
this.#listening.add(name);
|
this.#listening.add(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsubscribe() {
|
/**
|
||||||
|
* @param {string} name
|
||||||
|
*/
|
||||||
|
unsubscribe(name) {
|
||||||
|
// @ts-expect-error MustHave
|
||||||
vm.get(this).removeEventListener(name, this.#content);
|
vm.get(this).removeEventListener(name, this.#content);
|
||||||
|
// @ts-expect-error NonameDefine
|
||||||
this.#listening.remove(name);
|
this.#listening.remove(name);
|
||||||
}
|
}
|
||||||
}
|
}
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,67 @@
|
||||||
|
import { Uninstantable } from "../../util/index.js";
|
||||||
|
import { Library as lib } from "../index.js";
|
||||||
|
|
||||||
|
export class LibInitPromises extends Uninstantable {
|
||||||
|
/**
|
||||||
|
* Promise版的`lib.init.js`
|
||||||
|
*
|
||||||
|
* @param {string} path - 文件路径
|
||||||
|
* @param {string | string[]} [file] - 文件名或文件名组,忽略则直接读取`path`的内容
|
||||||
|
* @returns {Promise<Event>}
|
||||||
|
*/
|
||||||
|
static js(path, file) {
|
||||||
|
return new Promise((resolve, reject) => lib.init.js(path, file, resolve, reject))
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Promise版的`lib.init.css`
|
||||||
|
*
|
||||||
|
* @param {string} path - 文件路径
|
||||||
|
* @param {string | string[]} [file] - 文件名或文件名组,忽略则直接读取`path`的内容
|
||||||
|
* @param {Element} [before] - 新样式dom的位置
|
||||||
|
* @param {boolean} [noerror = false] - 是否忽略报错
|
||||||
|
* @returns {Promise<HTMLLinkElement>}
|
||||||
|
*/
|
||||||
|
static css(path, file, before, noerror = false) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const style = lib.init.css(path, file, before);
|
||||||
|
const success = () => resolve(style);
|
||||||
|
style.addEventListener("load", success);
|
||||||
|
style.addEventListener("error", noerror ? success : reject);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Promise版的`lib.init.req`
|
||||||
|
*
|
||||||
|
* @param {string} str - 要读取的地址
|
||||||
|
* @param {string} [master]
|
||||||
|
* @returns {Promise<ProgressEvent>}
|
||||||
|
*/
|
||||||
|
static req(str, master) {
|
||||||
|
return new Promise((resolve, reject) => lib.init.req(str, resolve, reject, master))
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Promise版的`lib.init.json`
|
||||||
|
*
|
||||||
|
* @param {string} url - 要读取的地址
|
||||||
|
* @returns {Promise<object>}
|
||||||
|
*/
|
||||||
|
static json(url) {
|
||||||
|
return new Promise((resolve, reject) => lib.init.json(url, resolve, reject))
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Promise版的`lib.init.sheet`
|
||||||
|
*
|
||||||
|
* @returns {Promise<HTMLStyleElement>}
|
||||||
|
*/
|
||||||
|
static sheet() {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const style = lib.init.sheet.apply(lib.init, arguments);
|
||||||
|
style.addEventListener("load", () => resolve(style));
|
||||||
|
style.addEventListener("error", reject);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,528 @@
|
||||||
|
// 'path' module extracted from Node.js v8.11.1 (only the posix part)
|
||||||
|
// transplited with Babel
|
||||||
|
|
||||||
|
// Copyright Joyent, Inc. and other Node contributors.
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
// copy of this software and associated documentation files (the
|
||||||
|
// "Software"), to deal in the Software without restriction, including
|
||||||
|
// without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||||
|
// persons to whom the Software is furnished to do so, subject to the
|
||||||
|
// following conditions:
|
||||||
|
//
|
||||||
|
// The above copyright notice and this permission notice shall be included
|
||||||
|
// in all copies or substantial portions of the Software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||||
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||||
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||||
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||||
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
function assertPath(path) {
|
||||||
|
if (typeof path !== 'string') {
|
||||||
|
throw new TypeError('Path must be a string. Received ' + JSON.stringify(path));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Resolves . and .. elements in a path with directory names
|
||||||
|
function normalizeStringPosix(path, allowAboveRoot) {
|
||||||
|
var res = '';
|
||||||
|
var lastSegmentLength = 0;
|
||||||
|
var lastSlash = -1;
|
||||||
|
var dots = 0;
|
||||||
|
var code;
|
||||||
|
for (var i = 0; i <= path.length; ++i) {
|
||||||
|
if (i < path.length)
|
||||||
|
code = path.charCodeAt(i);
|
||||||
|
else if (code === 47 /*/*/)
|
||||||
|
break;
|
||||||
|
else
|
||||||
|
code = 47 /*/*/;
|
||||||
|
if (code === 47 /*/*/) {
|
||||||
|
if (lastSlash === i - 1 || dots === 1) {
|
||||||
|
// NOOP
|
||||||
|
} else if (lastSlash !== i - 1 && dots === 2) {
|
||||||
|
if (res.length < 2 || lastSegmentLength !== 2 || res.charCodeAt(res.length - 1) !== 46 /*.*/ || res.charCodeAt(res.length - 2) !== 46 /*.*/) {
|
||||||
|
if (res.length > 2) {
|
||||||
|
var lastSlashIndex = res.lastIndexOf('/');
|
||||||
|
if (lastSlashIndex !== res.length - 1) {
|
||||||
|
if (lastSlashIndex === -1) {
|
||||||
|
res = '';
|
||||||
|
lastSegmentLength = 0;
|
||||||
|
} else {
|
||||||
|
res = res.slice(0, lastSlashIndex);
|
||||||
|
lastSegmentLength = res.length - 1 - res.lastIndexOf('/');
|
||||||
|
}
|
||||||
|
lastSlash = i;
|
||||||
|
dots = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else if (res.length === 2 || res.length === 1) {
|
||||||
|
res = '';
|
||||||
|
lastSegmentLength = 0;
|
||||||
|
lastSlash = i;
|
||||||
|
dots = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (allowAboveRoot) {
|
||||||
|
if (res.length > 0)
|
||||||
|
res += '/..';
|
||||||
|
else
|
||||||
|
res = '..';
|
||||||
|
lastSegmentLength = 2;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (res.length > 0)
|
||||||
|
res += '/' + path.slice(lastSlash + 1, i);
|
||||||
|
else
|
||||||
|
res = path.slice(lastSlash + 1, i);
|
||||||
|
lastSegmentLength = i - lastSlash - 1;
|
||||||
|
}
|
||||||
|
lastSlash = i;
|
||||||
|
dots = 0;
|
||||||
|
} else if (code === 46 /*.*/ && dots !== -1) {
|
||||||
|
++dots;
|
||||||
|
} else {
|
||||||
|
dots = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _format(sep, pathObject) {
|
||||||
|
var dir = pathObject.dir || pathObject.root;
|
||||||
|
var base = pathObject.base || (pathObject.name || '') + (pathObject.ext || '');
|
||||||
|
if (!dir) {
|
||||||
|
return base;
|
||||||
|
}
|
||||||
|
if (dir === pathObject.root) {
|
||||||
|
return dir + base;
|
||||||
|
}
|
||||||
|
return dir + sep + base;
|
||||||
|
}
|
||||||
|
|
||||||
|
var posix = {
|
||||||
|
// path.resolve([from ...], to)
|
||||||
|
resolve: function resolve() {
|
||||||
|
var resolvedPath = '';
|
||||||
|
var resolvedAbsolute = false;
|
||||||
|
var cwd;
|
||||||
|
|
||||||
|
for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
|
||||||
|
var path;
|
||||||
|
if (i >= 0)
|
||||||
|
path = arguments[i];
|
||||||
|
else {
|
||||||
|
if (cwd === undefined)
|
||||||
|
cwd = process.cwd();
|
||||||
|
path = cwd;
|
||||||
|
}
|
||||||
|
|
||||||
|
assertPath(path);
|
||||||
|
|
||||||
|
// Skip empty entries
|
||||||
|
if (path.length === 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
resolvedPath = path + '/' + resolvedPath;
|
||||||
|
resolvedAbsolute = path.charCodeAt(0) === 47 /*/*/;
|
||||||
|
}
|
||||||
|
|
||||||
|
// At this point the path should be resolved to a full absolute path, but
|
||||||
|
// handle relative paths to be safe (might happen when process.cwd() fails)
|
||||||
|
|
||||||
|
// Normalize the path
|
||||||
|
resolvedPath = normalizeStringPosix(resolvedPath, !resolvedAbsolute);
|
||||||
|
|
||||||
|
if (resolvedAbsolute) {
|
||||||
|
if (resolvedPath.length > 0)
|
||||||
|
return '/' + resolvedPath;
|
||||||
|
else
|
||||||
|
return '/';
|
||||||
|
} else if (resolvedPath.length > 0) {
|
||||||
|
return resolvedPath;
|
||||||
|
} else {
|
||||||
|
return '.';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
normalize: function normalize(path) {
|
||||||
|
assertPath(path);
|
||||||
|
|
||||||
|
if (path.length === 0) return '.';
|
||||||
|
|
||||||
|
var isAbsolute = path.charCodeAt(0) === 47 /*/*/;
|
||||||
|
var trailingSeparator = path.charCodeAt(path.length - 1) === 47 /*/*/;
|
||||||
|
|
||||||
|
// Normalize the path
|
||||||
|
path = normalizeStringPosix(path, !isAbsolute);
|
||||||
|
|
||||||
|
if (path.length === 0 && !isAbsolute) path = '.';
|
||||||
|
if (path.length > 0 && trailingSeparator) path += '/';
|
||||||
|
|
||||||
|
if (isAbsolute) return '/' + path;
|
||||||
|
return path;
|
||||||
|
},
|
||||||
|
|
||||||
|
isAbsolute: function isAbsolute(path) {
|
||||||
|
assertPath(path);
|
||||||
|
return path.length > 0 && path.charCodeAt(0) === 47 /*/*/;
|
||||||
|
},
|
||||||
|
|
||||||
|
join: function join() {
|
||||||
|
if (arguments.length === 0)
|
||||||
|
return '.';
|
||||||
|
var joined;
|
||||||
|
for (var i = 0; i < arguments.length; ++i) {
|
||||||
|
var arg = arguments[i];
|
||||||
|
assertPath(arg);
|
||||||
|
if (arg.length > 0) {
|
||||||
|
if (joined === undefined)
|
||||||
|
joined = arg;
|
||||||
|
else
|
||||||
|
joined += '/' + arg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (joined === undefined)
|
||||||
|
return '.';
|
||||||
|
return posix.normalize(joined);
|
||||||
|
},
|
||||||
|
|
||||||
|
relative: function relative(from, to) {
|
||||||
|
assertPath(from);
|
||||||
|
assertPath(to);
|
||||||
|
|
||||||
|
if (from === to) return '';
|
||||||
|
|
||||||
|
from = posix.resolve(from);
|
||||||
|
to = posix.resolve(to);
|
||||||
|
|
||||||
|
if (from === to) return '';
|
||||||
|
|
||||||
|
// Trim any leading backslashes
|
||||||
|
var fromStart = 1;
|
||||||
|
for (; fromStart < from.length; ++fromStart) {
|
||||||
|
if (from.charCodeAt(fromStart) !== 47 /*/*/)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
var fromEnd = from.length;
|
||||||
|
var fromLen = fromEnd - fromStart;
|
||||||
|
|
||||||
|
// Trim any leading backslashes
|
||||||
|
var toStart = 1;
|
||||||
|
for (; toStart < to.length; ++toStart) {
|
||||||
|
if (to.charCodeAt(toStart) !== 47 /*/*/)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
var toEnd = to.length;
|
||||||
|
var toLen = toEnd - toStart;
|
||||||
|
|
||||||
|
// Compare paths to find the longest common path from root
|
||||||
|
var length = fromLen < toLen ? fromLen : toLen;
|
||||||
|
var lastCommonSep = -1;
|
||||||
|
var i = 0;
|
||||||
|
for (; i <= length; ++i) {
|
||||||
|
if (i === length) {
|
||||||
|
if (toLen > length) {
|
||||||
|
if (to.charCodeAt(toStart + i) === 47 /*/*/) {
|
||||||
|
// We get here if `from` is the exact base path for `to`.
|
||||||
|
// For example: from='/foo/bar'; to='/foo/bar/baz'
|
||||||
|
return to.slice(toStart + i + 1);
|
||||||
|
} else if (i === 0) {
|
||||||
|
// We get here if `from` is the root
|
||||||
|
// For example: from='/'; to='/foo'
|
||||||
|
return to.slice(toStart + i);
|
||||||
|
}
|
||||||
|
} else if (fromLen > length) {
|
||||||
|
if (from.charCodeAt(fromStart + i) === 47 /*/*/) {
|
||||||
|
// We get here if `to` is the exact base path for `from`.
|
||||||
|
// For example: from='/foo/bar/baz'; to='/foo/bar'
|
||||||
|
lastCommonSep = i;
|
||||||
|
} else if (i === 0) {
|
||||||
|
// We get here if `to` is the root.
|
||||||
|
// For example: from='/foo'; to='/'
|
||||||
|
lastCommonSep = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
var fromCode = from.charCodeAt(fromStart + i);
|
||||||
|
var toCode = to.charCodeAt(toStart + i);
|
||||||
|
if (fromCode !== toCode)
|
||||||
|
break;
|
||||||
|
else if (fromCode === 47 /*/*/)
|
||||||
|
lastCommonSep = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
var out = '';
|
||||||
|
// Generate the relative path based on the path difference between `to`
|
||||||
|
// and `from`
|
||||||
|
for (i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i) {
|
||||||
|
if (i === fromEnd || from.charCodeAt(i) === 47 /*/*/) {
|
||||||
|
if (out.length === 0)
|
||||||
|
out += '..';
|
||||||
|
else
|
||||||
|
out += '/..';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lastly, append the rest of the destination (`to`) path that comes after
|
||||||
|
// the common path parts
|
||||||
|
if (out.length > 0)
|
||||||
|
return out + to.slice(toStart + lastCommonSep);
|
||||||
|
else {
|
||||||
|
toStart += lastCommonSep;
|
||||||
|
if (to.charCodeAt(toStart) === 47 /*/*/)
|
||||||
|
++toStart;
|
||||||
|
return to.slice(toStart);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_makeLong: function _makeLong(path) {
|
||||||
|
return path;
|
||||||
|
},
|
||||||
|
|
||||||
|
dirname: function dirname(path) {
|
||||||
|
assertPath(path);
|
||||||
|
if (path.length === 0) return '.';
|
||||||
|
var code = path.charCodeAt(0);
|
||||||
|
var hasRoot = code === 47 /*/*/;
|
||||||
|
var end = -1;
|
||||||
|
var matchedSlash = true;
|
||||||
|
for (var i = path.length - 1; i >= 1; --i) {
|
||||||
|
code = path.charCodeAt(i);
|
||||||
|
if (code === 47 /*/*/) {
|
||||||
|
if (!matchedSlash) {
|
||||||
|
end = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// We saw the first non-path separator
|
||||||
|
matchedSlash = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (end === -1) return hasRoot ? '/' : '.';
|
||||||
|
if (hasRoot && end === 1) return '//';
|
||||||
|
return path.slice(0, end);
|
||||||
|
},
|
||||||
|
|
||||||
|
basename: function basename(path, ext) {
|
||||||
|
if (ext !== undefined && typeof ext !== 'string') throw new TypeError('"ext" argument must be a string');
|
||||||
|
assertPath(path);
|
||||||
|
|
||||||
|
var start = 0;
|
||||||
|
var end = -1;
|
||||||
|
var matchedSlash = true;
|
||||||
|
var i;
|
||||||
|
|
||||||
|
if (ext !== undefined && ext.length > 0 && ext.length <= path.length) {
|
||||||
|
if (ext.length === path.length && ext === path) return '';
|
||||||
|
var extIdx = ext.length - 1;
|
||||||
|
var firstNonSlashEnd = -1;
|
||||||
|
for (i = path.length - 1; i >= 0; --i) {
|
||||||
|
var code = path.charCodeAt(i);
|
||||||
|
if (code === 47 /*/*/) {
|
||||||
|
// If we reached a path separator that was not part of a set of path
|
||||||
|
// separators at the end of the string, stop now
|
||||||
|
if (!matchedSlash) {
|
||||||
|
start = i + 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (firstNonSlashEnd === -1) {
|
||||||
|
// We saw the first non-path separator, remember this index in case
|
||||||
|
// we need it if the extension ends up not matching
|
||||||
|
matchedSlash = false;
|
||||||
|
firstNonSlashEnd = i + 1;
|
||||||
|
}
|
||||||
|
if (extIdx >= 0) {
|
||||||
|
// Try to match the explicit extension
|
||||||
|
if (code === ext.charCodeAt(extIdx)) {
|
||||||
|
if (--extIdx === -1) {
|
||||||
|
// We matched the extension, so mark this as the end of our path
|
||||||
|
// component
|
||||||
|
end = i;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Extension does not match, so our result is the entire path
|
||||||
|
// component
|
||||||
|
extIdx = -1;
|
||||||
|
end = firstNonSlashEnd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (start === end) end = firstNonSlashEnd; else if (end === -1) end = path.length;
|
||||||
|
return path.slice(start, end);
|
||||||
|
} else {
|
||||||
|
for (i = path.length - 1; i >= 0; --i) {
|
||||||
|
if (path.charCodeAt(i) === 47 /*/*/) {
|
||||||
|
// If we reached a path separator that was not part of a set of path
|
||||||
|
// separators at the end of the string, stop now
|
||||||
|
if (!matchedSlash) {
|
||||||
|
start = i + 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (end === -1) {
|
||||||
|
// We saw the first non-path separator, mark this as the end of our
|
||||||
|
// path component
|
||||||
|
matchedSlash = false;
|
||||||
|
end = i + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (end === -1) return '';
|
||||||
|
return path.slice(start, end);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
extname: function extname(path) {
|
||||||
|
assertPath(path);
|
||||||
|
var startDot = -1;
|
||||||
|
var startPart = 0;
|
||||||
|
var end = -1;
|
||||||
|
var matchedSlash = true;
|
||||||
|
// Track the state of characters (if any) we see before our first dot and
|
||||||
|
// after any path separator we find
|
||||||
|
var preDotState = 0;
|
||||||
|
for (var i = path.length - 1; i >= 0; --i) {
|
||||||
|
var code = path.charCodeAt(i);
|
||||||
|
if (code === 47 /*/*/) {
|
||||||
|
// If we reached a path separator that was not part of a set of path
|
||||||
|
// separators at the end of the string, stop now
|
||||||
|
if (!matchedSlash) {
|
||||||
|
startPart = i + 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (end === -1) {
|
||||||
|
// We saw the first non-path separator, mark this as the end of our
|
||||||
|
// extension
|
||||||
|
matchedSlash = false;
|
||||||
|
end = i + 1;
|
||||||
|
}
|
||||||
|
if (code === 46 /*.*/) {
|
||||||
|
// If this is our first dot, mark it as the start of our extension
|
||||||
|
if (startDot === -1)
|
||||||
|
startDot = i;
|
||||||
|
else if (preDotState !== 1)
|
||||||
|
preDotState = 1;
|
||||||
|
} else if (startDot !== -1) {
|
||||||
|
// We saw a non-dot and non-path separator before our dot, so we should
|
||||||
|
// have a good chance at having a non-empty extension
|
||||||
|
preDotState = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (startDot === -1 || end === -1 ||
|
||||||
|
// We saw a non-dot character immediately before the dot
|
||||||
|
preDotState === 0 ||
|
||||||
|
// The (right-most) trimmed path component is exactly '..'
|
||||||
|
preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
return path.slice(startDot, end);
|
||||||
|
},
|
||||||
|
|
||||||
|
format: function format(pathObject) {
|
||||||
|
if (pathObject === null || typeof pathObject !== 'object') {
|
||||||
|
throw new TypeError('The "pathObject" argument must be of type Object. Received type ' + typeof pathObject);
|
||||||
|
}
|
||||||
|
return _format('/', pathObject);
|
||||||
|
},
|
||||||
|
|
||||||
|
parse: function parse(path) {
|
||||||
|
assertPath(path);
|
||||||
|
|
||||||
|
var ret = { root: '', dir: '', base: '', ext: '', name: '' };
|
||||||
|
if (path.length === 0) return ret;
|
||||||
|
var code = path.charCodeAt(0);
|
||||||
|
var isAbsolute = code === 47 /*/*/;
|
||||||
|
var start;
|
||||||
|
if (isAbsolute) {
|
||||||
|
ret.root = '/';
|
||||||
|
start = 1;
|
||||||
|
} else {
|
||||||
|
start = 0;
|
||||||
|
}
|
||||||
|
var startDot = -1;
|
||||||
|
var startPart = 0;
|
||||||
|
var end = -1;
|
||||||
|
var matchedSlash = true;
|
||||||
|
var i = path.length - 1;
|
||||||
|
|
||||||
|
// Track the state of characters (if any) we see before our first dot and
|
||||||
|
// after any path separator we find
|
||||||
|
var preDotState = 0;
|
||||||
|
|
||||||
|
// Get non-dir info
|
||||||
|
for (; i >= start; --i) {
|
||||||
|
code = path.charCodeAt(i);
|
||||||
|
if (code === 47 /*/*/) {
|
||||||
|
// If we reached a path separator that was not part of a set of path
|
||||||
|
// separators at the end of the string, stop now
|
||||||
|
if (!matchedSlash) {
|
||||||
|
startPart = i + 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (end === -1) {
|
||||||
|
// We saw the first non-path separator, mark this as the end of our
|
||||||
|
// extension
|
||||||
|
matchedSlash = false;
|
||||||
|
end = i + 1;
|
||||||
|
}
|
||||||
|
if (code === 46 /*.*/) {
|
||||||
|
// If this is our first dot, mark it as the start of our extension
|
||||||
|
if (startDot === -1) startDot = i; else if (preDotState !== 1) preDotState = 1;
|
||||||
|
} else if (startDot !== -1) {
|
||||||
|
// We saw a non-dot and non-path separator before our dot, so we should
|
||||||
|
// have a good chance at having a non-empty extension
|
||||||
|
preDotState = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (startDot === -1 || end === -1 ||
|
||||||
|
// We saw a non-dot character immediately before the dot
|
||||||
|
preDotState === 0 ||
|
||||||
|
// The (right-most) trimmed path component is exactly '..'
|
||||||
|
preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {
|
||||||
|
if (end !== -1) {
|
||||||
|
if (startPart === 0 && isAbsolute) ret.base = ret.name = path.slice(1, end); else ret.base = ret.name = path.slice(startPart, end);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (startPart === 0 && isAbsolute) {
|
||||||
|
ret.name = path.slice(1, startDot);
|
||||||
|
ret.base = path.slice(1, end);
|
||||||
|
} else {
|
||||||
|
ret.name = path.slice(startPart, startDot);
|
||||||
|
ret.base = path.slice(startPart, end);
|
||||||
|
}
|
||||||
|
ret.ext = path.slice(startDot, end);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (startPart > 0) ret.dir = path.slice(0, startPart - 1); else if (isAbsolute) ret.dir = '/';
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
},
|
||||||
|
|
||||||
|
sep: '/',
|
||||||
|
delimiter: ':',
|
||||||
|
win32: null,
|
||||||
|
posix: null
|
||||||
|
};
|
||||||
|
|
||||||
|
// @ts-ignore
|
||||||
|
posix.posix = posix;
|
||||||
|
|
||||||
|
export default posix;
|
|
@ -0,0 +1,32 @@
|
||||||
|
import { Library as lib } from "../library/index.js";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} name
|
||||||
|
* @returns {any}
|
||||||
|
*/
|
||||||
|
export function get(name) {
|
||||||
|
const config = Reflect.get(lib, 'config');
|
||||||
|
if (!config) return null;
|
||||||
|
return Reflect.get(config, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} name
|
||||||
|
* @param {any} value
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
export function set(name, value) {
|
||||||
|
const config = Reflect.get(lib, 'config');
|
||||||
|
if (!config) return;
|
||||||
|
Reflect.set(config, name, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} name
|
||||||
|
* @returns {boolean}
|
||||||
|
*/
|
||||||
|
export function has(name) {
|
||||||
|
const config = Reflect.get(lib, 'config');
|
||||||
|
if (!config) return false;
|
||||||
|
return Reflect.has(config, name);
|
||||||
|
}
|
Loading…
Reference in New Issue