cj-tauri 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +113 -99
- package/bin/cj-tauri.js +287 -287
- package/cjpm.toml +63 -52
- package/cli/cjpm.toml +22 -22
- package/cli/src/doctor.cj +308 -306
- package/cli/src/main.cj +129 -129
- package/cli/src/manifest.cj +632 -558
- package/cli/src/manifest_test.cj +87 -0
- package/cli/src/project.cj +770 -770
- package/cli/src/resolve.cj +348 -348
- package/cli/src/scaffold.cj +369 -369
- package/cli/src/sync.cj +526 -526
- package/cli/src/util.cj +168 -168
- package/cli/templates/app/README.md +51 -48
- package/cli/templates/app/assets/capabilities/default.json +7 -7
- package/cli/templates/app/assets/ui/index.html +120 -118
- package/cli/templates/app/cj-tauri.toml +32 -22
- package/cli/templates/app/cjpm.toml +34 -34
- package/cli/templates/app/src/main.cj +101 -90
- package/cli/templates/app-react/README.md +56 -56
- package/cli/templates/app-react/assets/capabilities/default.json +7 -7
- package/cli/templates/app-react/assets/ui/index.html +25 -25
- package/cli/templates/app-react/assets/ui/package.json +19 -19
- package/cli/templates/app-react/assets/ui/src/App.css +67 -67
- package/cli/templates/app-react/assets/ui/src/App.jsx +124 -124
- package/cli/templates/app-react/assets/ui/src/main.jsx +6 -6
- package/cli/templates/app-react/assets/ui/vite.config.js +24 -24
- package/cli/templates/app-react/cj-tauri.toml +33 -23
- package/cli/templates/app-react/cjpm.toml +34 -34
- package/cli/templates/app-react/src/main.cj +91 -91
- package/cli/templates/app-vue/README.md +56 -56
- package/cli/templates/app-vue/assets/capabilities/default.json +7 -7
- package/cli/templates/app-vue/assets/ui/index.html +25 -25
- package/cli/templates/app-vue/assets/ui/package.json +18 -18
- package/cli/templates/app-vue/assets/ui/src/App.vue +176 -176
- package/cli/templates/app-vue/assets/ui/src/main.js +4 -4
- package/cli/templates/app-vue/assets/ui/vite.config.js +24 -24
- package/cli/templates/app-vue/cj-tauri.toml +33 -23
- package/cli/templates/app-vue/cjpm.toml +34 -34
- package/cli/templates/app-vue/src/main.cj +91 -91
- package/cli/templates/ohos-skeleton/AppScope/app.json5 +13 -13
- package/cli/templates/ohos-skeleton/AppScope/resources/base/element/string.json +8 -8
- package/cli/templates/ohos-skeleton/AppScope/resources/base/media/layered_image.json +6 -6
- package/cli/templates/ohos-skeleton/README.md +84 -79
- package/cli/templates/ohos-skeleton/build-hap.sh +15 -0
- package/cli/templates/ohos-skeleton/build-profile.json5 +46 -46
- package/cli/templates/ohos-skeleton/entry/build-profile.json5 +26 -26
- package/cli/templates/ohos-skeleton/entry/cjpm.toml +51 -43
- package/cli/templates/ohos-skeleton/entry/hvigorfile.ts +6 -6
- package/cli/templates/ohos-skeleton/entry/oh-package.json5 +9 -9
- package/cli/templates/ohos-skeleton/entry/src/main/cangjie/ability_stage.cj +17 -17
- package/cli/templates/ohos-skeleton/entry/src/main/cangjie/app_host.cj +94 -94
- package/cli/templates/ohos-skeleton/entry/src/main/cangjie/dialog_host.cj +217 -0
- package/cli/templates/ohos-skeleton/entry/src/main/cangjie/index.cj +527 -167
- package/cli/templates/ohos-skeleton/entry/src/main/cangjie/main_ability.cj +139 -139
- package/cli/templates/ohos-skeleton/entry/src/main/module.json5 +57 -49
- package/cli/templates/ohos-skeleton/entry/src/main/resources/base/element/color.json +8 -8
- package/cli/templates/ohos-skeleton/entry/src/main/resources/base/element/string.json +16 -16
- package/cli/templates/ohos-skeleton/entry/src/main/resources/base/media/layered_image.json +6 -6
- package/cli/templates/ohos-skeleton/entry/src/main/resources/base/profile/main_pages.json +2 -2
- package/cli/templates/ohos-skeleton/entry/src/main/resources/rawfile/capabilities.json +6 -6
- package/cli/templates/ohos-skeleton/entry/src/main/resources/rawfile/index.html +92 -92
- package/cli/templates/ohos-skeleton/hvigor/hvigor-config.json5 +5 -5
- package/cli/templates/ohos-skeleton/hvigorfile.ts +6 -6
- package/cli/templates/ohos-skeleton/oh-package.json5 +10 -10
- package/native/build_win.bat +62 -62
- package/native/core/bridge_core.c +1681 -1626
- package/native/core/bridge_core.h +675 -618
- package/native/core/bridge_js.h +108 -108
- package/native/platforms/harmonyos/README.md +115 -6
- package/native/platforms/linux/bridge_linux.c +2787 -2485
- package/native/platforms/windows/bridge_win.c +3740 -3248
- package/native/tests/gtk_threading_probe.c +143 -143
- package/native/tests/test_bridge_core.c +1339 -1228
- package/package.json +53 -53
- package/prebuilt/linux-x64/cj-tauri +0 -0
- package/src/api_system.cj +67 -67
- package/src/app.cj +325 -969
- package/src/app_events.cj +166 -0
- package/src/app_host_ops.cj +287 -0
- package/src/app_run.cj +283 -0
- package/src/app_spec.cj +76 -76
- package/src/arkweb_menu.cj +216 -0
- package/src/arkweb_script.cj +142 -142
- package/src/capability.cj +409 -409
- package/src/clipboard_bridge.cj +178 -0
- package/src/dialog_spec.cj +79 -0
- package/src/dragdrop.cj +26 -26
- package/src/embedded_assets.cj +98 -98
- package/src/host.cj +752 -607
- package/src/host_arkweb.cj +924 -778
- package/src/host_webkit.cj +663 -570
- package/src/host_webview2.cj +663 -570
- package/src/hotkey.cj +66 -66
- package/src/ipc_hub.cj +337 -337
- package/src/ipc_message.cj +286 -286
- package/src/launch.cj +62 -62
- package/src/logging.cj +127 -127
- package/src/menu.cj +197 -197
- package/src/platform/platform_app_context.cj +77 -77
- package/src/platform/platform_assets.cj +33 -33
- package/src/platform/platform_discover.cj +176 -176
- package/src/platform/platform_env.cj +29 -29
- package/src/platform/platform_feature.cj +31 -31
- package/src/platform/platform_page_source.cj +87 -87
- package/src/platform/platform_target_info.cj +32 -32
- package/src/platform_host_provider.cj +87 -87
- package/src/plugin.cj +333 -333
- package/src/plugins/clipboard/plugin_clipboard.cj +152 -152
- package/src/plugins/dialog/plugin_dialog.cj +209 -209
- package/src/plugins/fs/plugin_fs.cj +105 -1
- package/src/plugins/http/http_backend.cj +131 -0
- package/src/plugins/http/http_desktop.cj +195 -0
- package/src/plugins/http/http_ohos.cj +204 -0
- package/src/plugins/http/plugin_http.cj +310 -459
- package/src/plugins/log/plugin_log.cj +105 -105
- package/src/plugins/menu/plugin_menu.cj +158 -158
- package/src/plugins/notification/plugin_notification.cj +154 -154
- package/src/plugins/serial/plugin_serial.cj +458 -454
- package/src/plugins/serial/serial_bridge.cj +194 -194
- package/src/plugins/serial/serial_manager_ohos.cj +92 -0
- package/src/plugins/serial/serial_ohos.cj +529 -0
- package/src/plugins/shell/plugin_shell.cj +258 -258
- package/src/plugins/sqlite/plugin_sqlite.cj +705 -710
- package/src/plugins/sqlite/sqlite_ffi.cj +206 -211
- package/src/plugins/ws/plugin_ws.cj +488 -470
- package/src/process_hidden.cj +174 -174
- package/src/scope.cj +391 -391
- package/src/shell_event.cj +69 -69
- package/src/tests/app_spec_test.cj +126 -127
- package/src/tests/capability_test.cj +243 -243
- package/src/tests/dialog_spec_test.cj +73 -0
- package/src/tests/fake_host.cj +201 -201
- package/src/tests/ipc_hub_test.cj +487 -487
- package/src/tests/logging_test.cj +62 -62
- package/src/tests/platform_contract_test.cj +251 -251
- package/src/tests/plugin_clipboard_test.cj +222 -222
- package/src/tests/plugin_dialog_test.cj +237 -237
- package/src/tests/plugin_fs_test.cj +207 -0
- package/src/tests/plugin_http_test.cj +124 -124
- package/src/tests/plugin_notification_test.cj +205 -205
- package/src/tests/plugin_serial_test.cj +48 -0
- package/src/tests/plugin_test.cj +605 -585
- package/src/tests/plugin_ws_test.cj +40 -40
- package/src/tests/process_hidden_test.cj +129 -129
- package/src/tests/scope_test.cj +350 -350
- package/src/tests/system_host_test.cj +99 -81
- package/src/tests/urlutil_test.cj +53 -53
- package/src/tests/version_test.cj +75 -75
- package/src/tests/window_registry_test.cj +123 -123
- package/src/tray.cj +90 -90
- package/src/urlutil.cj +159 -159
- package/src/version.cj +44 -44
- package/src/window.cj +51 -51
- package/src/window_registry.cj +116 -116
- package/prebuilt/win32-x64/cj-tauri.exe +0 -0
- package/src/plugins/serial/serial_ohos_stub.cj +0 -61
- package/src/plugins/sqlite/sqlite_ohos_stub.cj +0 -91
package/src/urlutil.cj
CHANGED
|
@@ -1,159 +1,159 @@
|
|
|
1
|
-
package cjTauri
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* URL → host 提取(核心共享层):http 与 ws 两个插件共用同一套解析与大小写口径。
|
|
5
|
-
*
|
|
6
|
-
* 为什么放核心不放插件:主机白名单的「匹配目标」只要有第二份实现,就一定会有一份
|
|
7
|
-
* 是错的——与 scope 判定同一条铁律(AGENTS §2:安全校验不吃「各插件各写一套」)。
|
|
8
|
-
* 插件只管调,不自己扫字节。
|
|
9
|
-
*
|
|
10
|
-
* 语义:从 `scheme://[user@]host[:port][/path]` 提取 host(小写返回)。
|
|
11
|
-
* 协议只认 http / https / ws / wss;解析不出 host 返回 None。按字节扫(URL 结构
|
|
12
|
-
* 是 ASCII),不用 String 切片撞 UTF-8 边界。public 是为了单测可直接构造(跨包须 public)。
|
|
13
|
-
*/
|
|
14
|
-
public func urlHostOf(rawUrl: String): Option<String> {
|
|
15
|
-
let b = rawUrl.toArray()
|
|
16
|
-
// 找 "://"(58 47 47)
|
|
17
|
-
var schemeEnd: Int64 = -1
|
|
18
|
-
var i: Int64 = 0
|
|
19
|
-
while (i + 2 < b.size) {
|
|
20
|
-
if (b[i] == 58u8 && b[i + 1] == 47u8 && b[i + 2] == 47u8) {
|
|
21
|
-
schemeEnd = i
|
|
22
|
-
break
|
|
23
|
-
}
|
|
24
|
-
i++
|
|
25
|
-
}
|
|
26
|
-
if (schemeEnd <= 0) {
|
|
27
|
-
return None
|
|
28
|
-
}
|
|
29
|
-
let scheme = asciiLowerOf(b[0..schemeEnd])
|
|
30
|
-
if (scheme != "http" && scheme != "https" && scheme != "ws" && scheme != "wss") {
|
|
31
|
-
return None
|
|
32
|
-
}
|
|
33
|
-
// host 段:到 '/' '?' '#' 为止
|
|
34
|
-
var start = schemeEnd + 3
|
|
35
|
-
var end = start
|
|
36
|
-
while (end < b.size) {
|
|
37
|
-
let c = b[end]
|
|
38
|
-
if (c == 47u8 || c == 63u8 || c == 35u8) {
|
|
39
|
-
break
|
|
40
|
-
}
|
|
41
|
-
end++
|
|
42
|
-
}
|
|
43
|
-
if (end == start) {
|
|
44
|
-
return None
|
|
45
|
-
}
|
|
46
|
-
// 去 userinfo(最后一个 '@' 之前的部分)
|
|
47
|
-
var at: Int64 = -1
|
|
48
|
-
var k = end - 1
|
|
49
|
-
while (k >= start) {
|
|
50
|
-
if (b[k] == 64u8) {
|
|
51
|
-
at = k
|
|
52
|
-
break
|
|
53
|
-
}
|
|
54
|
-
k--
|
|
55
|
-
}
|
|
56
|
-
if (at >= 0) {
|
|
57
|
-
start = at + 1
|
|
58
|
-
}
|
|
59
|
-
// 去端口(第一个 ':' 之后)——IPv6 字面量 [..] 截到 ']' 为止,方括号内不拆
|
|
60
|
-
if (b[start] == 91u8) {
|
|
61
|
-
var close: Int64 = -1
|
|
62
|
-
var m = start + 1
|
|
63
|
-
while (m < end) {
|
|
64
|
-
if (b[m] == 93u8) {
|
|
65
|
-
close = m
|
|
66
|
-
break
|
|
67
|
-
}
|
|
68
|
-
m++
|
|
69
|
-
}
|
|
70
|
-
if (close >= 0) {
|
|
71
|
-
end = close + 1
|
|
72
|
-
}
|
|
73
|
-
} else {
|
|
74
|
-
var colon: Int64 = -1
|
|
75
|
-
var m = start
|
|
76
|
-
while (m < end) {
|
|
77
|
-
if (b[m] == 58u8) {
|
|
78
|
-
colon = m
|
|
79
|
-
break
|
|
80
|
-
}
|
|
81
|
-
m++
|
|
82
|
-
}
|
|
83
|
-
if (colon >= 0) {
|
|
84
|
-
end = colon
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
if (end <= start) {
|
|
88
|
-
return None
|
|
89
|
-
}
|
|
90
|
-
let host = asciiLowerOf(b[start..end])
|
|
91
|
-
if (host.size == 0) {
|
|
92
|
-
return None
|
|
93
|
-
}
|
|
94
|
-
return Some(host)
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* host 是不是 IP 字面量(IPv4 / IPv6,可带方括号)。
|
|
99
|
-
*
|
|
100
|
-
* 为什么需要它:建 TLS 客户端时要用 host 当 **SNI**(`serverName`),而 RFC 6066 明确不许 SNI 里放
|
|
101
|
-
* IP 字面量——stdx 默认不发 SNI,本仓给「域名」补上 SNI 的那一轮必须把 IP 排除在外,否则
|
|
102
|
-
* 「https 直连 IP」这类原本可用的端点会被对端当场拒掉(修一个坑别踩出另一个)。
|
|
103
|
-
* 判定只认严格形态:四段十进制且每段 <= 255 的 IPv4,或含冒号 / 带方括号的 IPv6——
|
|
104
|
-
* 纯十六进制字母的域名(如 `dead.beef`)是域名,不是 IP。
|
|
105
|
-
*/
|
|
106
|
-
public func isIpLiteralHost(host: String): Bool {
|
|
107
|
-
if (host.size == 0) {
|
|
108
|
-
return false
|
|
109
|
-
}
|
|
110
|
-
let b = host.toArray()
|
|
111
|
-
// 带方括号 = IPv6 字面量(urlHostOf 会把方括号一起返回)
|
|
112
|
-
if (b[0] == 91u8 && b[b.size - 1] == 93u8) {
|
|
113
|
-
return true
|
|
114
|
-
}
|
|
115
|
-
for (i in 0..b.size) {
|
|
116
|
-
if (b[i] == 58u8) {
|
|
117
|
-
return true // 含冒号即 IPv6(含 ::1 这类简写)
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
var segs = 0
|
|
121
|
-
var digits = 0
|
|
122
|
-
var value: Int64 = 0
|
|
123
|
-
for (i in 0..b.size) {
|
|
124
|
-
let c = b[i]
|
|
125
|
-
if (c == 46u8) {
|
|
126
|
-
if (digits == 0 || value > 255) {
|
|
127
|
-
return false
|
|
128
|
-
}
|
|
129
|
-
segs = segs + 1
|
|
130
|
-
digits = 0
|
|
131
|
-
value = 0
|
|
132
|
-
} else if (c >= 48u8 && c <= 57u8) {
|
|
133
|
-
digits = digits + 1
|
|
134
|
-
if (digits > 3) {
|
|
135
|
-
return false
|
|
136
|
-
}
|
|
137
|
-
value = value * 10 + Int64(c - 48u8)
|
|
138
|
-
} else {
|
|
139
|
-
return false
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
if (digits == 0 || value > 255) {
|
|
143
|
-
return false
|
|
144
|
-
}
|
|
145
|
-
return segs == 3
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
/** ASCII 字节 → 小写字符串(非 ASCII 原样保留);host 匹配统一走这里 */
|
|
149
|
-
private func asciiLowerOf(bytes: Array<Byte>): String {
|
|
150
|
-
let out = Array<Byte>(bytes.size, repeat: 0)
|
|
151
|
-
for (i in 0..bytes.size) {
|
|
152
|
-
var c = bytes[i]
|
|
153
|
-
if (c >= 65u8 && c <= 90u8) {
|
|
154
|
-
c = c + 32u8
|
|
155
|
-
}
|
|
156
|
-
out[i] = c
|
|
157
|
-
}
|
|
158
|
-
return String.fromUtf8(out)
|
|
159
|
-
}
|
|
1
|
+
package cjTauri
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* URL → host 提取(核心共享层):http 与 ws 两个插件共用同一套解析与大小写口径。
|
|
5
|
+
*
|
|
6
|
+
* 为什么放核心不放插件:主机白名单的「匹配目标」只要有第二份实现,就一定会有一份
|
|
7
|
+
* 是错的——与 scope 判定同一条铁律(AGENTS §2:安全校验不吃「各插件各写一套」)。
|
|
8
|
+
* 插件只管调,不自己扫字节。
|
|
9
|
+
*
|
|
10
|
+
* 语义:从 `scheme://[user@]host[:port][/path]` 提取 host(小写返回)。
|
|
11
|
+
* 协议只认 http / https / ws / wss;解析不出 host 返回 None。按字节扫(URL 结构
|
|
12
|
+
* 是 ASCII),不用 String 切片撞 UTF-8 边界。public 是为了单测可直接构造(跨包须 public)。
|
|
13
|
+
*/
|
|
14
|
+
public func urlHostOf(rawUrl: String): Option<String> {
|
|
15
|
+
let b = rawUrl.toArray()
|
|
16
|
+
// 找 "://"(58 47 47)
|
|
17
|
+
var schemeEnd: Int64 = -1
|
|
18
|
+
var i: Int64 = 0
|
|
19
|
+
while (i + 2 < b.size) {
|
|
20
|
+
if (b[i] == 58u8 && b[i + 1] == 47u8 && b[i + 2] == 47u8) {
|
|
21
|
+
schemeEnd = i
|
|
22
|
+
break
|
|
23
|
+
}
|
|
24
|
+
i++
|
|
25
|
+
}
|
|
26
|
+
if (schemeEnd <= 0) {
|
|
27
|
+
return None
|
|
28
|
+
}
|
|
29
|
+
let scheme = asciiLowerOf(b[0..schemeEnd])
|
|
30
|
+
if (scheme != "http" && scheme != "https" && scheme != "ws" && scheme != "wss") {
|
|
31
|
+
return None
|
|
32
|
+
}
|
|
33
|
+
// host 段:到 '/' '?' '#' 为止
|
|
34
|
+
var start = schemeEnd + 3
|
|
35
|
+
var end = start
|
|
36
|
+
while (end < b.size) {
|
|
37
|
+
let c = b[end]
|
|
38
|
+
if (c == 47u8 || c == 63u8 || c == 35u8) {
|
|
39
|
+
break
|
|
40
|
+
}
|
|
41
|
+
end++
|
|
42
|
+
}
|
|
43
|
+
if (end == start) {
|
|
44
|
+
return None
|
|
45
|
+
}
|
|
46
|
+
// 去 userinfo(最后一个 '@' 之前的部分)
|
|
47
|
+
var at: Int64 = -1
|
|
48
|
+
var k = end - 1
|
|
49
|
+
while (k >= start) {
|
|
50
|
+
if (b[k] == 64u8) {
|
|
51
|
+
at = k
|
|
52
|
+
break
|
|
53
|
+
}
|
|
54
|
+
k--
|
|
55
|
+
}
|
|
56
|
+
if (at >= 0) {
|
|
57
|
+
start = at + 1
|
|
58
|
+
}
|
|
59
|
+
// 去端口(第一个 ':' 之后)——IPv6 字面量 [..] 截到 ']' 为止,方括号内不拆
|
|
60
|
+
if (b[start] == 91u8) {
|
|
61
|
+
var close: Int64 = -1
|
|
62
|
+
var m = start + 1
|
|
63
|
+
while (m < end) {
|
|
64
|
+
if (b[m] == 93u8) {
|
|
65
|
+
close = m
|
|
66
|
+
break
|
|
67
|
+
}
|
|
68
|
+
m++
|
|
69
|
+
}
|
|
70
|
+
if (close >= 0) {
|
|
71
|
+
end = close + 1
|
|
72
|
+
}
|
|
73
|
+
} else {
|
|
74
|
+
var colon: Int64 = -1
|
|
75
|
+
var m = start
|
|
76
|
+
while (m < end) {
|
|
77
|
+
if (b[m] == 58u8) {
|
|
78
|
+
colon = m
|
|
79
|
+
break
|
|
80
|
+
}
|
|
81
|
+
m++
|
|
82
|
+
}
|
|
83
|
+
if (colon >= 0) {
|
|
84
|
+
end = colon
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (end <= start) {
|
|
88
|
+
return None
|
|
89
|
+
}
|
|
90
|
+
let host = asciiLowerOf(b[start..end])
|
|
91
|
+
if (host.size == 0) {
|
|
92
|
+
return None
|
|
93
|
+
}
|
|
94
|
+
return Some(host)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* host 是不是 IP 字面量(IPv4 / IPv6,可带方括号)。
|
|
99
|
+
*
|
|
100
|
+
* 为什么需要它:建 TLS 客户端时要用 host 当 **SNI**(`serverName`),而 RFC 6066 明确不许 SNI 里放
|
|
101
|
+
* IP 字面量——stdx 默认不发 SNI,本仓给「域名」补上 SNI 的那一轮必须把 IP 排除在外,否则
|
|
102
|
+
* 「https 直连 IP」这类原本可用的端点会被对端当场拒掉(修一个坑别踩出另一个)。
|
|
103
|
+
* 判定只认严格形态:四段十进制且每段 <= 255 的 IPv4,或含冒号 / 带方括号的 IPv6——
|
|
104
|
+
* 纯十六进制字母的域名(如 `dead.beef`)是域名,不是 IP。
|
|
105
|
+
*/
|
|
106
|
+
public func isIpLiteralHost(host: String): Bool {
|
|
107
|
+
if (host.size == 0) {
|
|
108
|
+
return false
|
|
109
|
+
}
|
|
110
|
+
let b = host.toArray()
|
|
111
|
+
// 带方括号 = IPv6 字面量(urlHostOf 会把方括号一起返回)
|
|
112
|
+
if (b[0] == 91u8 && b[b.size - 1] == 93u8) {
|
|
113
|
+
return true
|
|
114
|
+
}
|
|
115
|
+
for (i in 0..b.size) {
|
|
116
|
+
if (b[i] == 58u8) {
|
|
117
|
+
return true // 含冒号即 IPv6(含 ::1 这类简写)
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
var segs = 0
|
|
121
|
+
var digits = 0
|
|
122
|
+
var value: Int64 = 0
|
|
123
|
+
for (i in 0..b.size) {
|
|
124
|
+
let c = b[i]
|
|
125
|
+
if (c == 46u8) {
|
|
126
|
+
if (digits == 0 || value > 255) {
|
|
127
|
+
return false
|
|
128
|
+
}
|
|
129
|
+
segs = segs + 1
|
|
130
|
+
digits = 0
|
|
131
|
+
value = 0
|
|
132
|
+
} else if (c >= 48u8 && c <= 57u8) {
|
|
133
|
+
digits = digits + 1
|
|
134
|
+
if (digits > 3) {
|
|
135
|
+
return false
|
|
136
|
+
}
|
|
137
|
+
value = value * 10 + Int64(c - 48u8)
|
|
138
|
+
} else {
|
|
139
|
+
return false
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if (digits == 0 || value > 255) {
|
|
143
|
+
return false
|
|
144
|
+
}
|
|
145
|
+
return segs == 3
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/** ASCII 字节 → 小写字符串(非 ASCII 原样保留);host 匹配统一走这里 */
|
|
149
|
+
private func asciiLowerOf(bytes: Array<Byte>): String {
|
|
150
|
+
let out = Array<Byte>(bytes.size, repeat: 0)
|
|
151
|
+
for (i in 0..bytes.size) {
|
|
152
|
+
var c = bytes[i]
|
|
153
|
+
if (c >= 65u8 && c <= 90u8) {
|
|
154
|
+
c = c + 32u8
|
|
155
|
+
}
|
|
156
|
+
out[i] = c
|
|
157
|
+
}
|
|
158
|
+
return String.fromUtf8(out)
|
|
159
|
+
}
|
package/src/version.cj
CHANGED
|
@@ -1,44 +1,44 @@
|
|
|
1
|
-
package cjTauri
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* 框架版本:仓颉侧的单一代码来源(`system:version` 命令返回它)。
|
|
5
|
-
*
|
|
6
|
-
* 发版时必须与以下位置同步,改完跑 `bash scripts/check-version.sh` 自检:
|
|
7
|
-
* - cjpm.toml 的 version(框架包)
|
|
8
|
-
* - cli/cjpm.toml 的 version(CLI 包)
|
|
9
|
-
* - cli/src/project.cj 的 cliVersion()
|
|
10
|
-
* - CHANGELOG.md 顶部第一个已发版段
|
|
11
|
-
*/
|
|
12
|
-
public let CJ_TAURI_VERSION = "2.
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* IPC 报文协议版本(报文形状是跨层契约,加版本字段是协议治理惯例):事件 / 回执信封的 `protocol` 字段
|
|
16
|
-
* 与 `system:version` 返回的 `protocol` 字段都来自这里——单一代码来源,改协议时同步抬版本。
|
|
17
|
-
*
|
|
18
|
-
* 为什么同进程也要有:报文形状现在是跨层契约(C 桥 bridge_js.h 的页面侧解析、CLI 的
|
|
19
|
-
* manifest 消费、将来 HarmonyOS/独立进程形态的跨进程边界),有版本字段才能在「旧页面
|
|
20
|
-
* 配新框架」这类错配时给出可诊断的信号,而不是行为悄悄漂移。
|
|
21
|
-
* v1:`type` + `event`/`id` + `payload` (+ 可选 `coalesce`/`window`);本字段加入记 v1,
|
|
22
|
-
* 此后任何「删字段 / 改语义」必须抬到 v2。
|
|
23
|
-
*/
|
|
24
|
-
public let CJ_IPC_PROTOCOL = "1"
|
|
25
|
-
|
|
26
|
-
/** 当前宿主平台标识(`system:version` 的 platform 字段) */
|
|
27
|
-
// 鸿蒙目标的 `os` 仍报 Linux(实测),所以 `os` 维度分不开「GTK 宿主」与「ArkWeb 宿主」。
|
|
28
|
-
// 判据用 `env`:鸿蒙目标(`aarch64-linux-ohos`)是 `ohos`,桌面 Linux 是 `gnu`——两者互斥;
|
|
29
|
-
// 而 `arch` 不行(桌面 aarch64 Linux 同样是 `aarch64`,会被误报成鸿蒙)。
|
|
30
|
-
// 平台标识必须是真实的那一个:`linux` / `ohos` 混用会让前端与证据链分不清跑在哪个宿主上。
|
|
31
|
-
@When[os == "Linux" && env != "ohos"]
|
|
32
|
-
public func currentPlatform(): String {
|
|
33
|
-
return "linux"
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
@When[env == "ohos"]
|
|
37
|
-
public func currentPlatform(): String {
|
|
38
|
-
return "ohos"
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
@When[os == "Windows"]
|
|
42
|
-
public func currentPlatform(): String {
|
|
43
|
-
return "windows"
|
|
44
|
-
}
|
|
1
|
+
package cjTauri
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 框架版本:仓颉侧的单一代码来源(`system:version` 命令返回它)。
|
|
5
|
+
*
|
|
6
|
+
* 发版时必须与以下位置同步,改完跑 `bash scripts/check-version.sh` 自检:
|
|
7
|
+
* - cjpm.toml 的 version(框架包)
|
|
8
|
+
* - cli/cjpm.toml 的 version(CLI 包)
|
|
9
|
+
* - cli/src/project.cj 的 cliVersion()
|
|
10
|
+
* - CHANGELOG.md 顶部第一个已发版段
|
|
11
|
+
*/
|
|
12
|
+
public let CJ_TAURI_VERSION = "2.1.0"
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* IPC 报文协议版本(报文形状是跨层契约,加版本字段是协议治理惯例):事件 / 回执信封的 `protocol` 字段
|
|
16
|
+
* 与 `system:version` 返回的 `protocol` 字段都来自这里——单一代码来源,改协议时同步抬版本。
|
|
17
|
+
*
|
|
18
|
+
* 为什么同进程也要有:报文形状现在是跨层契约(C 桥 bridge_js.h 的页面侧解析、CLI 的
|
|
19
|
+
* manifest 消费、将来 HarmonyOS/独立进程形态的跨进程边界),有版本字段才能在「旧页面
|
|
20
|
+
* 配新框架」这类错配时给出可诊断的信号,而不是行为悄悄漂移。
|
|
21
|
+
* v1:`type` + `event`/`id` + `payload` (+ 可选 `coalesce`/`window`);本字段加入记 v1,
|
|
22
|
+
* 此后任何「删字段 / 改语义」必须抬到 v2。
|
|
23
|
+
*/
|
|
24
|
+
public let CJ_IPC_PROTOCOL = "1"
|
|
25
|
+
|
|
26
|
+
/** 当前宿主平台标识(`system:version` 的 platform 字段) */
|
|
27
|
+
// 鸿蒙目标的 `os` 仍报 Linux(实测),所以 `os` 维度分不开「GTK 宿主」与「ArkWeb 宿主」。
|
|
28
|
+
// 判据用 `env`:鸿蒙目标(`aarch64-linux-ohos`)是 `ohos`,桌面 Linux 是 `gnu`——两者互斥;
|
|
29
|
+
// 而 `arch` 不行(桌面 aarch64 Linux 同样是 `aarch64`,会被误报成鸿蒙)。
|
|
30
|
+
// 平台标识必须是真实的那一个:`linux` / `ohos` 混用会让前端与证据链分不清跑在哪个宿主上。
|
|
31
|
+
@When[os == "Linux" && env != "ohos"]
|
|
32
|
+
public func currentPlatform(): String {
|
|
33
|
+
return "linux"
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
@When[env == "ohos"]
|
|
37
|
+
public func currentPlatform(): String {
|
|
38
|
+
return "ohos"
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
@When[os == "Windows"]
|
|
42
|
+
public func currentPlatform(): String {
|
|
43
|
+
return "windows"
|
|
44
|
+
}
|
package/src/window.cj
CHANGED
|
@@ -1,51 +1,51 @@
|
|
|
1
|
-
package cjTauri
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* 窗口配置(对标 tauri.conf.json 的 app.windows[] 项)
|
|
5
|
-
*
|
|
6
|
-
* 用法:
|
|
7
|
-
* let app = TauriApp().window(WindowConfig("我的应用", 1200, 800))
|
|
8
|
-
*
|
|
9
|
-
* // 要自定义窗口图标(可选):
|
|
10
|
-
* var cfg = WindowConfig("我的应用", 1200, 800)
|
|
11
|
-
* cfg.iconPath = "assets/app.ico"
|
|
12
|
-
* let app = TauriApp().window(cfg)
|
|
13
|
-
*
|
|
14
|
-
* 默认值与此前桥内硬编码的值一致(标题 cj-tauri / 900x640),
|
|
15
|
-
* 因此不调用 window() 的应用行为不变。
|
|
16
|
-
*/
|
|
17
|
-
public class WindowConfig {
|
|
18
|
-
public var title: String
|
|
19
|
-
public var width: Int64
|
|
20
|
-
public var height: Int64
|
|
21
|
-
// 是否允许打开开发者工具(WebView2 的 AreDevToolsEnabled / WebKit 的 developer extras)
|
|
22
|
-
public var devTools: Bool
|
|
23
|
-
// 窗口图标路径:Windows 用 .ico(LoadImageW 只认 .ico);Linux 走 GTK,png/ico 都行。
|
|
24
|
-
// 空字符串 = 用系统默认图标(默认行为,不影响老应用)。
|
|
25
|
-
public var iconPath: String
|
|
26
|
-
|
|
27
|
-
// 最小化到托盘(B 项):用户在标题栏点「最小化」时窗口**隐藏**(从任务栏消失、只留托盘图标),
|
|
28
|
-
// 而不是缩成任务栏按钮。默认 false = 老行为不变。
|
|
29
|
-
// 必须与服务端配套:应用得先 setTray(...),否则隐藏之后界面上没有任何入口——
|
|
30
|
-
// 框架不替应用拦这个组合(它不知道应用的托盘菜单长什么样),但真到最小化那一刻平台会
|
|
31
|
-
// 复核托盘是否**真的**装上了:没装就降级为普通最小化并打一行 stderr,避免「窗口没了也点不回来」。
|
|
32
|
-
public var minimizeToTray: Bool
|
|
33
|
-
|
|
34
|
-
public init() {
|
|
35
|
-
this.title = "cj-tauri"
|
|
36
|
-
this.width = 900
|
|
37
|
-
this.height = 640
|
|
38
|
-
this.devTools = true
|
|
39
|
-
this.iconPath = ""
|
|
40
|
-
this.minimizeToTray = false
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
public init(title: String, width: Int64, height: Int64) {
|
|
44
|
-
this.title = title
|
|
45
|
-
this.width = width
|
|
46
|
-
this.height = height
|
|
47
|
-
this.devTools = true
|
|
48
|
-
this.iconPath = ""
|
|
49
|
-
this.minimizeToTray = false
|
|
50
|
-
}
|
|
51
|
-
}
|
|
1
|
+
package cjTauri
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 窗口配置(对标 tauri.conf.json 的 app.windows[] 项)
|
|
5
|
+
*
|
|
6
|
+
* 用法:
|
|
7
|
+
* let app = TauriApp().window(WindowConfig("我的应用", 1200, 800))
|
|
8
|
+
*
|
|
9
|
+
* // 要自定义窗口图标(可选):
|
|
10
|
+
* var cfg = WindowConfig("我的应用", 1200, 800)
|
|
11
|
+
* cfg.iconPath = "assets/app.ico"
|
|
12
|
+
* let app = TauriApp().window(cfg)
|
|
13
|
+
*
|
|
14
|
+
* 默认值与此前桥内硬编码的值一致(标题 cj-tauri / 900x640),
|
|
15
|
+
* 因此不调用 window() 的应用行为不变。
|
|
16
|
+
*/
|
|
17
|
+
public class WindowConfig {
|
|
18
|
+
public var title: String
|
|
19
|
+
public var width: Int64
|
|
20
|
+
public var height: Int64
|
|
21
|
+
// 是否允许打开开发者工具(WebView2 的 AreDevToolsEnabled / WebKit 的 developer extras)
|
|
22
|
+
public var devTools: Bool
|
|
23
|
+
// 窗口图标路径:Windows 用 .ico(LoadImageW 只认 .ico);Linux 走 GTK,png/ico 都行。
|
|
24
|
+
// 空字符串 = 用系统默认图标(默认行为,不影响老应用)。
|
|
25
|
+
public var iconPath: String
|
|
26
|
+
|
|
27
|
+
// 最小化到托盘(B 项):用户在标题栏点「最小化」时窗口**隐藏**(从任务栏消失、只留托盘图标),
|
|
28
|
+
// 而不是缩成任务栏按钮。默认 false = 老行为不变。
|
|
29
|
+
// 必须与服务端配套:应用得先 setTray(...),否则隐藏之后界面上没有任何入口——
|
|
30
|
+
// 框架不替应用拦这个组合(它不知道应用的托盘菜单长什么样),但真到最小化那一刻平台会
|
|
31
|
+
// 复核托盘是否**真的**装上了:没装就降级为普通最小化并打一行 stderr,避免「窗口没了也点不回来」。
|
|
32
|
+
public var minimizeToTray: Bool
|
|
33
|
+
|
|
34
|
+
public init() {
|
|
35
|
+
this.title = "cj-tauri"
|
|
36
|
+
this.width = 900
|
|
37
|
+
this.height = 640
|
|
38
|
+
this.devTools = true
|
|
39
|
+
this.iconPath = ""
|
|
40
|
+
this.minimizeToTray = false
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
public init(title: String, width: Int64, height: Int64) {
|
|
44
|
+
this.title = title
|
|
45
|
+
this.width = width
|
|
46
|
+
this.height = height
|
|
47
|
+
this.devTools = true
|
|
48
|
+
this.iconPath = ""
|
|
49
|
+
this.minimizeToTray = false
|
|
50
|
+
}
|
|
51
|
+
}
|