cj-tauri 1.1.2 → 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 (162) hide show
  1. package/README.md +137 -77
  2. package/bin/cj-tauri.js +287 -287
  3. package/cjpm.toml +13 -2
  4. package/cli/cjpm.toml +22 -13
  5. package/cli/src/doctor.cj +308 -304
  6. package/cli/src/main.cj +129 -121
  7. package/cli/src/manifest.cj +632 -0
  8. package/cli/src/manifest_test.cj +87 -0
  9. package/cli/src/project.cj +770 -754
  10. package/cli/src/resolve.cj +348 -348
  11. package/cli/src/scaffold.cj +46 -38
  12. package/cli/src/sync.cj +526 -0
  13. package/cli/src/util.cj +9 -0
  14. package/cli/templates/app/README.md +30 -59
  15. package/cli/templates/app/{ui → assets/ui}/index.html +2 -0
  16. package/cli/templates/app/cj-tauri.toml +32 -0
  17. package/cli/templates/app/cjpm.toml +21 -4
  18. package/cli/templates/app/src/main.cj +29 -16
  19. package/cli/templates/app-react/README.md +34 -45
  20. package/cli/templates/app-react/{ui → assets/ui}/index.html +25 -25
  21. package/cli/templates/app-react/{ui → assets/ui}/src/App.css +67 -67
  22. package/cli/templates/app-react/{ui → assets/ui}/src/App.jsx +124 -124
  23. package/cli/templates/app-react/cj-tauri.toml +33 -0
  24. package/cli/templates/app-react/cjpm.toml +21 -4
  25. package/cli/templates/app-react/src/main.cj +18 -29
  26. package/cli/templates/app-vue/README.md +34 -38
  27. package/cli/templates/app-vue/{ui → assets/ui}/index.html +25 -25
  28. package/cli/templates/app-vue/{ui → assets/ui}/src/App.vue +176 -176
  29. package/cli/templates/app-vue/cj-tauri.toml +33 -0
  30. package/cli/templates/app-vue/cjpm.toml +21 -4
  31. package/cli/templates/app-vue/src/main.cj +18 -29
  32. package/cli/templates/{ohos-pc → ohos-skeleton}/README.md +5 -0
  33. package/cli/templates/{ohos-pc → ohos-skeleton}/build-hap.sh +15 -0
  34. package/cli/templates/{ohos-pc → ohos-skeleton}/entry/cjpm.toml +8 -0
  35. package/cli/templates/ohos-skeleton/entry/src/main/cangjie/dialog_host.cj +217 -0
  36. package/cli/templates/ohos-skeleton/entry/src/main/cangjie/index.cj +527 -0
  37. package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/module.json5 +8 -0
  38. package/native/build_win.bat +62 -62
  39. package/native/core/bridge_core.c +1681 -1626
  40. package/native/core/bridge_core.h +675 -618
  41. package/native/core/bridge_js.h +108 -108
  42. package/native/platforms/harmonyos/README.md +115 -6
  43. package/native/platforms/linux/bridge_linux.c +2787 -2485
  44. package/native/platforms/windows/bridge_win.c +3740 -3248
  45. package/native/tests/gtk_threading_probe.c +143 -143
  46. package/native/tests/test_bridge_core.c +1339 -1228
  47. package/package.json +53 -51
  48. package/prebuilt/linux-x64/cj-tauri +0 -0
  49. package/src/api_system.cj +67 -67
  50. package/src/app.cj +325 -940
  51. package/src/app_events.cj +166 -0
  52. package/src/app_host_ops.cj +287 -0
  53. package/src/app_run.cj +283 -0
  54. package/src/app_spec.cj +76 -0
  55. package/src/arkweb_menu.cj +216 -0
  56. package/src/arkweb_script.cj +0 -12
  57. package/src/capability.cj +409 -409
  58. package/src/clipboard_bridge.cj +178 -0
  59. package/src/dialog_spec.cj +79 -0
  60. package/src/dragdrop.cj +26 -26
  61. package/src/embedded_assets.cj +98 -98
  62. package/src/host.cj +752 -604
  63. package/src/host_arkweb.cj +201 -17
  64. package/src/host_webkit.cj +663 -548
  65. package/src/host_webview2.cj +663 -548
  66. package/src/hotkey.cj +66 -66
  67. package/src/ipc_hub.cj +337 -337
  68. package/src/ipc_message.cj +286 -286
  69. package/src/launch.cj +62 -0
  70. package/src/logging.cj +127 -127
  71. package/src/menu.cj +197 -197
  72. package/src/platform/platform_app_context.cj +77 -0
  73. package/src/platform/platform_assets.cj +33 -0
  74. package/src/platform/platform_discover.cj +176 -0
  75. package/src/platform/platform_env.cj +29 -0
  76. package/src/platform/platform_feature.cj +31 -0
  77. package/src/platform/platform_page_source.cj +87 -0
  78. package/src/platform/platform_target_info.cj +32 -0
  79. package/src/platform_host_provider.cj +87 -0
  80. package/src/plugin.cj +333 -299
  81. package/src/plugins/clipboard/plugin_clipboard.cj +152 -144
  82. package/src/plugins/dialog/plugin_dialog.cj +209 -209
  83. package/src/plugins/fs/plugin_fs.cj +105 -1
  84. package/src/plugins/http/http_backend.cj +131 -0
  85. package/src/plugins/http/http_desktop.cj +195 -0
  86. package/src/plugins/http/http_ohos.cj +204 -0
  87. package/src/plugins/http/plugin_http.cj +310 -459
  88. package/src/plugins/log/plugin_log.cj +105 -105
  89. package/src/plugins/menu/plugin_menu.cj +8 -0
  90. package/src/plugins/notification/plugin_notification.cj +154 -146
  91. package/src/plugins/serial/plugin_serial.cj +17 -1
  92. package/src/plugins/serial/serial_bridge.cj +9 -1
  93. package/src/plugins/serial/serial_manager_ohos.cj +92 -0
  94. package/src/plugins/serial/serial_ohos.cj +529 -0
  95. package/src/plugins/shell/plugin_shell.cj +29 -1
  96. package/src/plugins/sqlite/plugin_sqlite.cj +8 -0
  97. package/src/plugins/ws/plugin_ws.cj +488 -470
  98. package/src/process_hidden.cj +174 -174
  99. package/src/scope.cj +391 -391
  100. package/src/shell_event.cj +69 -69
  101. package/src/tests/app_spec_test.cj +126 -0
  102. package/src/tests/capability_test.cj +243 -243
  103. package/src/tests/dialog_spec_test.cj +73 -0
  104. package/src/tests/fake_host.cj +201 -186
  105. package/src/tests/ipc_hub_test.cj +487 -487
  106. package/src/tests/logging_test.cj +62 -62
  107. package/src/tests/platform_contract_test.cj +251 -0
  108. package/src/tests/plugin_clipboard_test.cj +222 -222
  109. package/src/tests/plugin_dialog_test.cj +237 -237
  110. package/src/tests/plugin_fs_test.cj +207 -0
  111. package/src/tests/plugin_http_test.cj +124 -124
  112. package/src/tests/plugin_notification_test.cj +205 -205
  113. package/src/tests/plugin_serial_test.cj +48 -0
  114. package/src/tests/plugin_test.cj +66 -3
  115. package/src/tests/plugin_ws_test.cj +40 -40
  116. package/src/tests/process_hidden_test.cj +129 -129
  117. package/src/tests/scope_test.cj +350 -350
  118. package/src/tests/system_host_test.cj +99 -81
  119. package/src/tests/urlutil_test.cj +53 -53
  120. package/src/tests/version_test.cj +75 -75
  121. package/src/tests/window_registry_test.cj +123 -123
  122. package/src/tray.cj +90 -90
  123. package/src/urlutil.cj +159 -159
  124. package/src/version.cj +44 -44
  125. package/src/window.cj +51 -51
  126. package/src/window_registry.cj +116 -116
  127. package/cli/templates/ohos-pc/entry/src/main/cangjie/index.cj +0 -167
  128. package/prebuilt/win32-x64/cj-tauri.exe +0 -0
  129. package/src/host_factory.cj +0 -48
  130. /package/cli/templates/app/{capabilities → assets/capabilities}/default.json +0 -0
  131. /package/cli/templates/app-react/{capabilities → assets/capabilities}/default.json +0 -0
  132. /package/cli/templates/app-react/{ui → assets/ui}/package.json +0 -0
  133. /package/cli/templates/app-react/{ui → assets/ui}/src/main.jsx +0 -0
  134. /package/cli/templates/app-react/{ui → assets/ui}/vite.config.js +0 -0
  135. /package/cli/templates/app-vue/{capabilities → assets/capabilities}/default.json +0 -0
  136. /package/cli/templates/app-vue/{ui → assets/ui}/package.json +0 -0
  137. /package/cli/templates/app-vue/{ui → assets/ui}/src/main.js +0 -0
  138. /package/cli/templates/app-vue/{ui → assets/ui}/vite.config.js +0 -0
  139. /package/cli/templates/{ohos-pc → ohos-skeleton}/AppScope/app.json5 +0 -0
  140. /package/cli/templates/{ohos-pc → ohos-skeleton}/AppScope/resources/base/element/string.json +0 -0
  141. /package/cli/templates/{ohos-pc → ohos-skeleton}/AppScope/resources/base/media/background.png +0 -0
  142. /package/cli/templates/{ohos-pc → ohos-skeleton}/AppScope/resources/base/media/foreground.png +0 -0
  143. /package/cli/templates/{ohos-pc → ohos-skeleton}/AppScope/resources/base/media/layered_image.json +0 -0
  144. /package/cli/templates/{ohos-pc → ohos-skeleton}/build-profile.json5 +0 -0
  145. /package/cli/templates/{ohos-pc → ohos-skeleton}/entry/build-profile.json5 +0 -0
  146. /package/cli/templates/{ohos-pc → ohos-skeleton}/entry/hvigorfile.ts +0 -0
  147. /package/cli/templates/{ohos-pc → ohos-skeleton}/entry/oh-package.json5 +0 -0
  148. /package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/cangjie/ability_stage.cj +0 -0
  149. /package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/cangjie/app_host.cj +0 -0
  150. /package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/cangjie/main_ability.cj +0 -0
  151. /package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/resources/base/element/color.json +0 -0
  152. /package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/resources/base/element/string.json +0 -0
  153. /package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/resources/base/media/background.png +0 -0
  154. /package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/resources/base/media/foreground.png +0 -0
  155. /package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/resources/base/media/layered_image.json +0 -0
  156. /package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/resources/base/media/startIcon.png +0 -0
  157. /package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/resources/base/profile/main_pages.json +0 -0
  158. /package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/resources/rawfile/capabilities.json +0 -0
  159. /package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/resources/rawfile/index.html +0 -0
  160. /package/cli/templates/{ohos-pc → ohos-skeleton}/hvigor/hvigor-config.json5 +0 -0
  161. /package/cli/templates/{ohos-pc → ohos-skeleton}/hvigorfile.ts +0 -0
  162. /package/cli/templates/{ohos-pc → ohos-skeleton}/oh-package.json5 +0 -0
@@ -0,0 +1,217 @@
1
+ package ohos_app_cangjie_entry
2
+
3
+ import kit.ArkUI.*
4
+ import ohos.arkui.state_macro_manage.*
5
+ import std.collection.HashMap
6
+ import cjTauri.*
7
+
8
+ /*
9
+ * 「每个窗口已回填的请求 id」——组件与父组件共享的一格状态(同包、UI 线程内)。
10
+ *
11
+ * 为什么需要它:父组件要判断「当前这条还在展示、不能再取下一条」,而展示中这件事
12
+ * 只有组件自己知道(`answered` 是它的私有 @State)。把答案放在这里,两边读同一份,
13
+ * 就不用把闭包当构造参数传给 @Component(那条路宏支持有限,且多窗口下容易串台)。
14
+ *
15
+ * 没登记过的窗口回 -1:与 `dialogRequestId` 的初值相等,所以**首次**允许取请求。
16
+ */
17
+ let dialogAnswered: HashMap<String, Int64> = HashMap<String, Int64>()
18
+
19
+ /** 取某窗口「已回填的请求 id」,没记录过返回 -1(= 还没有任何一条被答过) */
20
+ func dialogAnsweredIdOf(label: String): Int64 {
21
+ match (dialogAnswered.get(label)) {
22
+ case Some(v) => return v
23
+ case None => return -1
24
+ }
25
+ }
26
+
27
+ /** 记下某窗口已回填的 id(回填发生在 UI 线程,与读取同线程,不需要锁) */
28
+ func markDialogAnswered(label: String, id: Int64): Unit {
29
+ dialogAnswered[label] = id
30
+ }
31
+
32
+ /*
33
+ * 对话框 overlay 的外观常量(0xAARRGGBB,Int64 就是 ResourceColor)。
34
+ *
35
+ * **遮罩必须带 alpha**:早先这里是 `Color.Black`(= 0xFF000000,完全不透明),
36
+ * 弹出时整页被一块黑板盖住——用户真机实测的原话是「背景全黑了」。
37
+ * 现在 0x66 ≈ 40% 不透明,页面内容透得出来,才像对话框盖在页面上。
38
+ *
39
+ * 这几个常量就是业务侧的定制位:改配色改这里,改布局改下面 `CjDialogHost.build()`。
40
+ * 想彻底换成自己的样式(比如页内 HTML 弹窗)就不要调 `dialog:message`——
41
+ * overlay 只是「零配置可用」的默认实现,不是唯一通路。
42
+ */
43
+ let DIALOG_SCRIM: Int64 = 0x66000000
44
+
45
+ let DIALOG_CARD_BG: Int64 = 0xFFFFFFFF
46
+
47
+ let DIALOG_TITLE_TEXT: Int64 = 0xFF1A1A1A
48
+
49
+ let DIALOG_BODY_TEXT: Int64 = 0xFF44474F
50
+
51
+ /* 取消键的浅灰底:中性动作不抢主色,桌面惯例里主色只给「确定」 */
52
+ let DIALOG_BTN_NEUTRAL: Int64 = 0xFFF1F3F5
53
+
54
+ /* 确定键底色按 kind 区分:info 蓝 / warning 橙 / error 红;单键与双键共用这一支 */
55
+ let DIALOG_ACCENT_INFO: Int64 = 0xFF0A59F7
56
+
57
+ let DIALOG_ACCENT_WARNING: Int64 = 0xFFED6F21
58
+
59
+ let DIALOG_ACCENT_ERROR: Int64 = 0xFFE84026
60
+
61
+ /*
62
+ * kind → 强调色(`normalizeDialogKind` 是框架共享层的归一,认不出的 kind 已回落成 info)
63
+ *
64
+ * 只影响「确定键底色」这一个可视点:警告与错误在桌面惯例里都用颜色区分,
65
+ * 而单键/双键的**语义**判定在框架侧(`dialogShapeOf`),这里不重复判一次。
66
+ */
67
+ func dialogAccentColor(kind: String): Int64 {
68
+ match (normalizeDialogKind(kind)) {
69
+ case "warning" => return DIALOG_ACCENT_WARNING
70
+ case "error" => return DIALOG_ACCENT_ERROR
71
+ case _ => return DIALOG_ACCENT_INFO
72
+ }
73
+ }
74
+
75
+ /*
76
+ * 宿主对话框的默认呈现(声明式 overlay)。
77
+ *
78
+ * ## 为什么必须是声明式
79
+ *
80
+ * 页面经 `dialog:message` 要求弹框时,命令是从 `javaScriptProxy` 的 `post` 回调同步栈上回来的;
81
+ * 在那条栈上调 `showAlertDialog` / `getPromptAction().showDialog`(含 `workerthread: true`)
82
+ * 会被 ArkUI **静默丢弃**——不抛异常、窗口不画、回调不来(取证见 docs/鸿蒙ArkWeb接入踩坑.md §10.11)。
83
+ * 所以唯一的落法是:回调里只置状态,`build()` 里按状态把 overlay 画成组件树的最后一个孩子。
84
+ *
85
+ * ## 为什么做成组件
86
+ *
87
+ * 内联在 `CjTauriWebView` 里时,业务想换个样子只能改模板——而 `targets/` 是 `cj-tauri sync`
88
+ * 的派生物,改了下次 sync 就没了。抽成组件后业务只需在根 `Stack` 里放一个实例:
89
+ *
90
+ * ```
91
+ * if (this.dialogActive) {
92
+ * CjDialogHost(windowLabel: this.windowLabel, requestId: this.dialogRequestId,
93
+ * title: this.dialogTitle, message: this.dialogMessage,
94
+ * twoKey: this.dialogIsConfirm, kind: this.dialogKind)
95
+ * }
96
+ * ```
97
+ *
98
+ * 调用点必须保持**纯调用**:挂链式修饰(`.width(...)` 之类)会让 `@Component` 宏展开时
99
+ * 补不上 `__gen_parent`,报的是「expected N arguments」(见 AGENTS §4)。
100
+ *
101
+ * ## 点完为什么自己会消失
102
+ *
103
+ * 按钮回填走模块级 `answerArkWebDialog`(框架队列),而父组件的 `dialogActive` 不会因为
104
+ * 一次点击而变——所以收起由组件自己记:`answered` 记住已回填的请求 id,`requestId`
105
+ * 与它不等时才画。下一轮请求进来父组件赋一个新的 `requestId`,卡片自然重新出现。
106
+ * 这条不依赖父组件回调,也就不需要把闭包当构造参数传进来。
107
+ *
108
+ * ## 收起后必须 visibility(None),不能只把子内容裁掉
109
+ *
110
+ * 组件要挂在外层 `Stack` 里就得始终返回一个根节点,所以外层 `Column` 收起来之后**仍然在**——
111
+ * 它是 100%×100% 的透明容器,在 ArkUI 里照样参与命中测试、照样吃掉落在页面上的点击。
112
+ * 真机第二轮反馈的原话是「点完对话框后,点其他没反应了」:卡片确实没了,整页却点不动,
113
+ * 凶手就是这层看不见的壳。
114
+ *
115
+ * `Visibility.Hidden` 不够——它只是不画,**布局占位与命中区都还在**;只有
116
+ * `Visibility.None` 才既不占位也不响应事件。所以这里两分:该画时 Visible,收起时 None。
117
+ * (同类风险:任何「常驻但条件内空的 overlay 容器」都要这么写,别只依赖背景透明。)
118
+ */
119
+ @Component
120
+ class CjDialogHost {
121
+ /* label 决定回填给哪个窗口的宿主(多窗口下不能串台) */
122
+ @Prop
123
+ var windowLabel: String
124
+
125
+ /* 请求 id:父组件每来一条新请求就换一个值,组件据此判断该不该重新显示 */
126
+ @Prop
127
+ var requestId: Int64
128
+
129
+ @Prop
130
+ var title: String
131
+
132
+ @Prop
133
+ var message: String
134
+
135
+ /* true = 双键(取消 + 确定),false = 单键(只有确定);判定在框架侧,这里只消费 */
136
+ @Prop
137
+ var twoKey: Bool
138
+
139
+ /* info / warning / error,只用于确定键配色 */
140
+ @Prop
141
+ var kind: String
142
+
143
+ /* 已回填过的请求 id(-1 = 还没有)。@State 不允许与 private 同用,宏会拒绝。 */
144
+ @State
145
+ var answered: Int64 = -1
146
+
147
+ func build() {
148
+ /* 外层这一层 **不设背景**:遮罩只在「确实该画」的那一支里,否则收起的瞬间
149
+ 整页会被一层灰蒙住不散(内联版第一版就有这个毛病)。 */
150
+ Column {
151
+ if (this.requestId != this.answered) {
152
+ Column {
153
+ Column(space: 14) {
154
+ Text(this.title)
155
+ .fontSize(19)
156
+ .fontWeight(FontWeight.Bold)
157
+ .fontColor(DIALOG_TITLE_TEXT)
158
+ .width(100.percent)
159
+ Text(this.message)
160
+ .fontSize(15)
161
+ .fontColor(DIALOG_BODY_TEXT)
162
+ .width(100.percent)
163
+ Row(space: 12) {
164
+ if (this.twoKey) {
165
+ Button("取消")
166
+ .fontSize(15)
167
+ .fontColor(DIALOG_BODY_TEXT)
168
+ .backgroundColor(DIALOG_BTN_NEUTRAL)
169
+ .onClick({ _ => this.answer(false) })
170
+ }
171
+ Button("确定")
172
+ .fontSize(15)
173
+ .fontColor(Color.White)
174
+ .backgroundColor(dialogAccentColor(this.kind))
175
+ .onClick({ _ => this.answer(true) })
176
+ }
177
+ .width(100.percent)
178
+ .justifyContent(FlexAlign.End)
179
+ }
180
+ .width(86.percent)
181
+ .constraintSize(maxWidth: 420)
182
+ .padding(20)
183
+ .backgroundColor(DIALOG_CARD_BG)
184
+ .borderRadius(16)
185
+ }
186
+ .width(100.percent)
187
+ .height(100.percent)
188
+ .justifyContent(FlexAlign.Center)
189
+ .backgroundColor(DIALOG_SCRIM)
190
+ }
191
+ }
192
+ .width(100.percent)
193
+ .height(100.percent)
194
+ /* 收起后整块退出命中测试(详见类头注释):只裁子内容会留下 100% 的透明层,
195
+ 真机上表现为「点完对话框后整页点不动」。 */
196
+ .visibility(if (this.requestId != this.answered) {
197
+ Visibility.Visible
198
+ } else {
199
+ Visibility.None
200
+ })
201
+ }
202
+
203
+ /**
204
+ * 回填用户的选择并收起自己。
205
+ *
206
+ * 先记 `answered` 再回填:回填会进框架的队列锁,连点时第二下不该再压在同一个 id 上
207
+ * (那次回填会被宿主的 `awaitingDialogs` 校验拒掉,日志里看得见)。
208
+ */
209
+ private func answer(confirmed: Bool): Unit {
210
+ let id = this.requestId
211
+ this.answered = id
212
+ /* 同时登记到共享状态:父组件靠它判断「上一条已答完、可以取下一条」,
213
+ 否则 overlay 收起后父组件永远以为还在展示,第二次点菜单就不弹了。 */
214
+ markDialogAnswered(this.windowLabel, id)
215
+ answerArkWebDialog(this.windowLabel, id, confirmed)
216
+ }
217
+ }