This commit is contained in:
400
dist/sigpro.js
vendored
400
dist/sigpro.js
vendored
@@ -1,42 +1,4 @@
|
|||||||
(() => {
|
(() => {
|
||||||
var __create = Object.create;
|
|
||||||
var __getProtoOf = Object.getPrototypeOf;
|
|
||||||
var __defProp = Object.defineProperty;
|
|
||||||
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
||||||
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
||||||
function __accessProp(key) {
|
|
||||||
return this[key];
|
|
||||||
}
|
|
||||||
var __toESMCache_node;
|
|
||||||
var __toESMCache_esm;
|
|
||||||
var __toESM = (mod, isNodeMode, target) => {
|
|
||||||
var canCache = mod != null && typeof mod === "object";
|
|
||||||
if (canCache) {
|
|
||||||
var cache = isNodeMode ? __toESMCache_node ??= new WeakMap : __toESMCache_esm ??= new WeakMap;
|
|
||||||
var cached = cache.get(mod);
|
|
||||||
if (cached)
|
|
||||||
return cached;
|
|
||||||
}
|
|
||||||
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
||||||
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
||||||
for (let key of __getOwnPropNames(mod))
|
|
||||||
if (!__hasOwnProp.call(to, key))
|
|
||||||
__defProp(to, key, {
|
|
||||||
get: __accessProp.bind(mod, key),
|
|
||||||
enumerable: true
|
|
||||||
});
|
|
||||||
if (canCache)
|
|
||||||
cache.set(mod, to);
|
|
||||||
return to;
|
|
||||||
};
|
|
||||||
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
||||||
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
||||||
}) : x)(function(x) {
|
|
||||||
if (typeof require !== "undefined")
|
|
||||||
return require.apply(this, arguments);
|
|
||||||
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
||||||
});
|
|
||||||
|
|
||||||
// src/sigpro.js
|
// src/sigpro.js
|
||||||
var isFunc = (f) => typeof f === "function";
|
var isFunc = (f) => typeof f === "function";
|
||||||
var isObj = (o) => o && typeof o === "object";
|
var isObj = (o) => o && typeof o === "object";
|
||||||
@@ -475,336 +437,12 @@
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// src/router.js
|
// src/sigpro.plus.js
|
||||||
var import_node_fs = (() => ({}));
|
|
||||||
|
|
||||||
// node:path
|
|
||||||
function assertPath(path) {
|
|
||||||
if (typeof path !== "string")
|
|
||||||
throw TypeError("Path must be a string. Received " + JSON.stringify(path));
|
|
||||||
}
|
|
||||||
function normalizeStringPosix(path, allowAboveRoot) {
|
|
||||||
var res = "", lastSegmentLength = 0, lastSlash = -1, dots = 0, 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)
|
|
||||||
;
|
|
||||||
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, base = pathObject.base || (pathObject.name || "") + (pathObject.ext || "");
|
|
||||||
if (!dir)
|
|
||||||
return base;
|
|
||||||
if (dir === pathObject.root)
|
|
||||||
return dir + base;
|
|
||||||
return dir + sep + base;
|
|
||||||
}
|
|
||||||
function resolve() {
|
|
||||||
var resolvedPath = "", resolvedAbsolute = false, 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;
|
|
||||||
}
|
|
||||||
if (assertPath(path), path.length === 0)
|
|
||||||
continue;
|
|
||||||
resolvedPath = path + "/" + resolvedPath, resolvedAbsolute = path.charCodeAt(0) === 47;
|
|
||||||
}
|
|
||||||
if (resolvedPath = normalizeStringPosix(resolvedPath, !resolvedAbsolute), resolvedAbsolute)
|
|
||||||
if (resolvedPath.length > 0)
|
|
||||||
return "/" + resolvedPath;
|
|
||||||
else
|
|
||||||
return "/";
|
|
||||||
else if (resolvedPath.length > 0)
|
|
||||||
return resolvedPath;
|
|
||||||
else
|
|
||||||
return ".";
|
|
||||||
}
|
|
||||||
function normalize(path) {
|
|
||||||
if (assertPath(path), path.length === 0)
|
|
||||||
return ".";
|
|
||||||
var isAbsolute = path.charCodeAt(0) === 47, trailingSeparator = path.charCodeAt(path.length - 1) === 47;
|
|
||||||
if (path = normalizeStringPosix(path, !isAbsolute), path.length === 0 && !isAbsolute)
|
|
||||||
path = ".";
|
|
||||||
if (path.length > 0 && trailingSeparator)
|
|
||||||
path += "/";
|
|
||||||
if (isAbsolute)
|
|
||||||
return "/" + path;
|
|
||||||
return path;
|
|
||||||
}
|
|
||||||
function isAbsolute(path) {
|
|
||||||
return assertPath(path), path.length > 0 && path.charCodeAt(0) === 47;
|
|
||||||
}
|
|
||||||
function join() {
|
|
||||||
if (arguments.length === 0)
|
|
||||||
return ".";
|
|
||||||
var joined;
|
|
||||||
for (var i = 0;i < arguments.length; ++i) {
|
|
||||||
var arg = arguments[i];
|
|
||||||
if (assertPath(arg), arg.length > 0)
|
|
||||||
if (joined === undefined)
|
|
||||||
joined = arg;
|
|
||||||
else
|
|
||||||
joined += "/" + arg;
|
|
||||||
}
|
|
||||||
if (joined === undefined)
|
|
||||||
return ".";
|
|
||||||
return normalize(joined);
|
|
||||||
}
|
|
||||||
function relative(from, to) {
|
|
||||||
if (assertPath(from), assertPath(to), from === to)
|
|
||||||
return "";
|
|
||||||
if (from = resolve(from), to = resolve(to), from === to)
|
|
||||||
return "";
|
|
||||||
var fromStart = 1;
|
|
||||||
for (;fromStart < from.length; ++fromStart)
|
|
||||||
if (from.charCodeAt(fromStart) !== 47)
|
|
||||||
break;
|
|
||||||
var fromEnd = from.length, fromLen = fromEnd - fromStart, toStart = 1;
|
|
||||||
for (;toStart < to.length; ++toStart)
|
|
||||||
if (to.charCodeAt(toStart) !== 47)
|
|
||||||
break;
|
|
||||||
var toEnd = to.length, toLen = toEnd - toStart, length = fromLen < toLen ? fromLen : toLen, lastCommonSep = -1, i = 0;
|
|
||||||
for (;i <= length; ++i) {
|
|
||||||
if (i === length) {
|
|
||||||
if (toLen > length) {
|
|
||||||
if (to.charCodeAt(toStart + i) === 47)
|
|
||||||
return to.slice(toStart + i + 1);
|
|
||||||
else if (i === 0)
|
|
||||||
return to.slice(toStart + i);
|
|
||||||
} else if (fromLen > length) {
|
|
||||||
if (from.charCodeAt(fromStart + i) === 47)
|
|
||||||
lastCommonSep = i;
|
|
||||||
else if (i === 0)
|
|
||||||
lastCommonSep = 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
var fromCode = from.charCodeAt(fromStart + i), toCode = to.charCodeAt(toStart + i);
|
|
||||||
if (fromCode !== toCode)
|
|
||||||
break;
|
|
||||||
else if (fromCode === 47)
|
|
||||||
lastCommonSep = i;
|
|
||||||
}
|
|
||||||
var out = "";
|
|
||||||
for (i = fromStart + lastCommonSep + 1;i <= fromEnd; ++i)
|
|
||||||
if (i === fromEnd || from.charCodeAt(i) === 47)
|
|
||||||
if (out.length === 0)
|
|
||||||
out += "..";
|
|
||||||
else
|
|
||||||
out += "/..";
|
|
||||||
if (out.length > 0)
|
|
||||||
return out + to.slice(toStart + lastCommonSep);
|
|
||||||
else {
|
|
||||||
if (toStart += lastCommonSep, to.charCodeAt(toStart) === 47)
|
|
||||||
++toStart;
|
|
||||||
return to.slice(toStart);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function _makeLong(path) {
|
|
||||||
return path;
|
|
||||||
}
|
|
||||||
function dirname(path) {
|
|
||||||
if (assertPath(path), path.length === 0)
|
|
||||||
return ".";
|
|
||||||
var code = path.charCodeAt(0), hasRoot = code === 47, end = -1, matchedSlash = true;
|
|
||||||
for (var i = path.length - 1;i >= 1; --i)
|
|
||||||
if (code = path.charCodeAt(i), code === 47) {
|
|
||||||
if (!matchedSlash) {
|
|
||||||
end = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
matchedSlash = false;
|
|
||||||
if (end === -1)
|
|
||||||
return hasRoot ? "/" : ".";
|
|
||||||
if (hasRoot && end === 1)
|
|
||||||
return "//";
|
|
||||||
return path.slice(0, end);
|
|
||||||
}
|
|
||||||
function basename(path, ext) {
|
|
||||||
if (ext !== undefined && typeof ext !== "string")
|
|
||||||
throw TypeError('"ext" argument must be a string');
|
|
||||||
assertPath(path);
|
|
||||||
var start = 0, end = -1, matchedSlash = true, i;
|
|
||||||
if (ext !== undefined && ext.length > 0 && ext.length <= path.length) {
|
|
||||||
if (ext.length === path.length && ext === path)
|
|
||||||
return "";
|
|
||||||
var extIdx = ext.length - 1, firstNonSlashEnd = -1;
|
|
||||||
for (i = path.length - 1;i >= 0; --i) {
|
|
||||||
var code = path.charCodeAt(i);
|
|
||||||
if (code === 47) {
|
|
||||||
if (!matchedSlash) {
|
|
||||||
start = i + 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (firstNonSlashEnd === -1)
|
|
||||||
matchedSlash = false, firstNonSlashEnd = i + 1;
|
|
||||||
if (extIdx >= 0)
|
|
||||||
if (code === ext.charCodeAt(extIdx)) {
|
|
||||||
if (--extIdx === -1)
|
|
||||||
end = i;
|
|
||||||
} else
|
|
||||||
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 (!matchedSlash) {
|
|
||||||
start = i + 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else if (end === -1)
|
|
||||||
matchedSlash = false, end = i + 1;
|
|
||||||
if (end === -1)
|
|
||||||
return "";
|
|
||||||
return path.slice(start, end);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function extname(path) {
|
|
||||||
assertPath(path);
|
|
||||||
var startDot = -1, startPart = 0, end = -1, matchedSlash = true, preDotState = 0;
|
|
||||||
for (var i = path.length - 1;i >= 0; --i) {
|
|
||||||
var code = path.charCodeAt(i);
|
|
||||||
if (code === 47) {
|
|
||||||
if (!matchedSlash) {
|
|
||||||
startPart = i + 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (end === -1)
|
|
||||||
matchedSlash = false, end = i + 1;
|
|
||||||
if (code === 46) {
|
|
||||||
if (startDot === -1)
|
|
||||||
startDot = i;
|
|
||||||
else if (preDotState !== 1)
|
|
||||||
preDotState = 1;
|
|
||||||
} else if (startDot !== -1)
|
|
||||||
preDotState = -1;
|
|
||||||
}
|
|
||||||
if (startDot === -1 || end === -1 || preDotState === 0 || preDotState === 1 && startDot === end - 1 && startDot === startPart + 1)
|
|
||||||
return "";
|
|
||||||
return path.slice(startDot, end);
|
|
||||||
}
|
|
||||||
function format(pathObject) {
|
|
||||||
if (pathObject === null || typeof pathObject !== "object")
|
|
||||||
throw TypeError('The "pathObject" argument must be of type Object. Received type ' + typeof pathObject);
|
|
||||||
return _format("/", pathObject);
|
|
||||||
}
|
|
||||||
function parse(path) {
|
|
||||||
assertPath(path);
|
|
||||||
var ret = { root: "", dir: "", base: "", ext: "", name: "" };
|
|
||||||
if (path.length === 0)
|
|
||||||
return ret;
|
|
||||||
var code = path.charCodeAt(0), isAbsolute2 = code === 47, start;
|
|
||||||
if (isAbsolute2)
|
|
||||||
ret.root = "/", start = 1;
|
|
||||||
else
|
|
||||||
start = 0;
|
|
||||||
var startDot = -1, startPart = 0, end = -1, matchedSlash = true, i = path.length - 1, preDotState = 0;
|
|
||||||
for (;i >= start; --i) {
|
|
||||||
if (code = path.charCodeAt(i), code === 47) {
|
|
||||||
if (!matchedSlash) {
|
|
||||||
startPart = i + 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (end === -1)
|
|
||||||
matchedSlash = false, end = i + 1;
|
|
||||||
if (code === 46) {
|
|
||||||
if (startDot === -1)
|
|
||||||
startDot = i;
|
|
||||||
else if (preDotState !== 1)
|
|
||||||
preDotState = 1;
|
|
||||||
} else if (startDot !== -1)
|
|
||||||
preDotState = -1;
|
|
||||||
}
|
|
||||||
if (startDot === -1 || end === -1 || preDotState === 0 || preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {
|
|
||||||
if (end !== -1)
|
|
||||||
if (startPart === 0 && isAbsolute2)
|
|
||||||
ret.base = ret.name = path.slice(1, end);
|
|
||||||
else
|
|
||||||
ret.base = ret.name = path.slice(startPart, end);
|
|
||||||
} else {
|
|
||||||
if (startPart === 0 && isAbsolute2)
|
|
||||||
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 (isAbsolute2)
|
|
||||||
ret.dir = "/";
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
var sep = "/";
|
|
||||||
var delimiter = ":";
|
|
||||||
var posix = ((p) => (p.posix = p, p))({ resolve, normalize, isAbsolute, join, relative, _makeLong, dirname, basename, extname, format, parse, sep, delimiter, win32: null, posix: null });
|
|
||||||
|
|
||||||
// src/router.js
|
|
||||||
var router = (routes) => {
|
var router = (routes) => {
|
||||||
const getHash = () => window.location.hash.slice(1) || "/";
|
const getHash = () => window.location.hash.slice(1) || "/";
|
||||||
const path = $(getHash());
|
const path = $(getHash());
|
||||||
const handler = () => path(getHash());
|
const handler = () => path(getHash());
|
||||||
window.addEventListener("hashchange", handler);
|
window.addEventListener("hashchange", handler);
|
||||||
onUnmount(() => window.removeEventListener("hashchange", handler));
|
|
||||||
const hook = h("div", { class: "router-hook" });
|
const hook = h("div", { class: "router-hook" });
|
||||||
let currentView = null;
|
let currentView = null;
|
||||||
watch([path], () => {
|
watch([path], () => {
|
||||||
@@ -826,37 +464,31 @@
|
|||||||
hook.replaceChildren(currentView.container);
|
hook.replaceChildren(currentView.container);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
hook.destroy = () => {
|
||||||
|
window.removeEventListener("hashchange", handler);
|
||||||
|
currentView?.destroy();
|
||||||
|
};
|
||||||
return hook;
|
return hook;
|
||||||
};
|
};
|
||||||
router.params = $({});
|
router.params = $({});
|
||||||
router.to = (p) => window.location.hash = p.replace(/^#?\/?/, "#/");
|
router.to = (p) => window.location.hash = p.replace(/^#?\/?/, "#/");
|
||||||
router.back = () => window.history.back();
|
router.back = () => window.history.back();
|
||||||
router.path = () => window.location.hash.replace(/^#/, "") || "/";
|
router.path = () => window.location.hash.replace(/^#/, "") || "/";
|
||||||
|
var currentLocale = $("en");
|
||||||
// src/utils.js
|
var translations = {};
|
||||||
var db = async (url, data = {}, loading = null) => {
|
var addLang = (obj) => {
|
||||||
if (loading)
|
for (const locale of Object.keys(obj)) {
|
||||||
loading(true);
|
if (!translations[locale])
|
||||||
try {
|
translations[locale] = {};
|
||||||
const res = await fetch(url, {
|
Object.assign(translations[locale], obj[locale]);
|
||||||
method: "POST",
|
|
||||||
headers: { "Content-Type": "application/json" },
|
|
||||||
body: JSON.stringify(data),
|
|
||||||
credentials: "include"
|
|
||||||
});
|
|
||||||
if (!res.ok) {
|
|
||||||
const errorText = await res.text();
|
|
||||||
throw new Error(`Error ${res.status}: ${errorText}`);
|
|
||||||
}
|
|
||||||
return await res.json();
|
|
||||||
} finally {
|
|
||||||
if (loading)
|
|
||||||
loading(false);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
var t = (key) => {
|
||||||
|
return () => translations[currentLocale()]?.[key] ?? key;
|
||||||
|
};
|
||||||
|
|
||||||
// src/build_umd.js
|
// src/build_umd.js
|
||||||
if (typeof window !== "undefined") {
|
if (typeof window !== "undefined") {
|
||||||
Object.assign(window, { $, watch, h, Fragment, when, each, router, mount, batch, onUnmount, isArr, isFunc, isObj, db });
|
Object.assign(window, { $, watch, h, Fragment, when, each, router, addLang, t, mount, batch, isArr, isFunc, isObj });
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
|
|||||||
2
dist/sigpro.min.js
vendored
2
dist/sigpro.min.js
vendored
File diff suppressed because one or more lines are too long
423
dist/router.js → dist/sigpro.plus.js
vendored
423
dist/router.js → dist/sigpro.plus.js
vendored
@@ -364,337 +364,12 @@ if (typeof window !== "undefined") {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// src/router.js
|
// src/sigpro.plus.js
|
||||||
var { default: fs} = (() => ({}));
|
|
||||||
|
|
||||||
// node:path
|
|
||||||
function assertPath(path) {
|
|
||||||
if (typeof path !== "string")
|
|
||||||
throw TypeError("Path must be a string. Received " + JSON.stringify(path));
|
|
||||||
}
|
|
||||||
function normalizeStringPosix(path, allowAboveRoot) {
|
|
||||||
var res = "", lastSegmentLength = 0, lastSlash = -1, dots = 0, 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)
|
|
||||||
;
|
|
||||||
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, base = pathObject.base || (pathObject.name || "") + (pathObject.ext || "");
|
|
||||||
if (!dir)
|
|
||||||
return base;
|
|
||||||
if (dir === pathObject.root)
|
|
||||||
return dir + base;
|
|
||||||
return dir + sep + base;
|
|
||||||
}
|
|
||||||
function resolve() {
|
|
||||||
var resolvedPath = "", resolvedAbsolute = false, 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;
|
|
||||||
}
|
|
||||||
if (assertPath(path), path.length === 0)
|
|
||||||
continue;
|
|
||||||
resolvedPath = path + "/" + resolvedPath, resolvedAbsolute = path.charCodeAt(0) === 47;
|
|
||||||
}
|
|
||||||
if (resolvedPath = normalizeStringPosix(resolvedPath, !resolvedAbsolute), resolvedAbsolute)
|
|
||||||
if (resolvedPath.length > 0)
|
|
||||||
return "/" + resolvedPath;
|
|
||||||
else
|
|
||||||
return "/";
|
|
||||||
else if (resolvedPath.length > 0)
|
|
||||||
return resolvedPath;
|
|
||||||
else
|
|
||||||
return ".";
|
|
||||||
}
|
|
||||||
function normalize(path) {
|
|
||||||
if (assertPath(path), path.length === 0)
|
|
||||||
return ".";
|
|
||||||
var isAbsolute = path.charCodeAt(0) === 47, trailingSeparator = path.charCodeAt(path.length - 1) === 47;
|
|
||||||
if (path = normalizeStringPosix(path, !isAbsolute), path.length === 0 && !isAbsolute)
|
|
||||||
path = ".";
|
|
||||||
if (path.length > 0 && trailingSeparator)
|
|
||||||
path += "/";
|
|
||||||
if (isAbsolute)
|
|
||||||
return "/" + path;
|
|
||||||
return path;
|
|
||||||
}
|
|
||||||
function isAbsolute(path) {
|
|
||||||
return assertPath(path), path.length > 0 && path.charCodeAt(0) === 47;
|
|
||||||
}
|
|
||||||
function join() {
|
|
||||||
if (arguments.length === 0)
|
|
||||||
return ".";
|
|
||||||
var joined;
|
|
||||||
for (var i = 0;i < arguments.length; ++i) {
|
|
||||||
var arg = arguments[i];
|
|
||||||
if (assertPath(arg), arg.length > 0)
|
|
||||||
if (joined === undefined)
|
|
||||||
joined = arg;
|
|
||||||
else
|
|
||||||
joined += "/" + arg;
|
|
||||||
}
|
|
||||||
if (joined === undefined)
|
|
||||||
return ".";
|
|
||||||
return normalize(joined);
|
|
||||||
}
|
|
||||||
function relative(from, to) {
|
|
||||||
if (assertPath(from), assertPath(to), from === to)
|
|
||||||
return "";
|
|
||||||
if (from = resolve(from), to = resolve(to), from === to)
|
|
||||||
return "";
|
|
||||||
var fromStart = 1;
|
|
||||||
for (;fromStart < from.length; ++fromStart)
|
|
||||||
if (from.charCodeAt(fromStart) !== 47)
|
|
||||||
break;
|
|
||||||
var fromEnd = from.length, fromLen = fromEnd - fromStart, toStart = 1;
|
|
||||||
for (;toStart < to.length; ++toStart)
|
|
||||||
if (to.charCodeAt(toStart) !== 47)
|
|
||||||
break;
|
|
||||||
var toEnd = to.length, toLen = toEnd - toStart, length = fromLen < toLen ? fromLen : toLen, lastCommonSep = -1, i = 0;
|
|
||||||
for (;i <= length; ++i) {
|
|
||||||
if (i === length) {
|
|
||||||
if (toLen > length) {
|
|
||||||
if (to.charCodeAt(toStart + i) === 47)
|
|
||||||
return to.slice(toStart + i + 1);
|
|
||||||
else if (i === 0)
|
|
||||||
return to.slice(toStart + i);
|
|
||||||
} else if (fromLen > length) {
|
|
||||||
if (from.charCodeAt(fromStart + i) === 47)
|
|
||||||
lastCommonSep = i;
|
|
||||||
else if (i === 0)
|
|
||||||
lastCommonSep = 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
var fromCode = from.charCodeAt(fromStart + i), toCode = to.charCodeAt(toStart + i);
|
|
||||||
if (fromCode !== toCode)
|
|
||||||
break;
|
|
||||||
else if (fromCode === 47)
|
|
||||||
lastCommonSep = i;
|
|
||||||
}
|
|
||||||
var out = "";
|
|
||||||
for (i = fromStart + lastCommonSep + 1;i <= fromEnd; ++i)
|
|
||||||
if (i === fromEnd || from.charCodeAt(i) === 47)
|
|
||||||
if (out.length === 0)
|
|
||||||
out += "..";
|
|
||||||
else
|
|
||||||
out += "/..";
|
|
||||||
if (out.length > 0)
|
|
||||||
return out + to.slice(toStart + lastCommonSep);
|
|
||||||
else {
|
|
||||||
if (toStart += lastCommonSep, to.charCodeAt(toStart) === 47)
|
|
||||||
++toStart;
|
|
||||||
return to.slice(toStart);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function _makeLong(path) {
|
|
||||||
return path;
|
|
||||||
}
|
|
||||||
function dirname(path) {
|
|
||||||
if (assertPath(path), path.length === 0)
|
|
||||||
return ".";
|
|
||||||
var code = path.charCodeAt(0), hasRoot = code === 47, end = -1, matchedSlash = true;
|
|
||||||
for (var i = path.length - 1;i >= 1; --i)
|
|
||||||
if (code = path.charCodeAt(i), code === 47) {
|
|
||||||
if (!matchedSlash) {
|
|
||||||
end = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
matchedSlash = false;
|
|
||||||
if (end === -1)
|
|
||||||
return hasRoot ? "/" : ".";
|
|
||||||
if (hasRoot && end === 1)
|
|
||||||
return "//";
|
|
||||||
return path.slice(0, end);
|
|
||||||
}
|
|
||||||
function basename(path, ext) {
|
|
||||||
if (ext !== undefined && typeof ext !== "string")
|
|
||||||
throw TypeError('"ext" argument must be a string');
|
|
||||||
assertPath(path);
|
|
||||||
var start = 0, end = -1, matchedSlash = true, i;
|
|
||||||
if (ext !== undefined && ext.length > 0 && ext.length <= path.length) {
|
|
||||||
if (ext.length === path.length && ext === path)
|
|
||||||
return "";
|
|
||||||
var extIdx = ext.length - 1, firstNonSlashEnd = -1;
|
|
||||||
for (i = path.length - 1;i >= 0; --i) {
|
|
||||||
var code = path.charCodeAt(i);
|
|
||||||
if (code === 47) {
|
|
||||||
if (!matchedSlash) {
|
|
||||||
start = i + 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (firstNonSlashEnd === -1)
|
|
||||||
matchedSlash = false, firstNonSlashEnd = i + 1;
|
|
||||||
if (extIdx >= 0)
|
|
||||||
if (code === ext.charCodeAt(extIdx)) {
|
|
||||||
if (--extIdx === -1)
|
|
||||||
end = i;
|
|
||||||
} else
|
|
||||||
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 (!matchedSlash) {
|
|
||||||
start = i + 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else if (end === -1)
|
|
||||||
matchedSlash = false, end = i + 1;
|
|
||||||
if (end === -1)
|
|
||||||
return "";
|
|
||||||
return path.slice(start, end);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function extname(path) {
|
|
||||||
assertPath(path);
|
|
||||||
var startDot = -1, startPart = 0, end = -1, matchedSlash = true, preDotState = 0;
|
|
||||||
for (var i = path.length - 1;i >= 0; --i) {
|
|
||||||
var code = path.charCodeAt(i);
|
|
||||||
if (code === 47) {
|
|
||||||
if (!matchedSlash) {
|
|
||||||
startPart = i + 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (end === -1)
|
|
||||||
matchedSlash = false, end = i + 1;
|
|
||||||
if (code === 46) {
|
|
||||||
if (startDot === -1)
|
|
||||||
startDot = i;
|
|
||||||
else if (preDotState !== 1)
|
|
||||||
preDotState = 1;
|
|
||||||
} else if (startDot !== -1)
|
|
||||||
preDotState = -1;
|
|
||||||
}
|
|
||||||
if (startDot === -1 || end === -1 || preDotState === 0 || preDotState === 1 && startDot === end - 1 && startDot === startPart + 1)
|
|
||||||
return "";
|
|
||||||
return path.slice(startDot, end);
|
|
||||||
}
|
|
||||||
function format(pathObject) {
|
|
||||||
if (pathObject === null || typeof pathObject !== "object")
|
|
||||||
throw TypeError('The "pathObject" argument must be of type Object. Received type ' + typeof pathObject);
|
|
||||||
return _format("/", pathObject);
|
|
||||||
}
|
|
||||||
function parse(path) {
|
|
||||||
assertPath(path);
|
|
||||||
var ret = { root: "", dir: "", base: "", ext: "", name: "" };
|
|
||||||
if (path.length === 0)
|
|
||||||
return ret;
|
|
||||||
var code = path.charCodeAt(0), isAbsolute2 = code === 47, start;
|
|
||||||
if (isAbsolute2)
|
|
||||||
ret.root = "/", start = 1;
|
|
||||||
else
|
|
||||||
start = 0;
|
|
||||||
var startDot = -1, startPart = 0, end = -1, matchedSlash = true, i = path.length - 1, preDotState = 0;
|
|
||||||
for (;i >= start; --i) {
|
|
||||||
if (code = path.charCodeAt(i), code === 47) {
|
|
||||||
if (!matchedSlash) {
|
|
||||||
startPart = i + 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (end === -1)
|
|
||||||
matchedSlash = false, end = i + 1;
|
|
||||||
if (code === 46) {
|
|
||||||
if (startDot === -1)
|
|
||||||
startDot = i;
|
|
||||||
else if (preDotState !== 1)
|
|
||||||
preDotState = 1;
|
|
||||||
} else if (startDot !== -1)
|
|
||||||
preDotState = -1;
|
|
||||||
}
|
|
||||||
if (startDot === -1 || end === -1 || preDotState === 0 || preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {
|
|
||||||
if (end !== -1)
|
|
||||||
if (startPart === 0 && isAbsolute2)
|
|
||||||
ret.base = ret.name = path.slice(1, end);
|
|
||||||
else
|
|
||||||
ret.base = ret.name = path.slice(startPart, end);
|
|
||||||
} else {
|
|
||||||
if (startPart === 0 && isAbsolute2)
|
|
||||||
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 (isAbsolute2)
|
|
||||||
ret.dir = "/";
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
var sep = "/";
|
|
||||||
var delimiter = ":";
|
|
||||||
var posix = ((p) => (p.posix = p, p))({ resolve, normalize, isAbsolute, join, relative, _makeLong, dirname, basename, extname, format, parse, sep, delimiter, win32: null, posix: null });
|
|
||||||
var path_default = posix;
|
|
||||||
|
|
||||||
// src/router.js
|
|
||||||
var router = (routes) => {
|
var router = (routes) => {
|
||||||
const getHash = () => window.location.hash.slice(1) || "/";
|
const getHash = () => window.location.hash.slice(1) || "/";
|
||||||
const path = $(getHash());
|
const path = $(getHash());
|
||||||
const handler = () => path(getHash());
|
const handler = () => path(getHash());
|
||||||
window.addEventListener("hashchange", handler);
|
window.addEventListener("hashchange", handler);
|
||||||
onUnmount(() => window.removeEventListener("hashchange", handler));
|
|
||||||
const hook = h("div", { class: "router-hook" });
|
const hook = h("div", { class: "router-hook" });
|
||||||
let currentView = null;
|
let currentView = null;
|
||||||
watch([path], () => {
|
watch([path], () => {
|
||||||
@@ -716,61 +391,57 @@ var router = (routes) => {
|
|||||||
hook.replaceChildren(currentView.container);
|
hook.replaceChildren(currentView.container);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
hook.destroy = () => {
|
||||||
|
window.removeEventListener("hashchange", handler);
|
||||||
|
currentView?.destroy();
|
||||||
|
};
|
||||||
return hook;
|
return hook;
|
||||||
};
|
};
|
||||||
router.params = $({});
|
router.params = $({});
|
||||||
router.to = (p) => window.location.hash = p.replace(/^#?\/?/, "#/");
|
router.to = (p) => window.location.hash = p.replace(/^#?\/?/, "#/");
|
||||||
router.back = () => window.history.back();
|
router.back = () => window.history.back();
|
||||||
router.path = () => window.location.hash.replace(/^#/, "") || "/";
|
router.path = () => window.location.hash.replace(/^#/, "") || "/";
|
||||||
function sigproRouter() {
|
var db = async (url, data = {}, loading = null) => {
|
||||||
const virtualModuleId = "virtual:sigpro-routes";
|
if (loading)
|
||||||
const resolvedVirtualModuleId = "\x00" + virtualModuleId;
|
loading(true);
|
||||||
const getFiles = (dir) => {
|
try {
|
||||||
if (!fs.existsSync(dir))
|
const res = await fetch(url, {
|
||||||
return [];
|
method: "POST",
|
||||||
return fs.readdirSync(dir, { recursive: true }).filter((file) => /\.(js|jsx)$/.test(file) && !path_default.basename(file).startsWith("_")).map((file) => path_default.resolve(dir, file));
|
headers: { "Content-Type": "application/json" },
|
||||||
};
|
body: JSON.stringify(data),
|
||||||
const pathToUrl = (pagesDir, filePath) => {
|
credentials: "include"
|
||||||
let relative2 = path_default.relative(pagesDir, filePath).replace(/\\/g, "/").replace(/\.(js|jsx)$/, "").replace(/\/index$/, "").replace(/^index$/, "");
|
});
|
||||||
return ("/" + relative2).replace(/\/+/g, "/").replace(/\[\.\.\.([^\]]+)\]/g, "*").replace(/\[([^\]]+)\]/g, ":$1").replace(/\/$/, "") || "/";
|
if (!res.ok) {
|
||||||
};
|
const errorText = await res.text();
|
||||||
return {
|
throw new Error(`Error ${res.status}: ${errorText}`);
|
||||||
name: "sigpro-router",
|
|
||||||
resolveId(id) {
|
|
||||||
if (id === virtualModuleId)
|
|
||||||
return resolvedVirtualModuleId;
|
|
||||||
},
|
|
||||||
load(id) {
|
|
||||||
if (id !== resolvedVirtualModuleId)
|
|
||||||
return;
|
|
||||||
const root = process.cwd();
|
|
||||||
const pagesDir = path_default.resolve(root, "src/pages");
|
|
||||||
const files = getFiles(pagesDir).sort((a, b) => {
|
|
||||||
const urlA = pathToUrl(pagesDir, a);
|
|
||||||
const urlB = pathToUrl(pagesDir, b);
|
|
||||||
if (urlA.includes(":") && !urlB.includes(":"))
|
|
||||||
return 1;
|
|
||||||
if (!urlA.includes(":") && urlB.includes(":"))
|
|
||||||
return -1;
|
|
||||||
return urlB.length - urlA.length;
|
|
||||||
});
|
|
||||||
let routeEntries = "";
|
|
||||||
files.forEach((fullPath) => {
|
|
||||||
const urlPath = pathToUrl(pagesDir, fullPath);
|
|
||||||
const relativeImport = "./" + path_default.relative(root, fullPath).replace(/\\/g, "/");
|
|
||||||
routeEntries += ` { path: '${urlPath}', component: () => import('/${relativeImport}') },
|
|
||||||
`;
|
|
||||||
});
|
|
||||||
if (!routeEntries.includes("path: '*'")) {
|
|
||||||
routeEntries += ` { path: '*', component: () => ({ default: () => document.createTextNode('404 - Not Found') }) },
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
return `export const routes = [
|
|
||||||
${routeEntries}];`;
|
|
||||||
}
|
}
|
||||||
};
|
return await res.json();
|
||||||
}
|
} finally {
|
||||||
export {
|
if (loading)
|
||||||
sigproRouter,
|
loading(false);
|
||||||
router
|
}
|
||||||
|
};
|
||||||
|
var currentLocale = $("en");
|
||||||
|
var translations = {};
|
||||||
|
var addLang = (obj) => {
|
||||||
|
for (const locale of Object.keys(obj)) {
|
||||||
|
if (!translations[locale])
|
||||||
|
translations[locale] = {};
|
||||||
|
Object.assign(translations[locale], obj[locale]);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var setLocale = (locale) => {
|
||||||
|
if (locale && translations[locale]) {
|
||||||
|
currentLocale(locale);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var t = (key) => {
|
||||||
|
return () => translations[currentLocale()]?.[key] ?? key;
|
||||||
|
};
|
||||||
|
export {
|
||||||
|
t,
|
||||||
|
setLocale,
|
||||||
|
router,
|
||||||
|
db,
|
||||||
|
addLang
|
||||||
};
|
};
|
||||||
52
dist/sigpro.vite.js
vendored
Normal file
52
dist/sigpro.vite.js
vendored
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
// src/sigpro.vite.js
|
||||||
|
function sigproRouter() {
|
||||||
|
const virtualModuleId = "virtual:sigpro-routes";
|
||||||
|
const resolvedVirtualModuleId = "\x00" + virtualModuleId;
|
||||||
|
const getFiles = (dir) => {
|
||||||
|
if (!fs.existsSync(dir))
|
||||||
|
return [];
|
||||||
|
return fs.readdirSync(dir, { recursive: true }).filter((file) => /\.(js|jsx)$/.test(file) && !path.basename(file).startsWith("_")).map((file) => path.resolve(dir, file));
|
||||||
|
};
|
||||||
|
const pathToUrl = (pagesDir, filePath) => {
|
||||||
|
let relative = path.relative(pagesDir, filePath).replace(/\\/g, "/").replace(/\.(js|jsx)$/, "").replace(/\/index$/, "").replace(/^index$/, "");
|
||||||
|
return ("/" + relative).replace(/\/+/g, "/").replace(/\[\.\.\.([^\]]+)\]/g, "*").replace(/\[([^\]]+)\]/g, ":$1").replace(/\/$/, "") || "/";
|
||||||
|
};
|
||||||
|
return {
|
||||||
|
name: "sigpro-router",
|
||||||
|
resolveId(id) {
|
||||||
|
if (id === virtualModuleId)
|
||||||
|
return resolvedVirtualModuleId;
|
||||||
|
},
|
||||||
|
load(id) {
|
||||||
|
if (id !== resolvedVirtualModuleId)
|
||||||
|
return;
|
||||||
|
const root = process.cwd();
|
||||||
|
const pagesDir = path.resolve(root, "src/pages");
|
||||||
|
const files = getFiles(pagesDir).sort((a, b) => {
|
||||||
|
const urlA = pathToUrl(pagesDir, a);
|
||||||
|
const urlB = pathToUrl(pagesDir, b);
|
||||||
|
if (urlA.includes(":") && !urlB.includes(":"))
|
||||||
|
return 1;
|
||||||
|
if (!urlA.includes(":") && urlB.includes(":"))
|
||||||
|
return -1;
|
||||||
|
return urlB.length - urlA.length;
|
||||||
|
});
|
||||||
|
let routeEntries = "";
|
||||||
|
files.forEach((fullPath) => {
|
||||||
|
const urlPath = pathToUrl(pagesDir, fullPath);
|
||||||
|
const relativeImport = "./" + path.relative(root, fullPath).replace(/\\/g, "/");
|
||||||
|
routeEntries += ` { path: '${urlPath}', component: () => import('/${relativeImport}') },
|
||||||
|
`;
|
||||||
|
});
|
||||||
|
if (!routeEntries.includes("path: '*'")) {
|
||||||
|
routeEntries += ` { path: '*', component: () => ({ default: () => document.createTextNode('404 - Not Found') }) },
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
return `export const routes = [
|
||||||
|
${routeEntries}];`;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
export {
|
||||||
|
sigproRouter
|
||||||
|
};
|
||||||
24
dist/utils.js
vendored
24
dist/utils.js
vendored
@@ -1,24 +0,0 @@
|
|||||||
// src/utils.js
|
|
||||||
var db = async (url, data = {}, loading = null) => {
|
|
||||||
if (loading)
|
|
||||||
loading(true);
|
|
||||||
try {
|
|
||||||
const res = await fetch(url, {
|
|
||||||
method: "POST",
|
|
||||||
headers: { "Content-Type": "application/json" },
|
|
||||||
body: JSON.stringify(data),
|
|
||||||
credentials: "include"
|
|
||||||
});
|
|
||||||
if (!res.ok) {
|
|
||||||
const errorText = await res.text();
|
|
||||||
throw new Error(`Error ${res.status}: ${errorText}`);
|
|
||||||
}
|
|
||||||
return await res.json();
|
|
||||||
} finally {
|
|
||||||
if (loading)
|
|
||||||
loading(false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
export {
|
|
||||||
db
|
|
||||||
};
|
|
||||||
@@ -17,7 +17,7 @@ router(routes: Route[]): HTMLElement
|
|||||||
|
|
||||||
**Returns:** A `div` element (with class `"router-hook"`) that acts as the router outlet. The router automatically destroys the previous view and mounts the matched component when the hash changes.
|
**Returns:** A `div` element (with class `"router-hook"`) that acts as the router outlet. The router automatically destroys the previous view and mounts the matched component when the hash changes.
|
||||||
|
|
||||||
> **Availability:** `router` and its helper methods (`router.to`, `router.back`, `router.path`, `router.params`) are exported from the SigPro module. In **ESM** you must import them (`import { router } from 'sigpro/router'`). In the **IIFE** classic script, they are automatically available on `window`. The examples below assume the functions are already in scope.
|
> **Availability:** `router` and its helper methods (`router.to`, `router.back`, `router.path`, `router.params`) are exported from the SigPro module. In **ESM** you must import them (`import { router } from 'sigpro/plus'`). In the **IIFE** classic script, they are automatically available on `window`. The examples below assume the functions are already in scope.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -223,7 +223,7 @@ Add the plugin to your `vite.config.js`. It works out of the box with zero confi
|
|||||||
```javascript
|
```javascript
|
||||||
// vite.config.js
|
// vite.config.js
|
||||||
import { defineConfig } from 'vite';
|
import { defineConfig } from 'vite';
|
||||||
import { sigproRouter } from 'sigpro/router';
|
import { sigproRouter } from 'sigpro/vite';
|
||||||
|
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
plugins: [sigproRouter()]
|
plugins: [sigproRouter()]
|
||||||
@@ -243,7 +243,7 @@ Thanks to **SigPro's synchronous initialization**, you no longer need to wrap yo
|
|||||||
```javascript
|
```javascript
|
||||||
// src/main.js
|
// src/main.js
|
||||||
import { mount } from 'sigpro';
|
import { mount } from 'sigpro';
|
||||||
import { router } from 'sigpro/router';
|
import { router } from 'sigpro/plus';
|
||||||
import { routes } from 'virtual:sigpro-routes';
|
import { routes } from 'virtual:sigpro-routes';
|
||||||
|
|
||||||
// The Core already has Router ready
|
// The Core already has Router ready
|
||||||
|
|||||||
400
docs/sigpro.js
400
docs/sigpro.js
@@ -1,42 +1,4 @@
|
|||||||
(() => {
|
(() => {
|
||||||
var __create = Object.create;
|
|
||||||
var __getProtoOf = Object.getPrototypeOf;
|
|
||||||
var __defProp = Object.defineProperty;
|
|
||||||
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
||||||
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
||||||
function __accessProp(key) {
|
|
||||||
return this[key];
|
|
||||||
}
|
|
||||||
var __toESMCache_node;
|
|
||||||
var __toESMCache_esm;
|
|
||||||
var __toESM = (mod, isNodeMode, target) => {
|
|
||||||
var canCache = mod != null && typeof mod === "object";
|
|
||||||
if (canCache) {
|
|
||||||
var cache = isNodeMode ? __toESMCache_node ??= new WeakMap : __toESMCache_esm ??= new WeakMap;
|
|
||||||
var cached = cache.get(mod);
|
|
||||||
if (cached)
|
|
||||||
return cached;
|
|
||||||
}
|
|
||||||
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
||||||
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
||||||
for (let key of __getOwnPropNames(mod))
|
|
||||||
if (!__hasOwnProp.call(to, key))
|
|
||||||
__defProp(to, key, {
|
|
||||||
get: __accessProp.bind(mod, key),
|
|
||||||
enumerable: true
|
|
||||||
});
|
|
||||||
if (canCache)
|
|
||||||
cache.set(mod, to);
|
|
||||||
return to;
|
|
||||||
};
|
|
||||||
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
||||||
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
||||||
}) : x)(function(x) {
|
|
||||||
if (typeof require !== "undefined")
|
|
||||||
return require.apply(this, arguments);
|
|
||||||
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
||||||
});
|
|
||||||
|
|
||||||
// src/sigpro.js
|
// src/sigpro.js
|
||||||
var isFunc = (f) => typeof f === "function";
|
var isFunc = (f) => typeof f === "function";
|
||||||
var isObj = (o) => o && typeof o === "object";
|
var isObj = (o) => o && typeof o === "object";
|
||||||
@@ -475,336 +437,12 @@
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// src/router.js
|
// src/sigpro.plus.js
|
||||||
var import_node_fs = (() => ({}));
|
|
||||||
|
|
||||||
// node:path
|
|
||||||
function assertPath(path) {
|
|
||||||
if (typeof path !== "string")
|
|
||||||
throw TypeError("Path must be a string. Received " + JSON.stringify(path));
|
|
||||||
}
|
|
||||||
function normalizeStringPosix(path, allowAboveRoot) {
|
|
||||||
var res = "", lastSegmentLength = 0, lastSlash = -1, dots = 0, 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)
|
|
||||||
;
|
|
||||||
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, base = pathObject.base || (pathObject.name || "") + (pathObject.ext || "");
|
|
||||||
if (!dir)
|
|
||||||
return base;
|
|
||||||
if (dir === pathObject.root)
|
|
||||||
return dir + base;
|
|
||||||
return dir + sep + base;
|
|
||||||
}
|
|
||||||
function resolve() {
|
|
||||||
var resolvedPath = "", resolvedAbsolute = false, 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;
|
|
||||||
}
|
|
||||||
if (assertPath(path), path.length === 0)
|
|
||||||
continue;
|
|
||||||
resolvedPath = path + "/" + resolvedPath, resolvedAbsolute = path.charCodeAt(0) === 47;
|
|
||||||
}
|
|
||||||
if (resolvedPath = normalizeStringPosix(resolvedPath, !resolvedAbsolute), resolvedAbsolute)
|
|
||||||
if (resolvedPath.length > 0)
|
|
||||||
return "/" + resolvedPath;
|
|
||||||
else
|
|
||||||
return "/";
|
|
||||||
else if (resolvedPath.length > 0)
|
|
||||||
return resolvedPath;
|
|
||||||
else
|
|
||||||
return ".";
|
|
||||||
}
|
|
||||||
function normalize(path) {
|
|
||||||
if (assertPath(path), path.length === 0)
|
|
||||||
return ".";
|
|
||||||
var isAbsolute = path.charCodeAt(0) === 47, trailingSeparator = path.charCodeAt(path.length - 1) === 47;
|
|
||||||
if (path = normalizeStringPosix(path, !isAbsolute), path.length === 0 && !isAbsolute)
|
|
||||||
path = ".";
|
|
||||||
if (path.length > 0 && trailingSeparator)
|
|
||||||
path += "/";
|
|
||||||
if (isAbsolute)
|
|
||||||
return "/" + path;
|
|
||||||
return path;
|
|
||||||
}
|
|
||||||
function isAbsolute(path) {
|
|
||||||
return assertPath(path), path.length > 0 && path.charCodeAt(0) === 47;
|
|
||||||
}
|
|
||||||
function join() {
|
|
||||||
if (arguments.length === 0)
|
|
||||||
return ".";
|
|
||||||
var joined;
|
|
||||||
for (var i = 0;i < arguments.length; ++i) {
|
|
||||||
var arg = arguments[i];
|
|
||||||
if (assertPath(arg), arg.length > 0)
|
|
||||||
if (joined === undefined)
|
|
||||||
joined = arg;
|
|
||||||
else
|
|
||||||
joined += "/" + arg;
|
|
||||||
}
|
|
||||||
if (joined === undefined)
|
|
||||||
return ".";
|
|
||||||
return normalize(joined);
|
|
||||||
}
|
|
||||||
function relative(from, to) {
|
|
||||||
if (assertPath(from), assertPath(to), from === to)
|
|
||||||
return "";
|
|
||||||
if (from = resolve(from), to = resolve(to), from === to)
|
|
||||||
return "";
|
|
||||||
var fromStart = 1;
|
|
||||||
for (;fromStart < from.length; ++fromStart)
|
|
||||||
if (from.charCodeAt(fromStart) !== 47)
|
|
||||||
break;
|
|
||||||
var fromEnd = from.length, fromLen = fromEnd - fromStart, toStart = 1;
|
|
||||||
for (;toStart < to.length; ++toStart)
|
|
||||||
if (to.charCodeAt(toStart) !== 47)
|
|
||||||
break;
|
|
||||||
var toEnd = to.length, toLen = toEnd - toStart, length = fromLen < toLen ? fromLen : toLen, lastCommonSep = -1, i = 0;
|
|
||||||
for (;i <= length; ++i) {
|
|
||||||
if (i === length) {
|
|
||||||
if (toLen > length) {
|
|
||||||
if (to.charCodeAt(toStart + i) === 47)
|
|
||||||
return to.slice(toStart + i + 1);
|
|
||||||
else if (i === 0)
|
|
||||||
return to.slice(toStart + i);
|
|
||||||
} else if (fromLen > length) {
|
|
||||||
if (from.charCodeAt(fromStart + i) === 47)
|
|
||||||
lastCommonSep = i;
|
|
||||||
else if (i === 0)
|
|
||||||
lastCommonSep = 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
var fromCode = from.charCodeAt(fromStart + i), toCode = to.charCodeAt(toStart + i);
|
|
||||||
if (fromCode !== toCode)
|
|
||||||
break;
|
|
||||||
else if (fromCode === 47)
|
|
||||||
lastCommonSep = i;
|
|
||||||
}
|
|
||||||
var out = "";
|
|
||||||
for (i = fromStart + lastCommonSep + 1;i <= fromEnd; ++i)
|
|
||||||
if (i === fromEnd || from.charCodeAt(i) === 47)
|
|
||||||
if (out.length === 0)
|
|
||||||
out += "..";
|
|
||||||
else
|
|
||||||
out += "/..";
|
|
||||||
if (out.length > 0)
|
|
||||||
return out + to.slice(toStart + lastCommonSep);
|
|
||||||
else {
|
|
||||||
if (toStart += lastCommonSep, to.charCodeAt(toStart) === 47)
|
|
||||||
++toStart;
|
|
||||||
return to.slice(toStart);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function _makeLong(path) {
|
|
||||||
return path;
|
|
||||||
}
|
|
||||||
function dirname(path) {
|
|
||||||
if (assertPath(path), path.length === 0)
|
|
||||||
return ".";
|
|
||||||
var code = path.charCodeAt(0), hasRoot = code === 47, end = -1, matchedSlash = true;
|
|
||||||
for (var i = path.length - 1;i >= 1; --i)
|
|
||||||
if (code = path.charCodeAt(i), code === 47) {
|
|
||||||
if (!matchedSlash) {
|
|
||||||
end = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
matchedSlash = false;
|
|
||||||
if (end === -1)
|
|
||||||
return hasRoot ? "/" : ".";
|
|
||||||
if (hasRoot && end === 1)
|
|
||||||
return "//";
|
|
||||||
return path.slice(0, end);
|
|
||||||
}
|
|
||||||
function basename(path, ext) {
|
|
||||||
if (ext !== undefined && typeof ext !== "string")
|
|
||||||
throw TypeError('"ext" argument must be a string');
|
|
||||||
assertPath(path);
|
|
||||||
var start = 0, end = -1, matchedSlash = true, i;
|
|
||||||
if (ext !== undefined && ext.length > 0 && ext.length <= path.length) {
|
|
||||||
if (ext.length === path.length && ext === path)
|
|
||||||
return "";
|
|
||||||
var extIdx = ext.length - 1, firstNonSlashEnd = -1;
|
|
||||||
for (i = path.length - 1;i >= 0; --i) {
|
|
||||||
var code = path.charCodeAt(i);
|
|
||||||
if (code === 47) {
|
|
||||||
if (!matchedSlash) {
|
|
||||||
start = i + 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (firstNonSlashEnd === -1)
|
|
||||||
matchedSlash = false, firstNonSlashEnd = i + 1;
|
|
||||||
if (extIdx >= 0)
|
|
||||||
if (code === ext.charCodeAt(extIdx)) {
|
|
||||||
if (--extIdx === -1)
|
|
||||||
end = i;
|
|
||||||
} else
|
|
||||||
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 (!matchedSlash) {
|
|
||||||
start = i + 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else if (end === -1)
|
|
||||||
matchedSlash = false, end = i + 1;
|
|
||||||
if (end === -1)
|
|
||||||
return "";
|
|
||||||
return path.slice(start, end);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function extname(path) {
|
|
||||||
assertPath(path);
|
|
||||||
var startDot = -1, startPart = 0, end = -1, matchedSlash = true, preDotState = 0;
|
|
||||||
for (var i = path.length - 1;i >= 0; --i) {
|
|
||||||
var code = path.charCodeAt(i);
|
|
||||||
if (code === 47) {
|
|
||||||
if (!matchedSlash) {
|
|
||||||
startPart = i + 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (end === -1)
|
|
||||||
matchedSlash = false, end = i + 1;
|
|
||||||
if (code === 46) {
|
|
||||||
if (startDot === -1)
|
|
||||||
startDot = i;
|
|
||||||
else if (preDotState !== 1)
|
|
||||||
preDotState = 1;
|
|
||||||
} else if (startDot !== -1)
|
|
||||||
preDotState = -1;
|
|
||||||
}
|
|
||||||
if (startDot === -1 || end === -1 || preDotState === 0 || preDotState === 1 && startDot === end - 1 && startDot === startPart + 1)
|
|
||||||
return "";
|
|
||||||
return path.slice(startDot, end);
|
|
||||||
}
|
|
||||||
function format(pathObject) {
|
|
||||||
if (pathObject === null || typeof pathObject !== "object")
|
|
||||||
throw TypeError('The "pathObject" argument must be of type Object. Received type ' + typeof pathObject);
|
|
||||||
return _format("/", pathObject);
|
|
||||||
}
|
|
||||||
function parse(path) {
|
|
||||||
assertPath(path);
|
|
||||||
var ret = { root: "", dir: "", base: "", ext: "", name: "" };
|
|
||||||
if (path.length === 0)
|
|
||||||
return ret;
|
|
||||||
var code = path.charCodeAt(0), isAbsolute2 = code === 47, start;
|
|
||||||
if (isAbsolute2)
|
|
||||||
ret.root = "/", start = 1;
|
|
||||||
else
|
|
||||||
start = 0;
|
|
||||||
var startDot = -1, startPart = 0, end = -1, matchedSlash = true, i = path.length - 1, preDotState = 0;
|
|
||||||
for (;i >= start; --i) {
|
|
||||||
if (code = path.charCodeAt(i), code === 47) {
|
|
||||||
if (!matchedSlash) {
|
|
||||||
startPart = i + 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (end === -1)
|
|
||||||
matchedSlash = false, end = i + 1;
|
|
||||||
if (code === 46) {
|
|
||||||
if (startDot === -1)
|
|
||||||
startDot = i;
|
|
||||||
else if (preDotState !== 1)
|
|
||||||
preDotState = 1;
|
|
||||||
} else if (startDot !== -1)
|
|
||||||
preDotState = -1;
|
|
||||||
}
|
|
||||||
if (startDot === -1 || end === -1 || preDotState === 0 || preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {
|
|
||||||
if (end !== -1)
|
|
||||||
if (startPart === 0 && isAbsolute2)
|
|
||||||
ret.base = ret.name = path.slice(1, end);
|
|
||||||
else
|
|
||||||
ret.base = ret.name = path.slice(startPart, end);
|
|
||||||
} else {
|
|
||||||
if (startPart === 0 && isAbsolute2)
|
|
||||||
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 (isAbsolute2)
|
|
||||||
ret.dir = "/";
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
var sep = "/";
|
|
||||||
var delimiter = ":";
|
|
||||||
var posix = ((p) => (p.posix = p, p))({ resolve, normalize, isAbsolute, join, relative, _makeLong, dirname, basename, extname, format, parse, sep, delimiter, win32: null, posix: null });
|
|
||||||
|
|
||||||
// src/router.js
|
|
||||||
var router = (routes) => {
|
var router = (routes) => {
|
||||||
const getHash = () => window.location.hash.slice(1) || "/";
|
const getHash = () => window.location.hash.slice(1) || "/";
|
||||||
const path = $(getHash());
|
const path = $(getHash());
|
||||||
const handler = () => path(getHash());
|
const handler = () => path(getHash());
|
||||||
window.addEventListener("hashchange", handler);
|
window.addEventListener("hashchange", handler);
|
||||||
onUnmount(() => window.removeEventListener("hashchange", handler));
|
|
||||||
const hook = h("div", { class: "router-hook" });
|
const hook = h("div", { class: "router-hook" });
|
||||||
let currentView = null;
|
let currentView = null;
|
||||||
watch([path], () => {
|
watch([path], () => {
|
||||||
@@ -826,37 +464,31 @@
|
|||||||
hook.replaceChildren(currentView.container);
|
hook.replaceChildren(currentView.container);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
hook.destroy = () => {
|
||||||
|
window.removeEventListener("hashchange", handler);
|
||||||
|
currentView?.destroy();
|
||||||
|
};
|
||||||
return hook;
|
return hook;
|
||||||
};
|
};
|
||||||
router.params = $({});
|
router.params = $({});
|
||||||
router.to = (p) => window.location.hash = p.replace(/^#?\/?/, "#/");
|
router.to = (p) => window.location.hash = p.replace(/^#?\/?/, "#/");
|
||||||
router.back = () => window.history.back();
|
router.back = () => window.history.back();
|
||||||
router.path = () => window.location.hash.replace(/^#/, "") || "/";
|
router.path = () => window.location.hash.replace(/^#/, "") || "/";
|
||||||
|
var currentLocale = $("en");
|
||||||
// src/utils.js
|
var translations = {};
|
||||||
var db = async (url, data = {}, loading = null) => {
|
var addLang = (obj) => {
|
||||||
if (loading)
|
for (const locale of Object.keys(obj)) {
|
||||||
loading(true);
|
if (!translations[locale])
|
||||||
try {
|
translations[locale] = {};
|
||||||
const res = await fetch(url, {
|
Object.assign(translations[locale], obj[locale]);
|
||||||
method: "POST",
|
|
||||||
headers: { "Content-Type": "application/json" },
|
|
||||||
body: JSON.stringify(data),
|
|
||||||
credentials: "include"
|
|
||||||
});
|
|
||||||
if (!res.ok) {
|
|
||||||
const errorText = await res.text();
|
|
||||||
throw new Error(`Error ${res.status}: ${errorText}`);
|
|
||||||
}
|
|
||||||
return await res.json();
|
|
||||||
} finally {
|
|
||||||
if (loading)
|
|
||||||
loading(false);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
var t = (key) => {
|
||||||
|
return () => translations[currentLocale()]?.[key] ?? key;
|
||||||
|
};
|
||||||
|
|
||||||
// src/build_umd.js
|
// src/build_umd.js
|
||||||
if (typeof window !== "undefined") {
|
if (typeof window !== "undefined") {
|
||||||
Object.assign(window, { $, watch, h, Fragment, when, each, router, mount, batch, onUnmount, isArr, isFunc, isObj, db });
|
Object.assign(window, { $, watch, h, Fragment, when, each, router, addLang, t, mount, batch, isArr, isFunc, isObj });
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
|
|||||||
14
package.json
14
package.json
@@ -19,11 +19,11 @@
|
|||||||
"script": "./dist/sigpro.min.js",
|
"script": "./dist/sigpro.min.js",
|
||||||
"types": "./sigpro.d.ts"
|
"types": "./sigpro.d.ts"
|
||||||
},
|
},
|
||||||
"./router": {
|
"./plus": {
|
||||||
"import": "./dist/router.js"
|
"import": "./dist/sigpro.plus.js"
|
||||||
},
|
},
|
||||||
"./utils": {
|
"./vite": {
|
||||||
"import": "./dist/utils.js"
|
"import": "./dist/sigpro.vite.js"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
@@ -49,10 +49,10 @@
|
|||||||
"build:iife:min": "bun build ./src/build_umd.js --bundle --outfile=./dist/sigpro.min.js --format=iife --global-name=sp --minify",
|
"build:iife:min": "bun build ./src/build_umd.js --bundle --outfile=./dist/sigpro.min.js --format=iife --global-name=sp --minify",
|
||||||
"build:esm": "bun build ./src/sigpro.js --bundle --outfile=./dist/sigpro.esm.js --format=esm",
|
"build:esm": "bun build ./src/sigpro.js --bundle --outfile=./dist/sigpro.esm.js --format=esm",
|
||||||
"build:esm:min": "bun build ./src/sigpro.js --bundle --outfile=./dist/sigpro.esm.min.js --format=esm --minify",
|
"build:esm:min": "bun build ./src/sigpro.js --bundle --outfile=./dist/sigpro.esm.min.js --format=esm --minify",
|
||||||
"build:router": "bun build ./src/router.js --bundle --outfile=./dist/router.js --format=esm --external:fs --external:path",
|
"build:plus": "bun build ./src/sigpro.plus.js --bundle --outfile=./dist/sigpro.plus.js --format=esm",
|
||||||
"build:utils": "bun build ./src/utils.js --bundle --outfile=./dist/utils.js --format=esm --external:fs --external:path",
|
"build:vite": "bun build ./src/sigpro.vite.js --bundle --outfile=./dist/sigpro.vite.js --format=esm --external:fs --external:path",
|
||||||
"build:copy": "cp ./dist/sigpro.js ./docs/sigpro.js",
|
"build:copy": "cp ./dist/sigpro.js ./docs/sigpro.js",
|
||||||
"build": "bun run build:iife && bun run build:iife:min && bun run build:esm && bun run build:esm:min && bun run build:router && bun run build:utils && bun run build:copy",
|
"build": "bun run build:iife && bun run build:iife:min && bun run build:esm && bun run build:esm:min && bun run build:plus && bun run build:vite && bun run build:copy",
|
||||||
"docs": "bun x serve docs"
|
"docs": "bun x serve docs"
|
||||||
},
|
},
|
||||||
"keywords": [
|
"keywords": [
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import { $, watch, batch, h, Fragment, mount, when, each, onUnmount, isArr, isFunc, isObj } from "./sigpro.js"
|
import { $, watch, batch, h, Fragment, mount, when, each, isArr, isFunc, isObj } from "./sigpro.js"
|
||||||
import { router } from "./router.js"
|
import { router, addLang, t } from "./sigpro.plus.js"
|
||||||
import { db } from "./utils.js"
|
|
||||||
|
|
||||||
if (typeof window !== "undefined") {
|
if (typeof window !== "undefined") {
|
||||||
Object.assign(window, { $, watch, h, Fragment, when, each, router, mount, batch, onUnmount, isArr, isFunc, isObj, db })
|
Object.assign(window, { $, watch, h, Fragment, when, each, router, addLang, t, mount, batch, isArr, isFunc, isObj })
|
||||||
}
|
}
|
||||||
101
src/router.js
101
src/router.js
@@ -1,101 +0,0 @@
|
|||||||
// src/router.js
|
|
||||||
import { h, watch, $, render, onUnmount, isFunc } from './sigpro.js';
|
|
||||||
import fs from 'node:fs';
|
|
||||||
import path from 'node:path';
|
|
||||||
|
|
||||||
const router = routes => {
|
|
||||||
const getHash = () => window.location.hash.slice(1) || "/";
|
|
||||||
const path = $(getHash());
|
|
||||||
const handler = () => path(getHash());
|
|
||||||
window.addEventListener("hashchange", handler);
|
|
||||||
onUnmount(() => window.removeEventListener("hashchange", handler));
|
|
||||||
|
|
||||||
const hook = h("div", { class: "router-hook" });
|
|
||||||
let currentView = null;
|
|
||||||
|
|
||||||
watch([path], () => {
|
|
||||||
const cur = path();
|
|
||||||
const route = routes.find(r => {
|
|
||||||
const p1 = r.path.split("/").filter(Boolean);
|
|
||||||
const p2 = cur.split("/").filter(Boolean);
|
|
||||||
return p1.length === p2.length && p1.every((p, i) => p[0] === ":" || p === p2[i]);
|
|
||||||
}) || routes.find(r => r.path === "*");
|
|
||||||
|
|
||||||
if (route) {
|
|
||||||
currentView?.destroy();
|
|
||||||
const params = {};
|
|
||||||
route.path.split("/").filter(Boolean).forEach((p, i) => {
|
|
||||||
if (p[0] === ":") params[p.slice(1)] = cur.split("/").filter(Boolean)[i];
|
|
||||||
});
|
|
||||||
router.params(params);
|
|
||||||
currentView = render(() => isFunc(route.component) ? route.component(params) : route.component);
|
|
||||||
hook.replaceChildren(currentView.container);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return hook;
|
|
||||||
};
|
|
||||||
|
|
||||||
router.params = $({});
|
|
||||||
router.to = p => window.location.hash = p.replace(/^#?\/?/, "#/");
|
|
||||||
router.back = () => window.history.back();
|
|
||||||
router.path = () => window.location.hash.replace(/^#/, "") || "/";
|
|
||||||
|
|
||||||
function sigproRouter() {
|
|
||||||
const virtualModuleId = 'virtual:sigpro-routes';
|
|
||||||
const resolvedVirtualModuleId = '\0' + virtualModuleId;
|
|
||||||
|
|
||||||
const getFiles = (dir) => {
|
|
||||||
if (!fs.existsSync(dir)) return [];
|
|
||||||
return fs.readdirSync(dir, { recursive: true })
|
|
||||||
.filter(file => /\.(js|jsx)$/.test(file) && !path.basename(file).startsWith('_'))
|
|
||||||
.map(file => path.resolve(dir, file));
|
|
||||||
};
|
|
||||||
|
|
||||||
const pathToUrl = (pagesDir, filePath) => {
|
|
||||||
let relative = path.relative(pagesDir, filePath)
|
|
||||||
.replace(/\\/g, '/')
|
|
||||||
.replace(/\.(js|jsx)$/, '')
|
|
||||||
.replace(/\/index$/, '')
|
|
||||||
.replace(/^index$/, '');
|
|
||||||
return ('/' + relative)
|
|
||||||
.replace(/\/+/g, '/')
|
|
||||||
.replace(/\[\.\.\.([^\]]+)\]/g, '*')
|
|
||||||
.replace(/\[([^\]]+)\]/g, ':$1')
|
|
||||||
.replace(/\/$/, '') || '/';
|
|
||||||
};
|
|
||||||
|
|
||||||
return {
|
|
||||||
name: 'sigpro-router',
|
|
||||||
resolveId(id) {
|
|
||||||
if (id === virtualModuleId) return resolvedVirtualModuleId;
|
|
||||||
},
|
|
||||||
load(id) {
|
|
||||||
if (id !== resolvedVirtualModuleId) return;
|
|
||||||
const root = process.cwd();
|
|
||||||
const pagesDir = path.resolve(root, 'src/pages');
|
|
||||||
const files = getFiles(pagesDir).sort((a, b) => {
|
|
||||||
const urlA = pathToUrl(pagesDir, a);
|
|
||||||
const urlB = pathToUrl(pagesDir, b);
|
|
||||||
if (urlA.includes(':') && !urlB.includes(':')) return 1;
|
|
||||||
if (!urlA.includes(':') && urlB.includes(':')) return -1;
|
|
||||||
return urlB.length - urlA.length;
|
|
||||||
});
|
|
||||||
|
|
||||||
let routeEntries = '';
|
|
||||||
files.forEach((fullPath) => {
|
|
||||||
const urlPath = pathToUrl(pagesDir, fullPath);
|
|
||||||
const relativeImport = './' + path.relative(root, fullPath).replace(/\\/g, '/');
|
|
||||||
routeEntries += ` { path: '${urlPath}', component: () => import('/${relativeImport}') },\n`;
|
|
||||||
});
|
|
||||||
if (!routeEntries.includes("path: '*'")) {
|
|
||||||
routeEntries += ` { path: '*', component: () => ({ default: () => document.createTextNode('404 - Not Found') }) },\n`;
|
|
||||||
}
|
|
||||||
return `export const routes = [\n${routeEntries}];`;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
// ============================================================
|
|
||||||
// Exportación final (lo que se consume desde 'sigpro/router')
|
|
||||||
// ============================================================
|
|
||||||
export { router, sigproRouter };
|
|
||||||
89
src/sigpro.plus.js
Normal file
89
src/sigpro.plus.js
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
// plus
|
||||||
|
import { h, watch, $, render, isFunc } from './sigpro';
|
||||||
|
|
||||||
|
// router
|
||||||
|
export const router = routes => {
|
||||||
|
const getHash = () => window.location.hash.slice(1) || "/";
|
||||||
|
const path = $(getHash());
|
||||||
|
const handler = () => path(getHash());
|
||||||
|
window.addEventListener("hashchange", handler);
|
||||||
|
|
||||||
|
const hook = h("div", { class: "router-hook" });
|
||||||
|
let currentView = null;
|
||||||
|
|
||||||
|
watch([path], () => {
|
||||||
|
const cur = path();
|
||||||
|
const route = routes.find(r => {
|
||||||
|
const p1 = r.path.split("/").filter(Boolean);
|
||||||
|
const p2 = cur.split("/").filter(Boolean);
|
||||||
|
return p1.length === p2.length && p1.every((p, i) => p[0] === ":" || p === p2[i]);
|
||||||
|
}) || routes.find(r => r.path === "*");
|
||||||
|
|
||||||
|
if (route) {
|
||||||
|
currentView?.destroy();
|
||||||
|
const params = {};
|
||||||
|
route.path.split("/").filter(Boolean).forEach((p, i) => {
|
||||||
|
if (p[0] === ":") params[p.slice(1)] = cur.split("/").filter(Boolean)[i];
|
||||||
|
});
|
||||||
|
router.params(params);
|
||||||
|
currentView = render(() => isFunc(route.component) ? route.component(params) : route.component);
|
||||||
|
hook.replaceChildren(currentView.container);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
hook.destroy = () => {
|
||||||
|
window.removeEventListener("hashchange", handler);
|
||||||
|
currentView?.destroy();
|
||||||
|
};
|
||||||
|
|
||||||
|
return hook;
|
||||||
|
};
|
||||||
|
|
||||||
|
router.params = $({});
|
||||||
|
router.to = p => window.location.hash = p.replace(/^#?\/?/, "#/");
|
||||||
|
router.back = () => window.history.back();
|
||||||
|
router.path = () => window.location.hash.replace(/^#/, "") || "/";
|
||||||
|
|
||||||
|
// db
|
||||||
|
export const db = async (url, data = {}, loading = null) => {
|
||||||
|
if (loading) loading(true);
|
||||||
|
try {
|
||||||
|
const res = await fetch(url, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
body: JSON.stringify(data),
|
||||||
|
credentials: 'include'
|
||||||
|
});
|
||||||
|
if (!res.ok) {
|
||||||
|
const errorText = await res.text();
|
||||||
|
throw new Error(`Error ${res.status}: ${errorText}`);
|
||||||
|
}
|
||||||
|
return await res.json();
|
||||||
|
} finally {
|
||||||
|
if (loading) loading(false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const currentLocale = $('en');
|
||||||
|
|
||||||
|
const translations = {};
|
||||||
|
|
||||||
|
// addLang
|
||||||
|
export const addLang = (obj) => {
|
||||||
|
for (const locale of Object.keys(obj)) {
|
||||||
|
if (!translations[locale]) translations[locale] = {};
|
||||||
|
Object.assign(translations[locale], obj[locale]);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// setLocale
|
||||||
|
export const setLocale = (locale) => {
|
||||||
|
if (locale && translations[locale]) {
|
||||||
|
currentLocale(locale);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// t
|
||||||
|
export const t = (key) => {
|
||||||
|
return () => translations[currentLocale()]?.[key] ?? key;
|
||||||
|
};
|
||||||
@@ -1,15 +1,8 @@
|
|||||||
/**
|
// sigproRouter for Vite
|
||||||
* SigPro Vite Plugin - File-based Routing
|
export function sigproRouter() {
|
||||||
* @module sigpro/vite
|
|
||||||
*/
|
|
||||||
import fs from 'node:fs';
|
|
||||||
import path from 'node:path';
|
|
||||||
|
|
||||||
export default function sigproRouter() {
|
|
||||||
const virtualModuleId = 'virtual:sigpro-routes';
|
const virtualModuleId = 'virtual:sigpro-routes';
|
||||||
const resolvedVirtualModuleId = '\0' + virtualModuleId;
|
const resolvedVirtualModuleId = '\0' + virtualModuleId;
|
||||||
|
|
||||||
// Helper para escanear archivos
|
|
||||||
const getFiles = (dir) => {
|
const getFiles = (dir) => {
|
||||||
if (!fs.existsSync(dir)) return [];
|
if (!fs.existsSync(dir)) return [];
|
||||||
return fs.readdirSync(dir, { recursive: true })
|
return fs.readdirSync(dir, { recursive: true })
|
||||||
@@ -17,14 +10,12 @@ export default function sigproRouter() {
|
|||||||
.map(file => path.resolve(dir, file));
|
.map(file => path.resolve(dir, file));
|
||||||
};
|
};
|
||||||
|
|
||||||
// Transformador de ruta de archivo a URL de router
|
|
||||||
const pathToUrl = (pagesDir, filePath) => {
|
const pathToUrl = (pagesDir, filePath) => {
|
||||||
let relative = path.relative(pagesDir, filePath)
|
let relative = path.relative(pagesDir, filePath)
|
||||||
.replace(/\\/g, '/')
|
.replace(/\\/g, '/')
|
||||||
.replace(/\.(js|jsx)$/, '')
|
.replace(/\.(js|jsx)$/, '')
|
||||||
.replace(/\/index$/, '')
|
.replace(/\/index$/, '')
|
||||||
.replace(/^index$/, '');
|
.replace(/^index$/, '');
|
||||||
|
|
||||||
return ('/' + relative)
|
return ('/' + relative)
|
||||||
.replace(/\/+/g, '/')
|
.replace(/\/+/g, '/')
|
||||||
.replace(/\[\.\.\.([^\]]+)\]/g, '*')
|
.replace(/\[\.\.\.([^\]]+)\]/g, '*')
|
||||||
@@ -34,18 +25,13 @@ export default function sigproRouter() {
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
name: 'sigpro-router',
|
name: 'sigpro-router',
|
||||||
|
|
||||||
resolveId(id) {
|
resolveId(id) {
|
||||||
if (id === virtualModuleId) return resolvedVirtualModuleId;
|
if (id === virtualModuleId) return resolvedVirtualModuleId;
|
||||||
},
|
},
|
||||||
|
|
||||||
load(id) {
|
load(id) {
|
||||||
if (id !== resolvedVirtualModuleId) return;
|
if (id !== resolvedVirtualModuleId) return;
|
||||||
|
|
||||||
const root = process.cwd();
|
const root = process.cwd();
|
||||||
const pagesDir = path.resolve(root, 'src/pages');
|
const pagesDir = path.resolve(root, 'src/pages');
|
||||||
|
|
||||||
// Obtenemos y ordenamos archivos (rutas estáticas primero, luego dinámicas)
|
|
||||||
const files = getFiles(pagesDir).sort((a, b) => {
|
const files = getFiles(pagesDir).sort((a, b) => {
|
||||||
const urlA = pathToUrl(pagesDir, a);
|
const urlA = pathToUrl(pagesDir, a);
|
||||||
const urlB = pathToUrl(pagesDir, b);
|
const urlB = pathToUrl(pagesDir, b);
|
||||||
@@ -55,23 +41,15 @@ export default function sigproRouter() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
let routeEntries = '';
|
let routeEntries = '';
|
||||||
|
|
||||||
files.forEach((fullPath) => {
|
files.forEach((fullPath) => {
|
||||||
const urlPath = pathToUrl(pagesDir, fullPath);
|
const urlPath = pathToUrl(pagesDir, fullPath);
|
||||||
// Hacemos la ruta relativa al proyecto para que el import de Vite sea limpio
|
|
||||||
const relativeImport = './' + path.relative(root, fullPath).replace(/\\/g, '/');
|
const relativeImport = './' + path.relative(root, fullPath).replace(/\\/g, '/');
|
||||||
|
routeEntries += ` { path: '${urlPath}', component: () => import('/${relativeImport}') },\n`;
|
||||||
routeEntries += ` { path: '${urlPath}', component: async () => (await import('/${relativeImport}')).default },\n`;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// Fallback 404 si no existe una ruta comodín
|
|
||||||
if (!routeEntries.includes("path: '*'")) {
|
if (!routeEntries.includes("path: '*'")) {
|
||||||
routeEntries += ` { path: '*', component: () => document.createTextNode('404 - Not Found') },\n`;
|
routeEntries += ` { path: '*', component: () => ({ default: () => document.createTextNode('404 - Not Found') }) },\n`;
|
||||||
}
|
}
|
||||||
|
|
||||||
return `export const routes = [\n${routeEntries}];`;
|
return `export const routes = [\n${routeEntries}];`;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export { sigproRouter };
|
|
||||||
24
src/utils.js
24
src/utils.js
@@ -1,24 +0,0 @@
|
|||||||
// utils.js
|
|
||||||
|
|
||||||
export const db = async (url, data = {}, loading = null) => {
|
|
||||||
if (loading) loading(true);
|
|
||||||
|
|
||||||
try {
|
|
||||||
const res = await fetch(url, {
|
|
||||||
method: 'POST',
|
|
||||||
headers: { 'Content-Type': 'application/json' },
|
|
||||||
body: JSON.stringify(data),
|
|
||||||
credentials: 'include'
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!res.ok) {
|
|
||||||
const errorText = await res.text();
|
|
||||||
throw new Error(`Error ${res.status}: ${errorText}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
return await res.json();
|
|
||||||
|
|
||||||
} finally {
|
|
||||||
if (loading) loading(false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
Reference in New Issue
Block a user