cardbuddy 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +211 -0
- package/dist/cli.js +76 -0
- package/dist/config.js +63 -0
- package/dist/core.js +2 -0
- package/dist/preview-editor/assets/apple-touch-icon-BQcES9QK.png +0 -0
- package/dist/preview-editor/assets/default-image-wzZYQ86K.png +0 -0
- package/dist/preview-editor/assets/favicon-16-Cg6Nrosk.png +0 -0
- package/dist/preview-editor/assets/favicon-32-B_1744sp.png +0 -0
- package/dist/preview-editor/assets/index-BYB0hngG.js +72 -0
- package/dist/preview-editor/assets/index-CpBZEQDy.css +1 -0
- package/dist/preview-editor/assets/site-icon-CFMif8z4.png +0 -0
- package/dist/preview-editor/assets/svg-symbols-B2exBrAr.svg +118 -0
- package/dist/preview-editor/index.html +17 -0
- package/dist/server-core/_vendor/finmall-env.mjs +96 -0
- package/dist/server-core/assetProxy.js +154 -0
- package/dist/server-core/bbox.js +153 -0
- package/dist/server-core/browser.js +108 -0
- package/dist/server-core/buildDataFromSchema.js +50 -0
- package/dist/server-core/cardFiles.js +188 -0
- package/dist/server-core/cardHistory.js +156 -0
- package/dist/server-core/cardImage.js +85 -0
- package/dist/server-core/cardImportMeta.js +139 -0
- package/dist/server-core/cardListCache.js +68 -0
- package/dist/server-core/cardOpenFolder.js +135 -0
- package/dist/server-core/cardSave.js +127 -0
- package/dist/server-core/cardSidecar.js +72 -0
- package/dist/server-core/cardSync.js +259 -0
- package/dist/server-core/cardValidate.js +134 -0
- package/dist/server-core/index.js +82 -0
- package/dist/server-core/logger.js +241 -0
- package/dist/server-core/nodeModels.js +52 -0
- package/dist/server-core/renderStatus.js +207 -0
- package/dist/server-core/screenshot.js +123 -0
- package/dist/server-core/sliceStatic.js +44 -0
- package/dist/standalone.js +447 -0
- package/dist/vendored/App.vue +2330 -0
- package/dist/vendored/api.js +142 -0
- package/dist/vendored/assets/apple-touch-icon.png +0 -0
- package/dist/vendored/assets/default-image.png +0 -0
- package/dist/vendored/assets/favicon-16.png +0 -0
- package/dist/vendored/assets/favicon-32.png +0 -0
- package/dist/vendored/assets/logo.png +0 -0
- package/dist/vendored/assets/site-icon.png +0 -0
- package/dist/vendored/assets/svg-symbols.svg +118 -0
- package/dist/vendored/assets/svgIcons/icons.svg +54 -0
- package/dist/vendored/assets/svgIcons/index.js +39 -0
- package/dist/vendored/components/AbsoluteLayout.vue +42 -0
- package/dist/vendored/components/AlertCardInstance.vue +58 -0
- package/dist/vendored/components/AlertCardLayer.vue +59 -0
- package/dist/vendored/components/ApiPayloadTree.vue +168 -0
- package/dist/vendored/components/AppToast.vue +37 -0
- package/dist/vendored/components/Button.vue +37 -0
- package/dist/vendored/components/Canvas.vue +65 -0
- package/dist/vendored/components/CardGallery.vue +243 -0
- package/dist/vendored/components/CardPreview.vue +72 -0
- package/dist/vendored/components/CardSelect.vue +200 -0
- package/dist/vendored/components/CheckGroup.vue +131 -0
- package/dist/vendored/components/Column.vue +25 -0
- package/dist/vendored/components/ComponentPalette.vue +294 -0
- package/dist/vendored/components/ConfirmDialog.vue +39 -0
- package/dist/vendored/components/CustomPlaceholder.vue +33 -0
- package/dist/vendored/components/DatePickerOverlay.vue +345 -0
- package/dist/vendored/components/DebugPanel.vue +806 -0
- package/dist/vendored/components/DeviceOverlay.vue +70 -0
- package/dist/vendored/components/Divider.vue +22 -0
- package/dist/vendored/components/Dropdown.vue +191 -0
- package/dist/vendored/components/EventEditor.vue +247 -0
- package/dist/vendored/components/GridLayout.vue +67 -0
- package/dist/vendored/components/HoverGuides.vue +122 -0
- package/dist/vendored/components/Icon.vue +34 -0
- package/dist/vendored/components/Image.vue +34 -0
- package/dist/vendored/components/Input.vue +90 -0
- package/dist/vendored/components/JsonTree.vue +516 -0
- package/dist/vendored/components/ListLayout.vue +68 -0
- package/dist/vendored/components/LogValue.vue +51 -0
- package/dist/vendored/components/Map.vue +110 -0
- package/dist/vendored/components/MultiColumn.vue +49 -0
- package/dist/vendored/components/MultiText.vue +58 -0
- package/dist/vendored/components/NodeInspector.vue +295 -0
- package/dist/vendored/components/PickerOverlay.vue +131 -0
- package/dist/vendored/components/ProgressSlider.vue +167 -0
- package/dist/vendored/components/PropControl.vue +241 -0
- package/dist/vendored/components/PropTree.vue +128 -0
- package/dist/vendored/components/RadioButton.vue +74 -0
- package/dist/vendored/components/RemotePreview.vue +171 -0
- package/dist/vendored/components/RenderTree.vue +437 -0
- package/dist/vendored/components/Root.vue +30 -0
- package/dist/vendored/components/Row.vue +25 -0
- package/dist/vendored/components/SelectionOverlay.vue +105 -0
- package/dist/vendored/components/StructureTree.vue +949 -0
- package/dist/vendored/components/SvgCode.vue +19 -0
- package/dist/vendored/components/SvgSymbols.vue +30 -0
- package/dist/vendored/components/Switch.vue +38 -0
- package/dist/vendored/components/Text.vue +32 -0
- package/dist/vendored/components/Video.vue +70 -0
- package/dist/vendored/components/ViewContainer.vue +52 -0
- package/dist/vendored/components/base.js +12 -0
- package/dist/vendored/components/icons.js +47 -0
- package/dist/vendored/components/index.js +58 -0
- package/dist/vendored/components/setters/SetBgPosition.vue +64 -0
- package/dist/vendored/components/setters/SetBgSize.vue +90 -0
- package/dist/vendored/components/setters/SetCode.vue +90 -0
- package/dist/vendored/components/setters/SetColor.vue +244 -0
- package/dist/vendored/components/setters/SetCustomSelect.vue +58 -0
- package/dist/vendored/components/setters/SetExpr.vue +107 -0
- package/dist/vendored/components/setters/SetGradient.vue +125 -0
- package/dist/vendored/components/setters/SetGrid9.vue +68 -0
- package/dist/vendored/components/setters/SetIconSelect.vue +67 -0
- package/dist/vendored/components/setters/SetIfForm.vue +61 -0
- package/dist/vendored/components/setters/SetImage.vue +43 -0
- package/dist/vendored/components/setters/SetList.vue +139 -0
- package/dist/vendored/components/setters/SetNumber.vue +118 -0
- package/dist/vendored/components/setters/SetNumberStyle.vue +113 -0
- package/dist/vendored/components/setters/SetPadding.vue +77 -0
- package/dist/vendored/components/setters/SetSegment.vue +160 -0
- package/dist/vendored/components/setters/SetSelect.vue +51 -0
- package/dist/vendored/components/setters/SetSwitch.vue +49 -0
- package/dist/vendored/components/setters/SetText.vue +52 -0
- package/dist/vendored/components/setters/props.js +23 -0
- package/dist/vendored/fidelity/baseline-messageOverview.json +87 -0
- package/dist/vendored/fidelity/calibration.json +29 -0
- package/dist/vendored/fidelity/fidelity-messageOverview-after.html +114 -0
- package/dist/vendored/fidelity/fidelity-messageOverview-after.json +272 -0
- package/dist/vendored/fidelity/fidelity-messageOverview.html +185 -0
- package/dist/vendored/fidelity/fidelity-messageOverview.json +336 -0
- package/dist/vendored/fidelity/fidelity-messageOverview_v2.html +262 -0
- package/dist/vendored/fidelity/fidelity-messageOverview_v2.json +502 -0
- package/dist/vendored/fidelity/fidelity-messageOverview_v3.html +201 -0
- package/dist/vendored/fidelity/fidelity-messageOverview_v3.json +417 -0
- package/dist/vendored/fidelity/fidelity-messageOverview_visual.html +125 -0
- package/dist/vendored/fidelity/fidelity-messageOverview_visual.json +338 -0
- package/dist/vendored/index.html +16 -0
- package/dist/vendored/main.js +36 -0
- package/dist/vendored/meta/action-meta.json +141 -0
- package/dist/vendored/meta/component-meta.json +2714 -0
- package/dist/vendored/meta/directive-meta.json +40 -0
- package/dist/vendored/meta/style-meta.json +1086 -0
- package/dist/vendored/runtime/StyleParser.js +179 -0
- package/dist/vendored/runtime/adapter.js +166 -0
- package/dist/vendored/runtime/alert-card.js +125 -0
- package/dist/vendored/runtime/app-toast.js +33 -0
- package/dist/vendored/runtime/assets.js +16 -0
- package/dist/vendored/runtime/canvas-context.js +141 -0
- package/dist/vendored/runtime/card-runtime.js +289 -0
- package/dist/vendored/runtime/clipboard-node.js +83 -0
- package/dist/vendored/runtime/clipboard.js +29 -0
- package/dist/vendored/runtime/evaluate.js +152 -0
- package/dist/vendored/runtime/event-model.js +300 -0
- package/dist/vendored/runtime/hoverGuide.js +31 -0
- package/dist/vendored/runtime/jsapi-mock.js +256 -0
- package/dist/vendored/runtime/node-model.js +217 -0
- package/dist/vendored/runtime/property.js +364 -0
- package/dist/vendored/runtime/selectionOverlay.js +53 -0
- package/dist/vendored/runtime/toPreview.js +648 -0
- package/dist/vendored/standalone-main.js +36 -0
- package/dist/vendored/standalone.html +12 -0
- package/dist/vendored/styles/app.css +2565 -0
- package/dist/vendored/styles/card-gallery.css +234 -0
- package/dist/vendored/styles/card-select.css +281 -0
- package/dist/vendored/styles/components.css +383 -0
- package/dist/vendored/styles/dropdown.css +337 -0
- package/dist/vendored/styles/json-tree.css +308 -0
- package/dist/vendored/styles/node-inspector.css +1003 -0
- package/dist/vendored/styles/setters.css +962 -0
- package/dist/vendored/styles/standalone.css +27 -0
- package/dist/vendored/styles/structure-tree.css +320 -0
- package/package.json +42 -0
package/README.md
ADDED
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# cardbuddy
|
|
2
|
+
|
|
3
|
+
本地开发服务(Local Dev Service)—— 把「卡片编辑器平台」的前后端彻底解耦。
|
|
4
|
+
|
|
5
|
+
编辑器前端是纯静态产物(可部署到任意公网静态托管),而卡片的本地增删查改(同步 / 保存 / 校验 / 渲染自检 / 截图 / 远端取卡)由本服务在**开发者本机**承接。
|
|
6
|
+
|
|
7
|
+
> 目标:编辑器平台统一维护、统一部署;每位开发者只在本地启动一个 `cardbuddy`,在编辑器「设置 → 本地开发服务」里填好地址,即可立即开发自己的卡片代码。
|
|
8
|
+
|
|
9
|
+
**公共 npm 包**:[`cardbuddy`](https://www.npmjs.com/package/cardbuddy) —— `npm i -g cardbuddy`(或 `npx cardbuddy`)即可安装使用。
|
|
10
|
+
|
|
11
|
+
> **改名说明**:本包 `0.6.0` 起由 `cardbuddy-dev` 改名为 **`cardbuddy`**(可执行命令同名)。旧包 `cardbuddy-dev` 已 deprecated —— 仍可安装但不再更新,请改用 `npm i -g cardbuddy`。
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 快速开始
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
# 任选其一安装(全局或 npx 均可)
|
|
19
|
+
npm i -g cardbuddy
|
|
20
|
+
# 或
|
|
21
|
+
npx cardbuddy
|
|
22
|
+
|
|
23
|
+
# 在「卡片代码仓库根目录」下启动:
|
|
24
|
+
cd /path/to/your/card-repo
|
|
25
|
+
cardbuddy
|
|
26
|
+
# → 监听 http://127.0.0.1:8787
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
启动后,在公网编辑器里打开「设置 → 本地开发服务」,填入 `http://127.0.0.1:8787`,即可跨源调用本机的卡片 CRUD。
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Preview 模式(本地独立调试)
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
cardbuddy --preview # 等价短参 -p
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
启动后,本地服务在同一个 `8787` 端口同时托管:
|
|
40
|
+
|
|
41
|
+
- 卡片 CRUD / 校验 / 截图等 `/__xxx` API
|
|
42
|
+
- 打包后的编辑器前端(替代 `https://poc-agent.finmall.com/cardBuddy/index.html`)
|
|
43
|
+
- 自动注入本地 API 地址并打开默认浏览器
|
|
44
|
+
|
|
45
|
+
> 命名说明:`--preview` 指「本地托管编辑器前端做预览」,与端点 `GET /__preview`(远端取卡)无关。
|
|
46
|
+
|
|
47
|
+
**前端产物来源优先级:**
|
|
48
|
+
|
|
49
|
+
1. `DSL_PREVIEW_ROOT` 显式指定目录
|
|
50
|
+
2. npm 包自带的 `dist/preview-editor/`(发布包内置;旧包布局 `dist/offline-editor/` 自动回退)
|
|
51
|
+
3. 当前目录下的 `dist/`(仓库内直接运行源码时)
|
|
52
|
+
|
|
53
|
+
包内已内置打包好的编辑器前端(`dist/preview-editor/`),因此无需自己构建前端即可使用 `--preview`。
|
|
54
|
+
|
|
55
|
+
**已废弃别名(仍生效)**:`--offline` / `-o`、`DSL_DEV_OFFLINE=1`、`DSL_OFFLINE_ROOT`、注入全局
|
|
56
|
+
`window.__CARD_DEV_OFFLINE_BASE__`。请把手上的脚本 / CI / demo 换成 preview 名,旧名将在后续版本移除;
|
|
57
|
+
服务端目前会同时注入新旧两个全局名,因此**已构建好的旧 `dist/` 前端仍能被新服务托管**。
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## 配置(环境变量 / `.env`)
|
|
62
|
+
|
|
63
|
+
在仓库根目录的 `.env` 中配置,或直接用环境变量:
|
|
64
|
+
|
|
65
|
+
| 变量 | 默认 | 说明 |
|
|
66
|
+
| --- | --- | --- |
|
|
67
|
+
| `DSL_CARD_ROOT` | 当前目录 (`cwd`) | 卡片代码仓库根(含 `src/cards`)。可用环境变量二次覆盖。 |
|
|
68
|
+
| `DSL_DEV_PORT` | `8787` | 本地服务监听端口。 |
|
|
69
|
+
| `EDITOR_URL` | `http://127.0.0.1:5180` | 截图自访问的编辑器实例地址(默认指向本地编辑器)。写入 `.env` 即可持久化。 |
|
|
70
|
+
| `DSL_DEV_TOKEN` | _(空)_ | 可选鉴权令牌;开启后请求须带 `x-dev-token` 头。默认仅靠 `127.0.0.1` 绑定(不暴露局域网)。 |
|
|
71
|
+
| `DSL_DEV_HTTPS` | `0` | 设为 `1` 启用自签 HTTPS(兜底旧 Safari / 企业策略的混合内容拦截)。 |
|
|
72
|
+
| `DSL_EDITOR_SRC` | _(空)_ | 内核开发用:指向本地编辑器 `preview/` 源码,绕过 vendored 快照调试。 |
|
|
73
|
+
| `DSL_DEV_PREVIEW` | `0` | 设为 `1` 等价于 `--preview`:同端口托管打包后的编辑器前端并自动打开浏览器。 |
|
|
74
|
+
| `DSL_PREVIEW_ROOT` | _(空)_ | 自定义 preview 前端构建产物目录(默认包内 `dist/preview-editor/`,回退 `cwd/dist`)。 |
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## HTTPS 模式(混合内容兜底)
|
|
79
|
+
|
|
80
|
+
默认本服务跑在 `http://127.0.0.1:8787`。当公网编辑器是 **HTTPS** 时,浏览器可能因「混合内容(Mixed Content)」或「私有网络访问(PNA)」策略拦截对 `http://127.0.0.1` 的跨源请求。现代 **Chrome / Firefox** 对回环地址(127.0.0.1 / localhost)豁免混合内容,默认即可用;但 **Safari** 等更严格的环境会拦截,此时启用 HTTPS 模式:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
DSL_DEV_HTTPS=1 cardbuddy
|
|
84
|
+
# → 监听 https://127.0.0.1:8787,证书首次自动生成并缓存到 <root>/.local/dsl-dev-tls/
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
证书为自签(SAN 覆盖 `localhost` / `127.0.0.1` / `::1`),**不在系统信任链**,首次使用需:
|
|
88
|
+
|
|
89
|
+
1. 在浏览器手动打开 `https://127.0.0.1:8787/__cards`;
|
|
90
|
+
2. 接受「您的连接不是私密连接」警告(一次性,之后该主机被信任);
|
|
91
|
+
3. 回到编辑器「设置 → 本地开发服务」,把 Base URL 改为 `https://127.0.0.1:8787` 即可。
|
|
92
|
+
|
|
93
|
+
> 即便走 HTTP 模式,CORS 层也已回写 `Access-Control-Allow-Private-Network: true`,向前兼容 Chrome 的 PNA 预检。
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## 端点(与编辑器约定的 `/__xxx`)
|
|
98
|
+
|
|
99
|
+
| 端点 | 来源 | 说明 |
|
|
100
|
+
| --- | --- | --- |
|
|
101
|
+
| `GET /__cards` | 自包含 | 卡片列表 |
|
|
102
|
+
| `GET /__card/:id` | 自包含 | 单卡 schema/data 读取 |
|
|
103
|
+
| `POST /__sync` | 本地服务代理 | 同步远端 FinMall(依赖 `finmall-card-sync` skill) |
|
|
104
|
+
| `POST /__save` | 本地服务代理 | 保存到远端 FinMall(依赖 `finmall-card-sync` skill) |
|
|
105
|
+
| `GET /__preview` | 本地服务代理 | 远端取卡(IDC10015,依赖 `finmall-card-sync` skill) |
|
|
106
|
+
| `POST /__validate` | 本地服务代理 | 契约校验(依赖 `dsl-card-generator` skill) |
|
|
107
|
+
| `GET /__render-status/:id` | 自包含 + 内嵌 Vite SSR | 渲染自检 |
|
|
108
|
+
| `GET /__node-models/:id` | 自包含 + 内嵌 Vite SSR | 节点 Property 树模型 |
|
|
109
|
+
| `GET /__import-meta/:id` | 自包含 | 导入侧车元数据 |
|
|
110
|
+
| `GET /__history` | 自包含 | 编辑历史 |
|
|
111
|
+
| `GET /__screenshot/:id` | 自包含(需 Playwright + 系统 Chrome)| 无头截图 |
|
|
112
|
+
| `GET /__events` (SSE) | 自包含 | `cards-changed` 实时推送 |
|
|
113
|
+
|
|
114
|
+
> **FinMall 凭据只在本机**:`/__sync` `/__save` `/__preview` 由本地服务代理 FinMall,凭据存于本机 `skills/finmall-card-sync` 与 `.env.finmall`,公网前端永不接触。
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## 依赖:FinMall skill
|
|
119
|
+
|
|
120
|
+
远端读写相关端点(`/__sync` `/__save` `/__preview` `/__validate`)通过动态 `import` 调用你项目里的 skill 脚本:
|
|
121
|
+
|
|
122
|
+
- `finmall-card-sync`(sync / save / preview)
|
|
123
|
+
- `dsl-card-generator`(validate)
|
|
124
|
+
|
|
125
|
+
请确保项目根下存在 `skills/finmall-card-sync/scripts/api_batch_sync.mjs` 等,且 `.env.finmall` 已配置 `FINMALL_BASE_URL` 等。
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## 安全
|
|
130
|
+
|
|
131
|
+
- 仅绑定 `127.0.0.1`,不暴露局域网。
|
|
132
|
+
- CORS 反射请求 `Origin`(任意公网域名均可跨源调用,无需配置白名单)。
|
|
133
|
+
- 可选 `x-dev-token` 鉴权。
|
|
134
|
+
- HTTPS 自签模式(`DSL_DEV_HTTPS=1`)兜底混合内容拦截(Safari / 严格策略);Chrome / Firefox 默认 HTTP 即可用。
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## 本地开发(编辑器 + 本地服务)
|
|
139
|
+
|
|
140
|
+
本仓库既是「卡片编辑器平台」的源码,也是 `cardbuddy` 的源码。下面说明怎么在本地开发**编辑器本身**(即 `preview/` 前端与 `server/core/` 后端)。
|
|
141
|
+
|
|
142
|
+
### 关键区别:同域(dev)vs 跨域(生产)
|
|
143
|
+
|
|
144
|
+
`npm run dev` 能"免费"工作,是因为 `preview/api.js` 的 `resolveApiBase()` 在 `import.meta.env.DEV` 为真时**走同源**(第 3 条回退),而**这条同源路径在生产里不存在**——`build` 产物的 `DEV=false`,生产永远依赖「编辑器配好 8787 地址 + 跨源调用本地服务」。
|
|
145
|
+
|
|
146
|
+
所以本地开发分两条互补的路径:
|
|
147
|
+
|
|
148
|
+
| 命令 | 编辑器来源 | 后端来源 | 用途 |
|
|
149
|
+
| --- | --- | --- | --- |
|
|
150
|
+
| `npm run dev` | `preview/` 源码(Vite dev + HMR) | Vite 插件同源挂载(5180) | 日常改编辑器 / 卡片(同域,**不**走生产跨域链路) |
|
|
151
|
+
| `npm run dev:prod` | `dist/` **构建产物**(`vite preview`) | `cardbuddy` 服务(8787) | 部署前权威跨域 smoke test(最贴近生产) |
|
|
152
|
+
| 部署公网 | `dist/` 静态托管(CDN) | 用户本机起 8787 | 生产环境 |
|
|
153
|
+
|
|
154
|
+
> 已废弃 `dev:full`:它用 dev 源码 + 注入 `VITE_API_BASE` 仿真跨域,但既不贴近生产(非 build 产物),又不如「dev + 设置里启用本地服务」更真实。直接用 `dev:prod`(build 产物 + 8787)做验证即可。
|
|
155
|
+
|
|
156
|
+
### 模式一:纯同域开发(默认,最常用)
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
npm run dev
|
|
160
|
+
# → Vite dev server 端口 5180(由 .env.finmall 的 FINMALL_DEV_PORT 控制)
|
|
161
|
+
# 浏览器打开 http://localhost:5180
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
`/__cards` `/__card/:id` `/__render-status` `/__node-models` 等后端端点由 Vite 插件 `server/cardServer.js` **同源挂载**,编辑器前端直接同源调用,无需单独起服务。
|
|
165
|
+
|
|
166
|
+
### 模式二:开发期顺手看跨域(可选)
|
|
167
|
+
|
|
168
|
+
不想切到 build 产物、又想在开发时验证跨源?**不用专门脚本**,直接:
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
npm run dev # 编辑器 5180(同域,HMR)
|
|
172
|
+
node packages/cardbuddy/src/cli.js # 另起 8787 服务(另开一个终端)
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
然后在编辑器「设置 → 本地开发服务」里**启用**并填 `http://127.0.0.1:8787`。`resolveApiBase()` 第 2 条(设置启用)优先于 DEV 回退,编辑器立即改走 8787 跨源——这与生产用户操作完全一致,比旧 `dev:full` 注入还真实。
|
|
176
|
+
|
|
177
|
+
### 模式三:部署前生产级验证(`npm run dev:prod`)
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
npm run dev:prod
|
|
181
|
+
# = npm run build && npm run preview(静态托管 dist/,默认 4173)+ 并行起 8787
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
打开 `http://localhost:4173`,在「设置 → 本地开发服务」启用并填 `http://127.0.0.1:8787`,即可对 **build 产物** 跑完整的跨源 smoke test(卡片列表 / 画布渲染 / 保存同步 / SSE 实时刷新)。这是部署前最贴近生产的验证;退出 `Ctrl+C` 同时关闭 preview 与 8787。
|
|
185
|
+
|
|
186
|
+
> `dev:prod` **不注入** `VITE_API_BASE`,因此产出的 `dist/` 是干净的、可直接用于生产部署——跨源地址完全交由设置(与生产一致)。
|
|
187
|
+
|
|
188
|
+
### 改动即时性(哪些要重启)
|
|
189
|
+
|
|
190
|
+
| 你改的文件 | `npm run dev` | `npm run dev:prod` |
|
|
191
|
+
| --- | --- | --- |
|
|
192
|
+
| `preview/**`(Vue 组件 / runtime / 样式) | ✅ Vite HMR 即时 | ⚠️ 需重跑 `npm run dev:prod`(build 产物,无 HMR) |
|
|
193
|
+
| `src/cards/*.json`(卡片内容) | ✅ `cards-changed` watcher 自动重载 | ✅ 8787 SSE 推送自动重载 |
|
|
194
|
+
| `server/core/**`(后端中间件) | ⚠️ 需**重启** Vite | ⚠️ 需**重启** 8787 服务 |
|
|
195
|
+
| `vite.config.mjs` / 插件配置 | ⚠️ 需重启 Vite | ⚠️ 需重跑 `npm run dev:prod`(重新 build) |
|
|
196
|
+
|
|
197
|
+
> 铁律:**改 `server/core/**` 必须重启对应进程**(Node 不会热重载服务端模块),别白等热更新。
|
|
198
|
+
|
|
199
|
+
### 前置条件
|
|
200
|
+
|
|
201
|
+
- `.env.finmall` 已存在(含 `FINMALL_BASE_URL` 远端基址、`FINMALL_DEV_PORT`)。缺它编辑器仍能起,只是远端资源代理会告警。
|
|
202
|
+
- 首次跑前先 `npm install`(仓库根)。
|
|
203
|
+
|
|
204
|
+
### 服务侧单独起(调试 8787 本身)
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
# 仓库内直接跑源码(无需先 build)
|
|
208
|
+
node packages/cardbuddy/src/cli.js
|
|
209
|
+
# 或带 HTTPS 兜底
|
|
210
|
+
DSL_DEV_HTTPS=1 node packages/cardbuddy/src/cli.js
|
|
211
|
+
```
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* cardbuddy CLI 入口(npm 包名与可执行命令同为 cardbuddy;0.6.0 前叫 cardbuddy-dev)。
|
|
4
|
+
*
|
|
5
|
+
* 读取 cwd 下 .env / .env.finmall / .env.finmall.local(dotenv),启动本地开发服务(127.0.0.1)。
|
|
6
|
+
* 配置项见 src/config.js(DSL_CARD_ROOT / FINMALL_CARD_PORT / DSL_DEV_PORT /
|
|
7
|
+
* DSL_DEV_TOKEN / DSL_DEV_HTTPS / EDITOR_URL / DSL_EDITOR_SRC)。
|
|
8
|
+
*
|
|
9
|
+
* 端口约定:.env.finmall 的 FINMALL_CARD_PORT 为「卡片开发服务端口」单一真值,
|
|
10
|
+
* 主仓库由 tools/dev.mjs 把它注入为 DSL_DEV_PORT;此处直接用 FINMALL_CARD_PORT,
|
|
11
|
+
* 使 demo(直接 npx cardbuddy 或 npm run dev,无启动器注入)也能经 .env.finmall 生效。
|
|
12
|
+
*/
|
|
13
|
+
import dotenv from 'dotenv'
|
|
14
|
+
import chalk from 'chalk'
|
|
15
|
+
import { startServer } from './standalone.js'
|
|
16
|
+
|
|
17
|
+
// 被 dev.mjs 拉起时让出来源前缀(由启动器带背景色 chip 标注),避免双重来源标签。
|
|
18
|
+
const srcTag =
|
|
19
|
+
process.env.DSL_LAUNCHER === 'dev'
|
|
20
|
+
? ''
|
|
21
|
+
: chalk.magenta('▌ ') + chalk.magenta.bold('cardbuddy') + ' '
|
|
22
|
+
|
|
23
|
+
// 加载环境(与 skills 同套约定:.env.finmall 为共享配置,.env.finmall.local 为个人覆盖层)。
|
|
24
|
+
// dotenv 默认不覆盖已存在变量,故主仓库由启动器注入的 DSL_DEV_PORT / FINMALL_BASE_URL 仍优先。
|
|
25
|
+
for (const p of ['.env', '.env.finmall', '.env.finmall.local']) {
|
|
26
|
+
dotenv.config({ path: p })
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const args = process.argv.slice(2)
|
|
30
|
+
if (args.includes('--help') || args.includes('-h')) {
|
|
31
|
+
console.log(`cardbuddy — CardBuddy 本地开发服务
|
|
32
|
+
|
|
33
|
+
用法:
|
|
34
|
+
cardbuddy [--preview] [--help]
|
|
35
|
+
|
|
36
|
+
选项:
|
|
37
|
+
--preview, -p 同时托管打包后的编辑器前端(本地预览),替代线上地址,并自动打开浏览器
|
|
38
|
+
旧名 --offline / -o 仍可用,已废弃
|
|
39
|
+
--help, -h 显示帮助
|
|
40
|
+
|
|
41
|
+
环境变量:
|
|
42
|
+
DSL_CARD_ROOT 卡片仓库根目录(默认 cwd)
|
|
43
|
+
DSL_DEV_PORT 本地服务端口(默认 8787,兼容 FINMALL_CARD_PORT)
|
|
44
|
+
DSL_DEV_HTTPS=1 启用自签 HTTPS
|
|
45
|
+
DSL_DEV_TOKEN 可选鉴权 token
|
|
46
|
+
DSL_DEV_PREVIEW=1 等价于 --preview
|
|
47
|
+
DSL_PREVIEW_ROOT 自定义 preview 前端构建产物目录(默认包内 dist/preview-editor,回退 cwd/dist)
|
|
48
|
+
|
|
49
|
+
已废弃别名(仍生效):--offline / -o、DSL_DEV_OFFLINE、DSL_OFFLINE_ROOT
|
|
50
|
+
`)
|
|
51
|
+
process.exit(0)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const previewFlag = args.includes('--preview') || args.includes('-p')
|
|
55
|
+
const legacyOfflineFlag = args.includes('--offline') || args.includes('-o')
|
|
56
|
+
if (legacyOfflineFlag) {
|
|
57
|
+
console.warn(
|
|
58
|
+
srcTag + chalk.yellow('⚠ --offline 已废弃,请改用 --preview(本次仍按 preview 模式启动)')
|
|
59
|
+
)
|
|
60
|
+
}
|
|
61
|
+
// 只在显式给了 flag 时才覆盖配置:无条件传 { preview: false } 会把 DSL_DEV_PREVIEW=1 顶成
|
|
62
|
+
// false —— 旧实现正因如此,环境变量开关一直是失效的。
|
|
63
|
+
startServer(previewFlag || legacyOfflineFlag ? { preview: true } : {})
|
|
64
|
+
.then(({ shutdown }) => {
|
|
65
|
+
const stop = async () => {
|
|
66
|
+
console.log('\n' + srcTag + chalk.cyan('正在关闭…'))
|
|
67
|
+
await shutdown().catch(() => {})
|
|
68
|
+
process.exit(0)
|
|
69
|
+
}
|
|
70
|
+
process.on('SIGINT', stop)
|
|
71
|
+
process.on('SIGTERM', stop)
|
|
72
|
+
})
|
|
73
|
+
.catch((e) => {
|
|
74
|
+
console.error(srcTag + chalk.red('启动失败:') + e)
|
|
75
|
+
process.exit(1)
|
|
76
|
+
})
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cardbuddy 配置解析(Phase 0 占位,Phase 1 扩展)。
|
|
3
|
+
*
|
|
4
|
+
* 约定:
|
|
5
|
+
* - 项目根默认 process.cwd(),可用 DSL_CARD_ROOT 覆盖。
|
|
6
|
+
* - 监听端口默认 8787,由 FINMALL_CARD_PORT 控制(.env.finmall 单一真值);
|
|
7
|
+
* 兼容旧 DSL_DEV_PORT(主仓库 tools/dev.mjs / prod-preview.mjs 注入)。
|
|
8
|
+
* 前端 resolveApiBase 的 DEV 默认端口同样读 FINMALL_CARD_PORT,保持三者一致。
|
|
9
|
+
* - 编辑器 URL 默认 http://127.0.0.1:5180(EDITOR_URL),供截图使用。
|
|
10
|
+
* - 仅绑定 127.0.0.1;token / https 为可选增强。
|
|
11
|
+
*/
|
|
12
|
+
import path from 'node:path'
|
|
13
|
+
import { fileURLToPath } from 'node:url'
|
|
14
|
+
|
|
15
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url))
|
|
16
|
+
|
|
17
|
+
export function loadConfig(env = process.env) {
|
|
18
|
+
const root = env.DSL_CARD_ROOT
|
|
19
|
+
? path.resolve(env.DSL_CARD_ROOT)
|
|
20
|
+
: process.cwd()
|
|
21
|
+
const port = Number(env.FINMALL_CARD_PORT || env.DSL_DEV_PORT || 8787)
|
|
22
|
+
const editorUrl = env.EDITOR_URL || 'http://127.0.0.1:5180'
|
|
23
|
+
const https = env.DSL_DEV_HTTPS === '1' || env.DSL_DEV_HTTPS === 'true'
|
|
24
|
+
const token = env.DSL_DEV_TOKEN || ''
|
|
25
|
+
const editorSrc = env.DSL_EDITOR_SRC || ''
|
|
26
|
+
// preview 模式:cardbuddy 同时托管打包后的编辑器前端(替代公网地址)。
|
|
27
|
+
// DSL_DEV_PREVIEW=1 / --preview 启动;DSL_PREVIEW_ROOT 可指定任意已构建产物目录。
|
|
28
|
+
// 旧名 DSL_DEV_OFFLINE / DSL_OFFLINE_ROOT 仍作兼容回退(已废弃,见 README「Preview 模式」)。
|
|
29
|
+
const truthy = (value) => value === '1' || value === 'true'
|
|
30
|
+
const preview = truthy(env.DSL_DEV_PREVIEW) || truthy(env.DSL_DEV_OFFLINE)
|
|
31
|
+
const previewRoot = env.DSL_PREVIEW_ROOT || env.DSL_OFFLINE_ROOT || ''
|
|
32
|
+
// FinMall 远端站点基址:资源代理(createAssetProxyMiddleware)回源用。
|
|
33
|
+
// 由 .env.finmall 的 FINMALL_BASE_URL 经启动器(tools/dev.mjs / prod-preview.mjs)
|
|
34
|
+
// 注入到本进程 env;缺省空串表示不回源(/minio 等只走占位图兜底)。
|
|
35
|
+
const upstream = env.FINMALL_BASE_URL || ''
|
|
36
|
+
|
|
37
|
+
return {
|
|
38
|
+
root,
|
|
39
|
+
port,
|
|
40
|
+
editorUrl,
|
|
41
|
+
https,
|
|
42
|
+
token,
|
|
43
|
+
editorSrc,
|
|
44
|
+
preview,
|
|
45
|
+
previewRoot,
|
|
46
|
+
upstream,
|
|
47
|
+
// 包内 vendored 运行时快照(build 阶段从 preview/ 复制到 dist/vendored):SSR 端点
|
|
48
|
+
// 所需的编辑器运行时(components/* + runtime/*)全量快照,使发布后无需消费者持有编辑器源码。
|
|
49
|
+
// - 源码运行(src/cli.js,__dirname=.../src):此处指向 .../src/vendored(不存在)→
|
|
50
|
+
// 走 repoPreviewDir 回退,仓库内开发无需先 build。
|
|
51
|
+
// - 发布运行(dist/cli.js,__dirname=.../dist):此处指向 .../dist/vendored(build 产出)→
|
|
52
|
+
// 命中 vendored,真正自包含。
|
|
53
|
+
vendoredRuntimeDir: path.resolve(__dirname, 'vendored'),
|
|
54
|
+
// 仓库内开发回退:从仓库根运行时(cwd=仓库根)能直接命中 preview/,无需先 build。
|
|
55
|
+
repoPreviewDir: path.resolve(process.cwd(), 'preview'),
|
|
56
|
+
// 发布态包内自带的预览编辑器构建产物(build.mjs 从 ../../dist 复制到 dist/preview-editor)。
|
|
57
|
+
previewEditorDir: path.resolve(__dirname, 'preview-editor'),
|
|
58
|
+
// 兼容旧包布局(<= 0.5.x 的 dist/offline-editor):存在时作为回退,避免升级后 --preview 找不到前端。
|
|
59
|
+
legacyOfflineEditorDir: path.resolve(__dirname, 'offline-editor'),
|
|
60
|
+
// 仓库内开发回退:根目录 npm run build 的产物 dist/。
|
|
61
|
+
repoDistDir: path.resolve(process.cwd(), 'dist'),
|
|
62
|
+
}
|
|
63
|
+
}
|
package/dist/core.js
ADDED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|