mvframe 1.1.31 → 1.1.33

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.cn.md CHANGED
@@ -268,6 +268,21 @@ await notify("需要发送到钉钉的消息");
268
268
 
269
269
  ---
270
270
 
271
+ ## 命令行:宿主项目打包
272
+
273
+ 在宿主项目 `package.json` 中增加 `"b": "mvframe-b"`。该命令会执行宿主 Vite 构建、复制 MVFrame 国旗资源,并写入 `serve.json`。项目名自动取执行命令时所在项目的文件夹名,并通过 `MVFRAME_PROJECT_NAME` 传给 Vite。
274
+
275
+ ```bash
276
+ yarn b # mode=development,输出 dev/
277
+ yarn b pre # mode=pre,输出 pre/,加载 .env.pre*
278
+ yarn b pd # mode=production,输出 pd/,加载 .env.production*
279
+ yarn b --mode staging --outDir release
280
+ ```
281
+
282
+ `--pre`、`--pd` 分别等价于 `pre`、`pd` 快捷命令。旧的 `-t`(`test/test`)、`-p`(`production/pre`)以及单个位置参数自定义输出目录仍然兼容。
283
+
284
+ ---
285
+
271
286
  ## 命令行:项目目录雏形(推荐)
272
287
 
273
288
  在**空目录或已有 Vite 工程根目录**执行,生成 `src/views`、`src/component`、`src/api`、`src/assets/img`、`src/assets/style`、`src/router`、`src/pinia/chip`、`src/config` 及示例 `main.js` / `App.vue`(已 `app.use(mvframe, …)` 挂好路由、Pinia `storeChips`、config,并写入 `components.async: ["VTable"]`),同时写入/更新宿主项目 **`AGENTS.md`** 的 MVFrame Codex 规则,其中包含 **每次 AI 完成开发后执行 `yarn exec mvframe-notify --once --message "..."` 发送完成通知** 的要求,并复制 **`/.cursor/rules/*.mdc`**(与 mvframe 仓库内 Cursor 规则一致)。若不存在则附带 `index.html` 与 `vite.config.js`。会**合并** `package.json` 的 `scripts` / `dependencies` / `devDependencies`(与 Vite 模板一致;**同名脚本和包保留你原有值**),初始化 `.env.mvframe-notify.example` / `.env.local.example` 与 `config.notify`,并自动执行 **`yarn install`**,最后请执行 **`yarn dev`**;需要同时启动通知服务时显式执行 **`yarn exec mvframe-d -n`**。加 `--no-package-json` 可不改动 `package.json` 且跳过安装。
package/README.md CHANGED
@@ -253,6 +253,21 @@ The floating label shell is implemented centrally in `src/style/chip/element.scs
253
253
 
254
254
  ---
255
255
 
256
+ ## CLI: host application build
257
+
258
+ Add `"b": "mvframe-b"` to the host application's `package.json`. The command runs the host Vite build, copies MVFrame flag assets, and writes `serve.json`. The host project name is derived from the current project folder and passed to Vite as `MVFRAME_PROJECT_NAME`.
259
+
260
+ ```bash
261
+ yarn b # mode=development, outDir=dev
262
+ yarn b pre # mode=pre, outDir=pre; loads .env.pre*
263
+ yarn b pd # mode=production, outDir=pd; loads .env.production*
264
+ yarn b --mode staging --outDir release
265
+ ```
266
+
267
+ `--pre` and `--pd` are equivalent to the `pre` and `pd` shortcuts. The legacy `-t` (`test/test`), `-p` (`production/pre`), and single positional output-directory forms remain supported.
268
+
269
+ ---
270
+
256
271
  ## CLI: project skeleton
257
272
 
258
273
  From an **empty folder or existing Vite root**, generates `src/views`, `src/component`, `src/api`, `src/assets/img`, `src/assets/style`, `src/router`, `src/pinia/chip`, `src/config`, plus starter `main.js` / `App.vue` with `app.use(mvframe, …)` (routes, Pinia `storeChips`, config, and `components.async: ["VTable"]`). It also writes/updates host-project **`AGENTS.md`** with MVFrame Codex rules, including a requirement that AI send a completion message with `yarn exec mvframe-notify --once --message "..."` after each finished development task, and copies **`/.cursor/rules/*.mdc`** from the package (same as this repo’s Cursor rules). Adds `index.html` and `vite.config.js` only if missing (use `--force` to overwrite). **Merges** `scripts` / `dependencies` / `devDependencies` into `package.json` (existing values win for shared keys), initializes `.env.mvframe-notify.example` / `.env.local.example` and `config.notify`, then runs **`yarn install`**; use `--no-package-json` to skip package changes and install. Then run **`yarn dev`** or explicitly run **`yarn exec mvframe-d -n`** to start Vite with the notify service.
package/dist/css/cpt.css CHANGED
@@ -1 +1 @@
1
- @charset "UTF-8";.MvcBtnGroup[data-v-085c7e56]{padding:.25rem;background:var(--color-group-bg);border-radius:var(--btn-radius);-webkit-user-select:none;user-select:none}.MvcBtnGroup i[data-v-085c7e56]{font-size:1rem}.MvcBtnGroup.sizeSmall[data-v-085c7e56]{padding:2px;border-radius:calc(var(--btn-radius, 1rem) / 2)}.MvcBtnGroup.sizeSmall i[data-v-085c7e56]{font-size:.75rem}.MvcBtnGroup.sizeSmall .btnItem[data-v-085c7e56]{padding:.25rem .625rem;font-size:.75rem;line-height:1.5;border-radius:.1875rem}.MvcBtnGroup.sizeLarge[data-v-085c7e56]{padding:.375rem;border-radius:.5rem}.MvcBtnGroup.sizeLarge i[data-v-085c7e56]{font-size:1.25rem}.MvcBtnGroup.sizeLarge .btnItem[data-v-085c7e56]{padding:.5rem 1.125rem;font-size:1rem;line-height:1.5;border-radius:.375rem}.MvcBtnGroup .btnItem[data-v-085c7e56]{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;gap:.25rem;padding:.375rem .875rem;font-size:.875rem;line-height:1.5;color:var(--color-txt-p);background:transparent;border:none;border-radius:var(--btn-radius);word-break:keep-all;text-wrap:nowrap;cursor:pointer;transition:var(--trans-all)}.MvcBtnGroup .btnItem[data-v-085c7e56]:hover:not(:disabled):not(.isActive){background:var(--color-bg-menu-item-hover)}.MvcBtnGroup .btnItem.isActive[data-v-085c7e56]{color:var(--color-on-primary-text);background:var(--color-primary);position:relative;isolation:isolate}.MvcBtnGroup .btnItem.isActive[data-v-085c7e56]:after{content:"";position:absolute;top:0;left:0;width:100%;height:100%;opacity:.25;background-color:var(--color-primary);transform:translateY(20%);pointer-events:none;filter:blur(.625rem);z-index:-1}.MvcBtnGroup .btnItem[data-v-085c7e56]:disabled{opacity:.5;cursor:not-allowed}.MvcCard[data-v-bdf05ab5]{position:relative;border:var(--border-d);border-radius:var(--card-radius);background:var(--mvframe-card-bg, var(--color-bg-page-header));box-sizing:border-box;transition:box-shadow var(--trans)}.MvcCard[data-v-bdf05ab5]:hover{box-shadow:0 .5rem .5rem color-mix(in srgb,var(--color-body) 6%,rgba(0,0,0,.05))}.MvcCard.MvcCard--fillParent[data-v-bdf05ab5]{display:flex;flex-direction:column;align-self:stretch;min-height:0;height:100%}.MvcCard .header[data-v-bdf05ab5]{position:relative;padding:.75rem 1rem;border-block-end:var(--card-header-border);z-index:2;flex-shrink:0;-webkit-user-select:none;user-select:none}.MvcCard .header .headerTitle[data-v-bdf05ab5]{margin:0;font-size:.875rem;font-weight:700;color:var(--color-txt-h2)}.MvcCard .body[data-v-bdf05ab5]{position:relative;padding:1rem;min-height:1rem;overflow:auto;z-index:1}.MvcCard.MvcCard--fillParent .body[data-v-bdf05ab5]{flex:1 1 auto;min-height:0}.MvcCard .footer[data-v-bdf05ab5]{position:relative;padding:.75rem 1rem;border-block-start:var(--card-header-border);z-index:2;flex-shrink:0;-webkit-user-select:none;user-select:none}.dragArea[data-v-3bd55143]{position:absolute;top:0;left:0;bottom:0;width:1rem;display:flex;align-items:center;z-index:99}.dragArea .dragHandle[data-v-3bd55143]{display:flex;align-items:center;width:.875rem;height:1.75rem;background-color:var(--color-border);border-radius:0 .125rem .125rem 0;opacity:0;cursor:ew-resize;z-index:99;transition:var(--trans-all)}.dragArea .dragHandle[data-v-3bd55143]:hover,.dragArea .dragHandle.active[data-v-3bd55143]{opacity:1;color:var(--color-white);background-color:var(--color-primary);box-shadow:.25rem 0 .5rem var(--color-dark1)}.dragArea:hover .dragHandle[data-v-3bd55143]{opacity:1}.MvcDrawerBody[data-v-33acb7b3]{position:relative;width:100%;overflow:hidden}.drawerFooter[data-v-33acb7b3]{background-image:linear-gradient(to top,50% var(--color-white),100 transparent)}.FrameTab .tabShadow[data-v-e9bf80ea]{position:absolute;top:100%;left:0;right:0;height:.5rem;background-image:linear-gradient(to bottom,rgba(0,0,0,.05) 0,transparent 100%);opacity:0;transition:opacity var(--trans)}.FrameTab .tabShadow.visible[data-v-e9bf80ea]{opacity:1}.FrameTab .tabArea[data-v-e9bf80ea]:after{content:"";position:absolute;top:2.175rem;left:0;right:0;border-bottom:var(--border-d);z-index:1}.FrameTab .tabItem[data-v-e9bf80ea]{margin-block-end:-1px;border:var(--border-d);border-block-end-color:transparent;border-radius:.25rem .25rem 0 0;background-color:var(--color-white);opacity:.5;overflow:hidden;transition:var(--trans-all)}.FrameTab .tabItem[data-v-e9bf80ea]:hover{opacity:.8}.FrameTab .tabItem.active[data-v-e9bf80ea]{opacity:1;border-block-end-color:var(--color-white);z-index:3;background-color:var(--color-bg-page-header)}.FrameTab .tabItem .abs[data-v-e9bf80ea]{transition:var(--trans-all);transform:translate(2.25rem)}.FrameTab .tabItem .abs[data-v-e9bf80ea]:hover{opacity:.8;color:var(--color-primary)}.FrameTab .tabItem.hoverItem.active[data-v-e9bf80ea]{padding-inline-end:2.25rem}.FrameTab .tabItem.hoverItem.active .abs[data-v-e9bf80ea]{transform:translate(-.375rem)}.FrameTab .tabItem.hoverItem[data-v-e9bf80ea]:hover{padding-inline-end:2.25rem}.FrameTab .tabItem.hoverItem:hover .abs[data-v-e9bf80ea]{transform:translate(-.375rem)}.FrameTab .tabItem.disabled[data-v-e9bf80ea]{opacity:.7;cursor:not-allowed}.FrameMenu[data-v-49ba8b1f]{width:12rem;background-color:var(--color-bg-menu);transition:width .3s ease-out;overflow:hidden}.FrameMenu[data-v-49ba8b1f]:after{content:"";position:absolute;top:0;right:0;bottom:0;border-right:var(--border-d)}.FrameMenu:hover .logomini[data-v-49ba8b1f]{opacity:.1}.FrameMenu:hover .collapseArea[data-v-49ba8b1f]{display:block!important}.FrameMenu .LogoArea .logomini[data-v-49ba8b1f]{display:none}.FrameMenu .collapseArea[data-v-49ba8b1f]{top:50%;right:1rem;height:1.25rem;width:1.24rem;transform:translateY(-50%)}.FrameMenu .MenuArea[data-v-49ba8b1f]{height:calc(100vh - 8rem)}.FrameMenu .MenuArea .menuItem[data-v-49ba8b1f]{height:2.75rem;transition:var(--trans-all)}.FrameMenu .MenuArea .menuItem[data-v-49ba8b1f]:hover{background-color:var(--color-bg-menu-item-hover)}.FrameMenu .MenuArea .menuItem.active[data-v-49ba8b1f]:hover{background-color:var(--color-primary);opacity:.8}.FrameMenu .MenuArea .menuItem.active .itemIcon[data-v-49ba8b1f]{color:var(--color-on-primary-text)}.FrameMenu .MenuArea .childrenItem[data-v-49ba8b1f]{transition:var(--trans-all)}.FrameMenu .MenuArea .childrenItem[data-v-49ba8b1f]:hover{background-color:var(--color-bg-menu-children-item-hover)}.FrameMenu .MenuArea .childrenItem.active[data-v-49ba8b1f]:hover{background-color:var(--color-primary);opacity:.8}.FrameMenu .MenuArea .itemChildrenArea[data-v-49ba8b1f]{background-color:var(--color-bg-menu-children)}.FrameMenu .MenuArea .itemTitle.active[data-v-49ba8b1f]{color:var(--color-on-primary-text)}.FrameMenu.collapse[data-v-49ba8b1f]{width:4rem}.FrameMenu.collapse .collapseArea[data-v-49ba8b1f]{right:1.5rem;display:none}.FrameMenu.collapse .LogoArea .logo[data-v-49ba8b1f]{display:none}.FrameMenu.collapse .LogoArea .logomini[data-v-49ba8b1f]{display:block;transition:opacity var(--trans)}.FrameMenu.collapse .MenuArea .menuItem.activeChild[data-v-49ba8b1f]{position:relative;isolation:isolate}.FrameMenu.collapse .MenuArea .menuItem.activeChild[data-v-49ba8b1f]:after{content:"";position:absolute;top:0;left:0;width:100%;height:100%;opacity:.25;background-color:var(--color-primary);transform:translateY(20%);pointer-events:none;filter:blur(.625rem);z-index:-1}.FrameMenu.collapse .MenuArea .itemChildrenArea[data-v-49ba8b1f]{display:none}.FrameFooter[data-v-a471ccbf]{display:flex;height:3rem;padding:.5rem 1rem;gap:.5rem;font-size:14px}.FrameRightMenu[data-v-388539e5]{position:fixed;z-index:3000;min-width:10rem;max-width:calc(100vw - 1rem);padding:.25rem;border:var(--border-d);border-radius:.375rem;background-color:var(--color-bg-menu);box-shadow:0 .75rem 2rem #00000024,0 .125rem .5rem #00000014;color:var(--color-txt-p);-webkit-user-select:none;user-select:none}.FrameRightMenu .menuItem[data-v-388539e5]{display:flex;align-items:center;gap:.5rem;width:100%;min-height:2rem;padding:0 .75rem;border:none;border-radius:.25rem;background:transparent;color:inherit;cursor:pointer;font-size:.75rem;line-height:1;text-align:left;transition:var(--trans-all);white-space:nowrap}.FrameRightMenu .menuItem[data-v-388539e5]:hover{background-color:var(--color-bg-menu-item-hover);color:var(--color-primary)}.FrameRightMenu .menuItem.disabled[data-v-388539e5]{color:var(--color-txt-gray);cursor:not-allowed;opacity:.6}.FrameRightMenu .menuItem.disabled[data-v-388539e5]:hover{background:transparent;color:var(--color-txt-gray)}.FrameRightMenu .menuIcon[data-v-388539e5]{flex-shrink:0;width:1rem;font-size:.875rem;line-height:1;text-align:center}.FrameRightMenu .menuLabel[data-v-388539e5]{overflow:hidden;text-overflow:ellipsis}.FrameRightMenu .menuDivider[data-v-388539e5]{height:1px;margin:.25rem;background-color:var(--color-border)}.FrameRightMenuFade-enter-active[data-v-388539e5],.FrameRightMenuFade-leave-active[data-v-388539e5]{transition:opacity var(--trans),transform var(--trans)}.FrameRightMenuFade-enter-from[data-v-388539e5],.FrameRightMenuFade-leave-to[data-v-388539e5]{opacity:0;transform:translateY(-.125rem)}.MvcFrame[data-v-5ae195c7]{display:flex}.MvcFrame .PageArea[data-v-5ae195c7]{flex-grow:1;position:relative;min-height:0}.MvcFieldInput.isNoBreak[data-v-20ebb61b] .el-input__wrapper,.MvcFieldInput.isNoBreak[data-v-20ebb61b] .el-input__inner,.MvcFieldInput.isNoBreak[data-v-20ebb61b] .el-input-group__prepend,.MvcFieldInput.isNoBreak[data-v-20ebb61b] .el-input-group__append{white-space:nowrap}.MvcList[data-v-cdd3bad5]{display:flex;flex-direction:column;width:100%;min-height:0;flex:1 1 auto;height:100%;-webkit-user-select:none;user-select:none}.MvcList .listViewport[data-v-cdd3bad5]{position:relative;flex:1 1 auto;min-height:0;overflow:hidden}.MvcList .listScroll[data-v-cdd3bad5]{position:relative;box-sizing:border-box;height:100%;max-height:100%}.MvcList .listItem[data-v-cdd3bad5]{padding:.5rem;margin-block-end:.25rem}.MvcList .listItem[data-v-cdd3bad5]:last-child{margin-block-end:0}.MvcList .listItem[data-v-cdd3bad5]{font-size:.75rem;line-height:1.5;color:var(--color-txt-p);background:transparent;border-radius:.25rem;cursor:pointer;transition:var(--trans-all)}.MvcList .listItem[data-v-cdd3bad5]:hover:not(.active):not(.isDisabled){background:var(--color-bg-menu-item-hover)}.MvcList .listItem.active[data-v-cdd3bad5]{position:sticky!important;top:0;color:var(--color-on-primary-text);z-index:9;-webkit-backdrop-filter:blur(.5rem);backdrop-filter:blur(.5rem);position:relative;isolation:isolate}.MvcList .listItem.active[data-v-cdd3bad5]:after{content:"";position:absolute;top:0;left:0;width:100%;height:100%;opacity:.25;background-color:var(--color-primary);transform:translateY(20%);pointer-events:none;filter:blur(.625rem);z-index:-1}.MvcList .listItem.isDisabled[data-v-cdd3bad5]{opacity:.5;cursor:not-allowed}.MvcList.sizeSmall .listItem[data-v-cdd3bad5]{padding:.25rem .375rem;margin-block-end:.125rem;font-size:.6875rem;border-radius:.1875rem}.MvcList.sizeSmall .listItem[data-v-cdd3bad5]:last-child{margin-block-end:0}.MvcList.sizeLarge .listItem[data-v-cdd3bad5]{padding:.625rem .75rem;margin-block-end:.5rem;font-size:.875rem;border-radius:.375rem}.MvcList.sizeLarge .listItem[data-v-cdd3bad5]:last-child{margin-block-end:0}.loadingFade-enter-active[data-v-305a4676],.loadingFade-leave-active[data-v-305a4676]{transition:opacity var(--trans)}.loadingFade-enter-from[data-v-305a4676],.loadingFade-leave-to[data-v-305a4676]{opacity:0}.MvcLoading[data-v-305a4676]{pointer-events:auto;-webkit-backdrop-filter:blur(.25rem);backdrop-filter:blur(.25rem)}.loaderTxt[data-v-305a4676]{max-width:15rem;word-break:break-word}.MvcLogin[data-v-6faa6992]{background-color:var(--color-bg-body)}.panelWrap[data-v-6faa6992]{background-color:var(--color-bg-menu);box-shadow:0 .25rem 1rem #0000000f}.qr-dingtalk[data-v-6faa6992]{background:#0089ff}.qr-feishu[data-v-6faa6992]{background:#3370ff}.qr-wechat[data-v-6faa6992]{background:#07c160}.oauthGoogle[data-v-6faa6992]{display:flex;align-items:center;justify-content:center;gap:.75rem;min-height:2.5rem;padding:.5rem 1rem;box-sizing:border-box;background:#fff;border:1px solid #747775;border-radius:.25rem;font-family:Roboto,system-ui,-apple-system,Segoe UI,sans-serif;font-size:.875rem;font-weight:500;line-height:1.25;color:#1f1f1f;cursor:pointer;transition:var(--trans-all)}.oauthGoogle[data-v-6faa6992]:hover:not(:disabled){box-shadow:0 1px 2px #3c40434d,0 1px 3px 1px #3c404326}.oauthGoogle[data-v-6faa6992]:disabled{opacity:.38;cursor:not-allowed}.oauthGoogle[data-v-6faa6992]:focus-visible{outline:2px solid #4285f4;outline-offset:2px}.oauthApple[data-v-6faa6992]{display:flex;align-items:center;justify-content:center;gap:.5rem;min-height:2.5rem;padding:.5rem 1rem;box-sizing:border-box;background:#000;border:none;border-radius:.375rem;font-family:-apple-system,BlinkMacSystemFont,SF Pro Text,Helvetica Neue,sans-serif;font-size:1.0625rem;font-weight:600;line-height:1.2;color:#fff;cursor:pointer;transition:var(--trans-all)}.oauthApple[data-v-6faa6992]:hover:not(:disabled){opacity:.88}.oauthApple[data-v-6faa6992]:disabled{opacity:.3;cursor:not-allowed}.oauthApple[data-v-6faa6992]:focus-visible{outline:2px solid #fff;outline-offset:2px}.MvcMention[data-v-a20420a4]{width:100%}.MvcFieldMention.isMaterialLabel:not(.isTextarea) .MvcFieldLabel[data-v-a20420a4]{background-color:var(--mv-field-label-bg)}.MvcNote[data-v-e3e84cc8]{position:relative;padding:.5rem 1rem;background-color:var(--color-bg-menu);font-size:.875rem;border-radius:0 .5rem .5rem 0}.MvcNote[data-v-e3e84cc8]:hover:before{opacity:1}.MvcNote[data-v-e3e84cc8]:before{content:"";position:absolute;top:0;left:0;right:0;bottom:0;opacity:0;pointer-events:none;border-radius:0 .5rem .5rem 0;border:1px solid var(--color-gray);transition:opacity var(--trans)}.MvcPage[data-v-060130ad]{position:relative;display:flex;flex-direction:column;min-height:calc(100vh - 3rem);z-index:1}.MvcPage .PageHeader[data-v-060130ad]{position:sticky;display:flex;align-items:center;justify-content:space-between;padding:.5rem 1rem;min-height:4rem;border-bottom:var(--border-d);background-color:var(--color-bg-page-header);z-index:9}.MvcPage .PageHeader .PageHeaderTitle[data-v-060130ad]{margin:0}.MvcPage .PageHeader .PageHeaderSubTitle[data-v-060130ad]{margin:0;font-size:.875rem;color:var(--color-txt-p)}.MvcPage .PageBody[data-v-060130ad]{position:relative;display:flex;flex-direction:column;flex:1 1 auto;min-height:0;background-color:var(--color-bg-page-body);z-index:2}.MvcPage.hasTab .PageHeader[data-v-060130ad]{top:2.25rem}.ghost[data-v-1927ce52]{cursor:grabbing}.typeItem[data-v-1927ce52]{cursor:pointer}.typeItem[data-v-1927ce52]:hover{background-color:var(--mg-gray3)}.typeItem.active[data-v-1927ce52]{color:var(--mg-white);background-color:var(--mg-primary)}.columnItem[data-v-1927ce52]:hover{background-color:var(--mg-gray3)}.columnItem .fixedBtn[data-v-1927ce52]{cursor:pointer}.columnItem .fixedBtn[data-v-1927ce52]:hover{background-color:var(--mg-primary1)}.MainTable[data-v-f79bf58d]{max-width:calc(100% + 2px);width:calc(100% + 2px);margin:0 -1px}[data-v-467a9b5a] .el-textarea__inner{box-sizing:border-box}.MvcFieldTextarea>.el-input__count[data-v-467a9b5a]{position:absolute;inset-inline-end:.75rem;bottom:.375rem;z-index:1;color:var(--el-text-color-secondary);font-size:.75rem;line-height:1;pointer-events:none}.ghost[data-v-73161392]{cursor:grabbing}.typeItem[data-v-73161392]{cursor:pointer}.typeItem[data-v-73161392]:hover{background-color:var(--mg-gray3)}.typeItem.active[data-v-73161392]{color:var(--color-txt-white);background-color:var(--color-bg-menu-item-active);position:relative;isolation:isolate}.typeItem.active[data-v-73161392]:after{content:"";position:absolute;top:0;left:0;width:100%;height:100%;opacity:.25;background-color:var(--color-primary);transform:translateY(20%);pointer-events:none;filter:blur(.625rem);z-index:-1}.columnItem[data-v-73161392]:hover{background-color:var(--color-bg-menu-item-hover)}.columnItem .fixedBtn[data-v-73161392]{cursor:pointer}.columnItem .fixedBtn[data-v-73161392]:hover{background-color:var(--mg-primary1)}.tableFooter[data-v-a13ba899]{margin-block-start:-1px;border-block-start:var(--border-d);border-radius:0 0 .5rem .5rem}.vtableHost[data-v-a13ba899]{min-height:10rem;background-color:var(--color-white)}.vtableHostFill[data-v-a13ba899]{height:100%}.treeCellLoadMask[data-v-a13ba899]{z-index:10;box-sizing:border-box;pointer-events:auto;cursor:wait;background-color:#ffffffb8;border-radius:.125rem}.treeCellLoadMask .loadMaskIcon[data-v-a13ba899]{pointer-events:none}
1
+ @charset "UTF-8";.MvcBtnGroup[data-v-301fcbf7]{--btn-normal-padding: .375rem .875rem;--btn-active-padding: .375rem .875rem;padding:.25rem;background:var(--color-group-bg);border-radius:var(--btn-radius);-webkit-user-select:none;user-select:none}.MvcBtnGroup i[data-v-301fcbf7]{font-size:1rem}.MvcBtnGroup.sizeSmall[data-v-301fcbf7]{padding:2px;border-radius:calc(var(--btn-radius, 1rem) / 2)}.MvcBtnGroup.sizeSmall i[data-v-301fcbf7]{font-size:.75rem}.MvcBtnGroup.sizeSmall[data-v-301fcbf7]{--btn-normal-padding: .25rem .625rem;--btn-active-padding: .25rem .625rem}.MvcBtnGroup.sizeSmall .btnItem[data-v-301fcbf7]{padding:var(--btn-normal-padding);font-size:.75rem;line-height:1.5;border-radius:.1875rem}.MvcBtnGroup.sizeLarge[data-v-301fcbf7]{padding:.375rem;border-radius:.5rem}.MvcBtnGroup.sizeLarge i[data-v-301fcbf7]{font-size:1.25rem}.MvcBtnGroup.sizeLarge[data-v-301fcbf7]{--btn-normal-padding: .5rem 1.125rem;--btn-active-padding: .5rem 1.125rem}.MvcBtnGroup.sizeLarge .btnItem[data-v-301fcbf7]{padding:var(--btn-normal-padding);font-size:1rem;line-height:1.5;border-radius:.375rem}.MvcBtnGroup .btnItem[data-v-301fcbf7]{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;gap:.25rem;padding:var(--btn-normal-padding);font-size:.875rem;line-height:1.5;color:var(--color-txt-p);background:transparent;border:none;border-radius:var(--btn-radius);word-break:keep-all;text-wrap:nowrap;cursor:pointer;transition:var(--trans-all)}.MvcBtnGroup .btnItem[data-v-301fcbf7]:hover:not(:disabled):not(.isActive){background:var(--color-bg-menu-item-hover)}.MvcBtnGroup .btnItem.isActive[data-v-301fcbf7]{padding:var(--btn-active-padding);color:var(--color-on-primary-text);background:var(--color-primary);position:relative;isolation:isolate}.MvcBtnGroup .btnItem.isActive[data-v-301fcbf7]:after{content:"";position:absolute;top:0;left:0;width:100%;height:100%;opacity:.25;background-color:var(--color-primary);transform:translateY(20%);pointer-events:none;filter:blur(.625rem);z-index:-1}.MvcBtnGroup .btnItem[data-v-301fcbf7]:disabled{opacity:.5;cursor:not-allowed}.MvcCard[data-v-bdf05ab5]{position:relative;border:var(--border-d);border-radius:var(--card-radius);background:var(--mvframe-card-bg, var(--color-bg-page-header));box-sizing:border-box;transition:box-shadow var(--trans)}.MvcCard[data-v-bdf05ab5]:hover{box-shadow:0 .5rem .5rem color-mix(in srgb,var(--color-body) 6%,rgba(0,0,0,.05))}.MvcCard.MvcCard--fillParent[data-v-bdf05ab5]{display:flex;flex-direction:column;align-self:stretch;min-height:0;height:100%}.MvcCard .header[data-v-bdf05ab5]{position:relative;padding:.75rem 1rem;border-block-end:var(--card-header-border);z-index:2;flex-shrink:0;-webkit-user-select:none;user-select:none}.MvcCard .header .headerTitle[data-v-bdf05ab5]{margin:0;font-size:.875rem;font-weight:700;color:var(--color-txt-h2)}.MvcCard .body[data-v-bdf05ab5]{position:relative;padding:1rem;min-height:1rem;overflow:auto;z-index:1}.MvcCard.MvcCard--fillParent .body[data-v-bdf05ab5]{flex:1 1 auto;min-height:0}.MvcCard .footer[data-v-bdf05ab5]{position:relative;padding:.75rem 1rem;border-block-start:var(--card-header-border);z-index:2;flex-shrink:0;-webkit-user-select:none;user-select:none}.dragArea[data-v-3bd55143]{position:absolute;top:0;left:0;bottom:0;width:1rem;display:flex;align-items:center;z-index:99}.dragArea .dragHandle[data-v-3bd55143]{display:flex;align-items:center;width:.875rem;height:1.75rem;background-color:var(--color-border);border-radius:0 .125rem .125rem 0;opacity:0;cursor:ew-resize;z-index:99;transition:var(--trans-all)}.dragArea .dragHandle[data-v-3bd55143]:hover,.dragArea .dragHandle.active[data-v-3bd55143]{opacity:1;color:var(--color-white);background-color:var(--color-primary);box-shadow:.25rem 0 .5rem var(--color-dark1)}.dragArea:hover .dragHandle[data-v-3bd55143]{opacity:1}.MvcDrawerBody[data-v-33acb7b3]{position:relative;width:100%;overflow:hidden}.drawerFooter[data-v-33acb7b3]{background-image:linear-gradient(to top,50% var(--color-white),100 transparent)}.FrameTab .tabShadow[data-v-e9bf80ea]{position:absolute;top:100%;left:0;right:0;height:.5rem;background-image:linear-gradient(to bottom,rgba(0,0,0,.05) 0,transparent 100%);opacity:0;transition:opacity var(--trans)}.FrameTab .tabShadow.visible[data-v-e9bf80ea]{opacity:1}.FrameTab .tabArea[data-v-e9bf80ea]:after{content:"";position:absolute;top:2.175rem;left:0;right:0;border-bottom:var(--border-d);z-index:1}.FrameTab .tabItem[data-v-e9bf80ea]{margin-block-end:-1px;border:var(--border-d);border-block-end-color:transparent;border-radius:.25rem .25rem 0 0;background-color:var(--color-white);opacity:.5;overflow:hidden;transition:var(--trans-all)}.FrameTab .tabItem[data-v-e9bf80ea]:hover{opacity:.8}.FrameTab .tabItem.active[data-v-e9bf80ea]{opacity:1;border-block-end-color:var(--color-white);z-index:3;background-color:var(--color-bg-page-header)}.FrameTab .tabItem .abs[data-v-e9bf80ea]{transition:var(--trans-all);transform:translate(2.25rem)}.FrameTab .tabItem .abs[data-v-e9bf80ea]:hover{opacity:.8;color:var(--color-primary)}.FrameTab .tabItem.hoverItem.active[data-v-e9bf80ea]{padding-inline-end:2.25rem}.FrameTab .tabItem.hoverItem.active .abs[data-v-e9bf80ea]{transform:translate(-.375rem)}.FrameTab .tabItem.hoverItem[data-v-e9bf80ea]:hover{padding-inline-end:2.25rem}.FrameTab .tabItem.hoverItem:hover .abs[data-v-e9bf80ea]{transform:translate(-.375rem)}.FrameTab .tabItem.disabled[data-v-e9bf80ea]{opacity:.7;cursor:not-allowed}.FrameMenu[data-v-49ba8b1f]{width:12rem;background-color:var(--color-bg-menu);transition:width .3s ease-out;overflow:hidden}.FrameMenu[data-v-49ba8b1f]:after{content:"";position:absolute;top:0;right:0;bottom:0;border-right:var(--border-d)}.FrameMenu:hover .logomini[data-v-49ba8b1f]{opacity:.1}.FrameMenu:hover .collapseArea[data-v-49ba8b1f]{display:block!important}.FrameMenu .LogoArea .logomini[data-v-49ba8b1f]{display:none}.FrameMenu .collapseArea[data-v-49ba8b1f]{top:50%;right:1rem;height:1.25rem;width:1.24rem;transform:translateY(-50%)}.FrameMenu .MenuArea[data-v-49ba8b1f]{height:calc(100vh - 8rem)}.FrameMenu .MenuArea .menuItem[data-v-49ba8b1f]{height:2.75rem;transition:var(--trans-all)}.FrameMenu .MenuArea .menuItem[data-v-49ba8b1f]:hover{background-color:var(--color-bg-menu-item-hover)}.FrameMenu .MenuArea .menuItem.active[data-v-49ba8b1f]:hover{background-color:var(--color-primary);opacity:.8}.FrameMenu .MenuArea .menuItem.active .itemIcon[data-v-49ba8b1f]{color:var(--color-on-primary-text)}.FrameMenu .MenuArea .childrenItem[data-v-49ba8b1f]{transition:var(--trans-all)}.FrameMenu .MenuArea .childrenItem[data-v-49ba8b1f]:hover{background-color:var(--color-bg-menu-children-item-hover)}.FrameMenu .MenuArea .childrenItem.active[data-v-49ba8b1f]:hover{background-color:var(--color-primary);opacity:.8}.FrameMenu .MenuArea .itemChildrenArea[data-v-49ba8b1f]{background-color:var(--color-bg-menu-children)}.FrameMenu .MenuArea .itemTitle.active[data-v-49ba8b1f]{color:var(--color-on-primary-text)}.FrameMenu.collapse[data-v-49ba8b1f]{width:4rem}.FrameMenu.collapse .collapseArea[data-v-49ba8b1f]{right:1.5rem;display:none}.FrameMenu.collapse .LogoArea .logo[data-v-49ba8b1f]{display:none}.FrameMenu.collapse .LogoArea .logomini[data-v-49ba8b1f]{display:block;transition:opacity var(--trans)}.FrameMenu.collapse .MenuArea .menuItem.activeChild[data-v-49ba8b1f]{position:relative;isolation:isolate}.FrameMenu.collapse .MenuArea .menuItem.activeChild[data-v-49ba8b1f]:after{content:"";position:absolute;top:0;left:0;width:100%;height:100%;opacity:.25;background-color:var(--color-primary);transform:translateY(20%);pointer-events:none;filter:blur(.625rem);z-index:-1}.FrameMenu.collapse .MenuArea .itemChildrenArea[data-v-49ba8b1f]{display:none}.FrameFooter[data-v-a471ccbf]{display:flex;height:3rem;padding:.5rem 1rem;gap:.5rem;font-size:14px}.FrameRightMenu[data-v-388539e5]{position:fixed;z-index:3000;min-width:10rem;max-width:calc(100vw - 1rem);padding:.25rem;border:var(--border-d);border-radius:.375rem;background-color:var(--color-bg-menu);box-shadow:0 .75rem 2rem #00000024,0 .125rem .5rem #00000014;color:var(--color-txt-p);-webkit-user-select:none;user-select:none}.FrameRightMenu .menuItem[data-v-388539e5]{display:flex;align-items:center;gap:.5rem;width:100%;min-height:2rem;padding:0 .75rem;border:none;border-radius:.25rem;background:transparent;color:inherit;cursor:pointer;font-size:.75rem;line-height:1;text-align:left;transition:var(--trans-all);white-space:nowrap}.FrameRightMenu .menuItem[data-v-388539e5]:hover{background-color:var(--color-bg-menu-item-hover);color:var(--color-primary)}.FrameRightMenu .menuItem.disabled[data-v-388539e5]{color:var(--color-txt-gray);cursor:not-allowed;opacity:.6}.FrameRightMenu .menuItem.disabled[data-v-388539e5]:hover{background:transparent;color:var(--color-txt-gray)}.FrameRightMenu .menuIcon[data-v-388539e5]{flex-shrink:0;width:1rem;font-size:.875rem;line-height:1;text-align:center}.FrameRightMenu .menuLabel[data-v-388539e5]{overflow:hidden;text-overflow:ellipsis}.FrameRightMenu .menuDivider[data-v-388539e5]{height:1px;margin:.25rem;background-color:var(--color-border)}.FrameRightMenuFade-enter-active[data-v-388539e5],.FrameRightMenuFade-leave-active[data-v-388539e5]{transition:opacity var(--trans),transform var(--trans)}.FrameRightMenuFade-enter-from[data-v-388539e5],.FrameRightMenuFade-leave-to[data-v-388539e5]{opacity:0;transform:translateY(-.125rem)}.MvcFrame[data-v-5ae195c7]{display:flex}.MvcFrame .PageArea[data-v-5ae195c7]{flex-grow:1;position:relative;min-height:0}.MvcFieldInput.isNoBreak[data-v-20ebb61b] .el-input__wrapper,.MvcFieldInput.isNoBreak[data-v-20ebb61b] .el-input__inner,.MvcFieldInput.isNoBreak[data-v-20ebb61b] .el-input-group__prepend,.MvcFieldInput.isNoBreak[data-v-20ebb61b] .el-input-group__append{white-space:nowrap}.MvcList[data-v-cdd3bad5]{display:flex;flex-direction:column;width:100%;min-height:0;flex:1 1 auto;height:100%;-webkit-user-select:none;user-select:none}.MvcList .listViewport[data-v-cdd3bad5]{position:relative;flex:1 1 auto;min-height:0;overflow:hidden}.MvcList .listScroll[data-v-cdd3bad5]{position:relative;box-sizing:border-box;height:100%;max-height:100%}.MvcList .listItem[data-v-cdd3bad5]{padding:.5rem;margin-block-end:.25rem}.MvcList .listItem[data-v-cdd3bad5]:last-child{margin-block-end:0}.MvcList .listItem[data-v-cdd3bad5]{font-size:.75rem;line-height:1.5;color:var(--color-txt-p);background:transparent;border-radius:.25rem;cursor:pointer;transition:var(--trans-all)}.MvcList .listItem[data-v-cdd3bad5]:hover:not(.active):not(.isDisabled){background:var(--color-bg-menu-item-hover)}.MvcList .listItem.active[data-v-cdd3bad5]{position:sticky!important;top:0;color:var(--color-on-primary-text);z-index:9;-webkit-backdrop-filter:blur(.5rem);backdrop-filter:blur(.5rem);position:relative;isolation:isolate}.MvcList .listItem.active[data-v-cdd3bad5]:after{content:"";position:absolute;top:0;left:0;width:100%;height:100%;opacity:.25;background-color:var(--color-primary);transform:translateY(20%);pointer-events:none;filter:blur(.625rem);z-index:-1}.MvcList .listItem.isDisabled[data-v-cdd3bad5]{opacity:.5;cursor:not-allowed}.MvcList.sizeSmall .listItem[data-v-cdd3bad5]{padding:.25rem .375rem;margin-block-end:.125rem;font-size:.6875rem;border-radius:.1875rem}.MvcList.sizeSmall .listItem[data-v-cdd3bad5]:last-child{margin-block-end:0}.MvcList.sizeLarge .listItem[data-v-cdd3bad5]{padding:.625rem .75rem;margin-block-end:.5rem;font-size:.875rem;border-radius:.375rem}.MvcList.sizeLarge .listItem[data-v-cdd3bad5]:last-child{margin-block-end:0}.loadingFade-enter-active[data-v-305a4676],.loadingFade-leave-active[data-v-305a4676]{transition:opacity var(--trans)}.loadingFade-enter-from[data-v-305a4676],.loadingFade-leave-to[data-v-305a4676]{opacity:0}.MvcLoading[data-v-305a4676]{pointer-events:auto;-webkit-backdrop-filter:blur(.25rem);backdrop-filter:blur(.25rem)}.loaderTxt[data-v-305a4676]{max-width:15rem;word-break:break-word}.MvcLogin[data-v-6faa6992]{background-color:var(--color-bg-body)}.panelWrap[data-v-6faa6992]{background-color:var(--color-bg-menu);box-shadow:0 .25rem 1rem #0000000f}.qr-dingtalk[data-v-6faa6992]{background:#0089ff}.qr-feishu[data-v-6faa6992]{background:#3370ff}.qr-wechat[data-v-6faa6992]{background:#07c160}.oauthGoogle[data-v-6faa6992]{display:flex;align-items:center;justify-content:center;gap:.75rem;min-height:2.5rem;padding:.5rem 1rem;box-sizing:border-box;background:#fff;border:1px solid #747775;border-radius:.25rem;font-family:Roboto,system-ui,-apple-system,Segoe UI,sans-serif;font-size:.875rem;font-weight:500;line-height:1.25;color:#1f1f1f;cursor:pointer;transition:var(--trans-all)}.oauthGoogle[data-v-6faa6992]:hover:not(:disabled){box-shadow:0 1px 2px #3c40434d,0 1px 3px 1px #3c404326}.oauthGoogle[data-v-6faa6992]:disabled{opacity:.38;cursor:not-allowed}.oauthGoogle[data-v-6faa6992]:focus-visible{outline:2px solid #4285f4;outline-offset:2px}.oauthApple[data-v-6faa6992]{display:flex;align-items:center;justify-content:center;gap:.5rem;min-height:2.5rem;padding:.5rem 1rem;box-sizing:border-box;background:#000;border:none;border-radius:.375rem;font-family:-apple-system,BlinkMacSystemFont,SF Pro Text,Helvetica Neue,sans-serif;font-size:1.0625rem;font-weight:600;line-height:1.2;color:#fff;cursor:pointer;transition:var(--trans-all)}.oauthApple[data-v-6faa6992]:hover:not(:disabled){opacity:.88}.oauthApple[data-v-6faa6992]:disabled{opacity:.3;cursor:not-allowed}.oauthApple[data-v-6faa6992]:focus-visible{outline:2px solid #fff;outline-offset:2px}.MvcMention[data-v-a20420a4]{width:100%}.MvcFieldMention.isMaterialLabel:not(.isTextarea) .MvcFieldLabel[data-v-a20420a4]{background-color:var(--mv-field-label-bg)}.MvcNote[data-v-e3e84cc8]{position:relative;padding:.5rem 1rem;background-color:var(--color-bg-menu);font-size:.875rem;border-radius:0 .5rem .5rem 0}.MvcNote[data-v-e3e84cc8]:hover:before{opacity:1}.MvcNote[data-v-e3e84cc8]:before{content:"";position:absolute;top:0;left:0;right:0;bottom:0;opacity:0;pointer-events:none;border-radius:0 .5rem .5rem 0;border:1px solid var(--color-gray);transition:opacity var(--trans)}.MvcPage[data-v-060130ad]{position:relative;display:flex;flex-direction:column;min-height:calc(100vh - 3rem);z-index:1}.MvcPage .PageHeader[data-v-060130ad]{position:sticky;display:flex;align-items:center;justify-content:space-between;padding:.5rem 1rem;min-height:4rem;border-bottom:var(--border-d);background-color:var(--color-bg-page-header);z-index:9}.MvcPage .PageHeader .PageHeaderTitle[data-v-060130ad]{margin:0}.MvcPage .PageHeader .PageHeaderSubTitle[data-v-060130ad]{margin:0;font-size:.875rem;color:var(--color-txt-p)}.MvcPage .PageBody[data-v-060130ad]{position:relative;display:flex;flex-direction:column;flex:1 1 auto;min-height:0;background-color:var(--color-bg-page-body);z-index:2}.MvcPage.hasTab .PageHeader[data-v-060130ad]{top:2.25rem}.ghost[data-v-1927ce52]{cursor:grabbing}.typeItem[data-v-1927ce52]{cursor:pointer}.typeItem[data-v-1927ce52]:hover{background-color:var(--mg-gray3)}.typeItem.active[data-v-1927ce52]{color:var(--mg-white);background-color:var(--mg-primary)}.columnItem[data-v-1927ce52]:hover{background-color:var(--mg-gray3)}.columnItem .fixedBtn[data-v-1927ce52]{cursor:pointer}.columnItem .fixedBtn[data-v-1927ce52]:hover{background-color:var(--mg-primary1)}.MainTable[data-v-f79bf58d]{max-width:calc(100% + 2px);width:calc(100% + 2px);margin:0 -1px}[data-v-467a9b5a] .el-textarea__inner{box-sizing:border-box}.MvcFieldTextarea>.el-input__count[data-v-467a9b5a]{position:absolute;inset-inline-end:.75rem;bottom:.375rem;z-index:1;color:var(--el-text-color-secondary);font-size:.75rem;line-height:1;pointer-events:none}.ghost[data-v-73161392]{cursor:grabbing}.typeItem[data-v-73161392]{cursor:pointer}.typeItem[data-v-73161392]:hover{background-color:var(--mg-gray3)}.typeItem.active[data-v-73161392]{color:var(--color-txt-white);background-color:var(--color-bg-menu-item-active);position:relative;isolation:isolate}.typeItem.active[data-v-73161392]:after{content:"";position:absolute;top:0;left:0;width:100%;height:100%;opacity:.25;background-color:var(--color-primary);transform:translateY(20%);pointer-events:none;filter:blur(.625rem);z-index:-1}.columnItem[data-v-73161392]:hover{background-color:var(--color-bg-menu-item-hover)}.columnItem .fixedBtn[data-v-73161392]{cursor:pointer}.columnItem .fixedBtn[data-v-73161392]:hover{background-color:var(--mg-primary1)}.tableFooter[data-v-a13ba899]{margin-block-start:-1px;border-block-start:var(--border-d);border-radius:0 0 .5rem .5rem}.vtableHost[data-v-a13ba899]{min-height:10rem;background-color:var(--color-white)}.vtableHostFill[data-v-a13ba899]{height:100%}.treeCellLoadMask[data-v-a13ba899]{z-index:10;box-sizing:border-box;pointer-events:auto;cursor:wait;background-color:#ffffffb8;border-radius:.125rem}.treeCellLoadMask .loadMaskIcon[data-v-a13ba899]{pointer-events:none}
package/dist/vendor.js CHANGED
@@ -9966,7 +9966,7 @@ const Se = (a) => {
9966
9966
  ], 10, fn))), 128))
9967
9967
  ], 16));
9968
9968
  }
9969
- }), gn = /* @__PURE__ */ ne(_n, [["__scopeId", "data-v-085c7e56"]]), yn = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
9969
+ }), gn = /* @__PURE__ */ ne(_n, [["__scopeId", "data-v-301fcbf7"]]), yn = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
9970
9970
  __proto__: null,
9971
9971
  default: gn
9972
9972
  }, Symbol.toStringTag, { value: "Module" })), An = {
@@ -13958,7 +13958,7 @@ const Wr = (a, o = {}) => {
13958
13958
  }, qr = {
13959
13959
  name: "Matt Avias Frame",
13960
13960
  copyright: "©2026",
13961
- version: "1.1.31",
13961
+ version: "1.1.33",
13962
13962
  author: "Matt Avias",
13963
13963
  date: "2026-02-26",
13964
13964
  /** 默认语言 key,与 `$getLang`、localStorage `lang` 一致;业务在 app.use(mvframe, { config }) 里覆盖 */
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "mvframe",
3
3
  "packageManager": "yarn@4.4.1",
4
- "version": "1.1.31",
4
+ "version": "1.1.33",
5
5
  "author": "matt avis",
6
6
  "main": "./dist/index.js",
7
7
  "module": "./dist/index.js",
@@ -3,17 +3,34 @@
3
3
  * 宿主 Vite 工程:打包后写入与 mstar 一致的 `serve.json`(SPA 回写 index.html)。
4
4
  *
5
5
  * 在宿主 `package.json` 中增加:`"b": "mvframe-b"`
6
- * 然后执行 `yarn b` `yarn b [outDir] [-t|-p]`。
6
+ * 然后执行 `yarn b`、`yarn b pre`、`yarn b pd`,或传入自定义 mode / outDir
7
7
  *
8
8
  * - 默认:--mode development,输出目录 `dev`
9
9
  * - `-t`:--mode test,输出 `test`
10
- * - `-p`:--mode production,输出 `pre`(Vite 环境为 production,对应 .env.production*)
11
- * - 一个位置参数:自定义输出目录(与 -t / -p 同用时,以 -t / -p 为准)
10
+ * - `-p`:兼容旧行为,--mode production,输出 `pre`
11
+ * - `pre` / `--pre`:--mode pre,输出 `pre`,加载 `.env.pre*`
12
+ * - `pd` / `--pd`:--mode production,输出 `pd`,加载 `.env.production*`
13
+ * - `--mode <mode>` / `--outDir <dir>`:自定义 Vite mode 与输出目录
14
+ * - 一个普通位置参数:兼容旧行为,作为自定义输出目录
12
15
  */
13
16
  const { spawnSync } = require("child_process");
14
17
  const fs = require("fs");
15
18
  const path = require("path");
16
19
  const { copyFlagAssetsTo } = require("./flag-assets.js");
20
+ const USAGE = `用法:
21
+ mvframe-b
22
+ mvframe-b pre | --pre
23
+ mvframe-b pd | --pd
24
+ mvframe-b [outDir] [-t|-p]
25
+ mvframe-b [--mode <mode>] [--outDir <dir>]
26
+
27
+ 快捷模式:
28
+ pre / --pre mode=pre, outDir=pre
29
+ pd / --pd mode=production, outDir=pd
30
+
31
+ 兼容模式:
32
+ -t mode=test, outDir=test
33
+ -p mode=production, outDir=pre`;
17
34
  const SERVE_JSON = `{
18
35
  "rewrites": [{
19
36
  "source": "**",
@@ -21,48 +38,88 @@ const SERVE_JSON = `{
21
38
  }]
22
39
  }`;
23
40
 
24
- function parseArgs(argv) {
41
+ function argumentError(message) {
42
+ const error = new Error(`${message}\n\n${USAGE}`);
43
+ error.name = "MvframeBuildArgumentError";
44
+ return error;
45
+ }
46
+
47
+ function readOptionValue(args, index, option) {
48
+ const value = args[index + 1];
49
+ if (!value || value.startsWith("-")) {
50
+ throw argumentError(`[mvframe-b] ${option} 缺少参数值`);
51
+ }
52
+ return value;
53
+ }
54
+
55
+ function parseArgs(argv, logger = console) {
25
56
  const args = argv.slice(2);
26
57
  let mode = "development";
27
58
  let outDir = "dev";
28
- let preset = false;
59
+ let preset = "";
60
+ let explicitOutDir = false;
61
+ let help = false;
29
62
  const positional = [];
30
63
 
31
- for (const a of args) {
32
- if (a === "-t") {
64
+ for (let index = 0; index < args.length; index += 1) {
65
+ const arg = args[index];
66
+
67
+ if (arg === "-h" || arg === "--help") {
68
+ help = true;
69
+ } else if (arg === "-t") {
33
70
  mode = "test";
34
71
  outDir = "test";
35
- preset = true;
36
- } else if (a === "-p") {
72
+ preset = "-t";
73
+ } else if (arg === "-p") {
37
74
  mode = "production";
38
75
  outDir = "pre";
39
- preset = true;
40
- } else if (a.startsWith("-")) {
41
- console.error(`[mvframe-b] 未知参数: ${a}`);
42
- process.exit(1);
76
+ preset = "-p";
77
+ } else if (arg === "pre" || arg === "--pre") {
78
+ mode = "pre";
79
+ outDir = "pre";
80
+ preset = "pre";
81
+ } else if (arg === "pd" || arg === "--pd") {
82
+ mode = "production";
83
+ outDir = "pd";
84
+ preset = "pd";
85
+ } else if (arg === "--mode") {
86
+ mode = readOptionValue(args, index, "--mode");
87
+ index += 1;
88
+ } else if (arg.startsWith("--mode=")) {
89
+ mode = arg.slice("--mode=".length);
90
+ if (!mode) throw argumentError("[mvframe-b] --mode 缺少参数值");
91
+ } else if (arg === "--outDir" || arg === "--out-dir") {
92
+ outDir = readOptionValue(args, index, arg);
93
+ explicitOutDir = true;
94
+ index += 1;
95
+ } else if (arg.startsWith("--outDir=") || arg.startsWith("--out-dir=")) {
96
+ outDir = arg.slice(arg.indexOf("=") + 1);
97
+ if (!outDir) throw argumentError("[mvframe-b] --outDir 缺少参数值");
98
+ explicitOutDir = true;
99
+ } else if (arg.startsWith("-")) {
100
+ throw argumentError(`[mvframe-b] 未知参数: ${arg}`);
43
101
  } else {
44
- positional.push(a);
102
+ positional.push(arg);
45
103
  }
46
104
  }
47
105
 
48
106
  if (positional.length > 1) {
49
- console.error(
50
- "[mvframe-b] 用法: yarn b [outDir] [-t|-p]\n 默认: outDir=dev, mode=development; -t: test/test; -p: pre/production",
107
+ throw argumentError(
108
+ `[mvframe-b] 最多只能传入一个自定义输出目录: ${positional.join(" ")}`,
51
109
  );
52
- process.exit(1);
53
110
  }
54
111
 
55
112
  if (positional.length === 1) {
56
- if (preset) {
57
- console.warn(
58
- `[mvframe-b] 已使用 -t/-p,忽略输出目录参数 "${positional[0]}",实际输出: ${outDir}`,
113
+ if (preset || explicitOutDir) {
114
+ logger.warn(
115
+ `[mvframe-b] 已指定 ${preset || "--outDir"},忽略输出目录参数 "${positional[0]}",实际输出: ${outDir}`,
59
116
  );
60
117
  } else {
61
118
  outDir = positional[0];
62
119
  }
63
120
  }
64
121
 
65
- return { mode, outDir };
122
+ return { mode, outDir, help };
66
123
  }
67
124
 
68
125
  /**
@@ -93,11 +150,39 @@ function copyFlagAssets(outAbs) {
93
150
  console.log(`[mvframe-b] 已复制 ${path.relative(outAbs, dest)}`);
94
151
  }
95
152
 
153
+ function projectNameFrom(cwd) {
154
+ return path.basename(path.resolve(cwd));
155
+ }
156
+
96
157
  function main() {
97
158
  const cwd = process.cwd();
98
- const { mode, outDir } = parseArgs(process.argv);
159
+ let options;
160
+
161
+ try {
162
+ options = parseArgs(process.argv);
163
+ } catch (error) {
164
+ if (error?.name === "MvframeBuildArgumentError") {
165
+ console.error(error.message);
166
+ process.exit(1);
167
+ }
168
+ throw error;
169
+ }
170
+
171
+ if (options.help) {
172
+ console.log(USAGE);
173
+ return;
174
+ }
175
+
176
+ const { mode, outDir } = options;
177
+ const projectName = projectNameFrom(cwd);
99
178
  const viteEntry = resolveViteCli(cwd);
100
- const env = { ...process.env, NODE_ENV: "production" };
179
+ const env = {
180
+ ...process.env,
181
+ NODE_ENV: "production",
182
+ MVFRAME_PROJECT_NAME: projectName,
183
+ };
184
+
185
+ console.log(`[mvframe-b] 项目: ${projectName}; mode: ${mode}; outDir: ${outDir}`);
101
186
  const child = spawnSync(
102
187
  process.execPath,
103
188
  [viteEntry, "build", "--outDir", outDir, "--mode", mode],
@@ -114,4 +199,10 @@ function main() {
114
199
  console.log(`[mvframe-b] 已写入 ${path.relative(cwd, servePath)}`);
115
200
  }
116
201
 
117
- main();
202
+ if (require.main === module) main();
203
+
204
+ module.exports = {
205
+ parseArgs,
206
+ projectNameFrom,
207
+ USAGE,
208
+ };