cj-tauri 2.0.0 → 2.1.1

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 (157) hide show
  1. package/README.md +206 -139
  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 +643 -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 +638 -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 +3745 -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/src/api_system.cj +67 -67
  77. package/src/app.cj +335 -969
  78. package/src/app_events.cj +166 -0
  79. package/src/app_host_ops.cj +287 -0
  80. package/src/app_run.cj +283 -0
  81. package/src/app_spec.cj +76 -76
  82. package/src/arkweb_menu.cj +216 -0
  83. package/src/arkweb_script.cj +142 -142
  84. package/src/capability.cj +409 -409
  85. package/src/clipboard_bridge.cj +178 -0
  86. package/src/dialog_spec.cj +79 -0
  87. package/src/dragdrop.cj +26 -26
  88. package/src/embedded_assets.cj +98 -98
  89. package/src/host.cj +752 -607
  90. package/src/host_arkweb.cj +924 -778
  91. package/src/host_webkit.cj +663 -570
  92. package/src/host_webview2.cj +663 -570
  93. package/src/hotkey.cj +66 -66
  94. package/src/ipc_hub.cj +401 -337
  95. package/src/ipc_message.cj +286 -286
  96. package/src/launch.cj +62 -62
  97. package/src/logging.cj +127 -127
  98. package/src/menu.cj +197 -197
  99. package/src/platform/platform_app_context.cj +77 -77
  100. package/src/platform/platform_assets.cj +33 -33
  101. package/src/platform/platform_discover.cj +176 -176
  102. package/src/platform/platform_env.cj +29 -29
  103. package/src/platform/platform_feature.cj +31 -31
  104. package/src/platform/platform_page_source.cj +87 -87
  105. package/src/platform/platform_target_info.cj +32 -32
  106. package/src/platform_host_provider.cj +87 -87
  107. package/src/plugin.cj +333 -333
  108. package/src/plugins/clipboard/plugin_clipboard.cj +152 -152
  109. package/src/plugins/dialog/plugin_dialog.cj +209 -209
  110. package/src/plugins/fs/plugin_fs.cj +105 -1
  111. package/src/plugins/http/http_backend.cj +131 -0
  112. package/src/plugins/http/http_desktop.cj +195 -0
  113. package/src/plugins/http/http_ohos.cj +204 -0
  114. package/src/plugins/http/plugin_http.cj +310 -459
  115. package/src/plugins/log/plugin_log.cj +105 -105
  116. package/src/plugins/menu/plugin_menu.cj +158 -158
  117. package/src/plugins/notification/plugin_notification.cj +154 -154
  118. package/src/plugins/serial/plugin_serial.cj +458 -454
  119. package/src/plugins/serial/serial_bridge.cj +194 -194
  120. package/src/plugins/serial/serial_manager_ohos.cj +92 -0
  121. package/src/plugins/serial/serial_ohos.cj +529 -0
  122. package/src/plugins/shell/plugin_shell.cj +258 -258
  123. package/src/plugins/sqlite/plugin_sqlite.cj +705 -710
  124. package/src/plugins/sqlite/sqlite_ffi.cj +206 -211
  125. package/src/plugins/ws/plugin_ws.cj +488 -470
  126. package/src/process_hidden.cj +174 -174
  127. package/src/scope.cj +391 -391
  128. package/src/shell_event.cj +69 -69
  129. package/src/tests/app_spec_test.cj +130 -127
  130. package/src/tests/capability_test.cj +243 -243
  131. package/src/tests/dialog_spec_test.cj +73 -0
  132. package/src/tests/fake_host.cj +201 -201
  133. package/src/tests/ipc_hub_test.cj +563 -487
  134. package/src/tests/logging_test.cj +62 -62
  135. package/src/tests/platform_contract_test.cj +264 -251
  136. package/src/tests/plugin_clipboard_test.cj +222 -222
  137. package/src/tests/plugin_dialog_test.cj +237 -237
  138. package/src/tests/plugin_fs_test.cj +207 -0
  139. package/src/tests/plugin_http_test.cj +124 -124
  140. package/src/tests/plugin_notification_test.cj +205 -205
  141. package/src/tests/plugin_serial_test.cj +48 -0
  142. package/src/tests/plugin_test.cj +605 -585
  143. package/src/tests/plugin_ws_test.cj +40 -40
  144. package/src/tests/process_hidden_test.cj +129 -129
  145. package/src/tests/scope_test.cj +350 -350
  146. package/src/tests/system_host_test.cj +99 -81
  147. package/src/tests/urlutil_test.cj +53 -53
  148. package/src/tests/version_test.cj +75 -75
  149. package/src/tests/window_registry_test.cj +123 -123
  150. package/src/tray.cj +90 -90
  151. package/src/urlutil.cj +159 -159
  152. package/src/version.cj +44 -44
  153. package/src/window.cj +51 -51
  154. package/src/window_registry.cj +116 -116
  155. package/prebuilt/win32-x64/cj-tauri.exe +0 -0
  156. package/src/plugins/serial/serial_ohos_stub.cj +0 -61
  157. package/src/plugins/sqlite/sqlite_ohos_stub.cj +0 -91
@@ -1,176 +1,176 @@
1
- <script setup>
2
- import { onMounted, ref } from 'vue';
3
-
4
- const name = ref('world');
5
- const result = ref('等待 invoke…');
6
- const tick = ref('');
7
- const menuMsg = ref('');
8
- const sidebar = ref(true);
9
- const href = ref('');
10
- const bridgeOk = ref(false);
11
-
12
- // 桥(window.__CJ_TAURI__)由宿主注入,注入时机随平台/页面来源而异:Linux 宿主注入在文档开始,
13
- // 但发行态单文件里的内联 <script type="module"> 解析完就执行,谁先谁后与加载方式有关。
14
- // 所以统一「等桥出现再初始化」,不要在模块作用域直接读。
15
- let bridge = null;
16
-
17
- function waitForBridge(timeoutMs = 3000) {
18
- return new Promise((resolve) => {
19
- const t0 = Date.now();
20
- const tick = () => {
21
- if (window.__CJ_TAURI__) return resolve(window.__CJ_TAURI__);
22
- if (Date.now() - t0 >= timeoutMs) return resolve(null);
23
- setTimeout(tick, 20);
24
- };
25
- tick();
26
- });
27
- }
28
-
29
- onMounted(async () => {
30
- href.value = location.href;
31
- bridge = await waitForBridge();
32
- if (!bridge) {
33
- result.value = '未找到 window.__CJ_TAURI__';
34
- return;
35
- }
36
- bridgeOk.value = true;
37
- bridge.listen('tick', (payload) => {
38
- tick.value = '事件 tick #' + payload.n + ' 来自仓颉后端';
39
- });
40
- // 原生菜单 → 页面(capabilities 里要声明 menu:click)
41
- bridge.listen('menu:click', (p) => {
42
- menuMsg.value = '菜单被点: ' + p.id + '(enabled=' + p.enabled + ', checked=' + p.checked + ')';
43
- });
44
- });
45
-
46
- async function greet() {
47
- if (!bridge) {
48
- result.value = '桥未就绪';
49
- return;
50
- }
51
- try {
52
- const data = await bridge.invoke('greet', { name: name.value });
53
- result.value = 'invoke OK: ' + data;
54
- } catch (err) {
55
- result.value = 'invoke FAIL: ' + err.message;
56
- }
57
- }
58
-
59
- async function startTimer() {
60
- if (bridge) await bridge.invoke('timer');
61
- }
62
-
63
- function reload() {
64
- if (bridge) bridge.reload();
65
- }
66
-
67
- // 页面 → 原生菜单:menu 插件的前端 shim(window.__CJ_TAURI__.menu,注入在 document start)
68
- async function toggleSidebar(e) {
69
- const checked = e.target.checked;
70
- if (!bridge || !bridge.menu) {
71
- result.value = '未注入 menu 插件 shim(页面来自 runUrl 时插件 JS 不在本进程)';
72
- return;
73
- }
74
- try {
75
- await bridge.menu.setChecked({ id: 'view.sidebar', checked });
76
- result.value = '原生菜单「侧边栏」已同步为 ' + checked;
77
- } catch (err) {
78
- result.value = 'menu.setChecked FAIL: ' + err.message;
79
- }
80
- }
81
- </script>
82
-
83
- <template>
84
- <h1>cj-tauri · Vue 3 + Vite</h1>
85
- <p class="hint">
86
- 页面来源:<code>{{ href }}</code><br />
87
- 桥状态:{{ bridgeOk ? '已注入 __CJ_TAURI__' : '未注入' }}
88
- </p>
89
-
90
- <div class="card">
91
- <div class="row">
92
- <input v-model="name" placeholder="输入名字" />
93
- <button @click="greet">greet</button>
94
- <button class="ghost" @click="startTimer">timer</button>
95
- <button class="ghost" @click="reload">reload</button>
96
- </div>
97
- <div class="out">{{ result }}</div>
98
- <div class="tick">{{ tick }}</div>
99
- <div class="tick">{{ menuMsg }}</div>
100
- <div class="chk">
101
- <input type="checkbox" :checked="sidebar" @change="toggleSidebar" />
102
- <span>侧边栏(对应原生菜单「视图 → 侧边栏」)</span>
103
- </div>
104
- <p class="tip">
105
- 改这个文件(<code>ui/src/App.vue</code>)保存,页面会在不重启应用的情况下更新。
106
- </p>
107
- </div>
108
- </template>
109
-
110
- <style scoped>
111
- h1 {
112
- color: #7ce7ff;
113
- }
114
- .hint {
115
- font-size: 13px;
116
- opacity: 0.8;
117
- }
118
- .card {
119
- background: #16213e;
120
- border-radius: 12px;
121
- padding: 20px 24px;
122
- width: 560px;
123
- box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
124
- }
125
- .row {
126
- display: flex;
127
- gap: 8px;
128
- }
129
- input {
130
- flex: 1;
131
- padding: 8px 12px;
132
- border: none;
133
- border-radius: 8px;
134
- background: #0f3460;
135
- color: #eee;
136
- }
137
- button {
138
- padding: 8px 14px;
139
- border: none;
140
- border-radius: 8px;
141
- background: #e94560;
142
- color: #fff;
143
- cursor: pointer;
144
- }
145
- button.ghost {
146
- background: #24476e;
147
- }
148
- button:hover {
149
- opacity: 0.85;
150
- }
151
- .out {
152
- margin-top: 14px;
153
- font-size: 16px;
154
- }
155
- .tick {
156
- margin-top: 6px;
157
- font-size: 13px;
158
- color: #8be9fd;
159
- }
160
- .chk {
161
- margin-top: 12px;
162
- font-size: 13px;
163
- opacity: 0.85;
164
- display: flex;
165
- align-items: center;
166
- gap: 6px;
167
- }
168
- .chk input {
169
- flex: none;
170
- }
171
- .tip {
172
- margin-top: 14px;
173
- font-size: 12px;
174
- opacity: 0.7;
175
- }
176
- </style>
1
+ <script setup>
2
+ import { onMounted, ref } from 'vue';
3
+
4
+ const name = ref('world');
5
+ const result = ref('等待 invoke…');
6
+ const tick = ref('');
7
+ const menuMsg = ref('');
8
+ const sidebar = ref(true);
9
+ const href = ref('');
10
+ const bridgeOk = ref(false);
11
+
12
+ // 桥(window.__CJ_TAURI__)由宿主注入,注入时机随平台/页面来源而异:Linux 宿主注入在文档开始,
13
+ // 但发行态单文件里的内联 <script type="module"> 解析完就执行,谁先谁后与加载方式有关。
14
+ // 所以统一「等桥出现再初始化」,不要在模块作用域直接读。
15
+ let bridge = null;
16
+
17
+ function waitForBridge(timeoutMs = 3000) {
18
+ return new Promise((resolve) => {
19
+ const t0 = Date.now();
20
+ const tick = () => {
21
+ if (window.__CJ_TAURI__) return resolve(window.__CJ_TAURI__);
22
+ if (Date.now() - t0 >= timeoutMs) return resolve(null);
23
+ setTimeout(tick, 20);
24
+ };
25
+ tick();
26
+ });
27
+ }
28
+
29
+ onMounted(async () => {
30
+ href.value = location.href;
31
+ bridge = await waitForBridge();
32
+ if (!bridge) {
33
+ result.value = '未找到 window.__CJ_TAURI__';
34
+ return;
35
+ }
36
+ bridgeOk.value = true;
37
+ bridge.listen('tick', (payload) => {
38
+ tick.value = '事件 tick #' + payload.n + ' 来自仓颉后端';
39
+ });
40
+ // 原生菜单 → 页面(capabilities 里要声明 menu:click)
41
+ bridge.listen('menu:click', (p) => {
42
+ menuMsg.value = '菜单被点: ' + p.id + '(enabled=' + p.enabled + ', checked=' + p.checked + ')';
43
+ });
44
+ });
45
+
46
+ async function greet() {
47
+ if (!bridge) {
48
+ result.value = '桥未就绪';
49
+ return;
50
+ }
51
+ try {
52
+ const data = await bridge.invoke('greet', { name: name.value });
53
+ result.value = 'invoke OK: ' + data;
54
+ } catch (err) {
55
+ result.value = 'invoke FAIL: ' + err.message;
56
+ }
57
+ }
58
+
59
+ async function startTimer() {
60
+ if (bridge) await bridge.invoke('timer');
61
+ }
62
+
63
+ function reload() {
64
+ if (bridge) bridge.reload();
65
+ }
66
+
67
+ // 页面 → 原生菜单:menu 插件的前端 shim(window.__CJ_TAURI__.menu,注入在 document start)
68
+ async function toggleSidebar(e) {
69
+ const checked = e.target.checked;
70
+ if (!bridge || !bridge.menu) {
71
+ result.value = '未注入 menu 插件 shim(页面来自 runUrl 时插件 JS 不在本进程)';
72
+ return;
73
+ }
74
+ try {
75
+ await bridge.menu.setChecked({ id: 'view.sidebar', checked });
76
+ result.value = '原生菜单「侧边栏」已同步为 ' + checked;
77
+ } catch (err) {
78
+ result.value = 'menu.setChecked FAIL: ' + err.message;
79
+ }
80
+ }
81
+ </script>
82
+
83
+ <template>
84
+ <h1>cj-tauri · Vue 3 + Vite</h1>
85
+ <p class="hint">
86
+ 页面来源:<code>{{ href }}</code><br />
87
+ 桥状态:{{ bridgeOk ? '已注入 __CJ_TAURI__' : '未注入' }}
88
+ </p>
89
+
90
+ <div class="card">
91
+ <div class="row">
92
+ <input v-model="name" placeholder="输入名字" />
93
+ <button @click="greet">greet</button>
94
+ <button class="ghost" @click="startTimer">timer</button>
95
+ <button class="ghost" @click="reload">reload</button>
96
+ </div>
97
+ <div class="out">{{ result }}</div>
98
+ <div class="tick">{{ tick }}</div>
99
+ <div class="tick">{{ menuMsg }}</div>
100
+ <div class="chk">
101
+ <input type="checkbox" :checked="sidebar" @change="toggleSidebar" />
102
+ <span>侧边栏(对应原生菜单「视图 → 侧边栏」)</span>
103
+ </div>
104
+ <p class="tip">
105
+ 改这个文件(<code>ui/src/App.vue</code>)保存,页面会在不重启应用的情况下更新。
106
+ </p>
107
+ </div>
108
+ </template>
109
+
110
+ <style scoped>
111
+ h1 {
112
+ color: #7ce7ff;
113
+ }
114
+ .hint {
115
+ font-size: 13px;
116
+ opacity: 0.8;
117
+ }
118
+ .card {
119
+ background: #16213e;
120
+ border-radius: 12px;
121
+ padding: 20px 24px;
122
+ width: 560px;
123
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
124
+ }
125
+ .row {
126
+ display: flex;
127
+ gap: 8px;
128
+ }
129
+ input {
130
+ flex: 1;
131
+ padding: 8px 12px;
132
+ border: none;
133
+ border-radius: 8px;
134
+ background: #0f3460;
135
+ color: #eee;
136
+ }
137
+ button {
138
+ padding: 8px 14px;
139
+ border: none;
140
+ border-radius: 8px;
141
+ background: #e94560;
142
+ color: #fff;
143
+ cursor: pointer;
144
+ }
145
+ button.ghost {
146
+ background: #24476e;
147
+ }
148
+ button:hover {
149
+ opacity: 0.85;
150
+ }
151
+ .out {
152
+ margin-top: 14px;
153
+ font-size: 16px;
154
+ }
155
+ .tick {
156
+ margin-top: 6px;
157
+ font-size: 13px;
158
+ color: #8be9fd;
159
+ }
160
+ .chk {
161
+ margin-top: 12px;
162
+ font-size: 13px;
163
+ opacity: 0.85;
164
+ display: flex;
165
+ align-items: center;
166
+ gap: 6px;
167
+ }
168
+ .chk input {
169
+ flex: none;
170
+ }
171
+ .tip {
172
+ margin-top: 14px;
173
+ font-size: 12px;
174
+ opacity: 0.7;
175
+ }
176
+ </style>
@@ -1,4 +1,4 @@
1
- import { createApp } from 'vue';
2
- import App from './App.vue';
3
-
4
- createApp(App).mount('#app');
1
+ import { createApp } from 'vue';
2
+ import App from './App.vue';
3
+
4
+ createApp(App).mount('#app');
@@ -1,24 +1,24 @@
1
- import { defineConfig } from 'vite';
2
- import vue from '@vitejs/plugin-vue';
3
- import { viteSingleFile } from 'vite-plugin-singlefile';
4
-
5
- // 两件事很重要:
6
- // 1) dev server 固定 127.0.0.1:5173 —— cj-tauri dev 就是按这个地址探活并注入 CJ_TAURI_DEV_URL 的;
7
- // strictPort 让它端口被占时直接报错,而不是悄悄换一个导致应用连不上。
8
- // 2) 构建产物必须是**单个** index.html —— 后端用 File.readFrom 读它,与 app 模板的单文件模式一致;
9
- // assetsInlineLimit 调大是为了让图片等资源也内联进 HTML。
10
- export default defineConfig({
11
- plugins: [vue(), viteSingleFile()],
12
- base: './',
13
- server: {
14
- host: '127.0.0.1',
15
- port: 5173,
16
- strictPort: true
17
- },
18
- build: {
19
- outDir: 'dist',
20
- emptyOutDir: true,
21
- cssCodeSplit: false,
22
- assetsInlineLimit: 104857600
23
- }
24
- });
1
+ import { defineConfig } from 'vite';
2
+ import vue from '@vitejs/plugin-vue';
3
+ import { viteSingleFile } from 'vite-plugin-singlefile';
4
+
5
+ // 两件事很重要:
6
+ // 1) dev server 固定 127.0.0.1:5173 —— cj-tauri dev 就是按这个地址探活并注入 CJ_TAURI_DEV_URL 的;
7
+ // strictPort 让它端口被占时直接报错,而不是悄悄换一个导致应用连不上。
8
+ // 2) 构建产物必须是**单个** index.html —— 后端用 File.readFrom 读它,与 app 模板的单文件模式一致;
9
+ // assetsInlineLimit 调大是为了让图片等资源也内联进 HTML。
10
+ export default defineConfig({
11
+ plugins: [vue(), viteSingleFile()],
12
+ base: './',
13
+ server: {
14
+ host: '127.0.0.1',
15
+ port: 5173,
16
+ strictPort: true
17
+ },
18
+ build: {
19
+ outDir: 'dist',
20
+ emptyOutDir: true,
21
+ cssCodeSplit: false,
22
+ assetsInlineLimit: 104857600
23
+ }
24
+ });
@@ -1,23 +1,33 @@
1
- # cj-tauri 应用清单——整个工程的单一真相(RFC-002 §7)。
2
- # cj-tauri sync 从这里派生 targets/ 骨架(desktop/ohos);cj-tauri check 校验它并检测骨架漂移。
3
- [app]
4
- name = "{{PROJECT_NAME}}"
5
- version = "0.1.0"
6
- # 应用标识:桌面是安装 ID,鸿蒙直接是 bundleName(每段须字母开头、只含字母数字下划线)
7
- id = "{{BUNDLE_NAME}}"
8
- # 业务包名(cjpm 约束①:toml 模块名必须等于源包名)
9
- package = "{{PACKAGE_NAME}}"
10
-
11
- [[windows]]
12
- label = "main"
13
- title = "{{PROJECT_NAME}}"
14
- width = 1000
15
- height = 700
16
-
17
- [assets]
18
- # 骨架 launcher 加载的页面:Vite 打出来的单文件产物(vite-plugin-singlefile 内联 js/css)。
19
- # dev 模式自动改写到 Vite dev server(热更新);发布构建才用这个产物。
20
- page = "ui/dist/index.html"
21
-
22
- [capabilities]
23
- dir = "assets/capabilities"
1
+ # cj-tauri 应用清单——整个工程的单一真相(RFC-002 §7)。
2
+ # cj-tauri sync 从这里派生 targets/ 骨架(desktop/ohos);cj-tauri check 校验它并检测骨架漂移。
3
+ [app]
4
+ name = "{{PROJECT_NAME}}"
5
+ version = "0.1.0"
6
+ # 应用标识:桌面是安装 ID,鸿蒙直接是 bundleName(每段须字母开头、只含字母数字下划线)
7
+ id = "{{BUNDLE_NAME}}"
8
+ # 业务包名(cjpm 约束①:toml 模块名必须等于源包名)
9
+ package = "{{PACKAGE_NAME}}"
10
+
11
+ [[windows]]
12
+ label = "main"
13
+ title = "{{PROJECT_NAME}}"
14
+ width = 1000
15
+ height = 700
16
+
17
+ [assets]
18
+ # 骨架 launcher 加载的页面:Vite 打出来的单文件产物(vite-plugin-singlefile 内联 js/css)。
19
+ # dev 模式自动改写到 Vite dev server(热更新);发布构建才用这个产物。
20
+ page = "ui/dist/index.html"
21
+
22
+ [capabilities]
23
+ dir = "assets/capabilities"
24
+
25
+ [links]
26
+ # 各目标端**追加**的链接选项(拼在框架默认值之后;留空 = 只用默认)。
27
+ # 什么时候需要它:要调的原生能力在仓颉 SDK 里没有绑定,只能 FFI 直连系统库——
28
+ # 符号必须出现在最终链接那一侧,而那份 cjpm.toml 是 sync 生成的、不能手改。
29
+ # 例:鸿蒙读设备电量走系统 C API(ohbattery_info.h),写 ohos = "-lohbattery_info"
30
+ # 三端分开写是因为同一个库在三端上名字通常不同(-lfoo / foo.lib / -lfoo_ndk.z)。
31
+ desktop-linux = ""
32
+ desktop-windows = ""
33
+ ohos = ""
@@ -1,34 +1,34 @@
1
- # 业务包:业务代码的唯一真相(RFC-002 §7.3——骨架永远是外壳,业务只有一份)。
2
- # output-type = "static":桌面骨架(targets/desktop)与鸿蒙入口(targets/ohos/entry)
3
- # 都以 path 依赖引用本包——同一份业务代码,多个目标各编各的产物。
4
- [package]
5
- cjc-version = "{{CJC_VERSION}}"
6
- name = "{{PACKAGE_NAME}}"
7
- description = "{{PROJECT_NAME}} - cj-tauri 业务包"
8
- version = "0.1.0"
9
- target-dir = ""
10
- output-type = "static"
11
- compile-option = ""
12
- override-compile-option = ""
13
- link-option = ""
14
- package-configuration = {}
15
-
16
- [dependencies]
17
- # cj-tauri 框架本体(由 cj-tauri create 写入的本机路径;换机器重跑 create 或手改)
18
- cjTauri = { path = "{{FRAMEWORK_ROOT_TOML}}" }
19
-
20
- [target.x86_64-unknown-linux-gnu.bin-dependencies]
21
- path-option = ["${CANGJIE_STDX}"]
22
-
23
- [target.x86_64-w64-mingw32.bin-dependencies]
24
- path-option = ["${CANGJIE_STDX}"]
25
-
26
- [target.aarch64-linux-ohos]
27
- # 鸿蒙目标:交叉编译工具链与 sysroot 由 DevEco 仓颉套件提供,路径全部走环境变量
28
- # (与框架根 cjpm.toml 同口径;末尾 --dy-std 不可省,原因见框架根 toml 的鸿蒙段注释)
29
- compile-option = "-B \"${DEVECO_CANGJIE_HOME}/build-tools/third_party/llvm/bin\" -B \"${DEVECO_OH_NATIVE_HOME}/sysroot/usr/lib/aarch64-linux-ohos\" -L \"${DEVECO_OH_NATIVE_HOME}/sysroot/usr/lib/aarch64-linux-ohos\" -L \"${DEVECO_OH_NATIVE_HOME}/llvm/lib/clang/15.0.4/lib/aarch64-linux-ohos\" -L \"${DEVECO_OH_NATIVE_HOME}/llvm/lib/aarch64-linux-ohos\" --sysroot \"${DEVECO_OH_NATIVE_HOME}/sysroot\" --dy-std"
30
-
31
- [target.aarch64-linux-ohos.bin-dependencies]
32
- # stdx 必须用鸿蒙版(CANGJIE_STDX_OHOS,桌面版 ABI 不通);CANGJIE_OHOS_LIBS 指 DevEco
33
- # 套件的 api/lib/linux_ohos_aarch64_cjnative/ohos(仓颉标准库 + ohos API 绑定)
34
- path-option = ["${CANGJIE_STDX_OHOS}", "${CANGJIE_OHOS_LIBS}", "${AARCH64_MACRO_LIBS}", "${AARCH64_KIT_LIBS}"]
1
+ # 业务包:业务代码的唯一真相(RFC-002 §7.3——骨架永远是外壳,业务只有一份)。
2
+ # output-type = "static":桌面骨架(targets/desktop)与鸿蒙入口(targets/ohos/entry)
3
+ # 都以 path 依赖引用本包——同一份业务代码,多个目标各编各的产物。
4
+ [package]
5
+ cjc-version = "{{CJC_VERSION}}"
6
+ name = "{{PACKAGE_NAME}}"
7
+ description = "{{PROJECT_NAME}} - cj-tauri 业务包"
8
+ version = "0.1.0"
9
+ target-dir = ""
10
+ output-type = "static"
11
+ compile-option = ""
12
+ override-compile-option = ""
13
+ link-option = ""
14
+ package-configuration = {}
15
+
16
+ [dependencies]
17
+ # cj-tauri 框架本体(由 cj-tauri create 写入的本机路径;换机器重跑 create 或手改)
18
+ cjTauri = { path = "{{FRAMEWORK_ROOT_TOML}}" }
19
+
20
+ [target.x86_64-unknown-linux-gnu.bin-dependencies]
21
+ path-option = ["${CANGJIE_STDX}"]
22
+
23
+ [target.x86_64-w64-mingw32.bin-dependencies]
24
+ path-option = ["${CANGJIE_STDX}"]
25
+
26
+ [target.aarch64-linux-ohos]
27
+ # 鸿蒙目标:交叉编译工具链与 sysroot 由 DevEco 仓颉套件提供,路径全部走环境变量
28
+ # (与框架根 cjpm.toml 同口径;末尾 --dy-std 不可省,原因见框架根 toml 的鸿蒙段注释)
29
+ compile-option = "-B \"${DEVECO_CANGJIE_HOME}/build-tools/third_party/llvm/bin\" -B \"${DEVECO_OH_NATIVE_HOME}/sysroot/usr/lib/aarch64-linux-ohos\" -L \"${DEVECO_OH_NATIVE_HOME}/sysroot/usr/lib/aarch64-linux-ohos\" -L \"${DEVECO_OH_NATIVE_HOME}/llvm/lib/clang/15.0.4/lib/aarch64-linux-ohos\" -L \"${DEVECO_OH_NATIVE_HOME}/llvm/lib/aarch64-linux-ohos\" --sysroot \"${DEVECO_OH_NATIVE_HOME}/sysroot\" --dy-std"
30
+
31
+ [target.aarch64-linux-ohos.bin-dependencies]
32
+ # stdx 必须用鸿蒙版(CANGJIE_STDX_OHOS,桌面版 ABI 不通);CANGJIE_OHOS_LIBS 指 DevEco
33
+ # 套件的 api/lib/linux_ohos_aarch64_cjnative/ohos(仓颉标准库 + ohos API 绑定)
34
+ path-option = ["${CANGJIE_STDX_OHOS}", "${CANGJIE_OHOS_LIBS}", "${AARCH64_MACRO_LIBS}", "${AARCH64_KIT_LIBS}"]