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.
Files changed (158) hide show
  1. package/README.md +113 -99
  2. package/bin/cj-tauri.js +287 -287
  3. package/cjpm.toml +63 -52
  4. package/cli/cjpm.toml +22 -22
  5. package/cli/src/doctor.cj +308 -306
  6. package/cli/src/main.cj +129 -129
  7. package/cli/src/manifest.cj +632 -558
  8. package/cli/src/manifest_test.cj +87 -0
  9. package/cli/src/project.cj +770 -770
  10. package/cli/src/resolve.cj +348 -348
  11. package/cli/src/scaffold.cj +369 -369
  12. package/cli/src/sync.cj +526 -526
  13. package/cli/src/util.cj +168 -168
  14. package/cli/templates/app/README.md +51 -48
  15. package/cli/templates/app/assets/capabilities/default.json +7 -7
  16. package/cli/templates/app/assets/ui/index.html +120 -118
  17. package/cli/templates/app/cj-tauri.toml +32 -22
  18. package/cli/templates/app/cjpm.toml +34 -34
  19. package/cli/templates/app/src/main.cj +101 -90
  20. package/cli/templates/app-react/README.md +56 -56
  21. package/cli/templates/app-react/assets/capabilities/default.json +7 -7
  22. package/cli/templates/app-react/assets/ui/index.html +25 -25
  23. package/cli/templates/app-react/assets/ui/package.json +19 -19
  24. package/cli/templates/app-react/assets/ui/src/App.css +67 -67
  25. package/cli/templates/app-react/assets/ui/src/App.jsx +124 -124
  26. package/cli/templates/app-react/assets/ui/src/main.jsx +6 -6
  27. package/cli/templates/app-react/assets/ui/vite.config.js +24 -24
  28. package/cli/templates/app-react/cj-tauri.toml +33 -23
  29. package/cli/templates/app-react/cjpm.toml +34 -34
  30. package/cli/templates/app-react/src/main.cj +91 -91
  31. package/cli/templates/app-vue/README.md +56 -56
  32. package/cli/templates/app-vue/assets/capabilities/default.json +7 -7
  33. package/cli/templates/app-vue/assets/ui/index.html +25 -25
  34. package/cli/templates/app-vue/assets/ui/package.json +18 -18
  35. package/cli/templates/app-vue/assets/ui/src/App.vue +176 -176
  36. package/cli/templates/app-vue/assets/ui/src/main.js +4 -4
  37. package/cli/templates/app-vue/assets/ui/vite.config.js +24 -24
  38. package/cli/templates/app-vue/cj-tauri.toml +33 -23
  39. package/cli/templates/app-vue/cjpm.toml +34 -34
  40. package/cli/templates/app-vue/src/main.cj +91 -91
  41. package/cli/templates/ohos-skeleton/AppScope/app.json5 +13 -13
  42. package/cli/templates/ohos-skeleton/AppScope/resources/base/element/string.json +8 -8
  43. package/cli/templates/ohos-skeleton/AppScope/resources/base/media/layered_image.json +6 -6
  44. package/cli/templates/ohos-skeleton/README.md +84 -79
  45. package/cli/templates/ohos-skeleton/build-hap.sh +15 -0
  46. package/cli/templates/ohos-skeleton/build-profile.json5 +46 -46
  47. package/cli/templates/ohos-skeleton/entry/build-profile.json5 +26 -26
  48. package/cli/templates/ohos-skeleton/entry/cjpm.toml +51 -43
  49. package/cli/templates/ohos-skeleton/entry/hvigorfile.ts +6 -6
  50. package/cli/templates/ohos-skeleton/entry/oh-package.json5 +9 -9
  51. package/cli/templates/ohos-skeleton/entry/src/main/cangjie/ability_stage.cj +17 -17
  52. package/cli/templates/ohos-skeleton/entry/src/main/cangjie/app_host.cj +94 -94
  53. package/cli/templates/ohos-skeleton/entry/src/main/cangjie/dialog_host.cj +217 -0
  54. package/cli/templates/ohos-skeleton/entry/src/main/cangjie/index.cj +527 -167
  55. package/cli/templates/ohos-skeleton/entry/src/main/cangjie/main_ability.cj +139 -139
  56. package/cli/templates/ohos-skeleton/entry/src/main/module.json5 +57 -49
  57. package/cli/templates/ohos-skeleton/entry/src/main/resources/base/element/color.json +8 -8
  58. package/cli/templates/ohos-skeleton/entry/src/main/resources/base/element/string.json +16 -16
  59. package/cli/templates/ohos-skeleton/entry/src/main/resources/base/media/layered_image.json +6 -6
  60. package/cli/templates/ohos-skeleton/entry/src/main/resources/base/profile/main_pages.json +2 -2
  61. package/cli/templates/ohos-skeleton/entry/src/main/resources/rawfile/capabilities.json +6 -6
  62. package/cli/templates/ohos-skeleton/entry/src/main/resources/rawfile/index.html +92 -92
  63. package/cli/templates/ohos-skeleton/hvigor/hvigor-config.json5 +5 -5
  64. package/cli/templates/ohos-skeleton/hvigorfile.ts +6 -6
  65. package/cli/templates/ohos-skeleton/oh-package.json5 +10 -10
  66. package/native/build_win.bat +62 -62
  67. package/native/core/bridge_core.c +1681 -1626
  68. package/native/core/bridge_core.h +675 -618
  69. package/native/core/bridge_js.h +108 -108
  70. package/native/platforms/harmonyos/README.md +115 -6
  71. package/native/platforms/linux/bridge_linux.c +2787 -2485
  72. package/native/platforms/windows/bridge_win.c +3740 -3248
  73. package/native/tests/gtk_threading_probe.c +143 -143
  74. package/native/tests/test_bridge_core.c +1339 -1228
  75. package/package.json +53 -53
  76. package/prebuilt/linux-x64/cj-tauri +0 -0
  77. package/src/api_system.cj +67 -67
  78. package/src/app.cj +325 -969
  79. package/src/app_events.cj +166 -0
  80. package/src/app_host_ops.cj +287 -0
  81. package/src/app_run.cj +283 -0
  82. package/src/app_spec.cj +76 -76
  83. package/src/arkweb_menu.cj +216 -0
  84. package/src/arkweb_script.cj +142 -142
  85. package/src/capability.cj +409 -409
  86. package/src/clipboard_bridge.cj +178 -0
  87. package/src/dialog_spec.cj +79 -0
  88. package/src/dragdrop.cj +26 -26
  89. package/src/embedded_assets.cj +98 -98
  90. package/src/host.cj +752 -607
  91. package/src/host_arkweb.cj +924 -778
  92. package/src/host_webkit.cj +663 -570
  93. package/src/host_webview2.cj +663 -570
  94. package/src/hotkey.cj +66 -66
  95. package/src/ipc_hub.cj +337 -337
  96. package/src/ipc_message.cj +286 -286
  97. package/src/launch.cj +62 -62
  98. package/src/logging.cj +127 -127
  99. package/src/menu.cj +197 -197
  100. package/src/platform/platform_app_context.cj +77 -77
  101. package/src/platform/platform_assets.cj +33 -33
  102. package/src/platform/platform_discover.cj +176 -176
  103. package/src/platform/platform_env.cj +29 -29
  104. package/src/platform/platform_feature.cj +31 -31
  105. package/src/platform/platform_page_source.cj +87 -87
  106. package/src/platform/platform_target_info.cj +32 -32
  107. package/src/platform_host_provider.cj +87 -87
  108. package/src/plugin.cj +333 -333
  109. package/src/plugins/clipboard/plugin_clipboard.cj +152 -152
  110. package/src/plugins/dialog/plugin_dialog.cj +209 -209
  111. package/src/plugins/fs/plugin_fs.cj +105 -1
  112. package/src/plugins/http/http_backend.cj +131 -0
  113. package/src/plugins/http/http_desktop.cj +195 -0
  114. package/src/plugins/http/http_ohos.cj +204 -0
  115. package/src/plugins/http/plugin_http.cj +310 -459
  116. package/src/plugins/log/plugin_log.cj +105 -105
  117. package/src/plugins/menu/plugin_menu.cj +158 -158
  118. package/src/plugins/notification/plugin_notification.cj +154 -154
  119. package/src/plugins/serial/plugin_serial.cj +458 -454
  120. package/src/plugins/serial/serial_bridge.cj +194 -194
  121. package/src/plugins/serial/serial_manager_ohos.cj +92 -0
  122. package/src/plugins/serial/serial_ohos.cj +529 -0
  123. package/src/plugins/shell/plugin_shell.cj +258 -258
  124. package/src/plugins/sqlite/plugin_sqlite.cj +705 -710
  125. package/src/plugins/sqlite/sqlite_ffi.cj +206 -211
  126. package/src/plugins/ws/plugin_ws.cj +488 -470
  127. package/src/process_hidden.cj +174 -174
  128. package/src/scope.cj +391 -391
  129. package/src/shell_event.cj +69 -69
  130. package/src/tests/app_spec_test.cj +126 -127
  131. package/src/tests/capability_test.cj +243 -243
  132. package/src/tests/dialog_spec_test.cj +73 -0
  133. package/src/tests/fake_host.cj +201 -201
  134. package/src/tests/ipc_hub_test.cj +487 -487
  135. package/src/tests/logging_test.cj +62 -62
  136. package/src/tests/platform_contract_test.cj +251 -251
  137. package/src/tests/plugin_clipboard_test.cj +222 -222
  138. package/src/tests/plugin_dialog_test.cj +237 -237
  139. package/src/tests/plugin_fs_test.cj +207 -0
  140. package/src/tests/plugin_http_test.cj +124 -124
  141. package/src/tests/plugin_notification_test.cj +205 -205
  142. package/src/tests/plugin_serial_test.cj +48 -0
  143. package/src/tests/plugin_test.cj +605 -585
  144. package/src/tests/plugin_ws_test.cj +40 -40
  145. package/src/tests/process_hidden_test.cj +129 -129
  146. package/src/tests/scope_test.cj +350 -350
  147. package/src/tests/system_host_test.cj +99 -81
  148. package/src/tests/urlutil_test.cj +53 -53
  149. package/src/tests/version_test.cj +75 -75
  150. package/src/tests/window_registry_test.cj +123 -123
  151. package/src/tray.cj +90 -90
  152. package/src/urlutil.cj +159 -159
  153. package/src/version.cj +44 -44
  154. package/src/window.cj +51 -51
  155. package/src/window_registry.cj +116 -116
  156. package/prebuilt/win32-x64/cj-tauri.exe +0 -0
  157. package/src/plugins/serial/serial_ohos_stub.cj +0 -61
  158. 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.0.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
- }
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
+ }