🍓 Sync 2026-08-30 00:07:42

This commit is contained in:
github-actions[bot] committed 2026-08-30 00:07:42 +08:00
1 parent 28e8ae5ca9
commit eea38c835c
17 files changed
+1387 -65

No files matched your search

+1 -1
View File
@@ -7,7 +7,7 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=filebrowser
PKG_VERSION:=1.5.3-stable
PKG_VERSION:=1.5.4-stable
PKG_RELEASE=1
ifeq ($(ARCH),aarch64)
+4 -4
View File
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2026-05-14 10:34+0000\n"
"Last-Translator: Pavel Borecki <pavel.borecki@gmail.com>\n"
"PO-Revision-Date: 2026-08-27 18:20+0000\n"
"Last-Translator: Martin Olmer <m_iv@seznam.cz>\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsfrpc/cs/>\n"
"Language: cs\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n"
"X-Generator: Weblate 2026.5.dev0\n"
"X-Generator: Weblate 2026.9.dev0\n"
#: applications/luci-app-frpc/htdocs/luci-static/resources/view/frpc.js:1454
msgid "Add new proxy or visitor..."
@@ -116,7 +116,7 @@ msgstr ""
#: applications/luci-app-frpc/htdocs/luci-static/resources/view/frpc.js:1417
msgid "Collecting data ..."
msgstr "Shromažďování dat…"
msgstr "Shromažďování dat …"
#: applications/luci-app-frpc/htdocs/luci-static/resources/view/frpc.js:317
msgid "Command arguments passed to token source exec."
File diff suppressed because it is too large. Load diff
+4 -1
View File
@@ -1,5 +1,8 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2026-08-28 06:20+0000\n"
"Last-Translator: SnIPeRSnIPeR <snipersniper@users.noreply.hosted.weblate.org>"
"\n"
"PO-Revision-Date: 2026-04-25 12:14+0000\n"
"Last-Translator: SnIPeRSnIPeR "
"<snipersniper@users.noreply.hosted.weblate.org>\n"
@@ -10,7 +13,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Weblate 5.17.1-dev\n"
"X-Generator: Weblate 2026.9.dev0\n"
#: applications/luci-app-frpc/htdocs/luci-static/resources/view/frpc.js:1454
msgid "Add new proxy or visitor..."
+4 -4
View File
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2026-02-10 18:11+0000\n"
"Last-Translator: Pavel Borecki <pavel.borecki@gmail.com>\n"
"PO-Revision-Date: 2026-08-27 18:20+0000\n"
"Last-Translator: Martin Olmer <m_iv@seznam.cz>\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsfrps/cs/>\n"
"Language: cs\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n"
"X-Generator: Weblate 5.16-dev\n"
"X-Generator: Weblate 2026.9.dev0\n"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:982
msgid "Access Control"
@@ -76,7 +76,7 @@ msgstr "Port, na který navázat"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:969
msgid "Collecting data ..."
msgstr "Shromažďování dat…"
msgstr "Shromažďování dat …"
#: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:323
msgid "Command arguments passed to token source exec."
+2 -2
View File
@@ -1,8 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2026-02-11 13:57+0000\n"
"Last-Translator: Džiugas Januševičius <dziugas1959@hotmail.com>\n"
"PO-Revision-Date: 2026-08-28 06:39+0000\n"
"Last-Translator: Martin Olmer <m_iv@seznam.cz>\n"
"Language-Team: Lithuanian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsfrps/lt/>\n"
"Language: lt\n"
+1 -1
View File
@@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-passwall
PKG_VERSION:=26.8.26
PKG_RELEASE:=251
PKG_RELEASE:=252
PKG_PO_VERSION:=$(PKG_VERSION)
PKG_CONFIG_DEPENDS:= \
@@ -142,18 +142,6 @@ local function http_write_json_error(data)
http.write(jsonStringify({code = 0, data = data}))
end
function reset_config()
uci:revert(c_config)
luci.sys.call("echo '' > /tmp/log/passwall.log")
luci.sys.call('/etc/init.d/passwall stop')
if luci.sys.call('[ -s "/usr/share/passwall/0_default_config" ]') == 0 then
luci.sys.call('cp -f /usr/share/passwall/0_default_config /etc/config/passwall')
api.log(" * 恢复默认配置成功。")
else
api.log(" * 找不到默认配置文件,重置失败!")
end
end
function show_menu()
api.sh_uci_del(c_config, "@global[0]", "hide_from_luci", true)
luci.sys.call("rm -rf /tmp/luci-*")
@@ -952,6 +940,7 @@ function create_backup()
end
function restore_backup()
local type = http.formvalue("type")
local result = { status = "error", message = "unknown error" }
local ok, err = pcall(function()
local filename = http.formvalue("filename")
@@ -981,21 +970,29 @@ function restore_backup()
fp:close()
if chunk_index + 1 == total_chunks then
uci:revert(c_config)
uci:revert(api.s_config)
luci.sys.call("echo '' > /tmp/log/passwall.log")
api.log(" * PassWall 配置文件上传成功…")
local temp_dir = '/tmp/passwall_bak'
luci.sys.call("mkdir -p " .. temp_dir)
if luci.sys.call("tar -xzf " .. file_path .. " -C " .. temp_dir) == 0 then
for _, backup_file in ipairs(backup_files) do
local temp_file = temp_dir .. backup_file
if fs.access(temp_file) then
luci.sys.call("cp -f " .. temp_file .. " " .. backup_file)
local is_server_config = backup_file == "/etc/config/passwall_server"
if type == "all" or (type == "client" and not is_server_config) or (type == "server" and is_server_config) then
local temp_file = temp_dir .. backup_file
if fs.access(temp_file) then
luci.sys.call("cp -f " .. temp_file .. " " .. backup_file)
end
end
end
api.log(" * PassWall 配置还原成功…")
api.log(" * 重启 PassWall 服务中…\n")
luci.sys.call('/etc/init.d/passwall restart > /dev/null 2>&1 &')
luci.sys.call('/etc/init.d/passwall_server restart > /dev/null 2>&1 &')
if type == "all" or type == "client" then
api.log(" * PassWall 配置还原成功…")
api.log(" * 重启 PassWall 服务中…\n")
luci.sys.call('/etc/init.d/passwall restart > /dev/null 2>&1 &')
end
if type == "all" or type == "server" then
luci.sys.call('/etc/init.d/passwall_server restart > /dev/null 2>&1 &')
end
result = { status = "success", message = "Upload completed", path = file_path }
else
api.log(" * PassWall 配置文件解压失败,请重试!")
@@ -1013,6 +1010,26 @@ function restore_backup()
http_write_json(result)
end
function reset_config()
local type = http.formvalue("type")
if type == "client" then
uci:revert(c_config)
luci.sys.call("echo '' > /tmp/log/passwall.log")
luci.sys.call('/etc/init.d/passwall stop')
if luci.sys.call('[ -s "/usr/share/passwall/0_default_config" ]') == 0 then
luci.sys.call('cp -f /usr/share/passwall/0_default_config /etc/config/passwall')
api.log(" * 恢复默认配置成功。")
else
api.log(" * 找不到默认配置文件,重置失败!")
end
elseif type == "server" then
uci:revert(api.s_config)
luci.sys.call("echo '' > /tmp/log/passwall_server.log")
luci.sys.call('/etc/init.d/passwall_server stop')
luci.sys.call("echo \"config global 'global'\" > /etc/config/passwall_server")
end
end
function geo_view()
local action = http.formvalue("action")
local value = http.formvalue("value")
@@ -26,14 +26,19 @@ local api = map.api
</div>
</div>
<div class="cbi-value" id="_reset_div">
<label class="cbi-value-title"><%:Restore to default configuration%></label>
<div class="cbi-value">
<label class="cbi-value-title"><%=translatef("Reset %s Configuration", translate("Client"))%></label>
<div class="cbi-value-field">
<input class="btn cbi-button cbi-button-reset" type="button" onclick="do_reset()" value="<%:Do Reset%>" />
<input class="btn cbi-button cbi-button-reset" type="button" onclick="do_reset('client')" value="<%:Do Reset%>" />
</div>
</div>
<div class="cbi-value"></div>
<div class="cbi-value">
<label class="cbi-value-title"><%=translatef("Reset %s Configuration", translate("Server"))%></label>
<div class="cbi-value-field">
<input class="btn cbi-button cbi-button-reset" type="button" onclick="do_reset('server')" value="<%:Do Reset%>" />
</div>
</div>
<div id="upload-modal" class="up-modal" style="display:none;">
<div class="up-modal-content">
@@ -41,6 +46,16 @@ local api = map.api
<div class="up-cbi-value-field">
<input class="cbi-input-file" type="file" id="ulfile" accept=".tar.gz" />
</div>
<div class="up-cbi-checkbox">
<label>
<input class="cbi-input-checkbox" type="checkbox" name="client" value="1" checked />
<%:Client%>
</label>
<label>
<input class="cbi-input-checkbox" type="checkbox" name="server" value="1" />
<%:Server%>
</label>
</div>
<div class="up-button-container">
<input class="btn cbi-button cbi-button-apply" type="button" id="upload-btn" onclick="do_upload()" value="<%:UL Restore%>" />
<input class="btn cbi-button cbi-button-remove" type="button" onclick="close_upload_win()" value="<%:CLOSE WIN%>" />
@@ -93,6 +108,21 @@ local api = map.api
.up-modal h3 {
background: inherit;
}
.up-cbi-checkbox {
display: flex;
justify-content: space-between;
align-items: center;
width: 100%;
max-width: 250px;
margin: 0 0 30px;
}
.up-cbi-checkbox label {
display: flex;
align-items: center;
gap: 5px;
}
</style>
<script>
@@ -147,20 +177,32 @@ local api = map.api
.catch(error => alert(error.message));
}
function do_reset(btn) {
if (confirm("<%: Do you want to restore the client to default settings?%>")) {
function do_reset(type) {
if (type !== "client" && type !== "server") return;
const name = type === "client" ? "<%:Client%>".toLowerCase() : "<%:Server%>".toLowerCase();
const redirect = type === "client" ? '<%=api.url("log")%>' : '<%=api.url("server")%>';
const message = "<%=translatef("Do you want to restore the %s to default settings?", "%s")%>".replace("%s", name);
const confirm_message = "<%=translatef("Are you sure you want to restore the %s to default settings?", "%s")%>".replace("%s", name);
if (confirm(message)) {
setTimeout(function () {
if (confirm("<%: Are you sure you want to restore the client to default settings?%>")) {
if (confirm(confirm_message)) {
const xhr = new XMLHttpRequest();
xhr.open("GET",'<%= api.url("reset_config") %>', false);
xhr.send();
window.location.href = '<%= api.url("log") %>'
xhr.open("GET", '<%=api.url("reset_config")%>?type=' + type, false);
xhr.send();
window.location.href = redirect;
}
}, 1000);
}
}
function do_upload(btn) {
const client = document.querySelector('input[name="client"]').checked;
const server = document.querySelector('input[name="server"]').checked;
if (!client && !server) return;
const type = client === server ? "all" : client ? "client" : "server";
const fileInput = document.getElementById("ulfile");
const file = fileInput.files[0];
if (!file) {
@@ -200,7 +242,7 @@ local api = map.api
if (currentChunk < totalChunks) {
const chunk = base64Data.substring(currentChunk * chunkSize, (currentChunk + 1) * chunkSize);
const xhr = new XMLHttpRequest();
xhr.open("POST", '<%= api.url("restore_backup") %>', true);
xhr.open("POST", '<%=api.url("restore_backup")%>?type=' + type, true);
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
@@ -228,7 +270,11 @@ local api = map.api
} else {
//alert("Upload completed.");
document.getElementById("upload-btn").value = "<%:UL Restore%>";
window.location.href = '<%= api.url("log") %>'
if (type === "server") {
window.location.href = '<%=api.url("server")%>';
} else {
window.location.href = '<%=api.url("log")%>';
}
}
}
sendNextChunk();
+12 -6
View File
@@ -2037,8 +2037,14 @@ msgstr "上传恢复"
msgid "CLOSE WIN"
msgstr "关闭窗口"
msgid "Restore to default configuration"
msgstr "恢复默认配置"
msgid "Reset %s Configuration"
msgstr "重置%s配置"
msgid "Client"
msgstr "客户端"
msgid "Server"
msgstr "服务端"
msgid "Do Reset"
msgstr "执行重置"
@@ -2052,11 +2058,11 @@ msgstr "文件类型无效,请上传一个 .tar.gz 文件。"
msgid "File size exceeds 10MB limit."
msgstr "文件大小超过 10MB 限制。"
msgid "Do you want to restore the client to default settings?"
msgstr "是否要恢复客户端默认配置?"
msgid "Do you want to restore the %s to default settings?"
msgstr "是否要恢复%s默认配置?"
msgid "Are you sure you want to restore the client to default settings?"
msgstr "是否真的要恢复客户端默认配置?"
msgid "Are you sure you want to restore the %s to default settings?"
msgstr "是否真的要恢复%s默认配置?"
msgid "_urltest"
msgstr "URLTest"
@@ -67,7 +67,9 @@ the navigation model links to (menu + each page's tab strip) through the
router, then full-loads the same URL and diffs title, `data-page`,
`dispatchpath`, tab strip, active nav mark, footer presence and console
errors — the report lists fallbacks (pages the router declined) and
divergences separately, and 0 divergences is the merge gate. `timing` is
divergences separately, and 0 divergences is the merge gate; a fallback on a
node the router claims (a view class, or a template page that is a view
shell) is reported as a divergence, so a regression there cannot pass. `timing` is
click → view painted, median of `RUNS`, router warm/cold vs full load.
`soak` samples heap, DOM nodes, listeners and the poll queue on the same
page after each of 5 laps over 12 pages. `back` traverses a chain that
@@ -13,7 +13,8 @@
* walk every page the navigation model links to (menu + each page's
* tab strip): same-document navigate, then a full load of the same
* URL; compare title, data-page, dispatchpath, tab count, footer
* presence, view child count. Reports divergences and fallbacks.
* presence, view child count. Reports divergences and fallbacks;
* a fallback on a node the router claims counts as a divergence.
* timing click → view painted, median of RUNS: router (warm and cold)
* vs full load, same pages.
* soak 60 navigations over the walked pages; heap, DOM nodes, poll queue
@@ -65,6 +66,8 @@ const COOKIE = {
path: "/",
};
const START = `${HOST}/cgi-bin/luci/admin/status/overview`;
// Where a walk of START itself begins: a same-URL navigation is a reload by rule.
const ALT_START = `${HOST}/cgi-bin/luci/admin/system/system`;
const median = (v) => {
const s = [...v].sort((a, b) => a - b);
@@ -280,10 +283,29 @@ if (!ONLY || ONLY === "walk") {
const t0 = Date.now();
try {
consoleErrors.length = 0;
await fullLoad(p.sessionId, START);
await fullLoad(p.sessionId, url === START ? ALT_START : START);
await evaljs(p.sessionId, "window.__sameDocMarker = 1");
const nav = await spaNavigate(p.sessionId, url);
if (!nav.sameDoc) { fallbacks.push(url.replace(HOST, "")); continue; }
if (!nav.sameDoc) {
// The document is now the target itself: ask its router whether it
// claims this node (a view class, or a template page that is a view
// shell). A claimed node that fell back is a regression, not a fallback.
const claim = await evaljs(p.sessionId, `L.require('router-aurora').then(async (r) => {
// the menu tree arrives asynchronously; a document the router never
// boots on (call/cbi pages) has none, and cannot be judged from here
for (let i = 0; i < 100 && !r.tree; i++) await new Promise((res) => setTimeout(res, 50));
if (!r.tree) return 'unknown';
try {
const rt = r.route(${JSON.stringify(url)}, { intent: true });
if (!rt) return 'declined';
if (rt.className) return 'claimed';
return (await r.template(rt)) ? 'claimed' : 'declined';
} catch (e) { return 'error: ' + e; }
})`, true);
if (claim === "declined" || claim === "unknown") fallbacks.push(url.replace(HOST, "") + (claim === "unknown" ? " (router not booted there)" : ""));
else divergences.push({ url: url.replace(HOST, ""), diffs: [`fallback on a node the router claims (${claim})`] });
continue;
}
await waitViewSettled(p.sessionId);
await sleep(SETTLE);
const soft = await snapshot(p.sessionId);
+1 -1
View File
@@ -13,7 +13,7 @@
"node": "^20.19.0 || >=22.12.0"
},
"devDependencies": {
"@eamonxg/luci-theme-devkit": "^0.3.0",
"@eamonxg/luci-theme-devkit": "^0.3.1",
"@eamonxg/luci-theme-tokens": "^2.0.0",
"@tailwindcss/vite": "^4.1.11",
"@types/node": "^24.0.0",
+5 -5
View File
@@ -9,8 +9,8 @@ importers:
.:
devDependencies:
'@eamonxg/luci-theme-devkit':
specifier: ^0.3.0
version: 0.3.0(terser@5.46.0)(vite@7.3.1(@types/node@24.10.9)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0))
specifier: ^0.3.1
version: 0.3.1(terser@5.46.0)(vite@7.3.1(@types/node@24.10.9)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0))
'@eamonxg/luci-theme-tokens':
specifier: ^2.0.0
version: 2.0.0
@@ -47,8 +47,8 @@ importers:
packages:
'@eamonxg/luci-theme-devkit@0.3.0':
resolution: {integrity: sha512-yvPb7LX5SRxUlRlDDaSS6/xSdAso6lcv/B5vjaWs7mTNkVwX2NYbUTCgl06x3ncS9SMREl+b+3zcUOiV6Fd4vg==}
'@eamonxg/luci-theme-devkit@0.3.1':
resolution: {integrity: sha512-dgmdTPYnAvmRJ0uCzcx4+7X3msPct5uv1YVC5DzPBrox3ugzSHV65zW+rPEtlENW/tdz3//+cvT47fw7p8lbvA==}
engines: {node: '>=20.19'}
hasBin: true
peerDependencies:
@@ -779,7 +779,7 @@ packages:
snapshots:
'@eamonxg/luci-theme-devkit@0.3.0(terser@5.46.0)(vite@7.3.1(@types/node@24.10.9)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0))':
'@eamonxg/luci-theme-devkit@0.3.1(terser@5.46.0)(vite@7.3.1(@types/node@24.10.9)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0))':
dependencies:
terser: 5.46.0
vite: 7.3.1(@types/node@24.10.9)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)
+2 -2
View File
@@ -8,8 +8,8 @@ include $(TOPDIR)/rules.mk
LUCI_TITLE:=Aurora Theme (A modern browser theme built with Vite and Tailwind CSS)
LUCI_DEPENDS:=+luci-base
PKG_VERSION:=1.2.8
PKG_RELEASE:=75
PKG_VERSION:=1.2.9
PKG_RELEASE:=76
PKG_LICENSE:=Apache-2.0
LUCI_MINIFY_CSS:=
@@ -1 +1 @@
"use strict";"require baseclass";"require ui";"require poll";"require rpc";const RT=window.L,RENDER_TIMEOUT=15e3,PATCH_ATTR="data-luci-patch",NODE_CSS_ATTR="data-luci-node-css",SHELL_ATTR="data-luci-shell",PROGRESS_DELAY=150,INSTANTIATE=/instantiateView\(\s*['"]([^'"]+)['"]/,TITLE_SLOT="\0",supported=()=>"object"==typeof navigation&&null!==navigation&&"function"==typeof navigation.addEventListener&&"function"==typeof NavigateEvent&&"intercept"in NavigateEvent.prototype,nodeWeight=e=>Math.min(e.order??9999,9999)+(e.auth?.login?1e4:0);function firstChild(e){let t=null;for(const[n,s]of Object.entries(e.children??{}))if(s.satisfied&&s.title&&"object"==typeof s.action)if("firstchild"===s.action?.type){if(t&&nodeWeight(t.node)<=nodeWeight(s))continue;firstChild(s)&&(t={name:n,node:s})}else s.firstchild_ineligible||(!t||nodeWeight(t.node)>nodeWeight(s))&&(t={name:n,node:s});return t}function resolve(e,t){let n=e,s=[],i=[],r=0;for(let o=0;o<32;o++){for(;r<t.length;){const e=n.children?.[t[r]];if(e&&!1===e.satisfied)return null;if(!e){if(!n.wildcard)return null;i=t.slice(r),r=t.length;break}n=e,s.push(t[r++])}const o=n.action?.type;if("alias"===o)t=[...String(n.action.path??"").split("/").filter(Boolean),...i],n=e,s=[],i=[],r=0;else{if("firstchild"!==o)return{node:n,path:s,args:i,request:t};{const e=firstChild(n);if(!e)return null;n=e.node,s.push(e.name)}}}return null}function readonlyAlong(e,t){const n=[];let s=e;for(const e of t)s=s?.children?.[e],s?.depends?.acl?.length&&n.push(s);return n.length>0&&n.every(e=>!0===e.readonly)}const actionOf=(e,t)=>t.length&&"object"==typeof e?.wildcardaction?e.wildcardaction:e?.action;function viewClass(e){return"view"===e?.type&&e.path?`view.${e.path.replace(/\//g,".")}`:null}const PRAGMA_HEAD=/^(?:\s*["'](?:use strict|require\s[^"']+)["'];)+/,PRAGMA=/["']require\s+([^\s"']+)/g;function pragmaDeps(e){return[...(e.slice(0,4096).match(PRAGMA_HEAD)?.[0]??"").matchAll(PRAGMA)].map(e=>e[1])}const moduleUrl=e=>`${RT.env.base_url}/${e.replace(/\./g,"/")}.js${RT.env.resource_version?`?v=${RT.env.resource_version}`:""}`,TITLE_SEPARATOR=/\s*[|\-–—:·]\s*\0|\0\s*[|\-–—:·]\s*/,patchPrefixes=e=>{const t=[];let n=null;for(const s of e)t.push(n=null==n?s:`${n}-${s}`);return t},patchAssetUrl=e=>{const t=document.body.dataset.assetVersion;return t?`${e}?v=${t}`:e},installedPatches=()=>(document.body.dataset.patches??"").split(/\s+/).filter(Boolean),patchRegistry=()=>window.luciPatches??={};let livePatches=new Set,pendingPatches=[];function applyPatches(e){const t=new Set(patchPrefixes(e)),n=RT.env.media,s=[];for(const e of installedPatches()){const i=e.replace(/\.(css|js)$/,""),r=t.has(i);if(e.endsWith(".css")){let e=document.querySelector(`link[${PATCH_ATTR}="${i}"]`);!e&&r?(e=E("link",{rel:"stylesheet",href:patchAssetUrl(`${n}/patches/${i}.css`),[PATCH_ATTR]:i}),document.head.appendChild(e)):e&&(e.disabled=!r)}else r&&s.push(i)}return s}function mountPatches(e){const t=patchRegistry();livePatches=new Set(e);for(const n of e)if(document.querySelector(`script[${PATCH_ATTR}="${n}"]`))t[n]?.mount?.();else{const e=E("script",{src:patchAssetUrl(`${RT.env.media}/patches/${n}.js`),[PATCH_ATTR]:n});e.addEventListener("load",()=>{livePatches.has(n)||patchRegistry()[n]?.unmount?.()}),document.head.appendChild(e)}}function unmountPatches(){livePatches=new Set;const e=patchRegistry();for(const t in e)e[t].unmount?.()}return document.addEventListener("luci-navigate",e=>{unmountPatches(),pendingPatches=applyPatches(e.detail.request)}),document.addEventListener("luci-navigated",()=>{mountPatches(pendingPatches),pendingPatches=[]}),baseclass.extend({__init__(){if(!supported()||!RT?.env?.scriptname)return;const e=this.contract();if(e.length)return void console.warn(`luci-router: luci-base surface missing, staying MPA: ${e.join(", ")}`);this.gen=0,this.seen=new Set,this.warmed=new Set,this.inflight=Promise.resolve(),this.intervals=new Set,this.scrolls=new Map,this.knownSheets=new WeakSet(this.sheets().filter(e=>e.hasAttribute(SHELL_ATTR)||e.hasAttribute(PATCH_ATTR)||e.hasAttribute(NODE_CSS_ATTR))),this.hookIntervals(),this.hookListeners(),this.hookSession(),this.hookVisibility();const t=RT.env.media.split("/").filter(Boolean).pop();Promise.all([ui.menu.load(),RT.require(`menu-${t}`).catch(()=>null)]).then(([e,t])=>{this.tree=e,this.menu=t;const n=this.initialRoute();n&&(document.querySelector('script[type="speculationrules"]')?.remove(),this.status=document.body.appendChild(E("div",{id:"luci-nav-status",role:"status","aria-live":"polite","aria-atomic":"true"})),navigation.addEventListener("navigate",e=>this.onNavigate(e)),document.addEventListener("pointerover",e=>this.onIntent(e)),document.addEventListener("pointerdown",e=>this.onIntent(e)),document.addEventListener("focusin",e=>this.onIntent(e)),this.watchInitialRender(n))})},contract(){const e={L:RT,rpc:rpc,poll:poll,ui:ui,window:window};return["L.view","L.require","L.dom.content","L.env.base_url","L.env.resource","L.env.media","L.Request.addIntercLine truncated
"use strict";"require baseclass";"require ui";"require poll";"require rpc";const RT=window.L,RENDER_TIMEOUT=15e3,PATCH_ATTR="data-luci-patch",NODE_CSS_ATTR="data-luci-node-css",SHELL_ATTR="data-luci-shell",PROGRESS_DELAY=150,INSTANTIATE=/instantiateView\(\s*['"]([^'"]+)['"]/,TITLE_SLOT="\0",supported=()=>"object"==typeof navigation&&null!==navigation&&"function"==typeof navigation.addEventListener&&"function"==typeof NavigateEvent&&"intercept"in NavigateEvent.prototype,nodeWeight=e=>Math.min(e.order??9999,9999)+(e.auth?.login?1e4:0);function firstChild(e){let t=null;for(const[n,s]of Object.entries(e.children??{}))if(s.satisfied&&s.title&&"object"==typeof s.action)if("firstchild"===s.action?.type){if(t&&nodeWeight(t.node)<=nodeWeight(s))continue;firstChild(s)&&(t={name:n,node:s})}else s.firstchild_ineligible||(!t||nodeWeight(t.node)>nodeWeight(s))&&(t={name:n,node:s});return t}function resolve(e,t){let n=e,s=[],i=[],r=0;for(let o=0;o<32;o++){for(;r<t.length;){const e=n.children?.[t[r]];if(e&&!1===e.satisfied)return null;if(!e){if(!n.wildcard)return null;i=t.slice(r),r=t.length;break}n=e,s.push(t[r++])}const o=n.action?.type;if("alias"===o)t=[...String(n.action.path??"").split("/").filter(Boolean),...i],n=e,s=[],i=[],r=0;else{if("firstchild"!==o)return{node:n,path:s,args:i,request:t};{const e=firstChild(n);if(!e)return null;n=e.node,s.push(e.name)}}}return null}function readonlyAlong(e,t){const n=[];let s=e;for(const e of t)s=s?.children?.[e],s?.depends?.acl?.length&&n.push(s);return n.length>0&&n.every(e=>!0===e.readonly)}const actionOf=(e,t)=>t.length&&"object"==typeof e?.wildcardaction?e.wildcardaction:e?.action;function viewClass(e){return"view"===e?.type&&e.path?`view.${e.path.replace(/\//g,".")}`:null}const PRAGMA_HEAD=/^(?:\s*["'](?:use strict|require\s[^"']+)["'];)+/,PRAGMA=/["']require\s+([^\s"']+)/g;function pragmaDeps(e){return[...(e.slice(0,4096).match(PRAGMA_HEAD)?.[0]??"").matchAll(PRAGMA)].map(e=>e[1])}const moduleUrl=e=>`${RT.env.base_url}/${e.replace(/\./g,"/")}.js${RT.env.resource_version?`?v=${RT.env.resource_version}`:""}`,TITLE_SEPARATOR=/\s*[|\-–—:·]\s*\0|\0\s*[|\-–—:·]\s*/,patchPrefixes=e=>{const t=[];let n=null;for(const s of e)t.push(n=null==n?s:`${n}-${s}`);return t},patchAssetUrl=e=>{const t=document.body.dataset.assetVersion;return t?`${e}?v=${t}`:e},installedPatches=()=>(document.body.dataset.patches??"").split(/\s+/).filter(Boolean),patchRegistry=()=>window.luciPatches??={};let livePatches=new Set,pendingPatches=[];function applyPatches(e){const t=new Set(patchPrefixes(e)),n=RT.env.media,s=[];for(const e of installedPatches()){const i=e.replace(/\.(css|js)$/,""),r=t.has(i);if(e.endsWith(".css")){let e=document.querySelector(`link[${PATCH_ATTR}="${i}"]`);!e&&r?(e=E("link",{rel:"stylesheet",href:patchAssetUrl(`${n}/patches/${i}.css`),[PATCH_ATTR]:i}),document.head.appendChild(e)):e&&(e.disabled=!r)}else r&&s.push(i)}return s}function mountPatches(e){const t=patchRegistry();livePatches=new Set(e);for(const n of e)if(document.querySelector(`script[${PATCH_ATTR}="${n}"]`))t[n]?.mount?.();else{const e=E("script",{src:patchAssetUrl(`${RT.env.media}/patches/${n}.js`),[PATCH_ATTR]:n});e.addEventListener("load",()=>{livePatches.has(n)||patchRegistry()[n]?.unmount?.()}),document.head.appendChild(e)}}function unmountPatches(){livePatches=new Set;const e=patchRegistry();for(const t in e)e[t].unmount?.()}return document.addEventListener("luci-navigate",e=>{unmountPatches(),pendingPatches=applyPatches(e.detail.request)}),document.addEventListener("luci-navigated",()=>{mountPatches(pendingPatches),pendingPatches=[]}),baseclass.extend({__init__(){if(!supported()||!RT?.env?.scriptname)return;const e=this.contract();if(e.length)return void console.warn(`luci-router: luci-base surface missing, staying MPA: ${e.join(", ")}`);this.gen=0,this.seen=new Set,this.warmed=new Set,this.inflight=Promise.resolve(),this.intervals=new Set,this.scrolls=new Map,this.knownSheets=new WeakSet(this.sheets().filter(e=>e.hasAttribute(SHELL_ATTR)||e.hasAttribute(PATCH_ATTR)||e.hasAttribute(NODE_CSS_ATTR))),this.hookIntervals(),this.hookListeners(),this.hookSession(),this.hookVisibility();const t=RT.env.media.split("/").filter(Boolean).pop();Promise.all([ui.menu.load(),RT.require(`menu-${t}`).catch(()=>null)]).then(([e,t])=>{this.tree=e,this.menu=t;const n=this.initialRoute();n&&(document.querySelector('script[type="speculationrules"]')?.remove(),this.status=document.body.appendChild(E("div",{id:"luci-nav-status",role:"status","aria-live":"polite","aria-atomic":"true"})),navigation.addEventListener("navigate",e=>this.onNavigate(e)),document.addEventListener("pointerover",e=>this.onIntent(e)),document.addEventListener("pointerdown",e=>this.onIntent(e)),document.addEventListener("focusin",e=>this.onIntent(e)),this.watchInitialRender(n))})},contract(){const e={L:RT,rpc:rpc,poll:poll,ui:ui,window:window};return["L.view","L.require","L.dom.content","L.env.base_url","L.env.resource","L.env.media","L.Request.addIntercLine truncated
+2 -2
View File
@@ -5,8 +5,8 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=sing-box
PKG_VERSION:=1.13.19
PKG_RELEASE:=26
PKG_VERSION:=1.13.20
PKG_RELEASE:=27
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/SagerNet/sing-box/tar.gz/v$(PKG_VERSION)?