feat: 提交
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
mes-processors-libs-*.tgz
|
16
.vscode/launch.json
vendored
Normal file
16
.vscode/launch.json
vendored
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
// 使用 IntelliSense 了解相关属性。
|
||||||
|
// 悬停以查看现有属性的描述。
|
||||||
|
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
|
||||||
|
{
|
||||||
|
"type": "chrome",
|
||||||
|
"request": "launch",
|
||||||
|
"name": "针对 localhost 启动 Chrome",
|
||||||
|
"url": "http://localhost:8080",
|
||||||
|
"webRoot": "${workspaceFolder}"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
5
.vscode/settings.json
vendored
Normal file
5
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
// libs工作区必须使用相对路径进行导入!
|
||||||
|
"typescript.preferences.importModuleSpecifier": "relative",
|
||||||
|
"javascript.preferences.importModuleSpecifier": "relative"
|
||||||
|
}
|
111
README.md
Normal file
111
README.md
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
# @mes-processors/libs
|
||||||
|
|
||||||
|
这是一个用于处理MES(制造执行系统)相关工作流的处理器类库。
|
||||||
|
|
||||||
|
## 安装
|
||||||
|
|
||||||
|
在内网环境下执行以下脚本进行安装
|
||||||
|
|
||||||
|
```sh
|
||||||
|
pnpm add http://gitea.cf/MES-FE/mes-packages/releases/download/0.1/mes-processors-libs-0.1.0.tgz
|
||||||
|
```
|
||||||
|
|
||||||
|
> [!CAUTION]
|
||||||
|
> 在安装库之前,请确认以下信息:
|
||||||
|
>
|
||||||
|
> - 该库发布于内网gitea仓库的release中,所以你需要提前在gitea中进行登录,并确保你有该仓库的访问权限。
|
||||||
|
> - 库的版本需要手动进行控制,注意上述链接中的版本信息,在安装前需要主动修改版本号,请前往<http://gitea.cf/MES-FE/mes-packages/releases>来确认最新版本。
|
||||||
|
|
||||||
|
## 使用
|
||||||
|
|
||||||
|
该库提供了MES/iMES公用的处理器,并已配置为导出项,请参考以下Typescript代码进行使用:
|
||||||
|
|
||||||
|
```ts
|
||||||
|
// 引入矩形优化处理器
|
||||||
|
import { RectLayoutProcConfig } from 'cut-abstractions';
|
||||||
|
import { RectLayoutProc } from '@mes-processors/libs';
|
||||||
|
|
||||||
|
// 实例化处理器
|
||||||
|
const proc = new RectLayoutProc();
|
||||||
|
// 构建上下文f proc.exec>[0] = {
|
||||||
|
input: testObj,
|
||||||
|
params: new RectLayoutProcConfig()
|
||||||
|
};
|
||||||
|
// 异步执行
|
||||||
|
const ctx: Parameters<typeo
|
||||||
|
await proc.exec(ctx);
|
||||||
|
|
||||||
|
// 从上下文对象中获取输出内容
|
||||||
|
console.log("RESULT: ", ctx.output);
|
||||||
|
```
|
||||||
|
|
||||||
|
## Q&A
|
||||||
|
|
||||||
|
### 运行某些处理器时出现404(Not Found)错误
|
||||||
|
|
||||||
|
**错误描述**
|
||||||
|
当执行处理器时,出现类似下面的错误:
|
||||||
|
|
||||||
|
```log
|
||||||
|
GET http://localhost:5173/node_modules/.vite/deps/assets/RectOptimizeMachine.worker-BO2fmpVH.js 404 (Not Found)
|
||||||
|
```
|
||||||
|
|
||||||
|
**根本原因**
|
||||||
|
该库中某些处理器使用了Web Worker来实现多线程异步处理(例如矩形优化处理器)。
|
||||||
|
|
||||||
|
Web Worker为单独打包的资产文件,但某些打包工具可能会对`node_modules`中的依赖进行预构建来提高性能,如果Worker文件被视为了预构建的一部分,就可能导致处理器无法正确地处理Worker文件的相对引用路径,导致在运行时尝试从`node_modules/.vite/deps/assets/`这样的内部路径加载,而这个路径在实际部署或服务时是不存在的。
|
||||||
|
|
||||||
|
**解决方法**
|
||||||
|
在打包工具中对该库进行配置,禁用对该库的优化和预构建,以`vite`为例:
|
||||||
|
```ts
|
||||||
|
// vite.config.ts
|
||||||
|
...
|
||||||
|
optimizeDeps: {
|
||||||
|
exclude: ["@mes-processors/libs"] // 从optimizeDeps中排除该库
|
||||||
|
}
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
## 开发
|
||||||
|
|
||||||
|
### 发布并打包项目
|
||||||
|
|
||||||
|
```sh
|
||||||
|
pnpm build
|
||||||
|
pnpm pack
|
||||||
|
```
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> 发布前记得更改版本号
|
||||||
|
|
||||||
|
### 约定
|
||||||
|
|
||||||
|
**目录**
|
||||||
|
|
||||||
|
```
|
||||||
|
src
|
||||||
|
├── modules 项目模块分组
|
||||||
|
├── processors 处理器
|
||||||
|
└── utils 公用的工具类
|
||||||
|
```
|
||||||
|
|
||||||
|
**导出和打包**
|
||||||
|
|
||||||
|
- 编写的处理器请在`src/index.ts`中进行导出
|
||||||
|
- 编写的工具类请在`src/utils/index.ts`中进行导出
|
||||||
|
- 在打包时项目仅会对`src/index.ts`进行打包,工具类相关模块不会进行打包
|
||||||
|
- 关于打包相关明细请自行查看相关文件
|
||||||
|
- [package.json](package.json)
|
||||||
|
- [vite.config.ts](vite.config.ts)
|
||||||
|
|
||||||
|
> [!WARNING]
|
||||||
|
> 在该工作区中编写模块时,禁止使用绝对路径进行导入,禁止在`tsconfig.json`或`vite.config.ts`中添加"@"别名,所有导入语句请使用相对路径进行引入,否则会因monorepo内部导入混乱导致模块解析失败。
|
||||||
|
|
||||||
|
### 测试
|
||||||
|
|
||||||
|
项目使用[Vitest](http://vitest.dev/)作为单元测试框架,若要对TS文件编写单元测试,请在文件的同目录下创建`<文件名>.test.ts`文件,并遵循Vitest规范编写单元测试。
|
||||||
|
|
||||||
|
要执行单元测试,请运行下面的命令:
|
||||||
|
```sh
|
||||||
|
pnpm test
|
||||||
|
```
|
BIN
mes-cutorder-libs-0.1.0.tgz
Normal file
BIN
mes-cutorder-libs-0.1.0.tgz
Normal file
Binary file not shown.
38
package.json
Normal file
38
package.json
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
{
|
||||||
|
"name": "@mes-cutorder/libs",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"description": "",
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"build": "vite build",
|
||||||
|
"test": "vitest",
|
||||||
|
"check": "tsc --noEmit --skipLibCheck -p tsconfig.app.json"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"dist",
|
||||||
|
"package.json",
|
||||||
|
"src",
|
||||||
|
"tsconfig.json",
|
||||||
|
"tsconfig.app.json",
|
||||||
|
"tsconfig.node.json"
|
||||||
|
],
|
||||||
|
"exports": {
|
||||||
|
".": "./src/index.ts",
|
||||||
|
"./utils": "./src/utils/index.ts"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"cut-abstractions": "http://gitea.cf/MES-FE/cut-abstractions/releases/download/0.1/cut-abstractions-0.1.9.tgz"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/node": "^24.0.10",
|
||||||
|
"typescript": "~5.8.3",
|
||||||
|
"vite": "^7.0.0",
|
||||||
|
"vite-plugin-dts": "^4.5.4",
|
||||||
|
"vite-plugin-node-polyfills": "^0.24.0",
|
||||||
|
"vite-plugin-resolve": "^2.5.2",
|
||||||
|
"vitest": "^3.2.4"
|
||||||
|
},
|
||||||
|
"keywords": [],
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC"
|
||||||
|
}
|
2596
pnpm-lock.yaml
generated
Normal file
2596
pnpm-lock.yaml
generated
Normal file
File diff suppressed because it is too large
Load Diff
8
src/index.ts
Normal file
8
src/index.ts
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
/**
|
||||||
|
* @package @mes-processors/libs
|
||||||
|
* @author LX
|
||||||
|
* @description 工作流处理器类库,在这个文件中使用导出时,不要在路径中使用'@',否则模块无法加载
|
||||||
|
*/
|
||||||
|
|
||||||
|
// CutOrder
|
||||||
|
export * from "./processors/cutOrder/CutOrder";
|
2
src/modules/README.md
Normal file
2
src/modules/README.md
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
### react-layout
|
||||||
|
矩形优化算法(陈总新优化)
|
1523
src/modules/cutOrder/KLSCclass.ts
Normal file
1523
src/modules/cutOrder/KLSCclass.ts
Normal file
File diff suppressed because it is too large
Load Diff
160
src/processors/cutOrder/CutOrder.ts
Normal file
160
src/processors/cutOrder/CutOrder.ts
Normal file
@@ -0,0 +1,160 @@
|
|||||||
|
import { ProcessorBase, ProcessorContext, RectLayoutProcOutput, LayoutResult, ConfigBase } from "cut-abstractions";
|
||||||
|
import { KLSC, YH_bang } from "../../modules/cutOrder/KLSCclass";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
export class CutorderConfig extends ConfigBase {
|
||||||
|
// [key:string] : any
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 开料顺序 --新算法
|
||||||
|
*/
|
||||||
|
export class CutOrderProc extends ProcessorBase<CutOrderInput, CutorderOutput, CutorderConfig> {
|
||||||
|
get name(): string {
|
||||||
|
return 'rect-layout';
|
||||||
|
}
|
||||||
|
get version(): string {
|
||||||
|
return '1.0.0';
|
||||||
|
}
|
||||||
|
exec(context: ProcessorContext<CutOrderInput, CutorderOutput, CutorderConfig>): Promise<void> | void {
|
||||||
|
return new Promise(async (resolve, reject) => {
|
||||||
|
try {
|
||||||
|
|
||||||
|
/** 验证入参 */
|
||||||
|
let check = this.checkInput(context?.input)
|
||||||
|
if (check.isOk == false) {
|
||||||
|
reject(check.msg)
|
||||||
|
return
|
||||||
|
} else {
|
||||||
|
let bangs: YH_bang[] = []
|
||||||
|
let blocks = new Array()
|
||||||
|
let length = context.input?.blocks.length || 0
|
||||||
|
let beginId = 0;
|
||||||
|
let dt = context.input?.gap || 6;
|
||||||
|
let k = context.input?.boardWidth || 0;
|
||||||
|
let g = context.input?.boardHeight || 0;
|
||||||
|
|
||||||
|
for (let i = 0; i < length; i++) {
|
||||||
|
let block = context.input?.blocks[i];
|
||||||
|
let bangid = i + 1;
|
||||||
|
let x = block?.x;
|
||||||
|
let y = block?.y;
|
||||||
|
let pbg = block?.pbg;
|
||||||
|
let pbk = block?.pbk;
|
||||||
|
blocks[bangid] = block;
|
||||||
|
|
||||||
|
if (x == undefined) {
|
||||||
|
reject(`block ${block?.id} x is undefined`)
|
||||||
|
return
|
||||||
|
} else if (y == undefined) {
|
||||||
|
reject(`block ${block?.id} y is undefined`)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
else if (pbg == undefined) {
|
||||||
|
reject(`block ${block?.id} pbg is undefined`)
|
||||||
|
return
|
||||||
|
} else if (pbk == undefined) {
|
||||||
|
reject(`block ${block?.id} pbk is undefined`)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
bangs.push({
|
||||||
|
bangid,
|
||||||
|
line: 0,
|
||||||
|
pbg,
|
||||||
|
pbk,
|
||||||
|
x,
|
||||||
|
y,
|
||||||
|
ishb: false,
|
||||||
|
hb: [],
|
||||||
|
isbig: false,
|
||||||
|
isqg: false,
|
||||||
|
isgr: false,
|
||||||
|
gr: [],
|
||||||
|
grid: -1
|
||||||
|
});
|
||||||
|
}
|
||||||
|
let xdsc = new KLSC(bangs, k, g, dt, 0, 0, 1);
|
||||||
|
let rt = xdsc.SCid;
|
||||||
|
if (rt.length < length) {
|
||||||
|
reject('开料顺序算法异常,计算结果与板件数不匹配。')
|
||||||
|
return
|
||||||
|
};
|
||||||
|
for (let i = 0; i < rt.length; i++) {
|
||||||
|
let bid = rt[i];
|
||||||
|
beginId++;
|
||||||
|
blocks[bid].cutOrder = beginId;
|
||||||
|
}
|
||||||
|
context.output = {
|
||||||
|
blocks
|
||||||
|
}
|
||||||
|
}
|
||||||
|
resolve()
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
reject(error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private checkInput(input?: CutOrderInput) {
|
||||||
|
let info: any = {
|
||||||
|
isOk: true,
|
||||||
|
msg: ''
|
||||||
|
}
|
||||||
|
if (input == undefined) {
|
||||||
|
info.isOk = false
|
||||||
|
info.msg = 'context.input is undefind'
|
||||||
|
} else if (input.blocks == undefined) {
|
||||||
|
info.isOk = false
|
||||||
|
info.msg = 'context.input.blocks is undefind'
|
||||||
|
} else if (input.gap == undefined) {
|
||||||
|
info.isOk = false
|
||||||
|
info.msg = 'context.input.gap is undefind'
|
||||||
|
} else if (input.boardWidth == undefined) {
|
||||||
|
info.isOk = false
|
||||||
|
info.msg = 'context.input.boardWidth is undefind'
|
||||||
|
} else if (input.boardHeight == undefined) {
|
||||||
|
info.isOk = false
|
||||||
|
info.msg = 'context.input.boardHeight is undefind'
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return info
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export type CutOrderInput = {
|
||||||
|
/**开料大板 宽 */
|
||||||
|
boardWidth: number,
|
||||||
|
/** 开料大板 高 */
|
||||||
|
boardHeight: number,
|
||||||
|
/** 刀头大小(含修边) */
|
||||||
|
gap: number,
|
||||||
|
/** 小板数据集合 */
|
||||||
|
blocks: CutorderInputBlock[]
|
||||||
|
}
|
||||||
|
export type CutorderOutput = {
|
||||||
|
blocks: CutorderInputBlock[]
|
||||||
|
}
|
||||||
|
export type CutorderInputBlock = {
|
||||||
|
/** 小板唯一标识 */
|
||||||
|
id: number,
|
||||||
|
/** 排版高 */
|
||||||
|
pbg: number,
|
||||||
|
/** 排版宽 */
|
||||||
|
pbk: number,
|
||||||
|
/** 板件坐标X */
|
||||||
|
x: number,
|
||||||
|
/** 板件坐标y */
|
||||||
|
y: number,
|
||||||
|
/**是否参与合并的板 */
|
||||||
|
ishb?: boolean;
|
||||||
|
/**是否为合并的大板 */
|
||||||
|
isbig?: boolean;
|
||||||
|
/**是否被切掉的板 */
|
||||||
|
isqg?: boolean;
|
||||||
|
}
|
59
src/processors/cutOrder/cutOrder.test.ts
Normal file
59
src/processors/cutOrder/cutOrder.test.ts
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
import { test } from 'vitest'
|
||||||
|
import { CutorderConfig, CutOrderInput, CutorderInputBlock, CutOrderProc } from './CutOrder';
|
||||||
|
|
||||||
|
test('cutOrderTest', async () => {
|
||||||
|
|
||||||
|
let cutOrderProc = new CutOrderProc()
|
||||||
|
let params: CutorderConfig = new CutorderConfig()
|
||||||
|
|
||||||
|
let blocks: CutorderInputBlock[] = [
|
||||||
|
{
|
||||||
|
id: 25030882560,
|
||||||
|
pbg: 598,
|
||||||
|
pbk: 398,
|
||||||
|
x: 3.005,
|
||||||
|
y: 4,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 25030882561,
|
||||||
|
pbg: 598,
|
||||||
|
pbk: 398,
|
||||||
|
x: 3.005,
|
||||||
|
y: 610,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 25030882562,
|
||||||
|
pbg: 598,
|
||||||
|
pbk: 398,
|
||||||
|
x: 3.005,
|
||||||
|
y: 1216,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 25030882563,
|
||||||
|
pbg: 598,
|
||||||
|
pbk: 398,
|
||||||
|
x: 3.005,
|
||||||
|
y: 1821.005,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 25030882564,
|
||||||
|
pbg: 598,
|
||||||
|
pbk: 398,
|
||||||
|
x: 407.015,
|
||||||
|
y: 3.005,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
let input: CutOrderInput = {
|
||||||
|
boardWidth: 1220,
|
||||||
|
boardHeight: 2440,
|
||||||
|
gap: 6,
|
||||||
|
blocks
|
||||||
|
}
|
||||||
|
const context = {
|
||||||
|
input,
|
||||||
|
params
|
||||||
|
}
|
||||||
|
await cutOrderProc.exec(context)
|
||||||
|
console.log(context);
|
||||||
|
})
|
1
src/vite-env.d.ts
vendored
Normal file
1
src/vite-env.d.ts
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
/// <reference types="vite/client" />
|
39
tsconfig.app.json
Normal file
39
tsconfig.app.json
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
{
|
||||||
|
// TODO: Warn: 在进行TS类型检查的时候会检查到workflow工作区中的文件,原因未知
|
||||||
|
"compilerOptions": {
|
||||||
|
"lib": [
|
||||||
|
"ES2020",
|
||||||
|
"ES2021",
|
||||||
|
"ESNext",
|
||||||
|
"DOM",
|
||||||
|
"DOM.Iterable"
|
||||||
|
],
|
||||||
|
"noEmit": true,
|
||||||
|
"target": "esnext",
|
||||||
|
"module": "ESNext",
|
||||||
|
"moduleResolution": "Bundler",
|
||||||
|
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
||||||
|
"baseUrl": ".",
|
||||||
|
"paths": {
|
||||||
|
// 为了保证导入不与被引入项目冲突,不应该配置'@/*'别名
|
||||||
|
"@libs/*": [
|
||||||
|
"./src/*"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
/* Linting */
|
||||||
|
"strict": true,
|
||||||
|
"erasableSyntaxOnly": false,
|
||||||
|
"noFallthroughCasesInSwitch": true,
|
||||||
|
"noUncheckedSideEffectImports": true,
|
||||||
|
"composite": true
|
||||||
|
},
|
||||||
|
"include": [
|
||||||
|
"src/**/*.ts",
|
||||||
|
"src/**/*.tsx",
|
||||||
|
],
|
||||||
|
"exclude": [
|
||||||
|
"src/**/__tests__/*",
|
||||||
|
"dist",
|
||||||
|
"node_modules/**"
|
||||||
|
]
|
||||||
|
}
|
7
tsconfig.json
Normal file
7
tsconfig.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"files": [],
|
||||||
|
"references": [
|
||||||
|
{ "path": "./tsconfig.app.json" },
|
||||||
|
{ "path": "./tsconfig.node.json" }
|
||||||
|
]
|
||||||
|
}
|
25
tsconfig.node.json
Normal file
25
tsconfig.node.json
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
|
||||||
|
"target": "ES2023",
|
||||||
|
"lib": ["ES2023"],
|
||||||
|
"module": "ESNext",
|
||||||
|
"skipLibCheck": true,
|
||||||
|
|
||||||
|
/* Bundler mode */
|
||||||
|
"moduleResolution": "bundler",
|
||||||
|
"allowImportingTsExtensions": true,
|
||||||
|
"verbatimModuleSyntax": true,
|
||||||
|
"moduleDetection": "force",
|
||||||
|
"noEmit": true,
|
||||||
|
|
||||||
|
/* Linting */
|
||||||
|
"strict": true,
|
||||||
|
"noUnusedLocals": true,
|
||||||
|
"noUnusedParameters": true,
|
||||||
|
"erasableSyntaxOnly": true,
|
||||||
|
"noFallthroughCasesInSwitch": true,
|
||||||
|
"noUncheckedSideEffectImports": true,
|
||||||
|
},
|
||||||
|
"include": ["vite.config.ts"]
|
||||||
|
}
|
34
vite.config.ts
Normal file
34
vite.config.ts
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
/// <reference types="vitest/config" />
|
||||||
|
import { defineConfig } from 'vite'
|
||||||
|
import { nodePolyfills } from 'vite-plugin-node-polyfills';
|
||||||
|
import { resolve } from 'node:path';
|
||||||
|
import dts from 'vite-plugin-dts';
|
||||||
|
|
||||||
|
let basePath = process.env.basePath ?? '';
|
||||||
|
|
||||||
|
// https://vite.dev/config/
|
||||||
|
export default defineConfig({
|
||||||
|
base: basePath,
|
||||||
|
plugins: [
|
||||||
|
nodePolyfills(),
|
||||||
|
dts({rollupTypes: true, tsconfigPath: './tsconfig.app.json',insertTypesEntry: true}),
|
||||||
|
],
|
||||||
|
build: {
|
||||||
|
modulePreload: {
|
||||||
|
resolveDependencies() {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
},
|
||||||
|
lib: {
|
||||||
|
entry: resolve(__dirname, 'src/index.ts'),
|
||||||
|
name: 'MesCutorder',
|
||||||
|
fileName(format) {
|
||||||
|
return `mes-cutorder.${format}.js`
|
||||||
|
},
|
||||||
|
formats: ['es', 'umd', 'iife']
|
||||||
|
}
|
||||||
|
},
|
||||||
|
esbuild: {
|
||||||
|
drop: process.env.NODE_ENV === 'production' ? ['console', 'debugger'] : [],
|
||||||
|
},
|
||||||
|
})
|
Reference in New Issue
Block a user