🍓 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 cd0177380e
commit c2438b27c7
17 files changed
+1387 -65

No files matched your search

+1 -1
View File
@@ -7,7 +7,7 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=filebrowser PKG_NAME:=filebrowser
PKG_VERSION:=1.5.3-stable PKG_VERSION:=1.5.4-stable
PKG_RELEASE=1 PKG_RELEASE=1
ifeq ($(ARCH),aarch64) ifeq ($(ARCH),aarch64)
+4 -4
View File
@@ -1,14 +1,14 @@
msgid "" msgid ""
msgstr "" msgstr ""
"PO-Revision-Date: 2026-05-14 10:34+0000\n" "PO-Revision-Date: 2026-08-27 18:20+0000\n"
"Last-Translator: Pavel Borecki <pavel.borecki@gmail.com>\n" "Last-Translator: Martin Olmer <m_iv@seznam.cz>\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/openwrt/" "Language-Team: Czech <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsfrpc/cs/>\n" "luciapplicationsfrpc/cs/>\n"
"Language: cs\n" "Language: cs\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\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 #: applications/luci-app-frpc/htdocs/luci-static/resources/view/frpc.js:1454
msgid "Add new proxy or visitor..." msgid "Add new proxy or visitor..."
@@ -116,7 +116,7 @@ msgstr ""
#: applications/luci-app-frpc/htdocs/luci-static/resources/view/frpc.js:1417 #: applications/luci-app-frpc/htdocs/luci-static/resources/view/frpc.js:1417
msgid "Collecting data ..." 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 #: applications/luci-app-frpc/htdocs/luci-static/resources/view/frpc.js:317
msgid "Command arguments passed to token source exec." 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 "" msgid ""
msgstr "" 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" "PO-Revision-Date: 2026-04-25 12:14+0000\n"
"Last-Translator: SnIPeRSnIPeR " "Last-Translator: SnIPeRSnIPeR "
"<snipersniper@users.noreply.hosted.weblate.org>\n" "<snipersniper@users.noreply.hosted.weblate.org>\n"
@@ -10,7 +13,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "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" "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 #: applications/luci-app-frpc/htdocs/luci-static/resources/view/frpc.js:1454
msgid "Add new proxy or visitor..." msgid "Add new proxy or visitor..."
+4 -4
View File
@@ -1,14 +1,14 @@
msgid "" msgid ""
msgstr "" msgstr ""
"PO-Revision-Date: 2026-02-10 18:11+0000\n" "PO-Revision-Date: 2026-08-27 18:20+0000\n"
"Last-Translator: Pavel Borecki <pavel.borecki@gmail.com>\n" "Last-Translator: Martin Olmer <m_iv@seznam.cz>\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/openwrt/" "Language-Team: Czech <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsfrps/cs/>\n" "luciapplicationsfrps/cs/>\n"
"Language: cs\n" "Language: cs\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\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 #: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:982
msgid "Access Control" 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 #: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:969
msgid "Collecting data ..." 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 #: applications/luci-app-frps/htdocs/luci-static/resources/view/frps.js:323
msgid "Command arguments passed to token source exec." msgid "Command arguments passed to token source exec."
+2 -2
View File
@@ -1,8 +1,8 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2026-02-11 13:57+0000\n" "PO-Revision-Date: 2026-08-28 06:39+0000\n"
"Last-Translator: Džiugas Januševičius <dziugas1959@hotmail.com>\n" "Last-Translator: Martin Olmer <m_iv@seznam.cz>\n"
"Language-Team: Lithuanian <https://hosted.weblate.org/projects/openwrt/" "Language-Team: Lithuanian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsfrps/lt/>\n" "luciapplicationsfrps/lt/>\n"
"Language: lt\n" "Language: lt\n"
+1 -1
View File
@@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-passwall PKG_NAME:=luci-app-passwall
PKG_VERSION:=26.8.26 PKG_VERSION:=26.8.26
PKG_RELEASE:=251 PKG_RELEASE:=252
PKG_PO_VERSION:=$(PKG_VERSION) PKG_PO_VERSION:=$(PKG_VERSION)
PKG_CONFIG_DEPENDS:= \ PKG_CONFIG_DEPENDS:= \
@@ -142,18 +142,6 @@ local function http_write_json_error(data)
http.write(jsonStringify({code = 0, data = data})) http.write(jsonStringify({code = 0, data = data}))
end 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() function show_menu()
api.sh_uci_del(c_config, "@global[0]", "hide_from_luci", true) api.sh_uci_del(c_config, "@global[0]", "hide_from_luci", true)
luci.sys.call("rm -rf /tmp/luci-*") luci.sys.call("rm -rf /tmp/luci-*")
@@ -952,6 +940,7 @@ function create_backup()
end end
function restore_backup() function restore_backup()
local type = http.formvalue("type")
local result = { status = "error", message = "unknown error" } local result = { status = "error", message = "unknown error" }
local ok, err = pcall(function() local ok, err = pcall(function()
local filename = http.formvalue("filename") local filename = http.formvalue("filename")
@@ -981,21 +970,29 @@ function restore_backup()
fp:close() fp:close()
if chunk_index + 1 == total_chunks then if chunk_index + 1 == total_chunks then
uci:revert(c_config) uci:revert(c_config)
uci:revert(api.s_config)
luci.sys.call("echo '' > /tmp/log/passwall.log") luci.sys.call("echo '' > /tmp/log/passwall.log")
api.log(" * PassWall 配置文件上传成功…") api.log(" * PassWall 配置文件上传成功…")
local temp_dir = '/tmp/passwall_bak' local temp_dir = '/tmp/passwall_bak'
luci.sys.call("mkdir -p " .. temp_dir) luci.sys.call("mkdir -p " .. temp_dir)
if luci.sys.call("tar -xzf " .. file_path .. " -C " .. temp_dir) == 0 then if luci.sys.call("tar -xzf " .. file_path .. " -C " .. temp_dir) == 0 then
for _, backup_file in ipairs(backup_files) do for _, backup_file in ipairs(backup_files) do
local temp_file = temp_dir .. backup_file local is_server_config = backup_file == "/etc/config/passwall_server"
if fs.access(temp_file) then if type == "all" or (type == "client" and not is_server_config) or (type == "server" and is_server_config) then
luci.sys.call("cp -f " .. temp_file .. " " .. backup_file) 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
end end
api.log(" * PassWall 配置还原成功…") if type == "all" or type == "client" then
api.log(" * 重启 PassWall 服务中…\n") api.log(" * PassWall 配置还原成功…")
luci.sys.call('/etc/init.d/passwall restart > /dev/null 2>&1 &') api.log(" * 重启 PassWall 服务中…\n")
luci.sys.call('/etc/init.d/passwall_server restart > /dev/null 2>&1 &') 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 } result = { status = "success", message = "Upload completed", path = file_path }
else else
api.log(" * PassWall 配置文件解压失败,请重试!") api.log(" * PassWall 配置文件解压失败,请重试!")
@@ -1013,6 +1010,26 @@ function restore_backup()
http_write_json(result) http_write_json(result)
end 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() function geo_view()
local action = http.formvalue("action") local action = http.formvalue("action")
local value = http.formvalue("value") local value = http.formvalue("value")
@@ -26,14 +26,19 @@ local api = map.api
</div> </div>
</div> </div>
<div class="cbi-value" id="_reset_div"> <div class="cbi-value">
<label class="cbi-value-title"><%:Restore to default configuration%></label> <label class="cbi-value-title"><%=translatef("Reset %s Configuration", translate("Client"))%></label>
<div class="cbi-value-field"> <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> </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 id="upload-modal" class="up-modal" style="display:none;">
<div class="up-modal-content"> <div class="up-modal-content">
@@ -41,6 +46,16 @@ local api = map.api
<div class="up-cbi-value-field"> <div class="up-cbi-value-field">
<input class="cbi-input-file" type="file" id="ulfile" accept=".tar.gz" /> <input class="cbi-input-file" type="file" id="ulfile" accept=".tar.gz" />
</div> </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"> <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-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%>" /> <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 { .up-modal h3 {
background: inherit; 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> </style>
<script> <script>
@@ -147,20 +177,32 @@ local api = map.api
.catch(error => alert(error.message)); .catch(error => alert(error.message));
} }
function do_reset(btn) { function do_reset(type) {
if (confirm("<%: Do you want to restore the client to default settings?%>")) { 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 () { setTimeout(function () {
if (confirm("<%: Are you sure you want to restore the client to default settings?%>")) { if (confirm(confirm_message)) {
const xhr = new XMLHttpRequest(); const xhr = new XMLHttpRequest();
xhr.open("GET",'<%= api.url("reset_config") %>', false); xhr.open("GET", '<%=api.url("reset_config")%>?type=' + type, false);
xhr.send(); xhr.send();
window.location.href = '<%= api.url("log") %>' window.location.href = redirect;
} }
}, 1000); }, 1000);
} }
} }
function do_upload(btn) { 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 fileInput = document.getElementById("ulfile");
const file = fileInput.files[0]; const file = fileInput.files[0];
if (!file) { if (!file) {
@@ -200,7 +242,7 @@ local api = map.api
if (currentChunk < totalChunks) { if (currentChunk < totalChunks) {
const chunk = base64Data.substring(currentChunk * chunkSize, (currentChunk + 1) * chunkSize); const chunk = base64Data.substring(currentChunk * chunkSize, (currentChunk + 1) * chunkSize);
const xhr = new XMLHttpRequest(); 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 () { xhr.onreadystatechange = function () {
if (xhr.readyState === 4) { if (xhr.readyState === 4) {
if (xhr.status === 200) { if (xhr.status === 200) {
@@ -228,7 +270,11 @@ local api = map.api
} else { } else {
//alert("Upload completed."); //alert("Upload completed.");
document.getElementById("upload-btn").value = "<%:UL Restore%>"; 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(); sendNextChunk();
+12 -6
View File
@@ -2037,8 +2037,14 @@ msgstr "上传恢复"
msgid "CLOSE WIN" msgid "CLOSE WIN"
msgstr "关闭窗口" msgstr "关闭窗口"
msgid "Restore to default configuration" msgid "Reset %s Configuration"
msgstr "恢复默认配置" msgstr "重置%s配置"
msgid "Client"
msgstr "客户端"
msgid "Server"
msgstr "服务端"
msgid "Do Reset" msgid "Do Reset"
msgstr "执行重置" msgstr "执行重置"
@@ -2052,11 +2058,11 @@ msgstr "文件类型无效,请上传一个 .tar.gz 文件。"
msgid "File size exceeds 10MB limit." msgid "File size exceeds 10MB limit."
msgstr "文件大小超过 10MB 限制。" msgstr "文件大小超过 10MB 限制。"
msgid "Do you want to restore the client to default settings?" msgid "Do you want to restore the %s to default settings?"
msgstr "是否要恢复客户端默认配置?" msgstr "是否要恢复%s默认配置?"
msgid "Are you sure you want to restore the client to default settings?" msgid "Are you sure you want to restore the %s to default settings?"
msgstr "是否真的要恢复客户端默认配置?" msgstr "是否真的要恢复%s默认配置?"
msgid "_urltest" msgid "_urltest"
msgstr "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`, router, then full-loads the same URL and diffs title, `data-page`,
`dispatchpath`, tab strip, active nav mark, footer presence and console `dispatchpath`, tab strip, active nav mark, footer presence and console
errors — the report lists fallbacks (pages the router declined) and 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. 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 `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 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 * walk every page the navigation model links to (menu + each page's
* tab strip): same-document navigate, then a full load of the same * tab strip): same-document navigate, then a full load of the same
* URL; compare title, data-page, dispatchpath, tab count, footer * 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) * timing click → view painted, median of RUNS: router (warm and cold)
* vs full load, same pages. * vs full load, same pages.
* soak 60 navigations over the walked pages; heap, DOM nodes, poll queue * soak 60 navigations over the walked pages; heap, DOM nodes, poll queue
@@ -65,6 +66,8 @@ const COOKIE = {
path: "/", path: "/",
}; };
const START = `${HOST}/cgi-bin/luci/admin/status/overview`; 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 median = (v) => {
const s = [...v].sort((a, b) => a - b); const s = [...v].sort((a, b) => a - b);
@@ -280,10 +283,29 @@ if (!ONLY || ONLY === "walk") {
const t0 = Date.now(); const t0 = Date.now();
try { try {
consoleErrors.length = 0; consoleErrors.length = 0;
await fullLoad(p.sessionId, START); await fullLoad(p.sessionId, url === START ? ALT_START : START);
await evaljs(p.sessionId, "window.__sameDocMarker = 1"); await evaljs(p.sessionId, "window.__sameDocMarker = 1");
const nav = await spaNavigate(p.sessionId, url); 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 waitViewSettled(p.sessionId);
await sleep(SETTLE); await sleep(SETTLE);
const soft = await snapshot(p.sessionId); const soft = await snapshot(p.sessionId);
+1 -1
View File
@@ -13,7 +13,7 @@
"node": "^20.19.0 || >=22.12.0" "node": "^20.19.0 || >=22.12.0"
}, },
"devDependencies": { "devDependencies": {
"@eamonxg/luci-theme-devkit": "^0.3.0", "@eamonxg/luci-theme-devkit": "^0.3.1",
"@eamonxg/luci-theme-tokens": "^2.0.0", "@eamonxg/luci-theme-tokens": "^2.0.0",
"@tailwindcss/vite": "^4.1.11", "@tailwindcss/vite": "^4.1.11",
"@types/node": "^24.0.0", "@types/node": "^24.0.0",
+5 -5
View File
@@ -9,8 +9,8 @@ importers:
.: .:
devDependencies: devDependencies:
'@eamonxg/luci-theme-devkit': '@eamonxg/luci-theme-devkit':
specifier: ^0.3.0 specifier: ^0.3.1
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)) 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': '@eamonxg/luci-theme-tokens':
specifier: ^2.0.0 specifier: ^2.0.0
version: 2.0.0 version: 2.0.0
@@ -47,8 +47,8 @@ importers:
packages: packages:
'@eamonxg/luci-theme-devkit@0.3.0': '@eamonxg/luci-theme-devkit@0.3.1':
resolution: {integrity: sha512-yvPb7LX5SRxUlRlDDaSS6/xSdAso6lcv/B5vjaWs7mTNkVwX2NYbUTCgl06x3ncS9SMREl+b+3zcUOiV6Fd4vg==} resolution: {integrity: sha512-dgmdTPYnAvmRJ0uCzcx4+7X3msPct5uv1YVC5DzPBrox3ugzSHV65zW+rPEtlENW/tdz3//+cvT47fw7p8lbvA==}
engines: {node: '>=20.19'} engines: {node: '>=20.19'}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
@@ -779,7 +779,7 @@ packages:
snapshots: 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: dependencies:
terser: 5.46.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) 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_TITLE:=Aurora Theme (A modern browser theme built with Vite and Tailwind CSS)
LUCI_DEPENDS:=+luci-base LUCI_DEPENDS:=+luci-base
PKG_VERSION:=1.2.8 PKG_VERSION:=1.2.9
PKG_RELEASE:=75 PKG_RELEASE:=76
PKG_LICENSE:=Apache-2.0 PKG_LICENSE:=Apache-2.0
LUCI_MINIFY_CSS:= 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 include $(TOPDIR)/rules.mk
PKG_NAME:=sing-box PKG_NAME:=sing-box
PKG_VERSION:=1.13.19 PKG_VERSION:=1.13.20
PKG_RELEASE:=26 PKG_RELEASE:=27
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/SagerNet/sing-box/tar.gz/v$(PKG_VERSION)? PKG_SOURCE_URL:=https://codeload.github.com/SagerNet/sing-box/tar.gz/v$(PKG_VERSION)?