@coze-arch/cli 0.0.1-alpha.2f99e6 → 0.0.1-alpha.302c56

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 (239) hide show
  1. package/README.md +1 -0
  2. package/lib/__templates__/expo/.coze +1 -1
  3. package/lib/__templates__/expo/.cozeproj/scripts/dev_build.sh +19 -82
  4. package/lib/__templates__/expo/.cozeproj/scripts/dev_run.sh +82 -88
  5. package/lib/__templates__/expo/.cozeproj/scripts/prod_build.sh +2 -2
  6. package/lib/__templates__/expo/.cozeproj/scripts/prod_run.sh +3 -4
  7. package/lib/__templates__/expo/.cozeproj/scripts/server_dev_run.sh +46 -0
  8. package/lib/__templates__/expo/README.md +68 -7
  9. package/lib/__templates__/expo/client/app/+not-found.tsx +30 -0
  10. package/lib/__templates__/expo/client/{src/app → app}/_layout.tsx +15 -12
  11. package/lib/__templates__/expo/client/app/index.tsx +1 -0
  12. package/lib/__templates__/expo/client/app.config.ts +76 -0
  13. package/lib/__templates__/expo/client/{src/components → components}/Screen.tsx +3 -19
  14. package/lib/__templates__/expo/client/components/ThemedText.tsx +33 -0
  15. package/lib/__templates__/expo/client/components/ThemedView.tsx +37 -0
  16. package/lib/__templates__/expo/client/constants/theme.ts +177 -0
  17. package/lib/__templates__/expo/client/declarations.d.ts +5 -0
  18. package/lib/__templates__/expo/client/eslint.config.mjs +40 -10
  19. package/lib/__templates__/expo/client/hooks/useColorScheme.tsx +48 -0
  20. package/lib/__templates__/expo/client/hooks/useSafeRouter.ts +152 -0
  21. package/lib/__templates__/expo/client/hooks/useTheme.ts +33 -0
  22. package/lib/__templates__/expo/client/metro.config.js +78 -5
  23. package/lib/__templates__/expo/client/package.json +36 -33
  24. package/lib/__templates__/expo/client/screens/demo/index.tsx +25 -0
  25. package/lib/__templates__/expo/client/screens/demo/styles.ts +28 -0
  26. package/lib/__templates__/expo/client/scripts/install-missing-deps.js +11 -10
  27. package/lib/__templates__/expo/client/tsconfig.json +1 -1
  28. package/lib/__templates__/expo/client/{src/utils → utils}/index.ts +22 -0
  29. package/lib/__templates__/expo/eslint-plugins/fontawesome6/index.js +9 -0
  30. package/lib/__templates__/expo/eslint-plugins/fontawesome6/names.js +1889 -0
  31. package/lib/__templates__/expo/eslint-plugins/fontawesome6/rule.js +174 -0
  32. package/lib/__templates__/expo/eslint-plugins/fontawesome6/v5-only-names.js +388 -0
  33. package/lib/__templates__/expo/eslint-plugins/forbid-emoji/index.js +9 -0
  34. package/lib/__templates__/expo/eslint-plugins/forbid-emoji/rule.js +112 -0
  35. package/lib/__templates__/expo/eslint-plugins/forbid-emoji/tech.md +94 -0
  36. package/lib/__templates__/expo/eslint-plugins/react-native/index.js +9 -0
  37. package/lib/__templates__/expo/eslint-plugins/react-native/rule.js +64 -0
  38. package/lib/__templates__/expo/eslint-plugins/reanimated/index.js +9 -0
  39. package/lib/__templates__/expo/eslint-plugins/reanimated/rule.js +88 -0
  40. package/lib/__templates__/expo/eslint-plugins/restrict-linear-gradient/index.js +9 -0
  41. package/lib/__templates__/expo/eslint-plugins/restrict-linear-gradient/rule.js +120 -0
  42. package/lib/__templates__/expo/eslint-plugins/restrict-linear-gradient/tech.md +58 -0
  43. package/lib/__templates__/expo/package.json +9 -100
  44. package/lib/__templates__/expo/patches/expo@54.0.33.patch +45 -0
  45. package/lib/__templates__/expo/pnpm-lock.yaml +1420 -2939
  46. package/lib/__templates__/expo/server/build.js +21 -0
  47. package/lib/__templates__/expo/server/package.json +22 -5
  48. package/lib/__templates__/expo/server/src/index.ts +10 -2
  49. package/lib/__templates__/expo/server/tsconfig.json +24 -0
  50. package/lib/__templates__/expo/template.config.js +57 -0
  51. package/lib/__templates__/native-static/.coze +11 -0
  52. package/lib/__templates__/native-static/index.html +33 -0
  53. package/lib/__templates__/native-static/styles/main.css +136 -0
  54. package/lib/__templates__/native-static/template.config.js +22 -0
  55. package/lib/__templates__/nextjs/.babelrc +15 -0
  56. package/lib/__templates__/nextjs/.coze +1 -0
  57. package/lib/__templates__/nextjs/README.md +5 -0
  58. package/lib/__templates__/nextjs/_npmrc +1 -0
  59. package/lib/__templates__/nextjs/eslint.config.mjs +5 -0
  60. package/lib/__templates__/nextjs/next.config.ts +11 -0
  61. package/lib/__templates__/nextjs/package.json +10 -2
  62. package/lib/__templates__/nextjs/pnpm-lock.yaml +3488 -1569
  63. package/lib/__templates__/nextjs/scripts/build.sh +4 -1
  64. package/lib/__templates__/nextjs/scripts/dev.sh +8 -2
  65. package/lib/__templates__/nextjs/scripts/prepare.sh +9 -0
  66. package/lib/__templates__/nextjs/scripts/start.sh +7 -1
  67. package/lib/__templates__/nextjs/src/app/globals.css +10 -2
  68. package/lib/__templates__/nextjs/src/app/layout.tsx +5 -14
  69. package/lib/__templates__/nextjs/src/app/page.tsx +18 -49
  70. package/lib/__templates__/nextjs/src/components/ui/resizable.tsx +29 -22
  71. package/lib/__templates__/nextjs/src/components/ui/sidebar.tsx +228 -230
  72. package/lib/__templates__/nextjs/src/server.ts +35 -0
  73. package/lib/__templates__/nextjs/template.config.js +67 -2
  74. package/lib/__templates__/nextjs/tsconfig.json +1 -1
  75. package/lib/__templates__/nuxt-vue/.coze +12 -0
  76. package/lib/__templates__/nuxt-vue/README.md +73 -0
  77. package/lib/__templates__/nuxt-vue/_gitignore +24 -0
  78. package/lib/__templates__/nuxt-vue/_npmrc +23 -0
  79. package/lib/__templates__/nuxt-vue/app/app.vue +6 -0
  80. package/lib/__templates__/nuxt-vue/app/pages/index.vue +23 -0
  81. package/lib/__templates__/nuxt-vue/assets/css/main.css +24 -0
  82. package/lib/__templates__/nuxt-vue/nuxt.config.ts +116 -0
  83. package/lib/__templates__/nuxt-vue/package.json +35 -0
  84. package/lib/__templates__/nuxt-vue/pnpm-lock.yaml +8759 -0
  85. package/lib/__templates__/nuxt-vue/postcss.config.mjs +8 -0
  86. package/lib/__templates__/nuxt-vue/public/favicon.ico +0 -0
  87. package/lib/__templates__/nuxt-vue/public/robots.txt +2 -0
  88. package/lib/__templates__/nuxt-vue/scripts/build.sh +14 -0
  89. package/lib/__templates__/nuxt-vue/scripts/dev.sh +39 -0
  90. package/lib/__templates__/nuxt-vue/scripts/prepare.sh +14 -0
  91. package/lib/__templates__/nuxt-vue/scripts/start.sh +21 -0
  92. package/lib/__templates__/nuxt-vue/server/api/hello.ts +10 -0
  93. package/lib/__templates__/nuxt-vue/server/middleware/logger.ts +10 -0
  94. package/lib/__templates__/nuxt-vue/server/routes/health.ts +10 -0
  95. package/lib/__templates__/nuxt-vue/tailwind.config.js +13 -0
  96. package/lib/__templates__/nuxt-vue/template.config.js +87 -0
  97. package/lib/__templates__/nuxt-vue/tsconfig.json +18 -0
  98. package/lib/__templates__/taro/.coze +14 -0
  99. package/lib/__templates__/taro/.cozeproj/scripts/deploy_build.sh +19 -0
  100. package/lib/__templates__/taro/.cozeproj/scripts/deploy_run.sh +14 -0
  101. package/lib/__templates__/taro/.cozeproj/scripts/dev_build.sh +2 -0
  102. package/lib/__templates__/taro/.cozeproj/scripts/dev_run.sh +151 -0
  103. package/lib/__templates__/taro/.cozeproj/scripts/init_env.sh +5 -0
  104. package/lib/__templates__/taro/.cozeproj/scripts/pack.sh +24 -0
  105. package/lib/__templates__/taro/AGENTS.md +6 -0
  106. package/lib/__templates__/taro/README.md +763 -0
  107. package/lib/__templates__/taro/_gitignore +40 -0
  108. package/lib/__templates__/taro/_npmrc +18 -0
  109. package/lib/__templates__/taro/babel.config.js +12 -0
  110. package/lib/__templates__/taro/config/dev.ts +9 -0
  111. package/lib/__templates__/taro/config/index.ts +238 -0
  112. package/lib/__templates__/taro/config/prod.ts +34 -0
  113. package/lib/__templates__/taro/eslint.config.mjs +135 -0
  114. package/lib/__templates__/taro/key/private.appid.key +0 -0
  115. package/lib/__templates__/taro/package.json +112 -0
  116. package/lib/__templates__/taro/patches/@tarojs__plugin-mini-ci@4.1.9.patch +30 -0
  117. package/lib/__templates__/taro/pnpm-lock.yaml +23412 -0
  118. package/lib/__templates__/taro/pnpm-workspace.yaml +2 -0
  119. package/lib/__templates__/taro/project.config.json +15 -0
  120. package/lib/__templates__/taro/server/nest-cli.json +10 -0
  121. package/lib/__templates__/taro/server/package.json +40 -0
  122. package/lib/__templates__/taro/server/src/app.controller.ts +23 -0
  123. package/lib/__templates__/taro/server/src/app.module.ts +10 -0
  124. package/lib/__templates__/taro/server/src/app.service.ts +8 -0
  125. package/lib/__templates__/taro/server/src/interceptors/http-status.interceptor.ts +23 -0
  126. package/lib/__templates__/taro/server/src/main.ts +49 -0
  127. package/lib/__templates__/taro/server/tsconfig.json +24 -0
  128. package/lib/__templates__/taro/src/app.config.ts +11 -0
  129. package/lib/__templates__/taro/src/app.css +156 -0
  130. package/lib/__templates__/taro/src/app.tsx +9 -0
  131. package/lib/__templates__/taro/src/components/ui/accordion.tsx +159 -0
  132. package/lib/__templates__/taro/src/components/ui/alert-dialog.tsx +260 -0
  133. package/lib/__templates__/taro/src/components/ui/alert.tsx +60 -0
  134. package/lib/__templates__/taro/src/components/ui/aspect-ratio.tsx +36 -0
  135. package/lib/__templates__/taro/src/components/ui/avatar.tsx +84 -0
  136. package/lib/__templates__/taro/src/components/ui/badge.tsx +37 -0
  137. package/lib/__templates__/taro/src/components/ui/breadcrumb.tsx +117 -0
  138. package/lib/__templates__/taro/src/components/ui/button-group.tsx +83 -0
  139. package/lib/__templates__/taro/src/components/ui/button.tsx +67 -0
  140. package/lib/__templates__/taro/src/components/ui/calendar.tsx +394 -0
  141. package/lib/__templates__/taro/src/components/ui/card.tsx +108 -0
  142. package/lib/__templates__/taro/src/components/ui/carousel.tsx +228 -0
  143. package/lib/__templates__/taro/src/components/ui/checkbox.tsx +58 -0
  144. package/lib/__templates__/taro/src/components/ui/code-block.tsx +169 -0
  145. package/lib/__templates__/taro/src/components/ui/collapsible.tsx +71 -0
  146. package/lib/__templates__/taro/src/components/ui/command.tsx +385 -0
  147. package/lib/__templates__/taro/src/components/ui/context-menu.tsx +614 -0
  148. package/lib/__templates__/taro/src/components/ui/dialog.tsx +256 -0
  149. package/lib/__templates__/taro/src/components/ui/drawer.tsx +192 -0
  150. package/lib/__templates__/taro/src/components/ui/dropdown-menu.tsx +561 -0
  151. package/lib/__templates__/taro/src/components/ui/field.tsx +228 -0
  152. package/lib/__templates__/taro/src/components/ui/hover-card.tsx +282 -0
  153. package/lib/__templates__/taro/src/components/ui/input-group.tsx +197 -0
  154. package/lib/__templates__/taro/src/components/ui/input-otp.tsx +136 -0
  155. package/lib/__templates__/taro/src/components/ui/input.tsx +56 -0
  156. package/lib/__templates__/taro/src/components/ui/label.tsx +24 -0
  157. package/lib/__templates__/taro/src/components/ui/menubar.tsx +595 -0
  158. package/lib/__templates__/taro/src/components/ui/navigation-menu.tsx +264 -0
  159. package/lib/__templates__/taro/src/components/ui/pagination.tsx +118 -0
  160. package/lib/__templates__/taro/src/components/ui/popover.tsx +291 -0
  161. package/lib/__templates__/taro/src/components/ui/portal.tsx +19 -0
  162. package/lib/__templates__/taro/src/components/ui/progress.tsx +28 -0
  163. package/lib/__templates__/taro/src/components/ui/radio-group.tsx +64 -0
  164. package/lib/__templates__/taro/src/components/ui/resizable.tsx +346 -0
  165. package/lib/__templates__/taro/src/components/ui/scroll-area.tsx +34 -0
  166. package/lib/__templates__/taro/src/components/ui/select.tsx +438 -0
  167. package/lib/__templates__/taro/src/components/ui/separator.tsx +30 -0
  168. package/lib/__templates__/taro/src/components/ui/sheet.tsx +262 -0
  169. package/lib/__templates__/taro/src/components/ui/skeleton.tsx +17 -0
  170. package/lib/__templates__/taro/src/components/ui/slider.tsx +203 -0
  171. package/lib/__templates__/taro/src/components/ui/sonner.tsx +1 -0
  172. package/lib/__templates__/taro/src/components/ui/switch.tsx +55 -0
  173. package/lib/__templates__/taro/src/components/ui/table.tsx +142 -0
  174. package/lib/__templates__/taro/src/components/ui/tabs.tsx +114 -0
  175. package/lib/__templates__/taro/src/components/ui/textarea.tsx +54 -0
  176. package/lib/__templates__/taro/src/components/ui/toast.tsx +517 -0
  177. package/lib/__templates__/taro/src/components/ui/toggle-group.tsx +120 -0
  178. package/lib/__templates__/taro/src/components/ui/toggle.tsx +77 -0
  179. package/lib/__templates__/taro/src/components/ui/tooltip.tsx +455 -0
  180. package/lib/__templates__/taro/src/index.html +39 -0
  181. package/lib/__templates__/taro/src/lib/hooks/use-keyboard-offset.ts +37 -0
  182. package/lib/__templates__/taro/src/lib/measure.ts +115 -0
  183. package/lib/__templates__/taro/src/lib/platform.ts +12 -0
  184. package/lib/__templates__/taro/src/lib/utils.ts +6 -0
  185. package/lib/__templates__/taro/src/network.ts +39 -0
  186. package/lib/__templates__/taro/src/pages/index/index.config.ts +3 -0
  187. package/lib/__templates__/taro/src/pages/index/index.css +1 -0
  188. package/lib/__templates__/taro/src/pages/index/index.tsx +33 -0
  189. package/lib/__templates__/taro/src/presets/dev-debug.ts +23 -0
  190. package/lib/__templates__/taro/src/presets/h5-container.tsx +15 -0
  191. package/lib/__templates__/taro/src/presets/h5-navbar.tsx +238 -0
  192. package/lib/__templates__/taro/src/presets/h5-styles.ts +220 -0
  193. package/lib/__templates__/taro/src/presets/index.tsx +18 -0
  194. package/lib/__templates__/taro/stylelint.config.mjs +4 -0
  195. package/lib/__templates__/taro/template.config.js +68 -0
  196. package/lib/__templates__/taro/tsconfig.json +29 -0
  197. package/lib/__templates__/taro/types/global.d.ts +32 -0
  198. package/lib/__templates__/templates.json +136 -43
  199. package/lib/__templates__/vite/.coze +1 -0
  200. package/lib/__templates__/vite/README.md +190 -11
  201. package/lib/__templates__/vite/_gitignore +1 -0
  202. package/lib/__templates__/vite/_npmrc +1 -0
  203. package/lib/__templates__/vite/eslint.config.mjs +14 -0
  204. package/lib/__templates__/vite/package.json +22 -2
  205. package/lib/__templates__/vite/pnpm-lock.yaml +2398 -182
  206. package/lib/__templates__/vite/scripts/build.sh +4 -1
  207. package/lib/__templates__/vite/scripts/dev.sh +9 -2
  208. package/lib/__templates__/vite/scripts/prepare.sh +9 -0
  209. package/lib/__templates__/vite/scripts/start.sh +9 -3
  210. package/lib/__templates__/vite/server/routes/index.ts +31 -0
  211. package/lib/__templates__/vite/server/server.ts +65 -0
  212. package/lib/__templates__/vite/server/vite.ts +67 -0
  213. package/lib/__templates__/vite/src/main.ts +17 -48
  214. package/lib/__templates__/vite/template.config.js +67 -6
  215. package/lib/__templates__/vite/tsconfig.json +4 -3
  216. package/lib/__templates__/vite/vite.config.ts +5 -0
  217. package/lib/cli.js +1084 -225
  218. package/package.json +12 -4
  219. package/lib/__templates__/expo/client/app.json +0 -63
  220. package/lib/__templates__/expo/client/src/app/index.ts +0 -1
  221. package/lib/__templates__/expo/client/src/constants/theme.ts +0 -128
  222. package/lib/__templates__/expo/client/src/hooks/useColorScheme.ts +0 -1
  223. package/lib/__templates__/expo/client/src/hooks/useTheme.ts +0 -13
  224. package/lib/__templates__/expo/client/src/screens/home/index.tsx +0 -50
  225. package/lib/__templates__/expo/client/src/screens/home/styles.ts +0 -60
  226. package/lib/__templates__/nextjs/.vscode/settings.json +0 -121
  227. package/lib/__templates__/vite/.vscode/settings.json +0 -7
  228. /package/lib/__templates__/expo/client/{src/assets → assets}/fonts/SpaceMono-Regular.ttf +0 -0
  229. /package/lib/__templates__/expo/client/{src/assets → assets}/images/adaptive-icon.png +0 -0
  230. /package/lib/__templates__/expo/client/{src/assets → assets}/images/default-avatar.png +0 -0
  231. /package/lib/__templates__/expo/client/{src/assets → assets}/images/favicon.png +0 -0
  232. /package/lib/__templates__/expo/client/{src/assets → assets}/images/icon.png +0 -0
  233. /package/lib/__templates__/expo/client/{src/assets → assets}/images/partial-react-logo.png +0 -0
  234. /package/lib/__templates__/expo/client/{src/assets → assets}/images/react-logo.png +0 -0
  235. /package/lib/__templates__/expo/client/{src/assets → assets}/images/react-logo@2x.png +0 -0
  236. /package/lib/__templates__/expo/client/{src/assets → assets}/images/react-logo@3x.png +0 -0
  237. /package/lib/__templates__/expo/client/{src/assets → assets}/images/splash-icon.png +0 -0
  238. /package/lib/__templates__/expo/client/{src/components → components}/SmartDateInput.tsx +0 -0
  239. /package/lib/__templates__/expo/client/{src/contexts → contexts}/AuthContext.tsx +0 -0
@@ -0,0 +1,33 @@
1
+ import { Colors } from '@/constants/theme';
2
+ import { useColorScheme } from '@/hooks/useColorScheme';
3
+
4
+ enum COLOR_SCHEME_CHOICE {
5
+ FOLLOW_SYSTEM = 'follow-system', // 跟随系统自动变化
6
+ DARK = 'dark', // 固定为 dark 主题,不随系统变化
7
+ LIGHT = 'light', // 固定为 light 主题,不随系统变化
8
+ };
9
+
10
+ const userPreferColorScheme: COLOR_SCHEME_CHOICE = COLOR_SCHEME_CHOICE.FOLLOW_SYSTEM;
11
+
12
+ function getTheme(colorScheme?: 'dark' | 'light' | null) {
13
+ const isDark = colorScheme === 'dark';
14
+ const theme = Colors[colorScheme ?? 'light'];
15
+
16
+ return {
17
+ theme,
18
+ isDark,
19
+ };
20
+ }
21
+
22
+ function useTheme() {
23
+ const systemColorScheme = useColorScheme()
24
+ const colorScheme = userPreferColorScheme === COLOR_SCHEME_CHOICE.FOLLOW_SYSTEM ?
25
+ systemColorScheme :
26
+ userPreferColorScheme;
27
+
28
+ return getTheme(colorScheme);
29
+ }
30
+
31
+ export {
32
+ useTheme,
33
+ }
@@ -26,26 +26,99 @@ config.resolver.blockList = [
26
26
  // 4. 通用规则
27
27
  /.*\/__tests__\/.*/, // 排除所有测试目录
28
28
  /.*\.git\/.*/, // 排除 Git 目录
29
+
30
+ // 5. pnpm 临时目录(避免 ENOENT 错误)
31
+ /.*node_modules\/\.pnpm\/.*_tmp_\d+.*/,
29
32
  ];
30
33
 
34
+ const BACKEND_TARGET = 'http://localhost:9091';
35
+
31
36
  const apiProxy = createProxyMiddleware({
32
- target: 'http://localhost:9091',
37
+ target: BACKEND_TARGET,
38
+ changeOrigin: true,
39
+ logLevel: 'debug',
40
+ proxyTimeout: 86400000,
41
+ onProxyReq: (proxyReq, req) => {
42
+ const accept = req.headers.accept || '';
43
+ if (accept.includes('text/event-stream')) {
44
+ proxyReq.setHeader('accept-encoding', 'identity');
45
+ }
46
+ },
47
+ onProxyRes: (proxyRes, req, res) => {
48
+ const contentType = proxyRes.headers['content-type'] || '';
49
+ if (contentType.includes('text/event-stream') || contentType.includes('application/stream')) {
50
+ res.setHeader('Cache-Control', 'no-cache');
51
+ res.setHeader('Connection', 'keep-alive');
52
+ res.setHeader('X-Accel-Buffering', 'no');
53
+ if (typeof res.flushHeaders === 'function') {
54
+ try { res.flushHeaders(); } catch {}
55
+ }
56
+ }
57
+ },
58
+ });
59
+
60
+ const streamProxy = createProxyMiddleware({
61
+ target: BACKEND_TARGET,
62
+ changeOrigin: true,
33
63
  logLevel: 'debug',
64
+ ws: true,
65
+ proxyTimeout: 86400000,
66
+ onProxyReq: (proxyReq, req) => {
67
+ const upgrade = req.headers.upgrade;
68
+ const accept = req.headers.accept || '';
69
+ if (upgrade && upgrade.toLowerCase() === 'websocket') {
70
+ proxyReq.setHeader('Connection', 'upgrade');
71
+ proxyReq.setHeader('Upgrade', req.headers.upgrade);
72
+ } else if (accept.includes('text/event-stream')) {
73
+ proxyReq.setHeader('accept-encoding', 'identity');
74
+ proxyReq.setHeader('Connection', 'keep-alive');
75
+ }
76
+ },
77
+ onProxyRes: (proxyRes, req, res) => {
78
+ const contentType = proxyRes.headers['content-type'] || '';
79
+ if (contentType.includes('text/event-stream') || contentType.includes('application/stream')) {
80
+ res.setHeader('Cache-Control', 'no-cache');
81
+ res.setHeader('Connection', 'keep-alive');
82
+ res.setHeader('X-Accel-Buffering', 'no');
83
+ if (typeof res.flushHeaders === 'function') {
84
+ try { res.flushHeaders(); } catch {}
85
+ }
86
+ }
87
+ },
34
88
  });
35
89
 
90
+ const shouldProxyToBackend = (url) => {
91
+ if (!url) return false;
92
+ if (/^\/api\/v\d+\//.test(url)) {
93
+ return true;
94
+ }
95
+ return false;
96
+ };
97
+
98
+ const isWebSocketRequest = (req) =>
99
+ !!(req.headers.upgrade && req.headers.upgrade.toLowerCase() === 'websocket');
100
+ const isSSERequest = (req) => {
101
+ const accept = req.headers.accept || '';
102
+ return accept.includes('text/event-stream');
103
+ };
104
+
36
105
  config.server = {
37
- ...config.server,
38
- enhanceMiddleware: (metroMiddleware, metroServer) => {
106
+ ...config.server,
107
+ enhanceMiddleware: (metroMiddleware, metroServer) => {
39
108
  return connect()
40
109
  .use((req, res, next) => {
41
- if (req.url && req.url.startsWith('/api/v')) {
110
+ if (shouldProxyToBackend(req.url)) {
42
111
  console.log(`[Metro Proxy] Forwarding ${req.method} ${req.url}`);
112
+
113
+ if (isWebSocketRequest(req) || isSSERequest(req)) {
114
+ return streamProxy(req, res, next);
115
+ }
43
116
  return apiProxy(req, res, next);
44
117
  }
45
118
  next();
46
119
  })
47
120
  .use(metroMiddleware);
48
121
  },
49
- }
122
+ };
50
123
 
51
124
  module.exports = config;
@@ -15,37 +15,38 @@
15
15
  "preset": "jest-expo"
16
16
  },
17
17
  "dependencies": {
18
- "@expo/metro-runtime": "^6.1.2",
19
- "@expo/vector-icons": "^15.0.0",
20
- "@react-native-async-storage/async-storage": "^2.2.0",
21
- "@react-native-community/datetimepicker": "^8.5.0",
22
- "@react-native-community/slider": "^5.0.1",
23
- "@react-native-masked-view/masked-view": "^0.3.2",
24
- "@react-native-picker/picker": "^2.11.0",
18
+ "@expo/metro-runtime": "~6.1.2",
19
+ "@expo/vector-icons": "^15.0.3",
20
+ "@react-native-async-storage/async-storage": "2.2.0",
21
+ "@react-native-community/datetimepicker": "8.4.4",
22
+ "@react-native-community/slider": "5.0.1",
23
+ "@react-native-masked-view/masked-view": "0.3.2",
24
+ "@react-native-picker/picker": "2.11.1",
25
25
  "@react-navigation/bottom-tabs": "^7.2.0",
26
26
  "@react-navigation/native": "^7.0.14",
27
- "babel-plugin-module-resolver": "^5.0.2",
28
- "babel-preset-expo": "^54.0.9",
29
27
  "dayjs": "^1.11.19",
30
- "expo": "^54.0.7",
31
- "expo-auth-session": "^7.0.9",
32
- "expo-av": "~16.0.6",
33
- "expo-blur": "~15.0.6",
28
+ "expo": "54.0.33",
29
+ "expo-auth-session": "~7.0.10",
30
+ "expo-av": "~16.0.8",
31
+ "expo-blur": "~15.0.8",
34
32
  "expo-camera": "~17.0.10",
35
- "expo-constants": "~18.0.8",
36
- "expo-crypto": "^15.0.7",
37
- "expo-font": "~14.0.7",
38
- "expo-haptics": "~15.0.6",
39
- "expo-image-picker": "~17.0.7",
40
- "expo-linear-gradient": "~15.0.6",
41
- "expo-linking": "~8.0.7",
42
- "expo-location": "~19.0.7",
43
- "expo-router": "~6.0.0",
44
- "expo-splash-screen": "~31.0.8",
45
- "expo-status-bar": "~3.0.7",
46
- "expo-symbols": "~1.0.6",
33
+ "expo-constants": "~18.0.13",
34
+ "expo-crypto": "~15.0.8",
35
+ "expo-file-system": "~19.0.21",
36
+ "expo-font": "~14.0.11",
37
+ "expo-haptics": "~15.0.8",
38
+ "expo-image": "~3.0.11",
39
+ "expo-image-picker": "~17.0.10",
40
+ "expo-linear-gradient": "~15.0.8",
41
+ "expo-linking": "~8.0.11",
42
+ "expo-location": "~19.0.8",
43
+ "expo-router": "~6.0.23",
44
+ "expo-splash-screen": "~31.0.13",
45
+ "expo-status-bar": "~3.0.9",
46
+ "expo-symbols": "~1.0.8",
47
47
  "expo-system-ui": "~6.0.9",
48
48
  "expo-web-browser": "~15.0.10",
49
+ "js-base64": "^3.7.7",
49
50
  "react": "19.1.0",
50
51
  "react-dom": "19.1.0",
51
52
  "react-native": "0.81.5",
@@ -53,13 +54,13 @@
53
54
  "react-native-gesture-handler": "~2.28.0",
54
55
  "react-native-keyboard-aware-scroll-view": "^0.9.5",
55
56
  "react-native-modal-datetime-picker": "18.0.0",
56
- "react-native-reanimated": "~4.1.0",
57
+ "react-native-reanimated": "~4.1.1",
57
58
  "react-native-safe-area-context": "~5.6.0",
58
59
  "react-native-screens": "~4.16.0",
59
- "react-native-svg": "15.15.0",
60
+ "react-native-svg": "15.12.1",
60
61
  "react-native-toast-message": "^2.3.3",
61
- "react-native-web": "^0.21.2",
62
- "react-native-webview": "~13.15.0",
62
+ "react-native-web": "~0.21.0",
63
+ "react-native-webview": "13.15.0",
63
64
  "react-native-worklets": "0.5.1",
64
65
  "zod": "^4.2.1"
65
66
  },
@@ -69,7 +70,10 @@
69
70
  "@types/jest": "^29.5.12",
70
71
  "@types/react": "~19.1.0",
71
72
  "@types/react-test-renderer": "19.1.0",
73
+ "babel-plugin-module-resolver": "^5.0.2",
74
+ "babel-preset-expo": "^54.0.9",
72
75
  "chalk": "^4.1.2",
76
+ "connect": "^3.7.0",
73
77
  "depcheck": "^1.4.7",
74
78
  "esbuild": "0.27.2",
75
79
  "eslint": "^9.39.2",
@@ -80,13 +84,12 @@
80
84
  "eslint-plugin-react-hooks": "^7.0.1",
81
85
  "eslint-plugin-regexp": "^2.10.0",
82
86
  "globals": "^16.1.0",
87
+ "http-proxy-middleware": "^3.0.5",
83
88
  "jest": "^29.2.1",
84
- "jest-expo": "~54.0.10",
89
+ "jest-expo": "~54.0.17",
85
90
  "react-test-renderer": "19.1.0",
86
91
  "tsx": "^4.21.0",
87
92
  "typescript": "^5.8.3",
88
- "typescript-eslint": "^8.32.1",
89
- "connect": "^3.7.0",
90
- "http-proxy-middleware": "^3.0.5"
93
+ "typescript-eslint": "^8.32.1"
91
94
  }
92
95
  }
@@ -0,0 +1,25 @@
1
+ import { View, Text } from 'react-native';
2
+ import { Image } from 'expo-image';
3
+
4
+ import { useTheme } from '@/hooks/useTheme';
5
+ import { Screen } from '@/components/Screen';
6
+ import { styles } from './styles';
7
+
8
+ export default function DemoPage() {
9
+ const { theme, isDark } = useTheme();
10
+
11
+ return (
12
+ <Screen backgroundColor={theme.backgroundRoot} statusBarStyle={isDark ? 'light' : 'dark'}>
13
+ <View
14
+ style={styles.container}
15
+ >
16
+ <Image
17
+ style={styles.logo}
18
+ source="https://lf-coze-web-cdn.coze.cn/obj/eden-cn/lm-lgvj/ljhwZthlaukjlkulzlp/coze-coding/icon/coze-coding.gif"
19
+ ></Image>
20
+ <Text style={{...styles.title, color: theme.textPrimary}}>应用开发中</Text>
21
+ <Text style={{...styles.description, color: theme.textSecondary}}>请稍候,界面即将呈现</Text>
22
+ </View>
23
+ </Screen>
24
+ );
25
+ }
@@ -0,0 +1,28 @@
1
+ import { Spacing } from '@/constants/theme';
2
+ import { StyleSheet } from 'react-native';
3
+
4
+ export const styles = StyleSheet.create({
5
+ container: {
6
+ position: 'absolute',
7
+ top: 0,
8
+ left: 0,
9
+ width: '100%',
10
+ height: '100%',
11
+ display: 'flex',
12
+ flexDirection: 'column',
13
+ alignItems: 'center',
14
+ justifyContent: 'center',
15
+ },
16
+ logo: {
17
+ width: 130,
18
+ height: 109,
19
+ },
20
+ title: {
21
+ fontSize: 16,
22
+ fontWeight: 'bold',
23
+ },
24
+ description: {
25
+ fontSize: 14,
26
+ marginTop: Spacing.sm,
27
+ },
28
+ });
@@ -9,7 +9,7 @@ const { execSync } = require('child_process');
9
9
  const fs = require('fs');
10
10
  const path = require('path');
11
11
 
12
- console.log('🔍 检测缺失的依赖...\n');
12
+ console.log('检测缺失的依赖...\n');
13
13
 
14
14
  try {
15
15
  // 运行 depcheck 并获取 JSON 输出
@@ -38,6 +38,7 @@ try {
38
38
  const ignoreFilePatterns = [
39
39
  /template\.config\.(ts|js)$/, // 模板配置文件
40
40
  /\.template\./, // 其他模板文件
41
+ /declarations\.d\.ts$/, // 项目配置文件
41
42
  ];
42
43
 
43
44
  // 过滤包:排除内部别名和只被模板文件引用的包
@@ -60,11 +61,11 @@ try {
60
61
  });
61
62
 
62
63
  if (missingPackages.length === 0) {
63
- console.log('✅ 没有发现缺失的依赖!');
64
+ console.log('没有发现缺失的依赖');
64
65
  process.exit(0);
65
66
  }
66
67
 
67
- console.log('📦 发现以下缺失的依赖:');
68
+ console.log('发现以下缺失的依赖:');
68
69
  missingPackages.forEach((pkg, index) => {
69
70
  const files = missing[pkg];
70
71
  console.log(` ${index + 1}. ${pkg}`);
@@ -73,7 +74,7 @@ try {
73
74
  );
74
75
  });
75
76
 
76
- console.log('\n🚀 开始安装...\n');
77
+ console.log('\n开始安装...\n');
77
78
 
78
79
  // 使用 expo install 安装所有缺失的包
79
80
  const packagesToInstall = missingPackages.join(' ');
@@ -83,22 +84,22 @@ try {
83
84
  stdio: 'inherit',
84
85
  });
85
86
 
86
- console.log('\n✅ 所有缺失的依赖已安装完成!');
87
+ console.log('\n所有缺失的依赖已安装完成');
87
88
  } catch (installError) {
88
- console.log('\n⚠️ expo install 失败,尝试使用 npm install...\n');
89
+ console.log('\nexpo install 失败,尝试使用 npm install...\n');
89
90
 
90
91
  execSync(`npm install ${packagesToInstall}`, {
91
92
  stdio: 'inherit',
92
93
  });
93
94
 
94
- console.log('\n所有缺失的依赖已通过 npm 安装完成!');
95
+ console.log('\n所有缺失的依赖已通过 npm 安装完成');
95
96
  }
96
97
  } catch (error) {
97
98
  if (error.message.includes('depcheck')) {
98
- console.error('depcheck 未安装或运行失败');
99
- console.log('💡 尝试运行: npm install -g depcheck');
99
+ console.error('depcheck 未安装或运行失败');
100
+ console.log('尝试运行: npm install -g depcheck');
100
101
  } else {
101
- console.error('发生错误:', error.message);
102
+ console.error('发生错误:', error.message);
102
103
  }
103
104
  process.exit(1);
104
105
  }
@@ -7,7 +7,7 @@
7
7
  "strict": true,
8
8
  "noEmit": true,
9
9
  "paths": {
10
- "@/*": ["./src/*"]
10
+ "@/*": ["./*"]
11
11
  }
12
12
  },
13
13
  "include": ["**/*.ts", "**/*.tsx", ".expo/types/**/*.ts", "expo-env.d.ts"],
@@ -1,9 +1,31 @@
1
+ import { Platform } from 'react-native';
1
2
  import dayjs from 'dayjs';
2
3
  import utc from 'dayjs/plugin/utc';
3
4
  dayjs.extend(utc);
4
5
 
5
6
  const API_BASE = (process.env.EXPO_PUBLIC_API_BASE ?? '').replace(/\/$/, '');
6
7
 
8
+ /**
9
+ * 创建跨平台兼容的文件对象,用于 FormData.append()
10
+ * - Web 端返回 File 对象
11
+ * - 移动端返回 { uri, type, name } 对象(RN fetch 会自动处理)
12
+ * @param fileUri Expo 媒体库(如 expo-image-picker、expo-camera)返回的 uri
13
+ * @param fileName 上传时的文件名,如 'photo.jpg'
14
+ * @param mimeType 文件 MIME 类型,如 'image/jpeg'、'audio/mpeg'
15
+ */
16
+ export async function createFormDataFile(
17
+ fileUri: string,
18
+ fileName: string,
19
+ mimeType: string
20
+ ): Promise<File | { uri: string; type: string; name: string }> {
21
+ if (Platform.OS === 'web') {
22
+ const response = await fetch(fileUri);
23
+ const blob = await response.blob();
24
+ return new File([blob], fileName, { type: mimeType });
25
+ }
26
+ return { uri: fileUri, type: mimeType, name: fileName };
27
+ }
28
+
7
29
  /**
8
30
  * 构建文件或图片完整的URL
9
31
  * @param url 相对或绝对路径
@@ -0,0 +1,9 @@
1
+ const validName = require('./rule')
2
+
3
+ const plugin = {
4
+ rules: {
5
+ 'valid-name': validName,
6
+ },
7
+ };
8
+
9
+ module.exports = plugin