openxiangda 1.0.264 → 2.0.0-alpha.2

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 (537) hide show
  1. package/README.md +11 -666
  2. package/bin/run.js +11 -0
  3. package/dist/browser/AuthoritativeSelector.d.ts +37 -0
  4. package/dist/browser/AuthoritativeSelector.d.ts.map +1 -0
  5. package/dist/browser/AuthoritativeSelector.js +357 -0
  6. package/dist/browser/AuthoritativeSelector.js.map +1 -0
  7. package/dist/browser/FilePreviewPage.d.ts +2 -0
  8. package/dist/browser/FilePreviewPage.d.ts.map +1 -0
  9. package/dist/browser/FilePreviewPage.js +191 -0
  10. package/dist/browser/FilePreviewPage.js.map +1 -0
  11. package/dist/browser/Shell.d.ts +6 -0
  12. package/dist/browser/Shell.d.ts.map +1 -0
  13. package/dist/browser/Shell.js +198 -0
  14. package/dist/browser/Shell.js.map +1 -0
  15. package/dist/browser/appearance.d.ts +12 -0
  16. package/dist/browser/appearance.d.ts.map +1 -0
  17. package/dist/browser/appearance.js +100 -0
  18. package/dist/browser/appearance.js.map +1 -0
  19. package/dist/browser/application.d.ts +8 -0
  20. package/dist/browser/application.d.ts.map +1 -0
  21. package/dist/browser/application.js +42 -0
  22. package/dist/browser/application.js.map +1 -0
  23. package/dist/browser/components/platform-fields/AddressField.d.ts +12 -0
  24. package/dist/browser/components/platform-fields/AddressField.d.ts.map +1 -0
  25. package/dist/browser/components/platform-fields/AddressField.js +179 -0
  26. package/dist/browser/components/platform-fields/AddressField.js.map +1 -0
  27. package/dist/browser/components/platform-fields/AttachmentFileList.d.ts +9 -0
  28. package/dist/browser/components/platform-fields/AttachmentFileList.d.ts.map +1 -0
  29. package/dist/browser/components/platform-fields/AttachmentFileList.js +164 -0
  30. package/dist/browser/components/platform-fields/AttachmentFileList.js.map +1 -0
  31. package/dist/browser/components/platform-fields/CascadeField.d.ts +13 -0
  32. package/dist/browser/components/platform-fields/CascadeField.d.ts.map +1 -0
  33. package/dist/browser/components/platform-fields/CascadeField.js +14 -0
  34. package/dist/browser/components/platform-fields/CascadeField.js.map +1 -0
  35. package/dist/browser/components/platform-fields/DateTimeField.d.ts +16 -0
  36. package/dist/browser/components/platform-fields/DateTimeField.d.ts.map +1 -0
  37. package/dist/browser/components/platform-fields/DateTimeField.js +51 -0
  38. package/dist/browser/components/platform-fields/DateTimeField.js.map +1 -0
  39. package/dist/browser/components/platform-fields/JsonField.d.ts +11 -0
  40. package/dist/browser/components/platform-fields/JsonField.d.ts.map +1 -0
  41. package/dist/browser/components/platform-fields/JsonField.js +40 -0
  42. package/dist/browser/components/platform-fields/JsonField.js.map +1 -0
  43. package/dist/browser/components/platform-fields/LocationField.d.ts +11 -0
  44. package/dist/browser/components/platform-fields/LocationField.d.ts.map +1 -0
  45. package/dist/browser/components/platform-fields/LocationField.js +73 -0
  46. package/dist/browser/components/platform-fields/LocationField.js.map +1 -0
  47. package/dist/browser/components/platform-fields/PlatformDirectoryPicker.d.ts +12 -0
  48. package/dist/browser/components/platform-fields/PlatformDirectoryPicker.d.ts.map +1 -0
  49. package/dist/browser/components/platform-fields/PlatformDirectoryPicker.js +269 -0
  50. package/dist/browser/components/platform-fields/PlatformDirectoryPicker.js.map +1 -0
  51. package/dist/browser/components/platform-fields/ResourceReferenceField.d.ts +12 -0
  52. package/dist/browser/components/platform-fields/ResourceReferenceField.d.ts.map +1 -0
  53. package/dist/browser/components/platform-fields/ResourceReferenceField.js +22 -0
  54. package/dist/browser/components/platform-fields/ResourceReferenceField.js.map +1 -0
  55. package/dist/browser/components/platform-fields/RichTextField.d.ts +14 -0
  56. package/dist/browser/components/platform-fields/RichTextField.d.ts.map +1 -0
  57. package/dist/browser/components/platform-fields/RichTextField.js +214 -0
  58. package/dist/browser/components/platform-fields/RichTextField.js.map +1 -0
  59. package/dist/browser/components/platform-fields/SignatureField.d.ts +15 -0
  60. package/dist/browser/components/platform-fields/SignatureField.d.ts.map +1 -0
  61. package/dist/browser/components/platform-fields/SignatureField.js +179 -0
  62. package/dist/browser/components/platform-fields/SignatureField.js.map +1 -0
  63. package/dist/browser/components/platform-fields/SubtableField.d.ts +18 -0
  64. package/dist/browser/components/platform-fields/SubtableField.d.ts.map +1 -0
  65. package/dist/browser/components/platform-fields/SubtableField.js +236 -0
  66. package/dist/browser/components/platform-fields/SubtableField.js.map +1 -0
  67. package/dist/browser/components/platform-fields/address-value.d.ts +13 -0
  68. package/dist/browser/components/platform-fields/address-value.d.ts.map +1 -0
  69. package/dist/browser/components/platform-fields/address-value.js +70 -0
  70. package/dist/browser/components/platform-fields/address-value.js.map +1 -0
  71. package/dist/browser/components/platform-fields/cascade-value.d.ts +6 -0
  72. package/dist/browser/components/platform-fields/cascade-value.d.ts.map +1 -0
  73. package/dist/browser/components/platform-fields/cascade-value.js +47 -0
  74. package/dist/browser/components/platform-fields/cascade-value.js.map +1 -0
  75. package/dist/browser/components/platform-fields/directory-value.d.ts +7 -0
  76. package/dist/browser/components/platform-fields/directory-value.d.ts.map +1 -0
  77. package/dist/browser/components/platform-fields/directory-value.js +35 -0
  78. package/dist/browser/components/platform-fields/directory-value.js.map +1 -0
  79. package/dist/browser/components/platform-fields/field-form-codec.d.ts +10 -0
  80. package/dist/browser/components/platform-fields/field-form-codec.d.ts.map +1 -0
  81. package/dist/browser/components/platform-fields/field-form-codec.js +82 -0
  82. package/dist/browser/components/platform-fields/field-form-codec.js.map +1 -0
  83. package/dist/browser/components/platform-fields/location-value.d.ts +20 -0
  84. package/dist/browser/components/platform-fields/location-value.d.ts.map +1 -0
  85. package/dist/browser/components/platform-fields/location-value.js +57 -0
  86. package/dist/browser/components/platform-fields/location-value.js.map +1 -0
  87. package/dist/browser/components/platform-fields/resource-query.d.ts +14 -0
  88. package/dist/browser/components/platform-fields/resource-query.d.ts.map +1 -0
  89. package/dist/browser/components/platform-fields/resource-query.js +102 -0
  90. package/dist/browser/components/platform-fields/resource-query.js.map +1 -0
  91. package/dist/browser/components/platform-fields/rich-text-value.d.ts +12 -0
  92. package/dist/browser/components/platform-fields/rich-text-value.d.ts.map +1 -0
  93. package/dist/browser/components/platform-fields/rich-text-value.js +83 -0
  94. package/dist/browser/components/platform-fields/rich-text-value.js.map +1 -0
  95. package/dist/browser/components/platform-fields/subtable-value.d.ts +31 -0
  96. package/dist/browser/components/platform-fields/subtable-value.d.ts.map +1 -0
  97. package/dist/browser/components/platform-fields/subtable-value.js +120 -0
  98. package/dist/browser/components/platform-fields/subtable-value.js.map +1 -0
  99. package/dist/browser/components/resource/GeneratedResourceCrud.d.ts +8 -0
  100. package/dist/browser/components/resource/GeneratedResourceCrud.d.ts.map +1 -0
  101. package/dist/browser/components/resource/GeneratedResourceCrud.js +580 -0
  102. package/dist/browser/components/resource/GeneratedResourceCrud.js.map +1 -0
  103. package/dist/browser/components/resource/ResourceBatchActions.d.ts +25 -0
  104. package/dist/browser/components/resource/ResourceBatchActions.d.ts.map +1 -0
  105. package/dist/browser/components/resource/ResourceBatchActions.js +168 -0
  106. package/dist/browser/components/resource/ResourceBatchActions.js.map +1 -0
  107. package/dist/browser/components/resource/StandardResourcePages.d.ts +57 -0
  108. package/dist/browser/components/resource/StandardResourcePages.d.ts.map +1 -0
  109. package/dist/browser/components/resource/StandardResourcePages.js +89 -0
  110. package/dist/browser/components/resource/StandardResourcePages.js.map +1 -0
  111. package/dist/browser/components/resource/SurfaceFields.d.ts +88 -0
  112. package/dist/browser/components/resource/SurfaceFields.d.ts.map +1 -0
  113. package/dist/browser/components/resource/SurfaceFields.js +497 -0
  114. package/dist/browser/components/resource/SurfaceFields.js.map +1 -0
  115. package/dist/browser/components/resource/generated-resource-definition.d.ts +19 -0
  116. package/dist/browser/components/resource/generated-resource-definition.d.ts.map +1 -0
  117. package/dist/browser/components/resource/generated-resource-definition.js +2 -0
  118. package/dist/browser/components/resource/generated-resource-definition.js.map +1 -0
  119. package/dist/browser/components/resource/resource-import.d.ts +15 -0
  120. package/dist/browser/components/resource/resource-import.d.ts.map +1 -0
  121. package/dist/browser/components/resource/resource-import.js +197 -0
  122. package/dist/browser/components/resource/resource-import.js.map +1 -0
  123. package/dist/browser/data-provider.d.ts +4 -0
  124. package/dist/browser/data-provider.d.ts.map +1 -0
  125. package/dist/browser/data-provider.js +45 -0
  126. package/dist/browser/data-provider.js.map +1 -0
  127. package/dist/browser/platform-client.d.ts +81 -0
  128. package/dist/browser/platform-client.d.ts.map +1 -0
  129. package/dist/browser/platform-client.js +422 -0
  130. package/dist/browser/platform-client.js.map +1 -0
  131. package/dist/browser/resource-definitions.d.ts +8 -0
  132. package/dist/browser/resource-definitions.d.ts.map +1 -0
  133. package/dist/browser/resource-definitions.js +14 -0
  134. package/dist/browser/resource-definitions.js.map +1 -0
  135. package/dist/browser/runtime-meta.d.ts +22 -0
  136. package/dist/browser/runtime-meta.d.ts.map +1 -0
  137. package/dist/browser/runtime-meta.js +79 -0
  138. package/dist/browser/runtime-meta.js.map +1 -0
  139. package/dist/browser/runtime.d.ts +13 -0
  140. package/dist/browser/runtime.d.ts.map +1 -0
  141. package/dist/browser/runtime.js +47 -0
  142. package/dist/browser/runtime.js.map +1 -0
  143. package/dist/browser/styles.css +1941 -0
  144. package/dist/config.d.ts +2 -0
  145. package/dist/config.d.ts.map +1 -0
  146. package/dist/config.js +2 -0
  147. package/dist/config.js.map +1 -0
  148. package/dist/core.d.ts +6 -0
  149. package/dist/core.d.ts.map +1 -0
  150. package/dist/core.js +4 -0
  151. package/dist/core.js.map +1 -0
  152. package/dist/field-kit.d.ts +22 -0
  153. package/dist/field-kit.d.ts.map +1 -0
  154. package/dist/field-kit.js +22 -0
  155. package/dist/field-kit.js.map +1 -0
  156. package/dist/index.d.ts +2 -0
  157. package/dist/index.d.ts.map +1 -0
  158. package/dist/index.js +2 -0
  159. package/dist/index.js.map +1 -0
  160. package/dist/nest.d.ts +10 -0
  161. package/dist/nest.d.ts.map +1 -0
  162. package/dist/nest.js +9 -0
  163. package/dist/nest.js.map +1 -0
  164. package/dist/react.d.ts +12 -0
  165. package/dist/react.d.ts.map +1 -0
  166. package/dist/react.js +11 -0
  167. package/dist/react.js.map +1 -0
  168. package/dist/testing.d.ts +4 -0
  169. package/dist/testing.d.ts.map +1 -0
  170. package/dist/testing.js +4 -0
  171. package/dist/testing.js.map +1 -0
  172. package/package.json +95 -200
  173. package/skills/manifest.json +10 -0
  174. package/skills/openxiangda-v2/SKILL.md +55 -0
  175. package/skills/openxiangda-v2/references/architecture.md +7 -0
  176. package/skills/openxiangda-v2/references/backend.md +116 -0
  177. package/skills/openxiangda-v2/references/data-authz.md +93 -0
  178. package/skills/openxiangda-v2/references/delivery.md +11 -0
  179. package/skills/openxiangda-v2/references/discovery.md +15 -0
  180. package/skills/openxiangda-v2/references/frontend.md +10 -0
  181. package/skills/openxiangda-v2/references/testing.md +16 -0
  182. package/skills/openxiangda-v2/references/workflow-notification.md +69 -0
  183. package/skills/openxiangda-v2/references/workspace.md +21 -0
  184. package/bin/openxiangda.js +0 -26
  185. package/lib/app-function-invoke.js +0 -28
  186. package/lib/application-environments.js +0 -1134
  187. package/lib/change-baseline.js +0 -1359
  188. package/lib/cli.js +0 -31084
  189. package/lib/config.js +0 -450
  190. package/lib/content-cache.js +0 -97
  191. package/lib/delivery-v2-cli.js +0 -329
  192. package/lib/delivery-v2-executor.js +0 -1703
  193. package/lib/delivery-v2-package.js +0 -1176
  194. package/lib/dependency-capsule.js +0 -246
  195. package/lib/design-gates.js +0 -668
  196. package/lib/design-review.js +0 -220
  197. package/lib/developer-center.js +0 -160
  198. package/lib/form-field-contract.js +0 -79
  199. package/lib/form-schema-loader.js +0 -181
  200. package/lib/git-remote-identity.js +0 -89
  201. package/lib/http.js +0 -196
  202. package/lib/integration-bundle.js +0 -225
  203. package/lib/js-code-build.js +0 -175
  204. package/lib/open-api.js +0 -256
  205. package/lib/policy.js +0 -137
  206. package/lib/publish-context.js +0 -98
  207. package/lib/publish-lease-heartbeat.js +0 -182
  208. package/lib/publish-lease.js +0 -221
  209. package/lib/release-error-classification.js +0 -41
  210. package/lib/release-explain.js +0 -75
  211. package/lib/release-mainline.js +0 -654
  212. package/lib/release-plan.js +0 -550
  213. package/lib/release-telemetry.js +0 -182
  214. package/lib/resource-binding-contract.js +0 -210
  215. package/lib/role-resolution.js +0 -57
  216. package/lib/runtime-lineage.js +0 -326
  217. package/lib/sdd.js +0 -3306
  218. package/lib/skills.js +0 -453
  219. package/lib/source-dependencies.js +0 -921
  220. package/lib/task-status.js +0 -330
  221. package/lib/utils.js +0 -178
  222. package/lib/workspace-bootstrap.js +0 -268
  223. package/lib/workspace-init.js +0 -202
  224. package/lib/worktree-cleanup.js +0 -631
  225. package/lib/worktree-owner.js +0 -354
  226. package/openxiangda-skills/SKILL.md +0 -226
  227. package/openxiangda-skills/references/architecture-design.md +0 -409
  228. package/openxiangda-skills/references/architecture-patterns.md +0 -264
  229. package/openxiangda-skills/references/automation-v3.md +0 -349
  230. package/openxiangda-skills/references/best-practices.md +0 -272
  231. package/openxiangda-skills/references/component-guide.md +0 -287
  232. package/openxiangda-skills/references/connector-resources.md +0 -80
  233. package/openxiangda-skills/references/data-views.md +0 -360
  234. package/openxiangda-skills/references/forms/component-registry.md +0 -90
  235. package/openxiangda-skills/references/forms/form-schema.md +0 -146
  236. package/openxiangda-skills/references/forms/layout-and-rules.md +0 -24
  237. package/openxiangda-skills/references/notifications.md +0 -227
  238. package/openxiangda-skills/references/openxiangda-api.md +0 -971
  239. package/openxiangda-skills/references/pages/app-shell.md +0 -66
  240. package/openxiangda-skills/references/pages/page-sdk.md +0 -401
  241. package/openxiangda-skills/references/pages/publish-flow.md +0 -84
  242. package/openxiangda-skills/references/pages/workspace-structure.md +0 -41
  243. package/openxiangda-skills/references/permission-design-patterns.md +0 -313
  244. package/openxiangda-skills/references/permissions-settings.md +0 -468
  245. package/openxiangda-skills/references/platform-data-model.md +0 -340
  246. package/openxiangda-skills/references/resource-manifest-cheatsheet.md +0 -936
  247. package/openxiangda-skills/references/school-contact-relations.md +0 -224
  248. package/openxiangda-skills/references/style-system.md +0 -218
  249. package/openxiangda-skills/references/troubleshooting.md +0 -271
  250. package/openxiangda-skills/references/workflow-v3.md +0 -441
  251. package/openxiangda-skills/references/workspace-state.md +0 -115
  252. package/openxiangda-skills/skills/openxiangda-app/SKILL.md +0 -118
  253. package/openxiangda-skills/skills/openxiangda-architecture-design/SKILL.md +0 -137
  254. package/openxiangda-skills/skills/openxiangda-core/SKILL.md +0 -222
  255. package/openxiangda-skills/skills/openxiangda-form/SKILL.md +0 -184
  256. package/openxiangda-skills/skills/openxiangda-inspect/SKILL.md +0 -63
  257. package/openxiangda-skills/skills/openxiangda-open-api/SKILL.md +0 -57
  258. package/openxiangda-skills/skills/openxiangda-open-api/agents/openai.yaml +0 -4
  259. package/openxiangda-skills/skills/openxiangda-open-api/references/backend-authentication.md +0 -63
  260. package/openxiangda-skills/skills/openxiangda-open-api/references/dingtalk-api.openapi.json +0 -15653
  261. package/openxiangda-skills/skills/openxiangda-page/SKILL.md +0 -154
  262. package/openxiangda-skills/skills/openxiangda-permission-settings/SKILL.md +0 -209
  263. package/openxiangda-skills/skills/openxiangda-workflow-automation/SKILL.md +0 -201
  264. package/packages/sdk/bin/lowcode-workspace.mjs +0 -4
  265. package/packages/sdk/dist/ProcessPreview-DSUIJi5V.d.mts +0 -1292
  266. package/packages/sdk/dist/ProcessPreview-DSUIJi5V.d.ts +0 -1292
  267. package/packages/sdk/dist/build/index.cjs +0 -1
  268. package/packages/sdk/dist/build/index.d.mts +0 -60
  269. package/packages/sdk/dist/build/index.d.ts +0 -60
  270. package/packages/sdk/dist/build/index.mjs +0 -1
  271. package/packages/sdk/dist/components/index.cjs +0 -148
  272. package/packages/sdk/dist/components/index.d.mts +0 -970
  273. package/packages/sdk/dist/components/index.d.ts +0 -970
  274. package/packages/sdk/dist/components/index.mjs +0 -148
  275. package/packages/sdk/dist/dataManagementApi-Ro9itwm8.d.ts +0 -142
  276. package/packages/sdk/dist/dataManagementApi-p_HOhQnA.d.mts +0 -142
  277. package/packages/sdk/dist/runtime/index.cjs +0 -148
  278. package/packages/sdk/dist/runtime/index.d.mts +0 -171
  279. package/packages/sdk/dist/runtime/index.d.ts +0 -171
  280. package/packages/sdk/dist/runtime/index.mjs +0 -148
  281. package/packages/sdk/dist/runtime/react.cjs +0 -148
  282. package/packages/sdk/dist/runtime/react.d.mts +0 -3202
  283. package/packages/sdk/dist/runtime/react.d.ts +0 -3202
  284. package/packages/sdk/dist/runtime/react.mjs +0 -148
  285. package/packages/sdk/dist/styles/antd-theme.cjs +0 -1
  286. package/packages/sdk/dist/styles/antd-theme.d.mts +0 -6
  287. package/packages/sdk/dist/styles/antd-theme.d.ts +0 -6
  288. package/packages/sdk/dist/styles/antd-theme.mjs +0 -1
  289. package/packages/sdk/dist/styles/tailwind-preset.cjs +0 -1
  290. package/packages/sdk/dist/styles/tailwind-preset.d.mts +0 -74
  291. package/packages/sdk/dist/styles/tailwind-preset.d.ts +0 -74
  292. package/packages/sdk/dist/styles/tailwind-preset.mjs +0 -1
  293. package/packages/sdk/dist/styles/tokens.css +0 -74
  294. package/packages/sdk/dist/workflow/index.cjs +0 -3
  295. package/packages/sdk/dist/workflow/index.d.mts +0 -291
  296. package/packages/sdk/dist/workflow/index.d.ts +0 -291
  297. package/packages/sdk/dist/workflow/index.mjs +0 -3
  298. package/packages/sdk/source/admin-list/AdminList.tsx +0 -1734
  299. package/packages/sdk/source/admin-list/README.md +0 -12
  300. package/packages/sdk/source/admin-list/dataSources.ts +0 -345
  301. package/packages/sdk/source/admin-list/index.ts +0 -42
  302. package/packages/sdk/source/admin-list/preferences.ts +0 -174
  303. package/packages/sdk/source/admin-list/types.ts +0 -273
  304. package/packages/sdk/src/build-source/README.md +0 -9
  305. package/packages/sdk/src/build-source/bin/lowcode-workspace.mjs +0 -7
  306. package/packages/sdk/src/build-source/package.json +0 -34
  307. package/packages/sdk/src/build-source/scripts/build-forms.mjs +0 -1129
  308. package/packages/sdk/src/build-source/scripts/build-pages.mjs +0 -897
  309. package/packages/sdk/src/build-source/scripts/build-workspace.mjs +0 -89
  310. package/packages/sdk/src/build-source/scripts/publish-all.mjs +0 -190
  311. package/packages/sdk/src/build-source/scripts/publish-oss.mjs +0 -144
  312. package/packages/sdk/src/build-source/scripts/register-bundle.mjs +0 -1
  313. package/packages/sdk/src/build-source/scripts/register.mjs +0 -362
  314. package/packages/sdk/src/build-source/scripts/sync-schema.mjs +0 -381
  315. package/packages/sdk/src/build-source/scripts/utils/form-api.mjs +0 -1058
  316. package/packages/sdk/src/build-source/scripts/utils/form-runtime-assets.mjs +0 -57
  317. package/packages/sdk/src/build-source/scripts/utils/incremental.mjs +0 -348
  318. package/packages/sdk/src/build-source/scripts/utils/load-config.mjs +0 -331
  319. package/packages/sdk/src/build-source/scripts/utils/mime-types.mjs +0 -70
  320. package/packages/sdk/src/build-source/scripts/utils/namespace-css.mjs +0 -77
  321. package/packages/sdk/src/build-source/scripts/utils/oss-client.mjs +0 -128
  322. package/packages/sdk/src/build-source/scripts/utils/pages.mjs +0 -150
  323. package/packages/sdk/src/build-source/scripts/utils/progress.mjs +0 -57
  324. package/packages/sdk/src/build-source/scripts/utils/publish-oss-patterns.mjs +0 -20
  325. package/packages/sdk/src/build-source/scripts/utils/register-payload.mjs +0 -90
  326. package/packages/sdk/src/build-source/scripts/utils/runtime-css-check.mjs +0 -44
  327. package/packages/sdk/src/build-source/scripts/utils/schema-transform.mjs +0 -142
  328. package/packages/sdk/src/build-source/scripts/utils/static-assets.mjs +0 -165
  329. package/packages/sdk/src/build-source/scripts/utils/tailwind-config.mjs +0 -283
  330. package/packages/sdk/src/build-source/scripts/utils/tailwind-token-warnings.mjs +0 -146
  331. package/packages/sdk/src/build-source/scripts/utils/workspace-style-entry.mjs +0 -29
  332. package/packages/sdk/src/build-source/src/cli.mjs +0 -735
  333. package/policy/openxiangda-policy.json +0 -72
  334. package/templates/openxiangda-react-spa/.cursor/rules/openxiangda-form.mdc +0 -24
  335. package/templates/openxiangda-react-spa/.cursor/rules/openxiangda-page.mdc +0 -25
  336. package/templates/openxiangda-react-spa/.cursor/rules/openxiangda-resources.mdc +0 -32
  337. package/templates/openxiangda-react-spa/.cursor/rules/openxiangda-workflow-automation.mdc +0 -26
  338. package/templates/openxiangda-react-spa/.cursor/rules/openxiangda.mdc +0 -68
  339. package/templates/openxiangda-react-spa/.env.example +0 -4
  340. package/templates/openxiangda-react-spa/.qoder/rules/openxiangda-form.md +0 -37
  341. package/templates/openxiangda-react-spa/.qoder/rules/openxiangda-page.md +0 -29
  342. package/templates/openxiangda-react-spa/.qoder/rules/openxiangda-resources.md +0 -32
  343. package/templates/openxiangda-react-spa/.qoder/rules/openxiangda-workflow-automation.md +0 -34
  344. package/templates/openxiangda-react-spa/.qoder/rules/openxiangda.md +0 -66
  345. package/templates/openxiangda-react-spa/AGENTS.md +0 -192
  346. package/templates/openxiangda-react-spa/DELIVERY.md +0 -43
  347. package/templates/openxiangda-react-spa/app-workspace.config.ts +0 -50
  348. package/templates/openxiangda-react-spa/index.html +0 -12
  349. package/templates/openxiangda-react-spa/package.json +0 -53
  350. package/templates/openxiangda-react-spa/postcss.config.cjs +0 -6
  351. package/templates/openxiangda-react-spa/scripts/build-js-code.mjs +0 -600
  352. package/templates/openxiangda-react-spa/scripts/deploy.mjs +0 -18
  353. package/templates/openxiangda-react-spa/scripts/guard-publish.mjs +0 -21
  354. package/templates/openxiangda-react-spa/src/app/navigation.ts +0 -73
  355. package/templates/openxiangda-react-spa/src/app/router.tsx +0 -146
  356. package/templates/openxiangda-react-spa/src/app/starter-content.ts +0 -144
  357. package/templates/openxiangda-react-spa/src/forms/.gitkeep +0 -1
  358. package/templates/openxiangda-react-spa/src/layouts/AdminShell.tsx +0 -570
  359. package/templates/openxiangda-react-spa/src/main.tsx +0 -21
  360. package/templates/openxiangda-react-spa/src/pages/admin/AdminDashboardPage.tsx +0 -170
  361. package/templates/openxiangda-react-spa/src/pages/admin/LoginLogPage.tsx +0 -425
  362. package/templates/openxiangda-react-spa/src/pages/defaults/DataRoutePage.tsx +0 -36
  363. package/templates/openxiangda-react-spa/src/pages/defaults/FilePreviewRoutePage.tsx +0 -65
  364. package/templates/openxiangda-react-spa/src/pages/defaults/FormRoutePage.tsx +0 -235
  365. package/templates/openxiangda-react-spa/src/pages/public/PublicRegisterPage.tsx +0 -15
  366. package/templates/openxiangda-react-spa/src/pages/states/NotFoundPage.tsx +0 -31
  367. package/templates/openxiangda-react-spa/src/resources/menus/menus.json +0 -22
  368. package/templates/openxiangda-react-spa/src/resources/permissions/page-groups/app-admin.json +0 -8
  369. package/templates/openxiangda-react-spa/src/resources/permissions/page-groups/public-visitor.json +0 -8
  370. package/templates/openxiangda-react-spa/src/resources/public-access/public-register.json +0 -14
  371. package/templates/openxiangda-react-spa/src/resources/roles/roles.json +0 -15
  372. package/templates/openxiangda-react-spa/src/resources/routes/public-register.json +0 -8
  373. package/templates/openxiangda-react-spa/src/runtime/default-page-overrides.tsx +0 -35
  374. package/templates/openxiangda-react-spa/src/runtime/default-routes.ts +0 -16
  375. package/templates/openxiangda-react-spa/src/shared/form-schema.ts +0 -135
  376. package/templates/openxiangda-react-spa/src/shared/mac-admin.tsx +0 -651
  377. package/templates/openxiangda-react-spa/src/shared/ui.tsx +0 -22
  378. package/templates/openxiangda-react-spa/src/styles/index.css +0 -105
  379. package/templates/openxiangda-react-spa/tailwind.config.cjs +0 -37
  380. package/templates/openxiangda-react-spa/tsconfig.app.json +0 -36
  381. package/templates/openxiangda-react-spa/tsconfig.js-code-nodes.json +0 -19
  382. package/templates/openxiangda-react-spa/tsconfig.json +0 -7
  383. package/templates/openxiangda-react-spa/tsconfig.node.json +0 -10
  384. package/templates/openxiangda-react-spa/vite.config.ts +0 -209
  385. package/templates/sy-lowcode-app-workspace/.cursor/rules/openxiangda-form.mdc +0 -24
  386. package/templates/sy-lowcode-app-workspace/.cursor/rules/openxiangda-page.mdc +0 -21
  387. package/templates/sy-lowcode-app-workspace/.cursor/rules/openxiangda-resources.mdc +0 -40
  388. package/templates/sy-lowcode-app-workspace/.cursor/rules/openxiangda-workflow-automation.mdc +0 -21
  389. package/templates/sy-lowcode-app-workspace/.cursor/rules/openxiangda.mdc +0 -81
  390. package/templates/sy-lowcode-app-workspace/.qoder/rules/openxiangda-form.md +0 -38
  391. package/templates/sy-lowcode-app-workspace/.qoder/rules/openxiangda-page.md +0 -39
  392. package/templates/sy-lowcode-app-workspace/.qoder/rules/openxiangda-resources.md +0 -59
  393. package/templates/sy-lowcode-app-workspace/.qoder/rules/openxiangda-workflow-automation.md +0 -46
  394. package/templates/sy-lowcode-app-workspace/.qoder/rules/openxiangda.md +0 -82
  395. package/templates/sy-lowcode-app-workspace/AGENTS.md +0 -158
  396. package/templates/sy-lowcode-app-workspace/DELIVERY.md +0 -43
  397. package/templates/sy-lowcode-app-workspace/app-workspace.config.ts +0 -51
  398. package/templates/sy-lowcode-app-workspace/examples/best-practices/README.md +0 -43
  399. package/templates/sy-lowcode-app-workspace/examples/best-practices/access-governance.md +0 -239
  400. package/templates/sy-lowcode-app-workspace/examples/best-practices/catalog.json +0 -99
  401. package/templates/sy-lowcode-app-workspace/examples/best-practices/decision-guide.md +0 -94
  402. package/templates/sy-lowcode-app-workspace/examples/best-practices/design-style.md +0 -91
  403. package/templates/sy-lowcode-app-workspace/examples/best-practices/module-structure.md +0 -48
  404. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/domain/role-governance/index.ts +0 -2
  405. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/domain/role-governance/permissions.test.ts +0 -52
  406. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/domain/role-governance/permissions.ts +0 -37
  407. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/domain/role-governance/types.ts +0 -19
  408. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/domain/service-ticket/index.ts +0 -4
  409. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/domain/service-ticket/permissions.test.ts +0 -42
  410. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/domain/service-ticket/permissions.ts +0 -25
  411. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/domain/service-ticket/state-machine.test.ts +0 -63
  412. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/domain/service-ticket/state-machine.ts +0 -73
  413. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/domain/service-ticket/ticket-query.test.ts +0 -34
  414. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/domain/service-ticket/ticket-query.ts +0 -73
  415. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/domain/service-ticket/types.ts +0 -66
  416. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/forms/app-role/page.tsx +0 -1
  417. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/forms/app-role/schema.ts +0 -109
  418. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/forms/customer-profile/page.tsx +0 -1
  419. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/forms/customer-profile/schema.ts +0 -92
  420. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/forms/service-ticket/page.tsx +0 -1
  421. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/forms/service-ticket/schema.ts +0 -153
  422. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/forms/ticket-action-log/page.tsx +0 -1
  423. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/forms/ticket-action-log/schema.ts +0 -65
  424. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/js-code-nodes/daily_ticket_digest/index.ts +0 -44
  425. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/js-code-nodes/sync_roles_to_platform/index.ts +0 -33
  426. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/glass-home-dashboard/App.tsx +0 -8
  427. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/glass-home-dashboard/GlassHomeDashboard.tsx +0 -232
  428. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/glass-home-dashboard/index.tsx +0 -10
  429. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/glass-home-dashboard/page.config.ts +0 -14
  430. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/glass-home-dashboard/styles.css +0 -196
  431. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/interactive-workbench/App.tsx +0 -7
  432. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/interactive-workbench/WorkbenchPage.tsx +0 -36
  433. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/interactive-workbench/components/ConfigPanel.tsx +0 -34
  434. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/interactive-workbench/components/PreviewPanel.tsx +0 -17
  435. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/interactive-workbench/index.tsx +0 -10
  436. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/interactive-workbench/page.config.ts +0 -9
  437. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/interactive-workbench/reducer.ts +0 -29
  438. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/interactive-workbench/styles.css +0 -24
  439. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/mint-analytics-dashboard/App.tsx +0 -8
  440. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/mint-analytics-dashboard/MintAnalyticsDashboard.tsx +0 -279
  441. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/mint-analytics-dashboard/index.tsx +0 -10
  442. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/mint-analytics-dashboard/page.config.ts +0 -14
  443. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/mint-analytics-dashboard/styles.css +0 -163
  444. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/mobile-portal-shell/App.tsx +0 -7
  445. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/mobile-portal-shell/MobilePortalShell.tsx +0 -31
  446. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/mobile-portal-shell/index.tsx +0 -10
  447. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/mobile-portal-shell/modules/MobileHome.tsx +0 -13
  448. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/mobile-portal-shell/page.config.ts +0 -14
  449. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/mobile-portal-shell/routes.ts +0 -13
  450. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/mobile-portal-shell/styles.css +0 -11
  451. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/ops-monitor-dashboard/App.tsx +0 -8
  452. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/ops-monitor-dashboard/OpsMonitorDashboard.tsx +0 -306
  453. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/ops-monitor-dashboard/index.tsx +0 -10
  454. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/ops-monitor-dashboard/page.config.ts +0 -14
  455. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/ops-monitor-dashboard/styles.css +0 -248
  456. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/pc-portal-shell/App.tsx +0 -7
  457. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/pc-portal-shell/PcPortalShell.tsx +0 -35
  458. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/pc-portal-shell/components/PortalMetric.tsx +0 -11
  459. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/pc-portal-shell/index.tsx +0 -10
  460. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/pc-portal-shell/modules/HomeModule.tsx +0 -25
  461. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/pc-portal-shell/modules/TicketsModule.tsx +0 -14
  462. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/pc-portal-shell/page.config.ts +0 -14
  463. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/pc-portal-shell/routes.ts +0 -19
  464. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/pc-portal-shell/styles.css +0 -35
  465. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/service-ticket-ops/App.tsx +0 -7
  466. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/service-ticket-ops/TicketOpsPage.tsx +0 -105
  467. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/service-ticket-ops/components/TicketActionTimeline.tsx +0 -22
  468. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/service-ticket-ops/components/TicketDetailDrawer.tsx +0 -44
  469. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/service-ticket-ops/components/TicketTableActions.tsx +0 -57
  470. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/service-ticket-ops/index.tsx +0 -10
  471. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/service-ticket-ops/page.config.ts +0 -9
  472. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/service-ticket-ops/styles.css +0 -35
  473. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/work-order-list-drawer/App.tsx +0 -8
  474. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/work-order-list-drawer/WorkOrderListDrawerPage.tsx +0 -371
  475. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/work-order-list-drawer/index.tsx +0 -10
  476. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/work-order-list-drawer/page.config.ts +0 -14
  477. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/pages/work-order-list-drawer/styles.css +0 -182
  478. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/resources/automations/daily-ticket-digest/automation.json +0 -25
  479. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/resources/automations/daily-ticket-digest/trigger.json +0 -9
  480. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/resources/notifications/daily-ticket-digest.json +0 -24
  481. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/resources/permissions/form-groups/service-ticket-college.json +0 -21
  482. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/resources/permissions/roles.json +0 -17
  483. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/resources/workflows/expense-approval-workflow.json +0 -48
  484. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/shared/components/ConfirmAction.tsx +0 -22
  485. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/shared/components/QueryState.tsx +0 -37
  486. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/shared/components/StatusTag.tsx +0 -20
  487. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/shared/components/admin-ui-templates/DashboardPrimitives.tsx +0 -832
  488. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/shared/components/admin-ui-templates/chartOptions.ts +0 -140
  489. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/shared/components/admin-ui-templates/sampleData.ts +0 -466
  490. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/shared/components/admin-ui-templates/styles.css +0 -874
  491. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/shared/components/admin-ui-templates/types.ts +0 -150
  492. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/shared/hooks/useTicketOps.ts +0 -96
  493. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/shared/services/role-governance.ts +0 -48
  494. package/templates/sy-lowcode-app-workspace/examples/best-practices/src/shared/services/service-ticket.ts +0 -113
  495. package/templates/sy-lowcode-app-workspace/examples/forms/customer/page.tsx +0 -1
  496. package/templates/sy-lowcode-app-workspace/examples/forms/customer/schema.ts +0 -36
  497. package/templates/sy-lowcode-app-workspace/index.html +0 -12
  498. package/templates/sy-lowcode-app-workspace/package.json +0 -58
  499. package/templates/sy-lowcode-app-workspace/postcss.config.cjs +0 -9
  500. package/templates/sy-lowcode-app-workspace/scripts/build-js-code.mjs +0 -600
  501. package/templates/sy-lowcode-app-workspace/scripts/guard-publish.mjs +0 -29
  502. package/templates/sy-lowcode-app-workspace/src/dev/App.tsx +0 -820
  503. package/templates/sy-lowcode-app-workspace/src/forms/.gitkeep +0 -1
  504. package/templates/sy-lowcode-app-workspace/src/forms/README.md +0 -52
  505. package/templates/sy-lowcode-app-workspace/src/index.css +0 -26
  506. package/templates/sy-lowcode-app-workspace/src/js-code-nodes/.gitkeep +0 -1
  507. package/templates/sy-lowcode-app-workspace/src/js-code-nodes/types.d.ts +0 -3
  508. package/templates/sy-lowcode-app-workspace/src/main.tsx +0 -29
  509. package/templates/sy-lowcode-app-workspace/src/pages/.gitkeep +0 -1
  510. package/templates/sy-lowcode-app-workspace/src/runtime/builtin-overrides.tsx +0 -8
  511. package/templates/sy-lowcode-app-workspace/src/shared/form-schema.ts +0 -135
  512. package/templates/sy-lowcode-app-workspace/src/types/app-workspace.types.ts +0 -88
  513. package/templates/sy-lowcode-app-workspace/tailwind.config.cjs +0 -31
  514. package/templates/sy-lowcode-app-workspace/tsconfig.app.json +0 -40
  515. package/templates/sy-lowcode-app-workspace/tsconfig.examples.json +0 -24
  516. package/templates/sy-lowcode-app-workspace/tsconfig.js-code-nodes.json +0 -19
  517. package/templates/sy-lowcode-app-workspace/tsconfig.json +0 -7
  518. package/templates/sy-lowcode-app-workspace/tsconfig.node.json +0 -10
  519. package/templates/sy-lowcode-app-workspace/vite.config.ts +0 -85
  520. package/v2/README.md +0 -35
  521. package/v2/skills/manifest.json +0 -45
  522. package/v2/skills/openxiangda-v1-maintenance/SKILL.md +0 -21
  523. package/v2/skills/openxiangda-v1-maintenance/agents/openai.yaml +0 -4
  524. package/v2/skills/openxiangda-v2/SKILL.md +0 -38
  525. package/v2/skills/openxiangda-v2-architecture/SKILL.md +0 -29
  526. package/v2/skills/openxiangda-v2-architecture/agents/openai.yaml +0 -4
  527. package/v2/skills/openxiangda-v2-backend/SKILL.md +0 -28
  528. package/v2/skills/openxiangda-v2-backend/agents/openai.yaml +0 -4
  529. package/v2/skills/openxiangda-v2-data-authz/SKILL.md +0 -28
  530. package/v2/skills/openxiangda-v2-data-authz/agents/openai.yaml +0 -4
  531. package/v2/skills/openxiangda-v2-delivery/SKILL.md +0 -30
  532. package/v2/skills/openxiangda-v2-delivery/agents/openai.yaml +0 -4
  533. package/v2/skills/openxiangda-v2-frontend/SKILL.md +0 -21
  534. package/v2/skills/openxiangda-v2-frontend/agents/openai.yaml +0 -4
  535. package/v2/skills/openxiangda-v2-workflow-events/SKILL.md +0 -28
  536. package/v2/skills/openxiangda-v2-workflow-events/agents/openai.yaml +0 -4
  537. /package/{v2/skills → skills}/openxiangda-v2/agents/openai.yaml +0 -0
@@ -1,897 +0,0 @@
1
- /**
2
- * build-pages.mjs - 构建复杂代码页
3
- */
4
-
5
- import crypto from "node:crypto";
6
- import fsSync from "node:fs";
7
- import fs from "node:fs/promises";
8
- import { createRequire } from "node:module";
9
- import path from "node:path";
10
- import { fileURLToPath } from "node:url";
11
- import { gzipSync } from "node:zlib";
12
- import {
13
- cleanBuildCache,
14
- commitIncrementalBuild,
15
- normalizeOnly,
16
- planIncrementalBuild,
17
- printPlan,
18
- } from "./utils/incremental.mjs";
19
- import { createNamespaceCssPlugin } from "./utils/namespace-css.mjs";
20
- import { validateRuntimeCssFile } from "./utils/runtime-css-check.mjs";
21
- import {
22
- extractLargeDataUrlAssets,
23
- formatExtractedAssetSummary,
24
- } from "./utils/static-assets.mjs";
25
- import { warnShadcnTailwindTokens } from "./utils/tailwind-token-warnings.mjs";
26
- import { loadConfig } from "./utils/load-config.mjs";
27
- import {
28
- createWorkspaceStyleImport,
29
- listWorkspaceStyleEntryPaths,
30
- } from "./utils/workspace-style-entry.mjs";
31
-
32
- process.env.NODE_ENV = "production";
33
- process.env.BABEL_ENV = "production";
34
-
35
- const [{ default: react }, { build }] = await Promise.all([
36
- import("@vitejs/plugin-react"),
37
- import("vite"),
38
- ]);
39
-
40
- import { discoverPages, distRoot, rootDir, srcRoot } from "./utils/pages.mjs";
41
-
42
- const require = createRequire(import.meta.url);
43
- const tmpDir = path.join(rootDir, ".tmp");
44
- const runtimeDistDir = path.join(distRoot, "page-runtime");
45
- const runtimeVersionPlaceholder = "__SY_PAGE_RUNTIME_VERSION__";
46
- const runtimeCacheFileName = "build-cache.json";
47
- const portalContainerResolverGlobal = "__OPENXIANGDA_GET_PORTAL_CONTAINER__";
48
- let workspaceConfigPromise = null;
49
-
50
- const runtimePackages = [
51
- "react",
52
- "react-dom",
53
- "@ant-design/cssinjs",
54
- "antd",
55
- "antd-mobile",
56
- "@ant-design/icons",
57
- "openxiangda",
58
- ];
59
-
60
- const proxyModuleIds = new Map(
61
- [
62
- "react",
63
- "react/jsx-runtime",
64
- "react-dom/client",
65
- "@ant-design/cssinjs",
66
- "antd",
67
- "antd/locale/zh_CN",
68
- "@ant-design/icons",
69
- "openxiangda",
70
- "openxiangda/runtime",
71
- ].map((id) => [id, `\0sy-page-runtime-proxy:${id}`]),
72
- );
73
-
74
- const staticProxyExports = {
75
- "openxiangda/runtime": [
76
- "createPageSdk",
77
- "createReactPage",
78
- "PageProvider",
79
- "useCurrentUser",
80
- "useDataSource",
81
- "useFormViewPermissions",
82
- "useMessage",
83
- "useModal",
84
- "useNavigation",
85
- "usePageContext",
86
- "usePageProps",
87
- "usePageRoute",
88
- "usePageSdk",
89
- ],
90
- "react/jsx-runtime": ["Fragment", "jsx", "jsxs"],
91
- "react-dom/client": ["createRoot", "hydrateRoot"],
92
- "@ant-design/cssinjs": ["StyleProvider", "createCache", "extractStyle"],
93
- "antd/locale/zh_CN": [],
94
- };
95
-
96
- const exportNameCache = new Map();
97
-
98
- function formatBytes(bytes) {
99
- if (!Number.isFinite(bytes)) return "-";
100
- if (bytes < 1024) return `${bytes} B`;
101
- if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(2)} KB`;
102
- return `${(bytes / 1024 / 1024).toFixed(2)} MB`;
103
- }
104
-
105
- function formatDuration(startTime) {
106
- return `${((Date.now() - startTime) / 1000).toFixed(2)}s`;
107
- }
108
-
109
- function fileSizeLabel(filePath) {
110
- if (!fsSync.existsSync(filePath)) return "未生成";
111
- return formatBytes(fsSync.statSync(filePath).size);
112
- }
113
-
114
- function fileGzipSizeLabel(filePath) {
115
- if (!fsSync.existsSync(filePath)) return "未生成";
116
- return formatBytes(gzipSync(fsSync.readFileSync(filePath)).length);
117
- }
118
-
119
- function readTextIfExists(filePath) {
120
- if (!fsSync.existsSync(filePath)) return "";
121
- return fsSync.readFileSync(filePath, "utf-8");
122
- }
123
-
124
- function normalizeCssIsolation(value) {
125
- if (value === "namespace" || value === "shadow") return value;
126
- return "none";
127
- }
128
-
129
- function usesNamespaceCss(cssIsolation) {
130
- return cssIsolation === "namespace" || cssIsolation === "shadow";
131
- }
132
-
133
- function getWorkspaceConfig() {
134
- if (!workspaceConfigPromise) workspaceConfigPromise = loadConfig();
135
- return workspaceConfigPromise;
136
- }
137
-
138
- function readPackageVersion(packageName) {
139
- try {
140
- let current = path.dirname(require.resolve(packageName));
141
- while (current && current !== path.dirname(current)) {
142
- const packageJsonPath = path.join(current, "package.json");
143
- if (fsSync.existsSync(packageJsonPath)) {
144
- return (
145
- JSON.parse(fsSync.readFileSync(packageJsonPath, "utf-8")).version ||
146
- "unknown"
147
- );
148
- }
149
- current = path.dirname(current);
150
- }
151
- return "unknown";
152
- } catch {
153
- return "missing";
154
- }
155
- }
156
-
157
- /**
158
- * @param {string[]} argv - 命令行参数数组
159
- * @returns {{ page: string, runtimeCache: boolean, help: boolean }}
160
- */
161
- function parseArgs(argv) {
162
- const result = {
163
- page: "",
164
- force: false,
165
- only: "",
166
- dryRun: false,
167
- cleanCache: false,
168
- runtimeCache: process.env.APP_RUNTIME_CACHE !== "false",
169
- help: false,
170
- };
171
- for (let index = 0; index < argv.length; index += 1) {
172
- const arg = argv[index];
173
- if (arg === "--help" || arg === "-h") {
174
- result.help = true;
175
- continue;
176
- }
177
- if (arg === "--page" && argv[index + 1]) {
178
- result.page = argv[index + 1];
179
- index += 1;
180
- continue;
181
- }
182
- if (arg === "--only" && argv[index + 1]) {
183
- result.only = argv[index + 1];
184
- index += 1;
185
- continue;
186
- }
187
- if (arg.startsWith("--only=")) {
188
- result.only = arg.slice("--only=".length);
189
- continue;
190
- }
191
- if (arg === "--force") {
192
- result.force = true;
193
- continue;
194
- }
195
- if (arg === "--dry-run") {
196
- result.dryRun = true;
197
- continue;
198
- }
199
- if (arg === "--clean-cache") {
200
- result.cleanCache = true;
201
- continue;
202
- }
203
- if (arg === `--${["bundle", "mode"].join("-")}`) {
204
- throw new Error("runtime mode flag has been removed");
205
- }
206
- if (arg === "--no-runtime-cache") {
207
- result.runtimeCache = false;
208
- }
209
- }
210
- return result;
211
- }
212
-
213
- function printHelp() {
214
- console.log(`
215
- build-pages - 构建复杂代码页
216
-
217
- 用法:
218
- tsx scripts/build-pages.mjs [options]
219
-
220
- 选项:
221
- --page <name> 只构建指定页面目录
222
- --only <list> 只构建指定模块,如 forms/customer,pages/dashboard
223
- --force 忽略增量缓存,强制重建页面产物
224
- --dry-run 只打印增量计划,不构建
225
- --clean-cache 删除 .openxiangda/build-cache.json
226
- --no-runtime-cache 强制重建共享 runtime
227
- --help, -h 显示帮助信息
228
- `);
229
- }
230
-
231
- function createRuntimeInputHash(runtimeEntryContent, cssIsolation) {
232
- const hash = crypto.createHash("sha256");
233
- const packageVersions = runtimePackages.reduce((result, packageName) => {
234
- result[packageName] = readPackageVersion(packageName);
235
- return result;
236
- }, {});
237
- const configFiles = [
238
- ...listWorkspaceStyleEntryPaths(rootDir),
239
- path.join(rootDir, "app-workspace.config.ts"),
240
- path.join(rootDir, "tailwind.config.cjs"),
241
- path.join(rootDir, "postcss.config.cjs"),
242
- fileURLToPath(import.meta.url),
243
- ];
244
-
245
- hash.update("sy-page-runtime-v1-input");
246
- hash.update(runtimeEntryContent);
247
- hash.update(normalizeCssIsolation(cssIsolation));
248
- hash.update(JSON.stringify(packageVersions));
249
- configFiles.forEach((filePath) => {
250
- hash.update(filePath);
251
- hash.update(readTextIfExists(filePath));
252
- });
253
- return hash.digest("hex");
254
- }
255
-
256
- function createRuntimeEntryContent() {
257
- const workspaceStyleImport = createWorkspaceStyleImport(rootDir, tmpDir);
258
- return `import * as ReactModule from 'react';
259
- import * as ReactJsxRuntimeModule from 'react/jsx-runtime';
260
- import * as ReactDomClientModule from 'react-dom/client';
261
- import * as CssInJsModule from '@ant-design/cssinjs';
262
- import * as AntdModule from 'antd';
263
- import zhCN from 'antd/locale/zh_CN';
264
- import * as IconsModule from '@ant-design/icons';
265
- import * as OpenXiangdaModule from 'openxiangda';
266
- import * as OpenXiangdaRuntimeModule from 'openxiangda/runtime';
267
- import '${workspaceStyleImport}';
268
-
269
- const runtimeVersion = '${runtimeVersionPlaceholder}';
270
-
271
- const withDefault = (moduleValue, defaultValue) => ({
272
- ...moduleValue,
273
- default: defaultValue ?? moduleValue.default ?? moduleValue,
274
- });
275
-
276
- export const pageRuntime = {
277
- protocol: 'sy-page-runtime',
278
- majorVersion: 1,
279
- version: runtimeVersion,
280
- modules: {
281
- react: withDefault(ReactModule, ReactModule.default || ReactModule),
282
- 'react/jsx-runtime': ReactJsxRuntimeModule,
283
- 'react-dom/client': ReactDomClientModule,
284
- '@ant-design/cssinjs': CssInJsModule,
285
- antd: withDefault(AntdModule, null),
286
- 'antd/locale/zh_CN': { default: zhCN },
287
- '@ant-design/icons': IconsModule,
288
- openxiangda: OpenXiangdaModule,
289
- 'openxiangda/runtime': OpenXiangdaRuntimeModule,
290
- },
291
- };
292
-
293
- globalThis.SY_PAGE_RUNTIME_V1 = pageRuntime;
294
-
295
- export default pageRuntime;
296
- `;
297
- }
298
-
299
- function readRuntimeManifest() {
300
- const manifestPath = path.join(runtimeDistDir, "manifest.json");
301
- if (!fsSync.existsSync(manifestPath)) return null;
302
- try {
303
- return JSON.parse(fsSync.readFileSync(manifestPath, "utf-8"));
304
- } catch {
305
- return null;
306
- }
307
- }
308
-
309
- function readRuntimeBuildCache() {
310
- const cachePath = path.join(runtimeDistDir, runtimeCacheFileName);
311
- if (!fsSync.existsSync(cachePath)) return null;
312
- try {
313
- return JSON.parse(fsSync.readFileSync(cachePath, "utf-8"));
314
- } catch {
315
- return null;
316
- }
317
- }
318
-
319
- function isRuntimeCacheValid(inputHash) {
320
- const manifest = readRuntimeManifest();
321
- const cache = readRuntimeBuildCache();
322
- if (
323
- !manifest ||
324
- manifest.protocol !== "sy-page-runtime" ||
325
- manifest.majorVersion !== 1 ||
326
- !manifest.version ||
327
- !manifest.files?.entry ||
328
- !cache ||
329
- cache.inputHash !== inputHash ||
330
- cache.runtimeVersion !== manifest.version
331
- ) {
332
- return false;
333
- }
334
- const runtimeJsPath = path.join(runtimeDistDir, manifest.files.entry);
335
- if (!fsSync.existsSync(runtimeJsPath)) return false;
336
- if (
337
- manifest.files.css &&
338
- !fsSync.existsSync(path.join(runtimeDistDir, manifest.files.css))
339
- ) {
340
- return false;
341
- }
342
- try {
343
- validateRuntimeCssFile(
344
- path.join(runtimeDistDir, manifest.files.css || "style.css"),
345
- {
346
- label: "代码页共享 runtime",
347
- },
348
- );
349
- } catch {
350
- return false;
351
- }
352
- return true;
353
- }
354
-
355
- async function createCssOptions(cssIsolation = "none") {
356
- const tailwindcssModule = await import("tailwindcss");
357
- const autoprefixerModule = await import("autoprefixer");
358
- const tailwindcss = tailwindcssModule.default ?? tailwindcssModule;
359
- const autoprefixer = autoprefixerModule.default ?? autoprefixerModule;
360
- const plugins = [
361
- tailwindcss({ config: path.join(rootDir, "tailwind.config.cjs") }),
362
- ];
363
- if (usesNamespaceCss(normalizeCssIsolation(cssIsolation))) {
364
- plugins.push(createNamespaceCssPlugin());
365
- }
366
- plugins.push(autoprefixer());
367
- return {
368
- postcss: {
369
- plugins,
370
- },
371
- };
372
- }
373
-
374
- function createAntdMobilePortalPatchPlugin() {
375
- const resolverExpression = `globalThis.${portalContainerResolverGlobal}?.() || document.body`;
376
- return {
377
- name: "openxiangda-antd-mobile-portal-container",
378
- transform(code, id) {
379
- if (!id.includes("/antd-mobile/") && !id.includes("\\\\antd-mobile\\\\")) {
380
- return null;
381
- }
382
- const nextCode = code.replace(
383
- /getContainer:\s*\(\)\s*=>\s*document\.body/g,
384
- `getContainer: () => ${resolverExpression}`,
385
- );
386
- if (nextCode === code) return null;
387
- return { code: nextCode, map: null };
388
- },
389
- };
390
- }
391
-
392
- function createResolveAlias() {
393
- return [
394
- {
395
- find: "@",
396
- replacement: srcRoot,
397
- },
398
- ];
399
- }
400
-
401
- async function buildSharedRuntime(options = {}) {
402
- const startedAt = Date.now();
403
- const entryContent = createRuntimeEntryContent();
404
- const config = await getWorkspaceConfig();
405
- const cssIsolation = normalizeCssIsolation(config.defaults?.cssIsolation);
406
- const inputHash = createRuntimeInputHash(entryContent, cssIsolation);
407
- if (options.runtimeCache !== false && isRuntimeCacheValid(inputHash)) {
408
- const manifest = readRuntimeManifest();
409
- console.log(`[build] 代码页共享 runtime 缓存命中: ${manifest.version}`);
410
- return;
411
- }
412
-
413
- const entryPath = path.join(tmpDir, "page-runtime-entry.jsx");
414
- await fs.writeFile(entryPath, entryContent, "utf8");
415
-
416
- try {
417
- const cssOptions = await createCssOptions(cssIsolation);
418
- console.log("[build] 构建代码页共享 runtime");
419
- await build({
420
- configFile: false,
421
- root: rootDir,
422
- publicDir: false,
423
- css: cssOptions,
424
- define: {
425
- "process.env.NODE_ENV": JSON.stringify("production"),
426
- "process.env": JSON.stringify({ NODE_ENV: "production" }),
427
- },
428
- plugins: [createAntdMobilePortalPatchPlugin(), react()],
429
- resolve: {
430
- alias: createResolveAlias(),
431
- dedupe: ["react", "react-dom", "antd", "@ant-design/cssinjs"],
432
- },
433
- build: {
434
- target: "es2018",
435
- assetsInlineLimit: 0,
436
- cssCodeSplit: false,
437
- emptyOutDir: true,
438
- minify: true,
439
- outDir: runtimeDistDir,
440
- lib: {
441
- entry: entryPath,
442
- formats: ["es"],
443
- fileName: () => "runtime.js",
444
- },
445
- rollupOptions: {
446
- output: {
447
- inlineDynamicImports: true,
448
- entryFileNames: "runtime.js",
449
- chunkFileNames: "runtime.js",
450
- assetFileNames: (assetInfo) => {
451
- if (String(assetInfo.name || "").endsWith(".css")) {
452
- return "style.css";
453
- }
454
- return "assets/[name]-[hash][extname]";
455
- },
456
- },
457
- },
458
- },
459
- logLevel: "warn",
460
- });
461
-
462
- const runtimeJsPath = path.join(runtimeDistDir, "runtime.js");
463
- const runtimeCssPath = path.join(runtimeDistDir, "style.css");
464
- const extractedAssets = extractLargeDataUrlAssets({
465
- outDir: runtimeDistDir,
466
- files: [runtimeJsPath, runtimeCssPath],
467
- });
468
- const extractedSummary = formatExtractedAssetSummary(extractedAssets);
469
- if (extractedSummary) console.log(`[build] ${extractedSummary}`);
470
- validateRuntimeCssFile(runtimeCssPath, { label: "代码页共享 runtime" });
471
- const runtimeJs = fsSync.readFileSync(runtimeJsPath);
472
- const runtimeCss = fsSync.existsSync(runtimeCssPath)
473
- ? fsSync.readFileSync(runtimeCssPath)
474
- : Buffer.alloc(0);
475
- const hash = crypto
476
- .createHash("sha256")
477
- .update(runtimeJs)
478
- .update(runtimeCss)
479
- .digest("hex")
480
- .slice(0, 12);
481
- const runtimeVersion = `v1-${hash}`;
482
- await fs.writeFile(
483
- runtimeJsPath,
484
- runtimeJs
485
- .toString("utf-8")
486
- .split(runtimeVersionPlaceholder)
487
- .join(runtimeVersion),
488
- "utf8",
489
- );
490
- const manifest = {
491
- protocol: "sy-page-runtime",
492
- majorVersion: 1,
493
- version: runtimeVersion,
494
- inputHash,
495
- files: {
496
- entry: "runtime.js",
497
- css: fsSync.existsSync(runtimeCssPath) ? "style.css" : null,
498
- },
499
- sizes: {
500
- entry: fsSync.statSync(runtimeJsPath).size,
501
- entryGzip: gzipSync(fsSync.readFileSync(runtimeJsPath)).length,
502
- css: fsSync.existsSync(runtimeCssPath)
503
- ? fsSync.statSync(runtimeCssPath).size
504
- : 0,
505
- cssGzip: fsSync.existsSync(runtimeCssPath)
506
- ? gzipSync(fsSync.readFileSync(runtimeCssPath)).length
507
- : 0,
508
- },
509
- builtAt: new Date().toISOString(),
510
- };
511
- await fs.writeFile(
512
- path.join(runtimeDistDir, "manifest.json"),
513
- JSON.stringify(manifest, null, 2),
514
- "utf8",
515
- );
516
- await fs.writeFile(
517
- path.join(runtimeDistDir, runtimeCacheFileName),
518
- JSON.stringify(
519
- {
520
- inputHash,
521
- runtimeVersion,
522
- updatedAt: new Date().toISOString(),
523
- },
524
- null,
525
- 2,
526
- ),
527
- "utf8",
528
- );
529
- console.log(
530
- `[build] 代码页共享 runtime 构建完成,用时 ${formatDuration(startedAt)}`,
531
- );
532
- console.log(
533
- `[build] runtime.js: ${fileSizeLabel(runtimeJsPath)} / gzip ${fileGzipSizeLabel(runtimeJsPath)}`,
534
- );
535
- console.log(
536
- `[build] style.css: ${fileSizeLabel(runtimeCssPath)} / gzip ${fileGzipSizeLabel(runtimeCssPath)}`,
537
- );
538
- } finally {
539
- await fs.rm(entryPath, { force: true });
540
- }
541
- }
542
-
543
- function isValidExportName(name) {
544
- return /^[A-Za-z_$][\w$]*$/.test(name) && name !== "default";
545
- }
546
-
547
- async function getProxyExportNames(source) {
548
- if (exportNameCache.has(source)) return exportNameCache.get(source);
549
- if (staticProxyExports[source]) {
550
- exportNameCache.set(source, staticProxyExports[source]);
551
- return staticProxyExports[source];
552
- }
553
- if (source === "openxiangda") {
554
- const parsed = readPackageTypeExports(source);
555
- const runtimeExports = await readRuntimeModuleExports(source).catch(() => []);
556
- const names = Array.from(new Set([...parsed, ...runtimeExports]));
557
- exportNameCache.set(source, names);
558
- return names;
559
- }
560
- if (source === "@ant-design/icons") {
561
- const names = await readRuntimeModuleExports(source);
562
- exportNameCache.set(source, names);
563
- return names;
564
- }
565
- try {
566
- const names = await readRuntimeModuleExports(source);
567
- exportNameCache.set(source, names);
568
- return names;
569
- } catch {
570
- exportNameCache.set(source, []);
571
- return [];
572
- }
573
- }
574
-
575
- async function readRuntimeModuleExports(source) {
576
- const moduleValue = await import(source);
577
- return Object.keys(moduleValue).filter(isValidExportName);
578
- }
579
-
580
- function readPackageTypeExports(source) {
581
- try {
582
- const entryPath = resolvePackageEntry(source);
583
- if (!entryPath) return [];
584
- let currentDir = path.dirname(entryPath);
585
- let packageJsonPath = "";
586
- while (currentDir && currentDir !== path.dirname(currentDir)) {
587
- const candidate = path.join(currentDir, "package.json");
588
- if (fsSync.existsSync(candidate)) {
589
- packageJsonPath = candidate;
590
- break;
591
- }
592
- currentDir = path.dirname(currentDir);
593
- }
594
- if (!packageJsonPath) return [];
595
- const packageJson = JSON.parse(
596
- fsSync.readFileSync(packageJsonPath, "utf-8"),
597
- );
598
- const typesPath = packageJson.types || packageJson.typings;
599
- if (!typesPath) return [];
600
- const dtsPath = path.resolve(path.dirname(packageJsonPath), typesPath);
601
- const content = fsSync.readFileSync(dtsPath, "utf-8");
602
- const names = new Set();
603
- for (const match of content.matchAll(
604
- /export\s+(?:declare\s+)?(?:const|function|class)\s+([A-Za-z_$][\w$]*)/g,
605
- )) {
606
- names.add(match[1]);
607
- }
608
- for (const match of content.matchAll(/export\s*\{([^}]+)\}/g)) {
609
- match[1]
610
- .split(",")
611
- .map((item) =>
612
- item
613
- .trim()
614
- .split(/\s+as\s+/)
615
- .pop()
616
- ?.trim(),
617
- )
618
- .filter((item) => item && isValidExportName(item))
619
- .forEach((item) => names.add(item));
620
- }
621
- return Array.from(names);
622
- } catch {
623
- return [];
624
- }
625
- }
626
-
627
- function resolvePackageEntry(source) {
628
- const attempts = [
629
- () => require.resolve(source),
630
- () => require.resolve(source, { paths: [rootDir] }),
631
- ];
632
- for (const attempt of attempts) {
633
- try {
634
- return attempt();
635
- } catch {
636
- // Try the next resolution root.
637
- }
638
- }
639
- return "";
640
- }
641
-
642
- async function createProxyModuleCode(source) {
643
- const exportNames = await getProxyExportNames(source);
644
- const globalKey = JSON.stringify(source);
645
- const namedExports = exportNames
646
- .map(
647
- (name) => `export const ${name} = moduleValue[${JSON.stringify(name)}];`,
648
- )
649
- .join("\n");
650
- const defaultExport =
651
- source === "antd/locale/zh_CN"
652
- ? "export default moduleValue.default;"
653
- : `export default (moduleValue.default ?? moduleValue);`;
654
-
655
- return `const runtime = globalThis.SY_PAGE_RUNTIME_V1;
656
- if (!runtime || runtime.protocol !== 'sy-page-runtime' || runtime.majorVersion !== 1) {
657
- throw new Error('代码页共享运行时未加载或版本不兼容');
658
- }
659
- const moduleValue = runtime.modules[${globalKey}];
660
- if (!moduleValue) {
661
- throw new Error('代码页共享运行时缺少模块: ${source}');
662
- }
663
- ${namedExports}
664
- ${defaultExport}
665
- `;
666
- }
667
-
668
- function createSharedRuntimeProxyPlugin() {
669
- return {
670
- name: "sy-page-runtime-proxy",
671
- enforce: "pre",
672
- resolveId(source) {
673
- return proxyModuleIds.get(source) || null;
674
- },
675
- async load(id) {
676
- const source = Array.from(proxyModuleIds.entries()).find(
677
- ([, proxyId]) => proxyId === id,
678
- )?.[0];
679
- if (!source) return null;
680
- return createProxyModuleCode(source);
681
- },
682
- transform(code, id) {
683
- if (!id.includes(`${path.sep}src${path.sep}pages${path.sep}`))
684
- return null;
685
- if (!/\.[cm]?[jt]sx?$/.test(id)) return null;
686
- return code.replace(
687
- /^\s*import\s+["'](?:\.\.\/\.\.\/index\.css|\.\.\/index\.css)["'];?\s*$/gm,
688
- "",
689
- );
690
- },
691
- };
692
- }
693
-
694
- /**
695
- * 确保构建产物的文件名与预期一致,必要时重命名
696
- * @param {string} targetDir - 目标目录
697
- * @param {string} expectedName - 期望的文件名
698
- * @param {string} extension - 文件扩展名
699
- * @returns {Promise<string|null>}
700
- */
701
- async function ensureFileName(targetDir, expectedName, extension) {
702
- const files = await fs.readdir(targetDir);
703
- const matchingFile = files.find((fileName) => fileName.endsWith(extension));
704
- if (!matchingFile) return null;
705
- if (matchingFile === expectedName) return path.join(targetDir, matchingFile);
706
- const sourcePath = path.join(targetDir, matchingFile);
707
- const targetPath = path.join(targetDir, expectedName);
708
- await fs.rename(sourcePath, targetPath);
709
- return targetPath;
710
- }
711
-
712
- /**
713
- * 构建单个代码页的 Vite bundle
714
- * @param {{ config: { code: string }, entryPath: string }} page - 页面信息
715
- * @returns {Promise<void>}
716
- */
717
- async function buildPage(page) {
718
- const startedAt = Date.now();
719
- console.log(`📦 构建代码页: ${page.config.code} (shared runtime)`);
720
- const outDir = path.join(distRoot, "pages", page.config.code);
721
- await fs.mkdir(outDir, { recursive: true });
722
-
723
- const config = await getWorkspaceConfig();
724
- const cssIsolation = normalizeCssIsolation(
725
- page.config.cssIsolation || config.defaults?.cssIsolation,
726
- );
727
- const cssOptions = await createCssOptions(cssIsolation);
728
- await build({
729
- configFile: false,
730
- mode: "production",
731
- root: rootDir,
732
- publicDir: false,
733
- css: cssOptions,
734
- define: {
735
- "process.env.NODE_ENV": JSON.stringify("production"),
736
- "process.env": JSON.stringify({ NODE_ENV: "production" }),
737
- },
738
- plugins: [
739
- createAntdMobilePortalPatchPlugin(),
740
- createSharedRuntimeProxyPlugin(),
741
- react(),
742
- ],
743
- resolve: {
744
- alias: createResolveAlias(),
745
- dedupe: ["react", "react-dom", "antd", "@ant-design/cssinjs"],
746
- },
747
- build: {
748
- target: "es2018",
749
- assetsInlineLimit: 0,
750
- cssCodeSplit: false,
751
- emptyOutDir: true,
752
- minify: true,
753
- outDir,
754
- lib: {
755
- entry: page.entryPath,
756
- formats: ["es"],
757
- fileName: () => "index",
758
- },
759
- rollupOptions: {
760
- output: {
761
- inlineDynamicImports: true,
762
- entryFileNames: "index.js",
763
- chunkFileNames: "index.js",
764
- assetFileNames: (assetInfo) => {
765
- if (String(assetInfo.name || "").endsWith(".css")) {
766
- return "style.css";
767
- }
768
- return "assets/[name]-[hash][extname]";
769
- },
770
- },
771
- },
772
- },
773
- logLevel: "warn",
774
- });
775
-
776
- const jsPath = await ensureFileName(outDir, "index.js", ".js");
777
- if (!jsPath) throw new Error(`页面 ${page.config.code} 未生成 index.js`);
778
- const cssPath = await ensureFileName(outDir, "style.css", ".css");
779
- if (!cssPath) await fs.writeFile(path.join(outDir, "style.css"), "", "utf8");
780
- const finalCssPath = path.join(outDir, "style.css");
781
- const extractedAssets = extractLargeDataUrlAssets({
782
- outDir,
783
- files: [jsPath, finalCssPath],
784
- });
785
- const extractedSummary = formatExtractedAssetSummary(extractedAssets);
786
- if (extractedSummary) console.log(`[build] ${extractedSummary}`);
787
-
788
- const outputCode = await fs.readFile(jsPath, "utf8");
789
- const bareImportMatch = outputCode.match(
790
- /\bfrom\s*["'](?:react|react-dom|react\/jsx-runtime|antd|@ant-design\/cssinjs|@ant-design\/icons|openxiangda(?:\/runtime)?)["']/,
791
- );
792
- if (bareImportMatch) {
793
- throw new Error(
794
- `构建产物仍包含浏览器无法直接加载的裸模块导入: ${bareImportMatch[0]}`,
795
- );
796
- }
797
- if (/\bprocess\.env\b/.test(outputCode)) {
798
- throw new Error("构建产物仍包含浏览器不存在的 process.env 引用");
799
- }
800
- if (/\bjsxDEV\b|react\/jsx-dev-runtime/.test(outputCode)) {
801
- throw new Error(
802
- "构建产物包含开发态 JSX runtime(jsxDEV/react/jsx-dev-runtime),请使用生产模式重新构建",
803
- );
804
- }
805
- console.log(
806
- `[build] 代码页 ${page.config.code} 构建完成,用时 ${formatDuration(startedAt)}`,
807
- );
808
- console.log(
809
- `[build] index.js: ${fileSizeLabel(jsPath)} / gzip ${fileGzipSizeLabel(jsPath)}`,
810
- );
811
- }
812
-
813
- async function main() {
814
- const args = parseArgs(process.argv.slice(2));
815
- if (args.help) {
816
- printHelp();
817
- process.exit(0);
818
- }
819
- if (args.cleanCache) {
820
- cleanBuildCache();
821
- console.log("[build] 已删除 .openxiangda/build-cache.json");
822
- return;
823
- }
824
-
825
- const onlyTargets = normalizeOnly(args.only);
826
- const only = onlyTargets.filter((item) => item.startsWith("pages/"));
827
- if (onlyTargets.length > 0 && only.length === 0) {
828
- console.log("[build] pages: No page targets selected");
829
- return;
830
- }
831
- const requested = args.page ? [`pages/${args.page}`] : only;
832
- const pages = (await discoverPages("")).map((page) => ({
833
- ...page,
834
- key: `pages/${page.dirName}`,
835
- dirPath: page.dirPath,
836
- }));
837
- if (pages.length === 0) {
838
- if (args.page) {
839
- throw new Error(`找不到代码页 "${args.page}"`);
840
- }
841
- console.log("未发现复杂代码页,跳过 pages 构建");
842
- return;
843
- }
844
- const pageKeys = new Set(pages.map((page) => page.key));
845
- const missing = requested.filter((key) => !pageKeys.has(key));
846
- if (missing.length > 0) {
847
- throw new Error(
848
- `找不到代码页 ${missing.map((key) => `"${key.slice("pages/".length)}"`).join(", ")}`,
849
- );
850
- }
851
-
852
- const plan = planIncrementalBuild(pages, {
853
- force: args.force,
854
- only: requested.length ? requested : undefined,
855
- });
856
- printPlan(plan, "pages");
857
- if (args.dryRun) return;
858
- if (plan.changed.length === 0) return;
859
- warnShadcnTailwindTokens(rootDir);
860
-
861
- if (plan.fullRebuild && requested.length === 0) {
862
- await fs.rm(path.join(distRoot, "pages"), { recursive: true, force: true });
863
- }
864
- await fs.mkdir(tmpDir, { recursive: true });
865
-
866
- await buildSharedRuntime({ runtimeCache: args.runtimeCache });
867
- console.log("");
868
-
869
- let succeeded = 0;
870
- let failed = 0;
871
- const built = [];
872
- for (const page of plan.changed) {
873
- try {
874
- await buildPage(page);
875
- succeeded += 1;
876
- built.push(page);
877
- } catch (error) {
878
- failed += 1;
879
- console.error(` ❌ 构建失败: ${error.stack || error.message}`);
880
- }
881
- }
882
-
883
- try {
884
- const remaining = await fs.readdir(tmpDir);
885
- if (remaining.length === 0) {
886
- await fs.rmdir(tmpDir);
887
- }
888
- } catch {
889
- // ignore
890
- }
891
-
892
- console.log(`完成: ${succeeded} 成功, ${failed} 失败`);
893
- if (failed > 0) process.exit(1);
894
- commitIncrementalBuild(plan, built);
895
- }
896
-
897
- await main();