vite-plugin-build-version-file 0.1.3 → 0.1.5
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 +175 -8
- package/dist/index.cjs +51 -1
- package/dist/index.d.cts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.mjs +51 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -7,7 +7,16 @@
|
|
|
7
7
|
- 构建产物中生成 `version.json`
|
|
8
8
|
- 可选地向 HTML 注入 `window["__VERSION__"]`
|
|
9
9
|
- 通过 `import.meta.env.__VERSION__` 在代码中直接读取版本号
|
|
10
|
-
-
|
|
10
|
+
- 支持自定义版本号、文件名、全局变量名和额外数据
|
|
11
|
+
|
|
12
|
+
这个插件只负责产出和暴露版本信息。
|
|
13
|
+
|
|
14
|
+
它不负责这些运行时行为:
|
|
15
|
+
|
|
16
|
+
- 轮询检查版本
|
|
17
|
+
- 弹窗提示用户更新
|
|
18
|
+
- 用户取消后的重试策略
|
|
19
|
+
- 页面刷新时机
|
|
11
20
|
|
|
12
21
|
适合用在这些场景:
|
|
13
22
|
|
|
@@ -53,6 +62,7 @@ export default defineConfig({
|
|
|
53
62
|
- 开发态访问 `/version.json` 时返回版本信息
|
|
54
63
|
- 构建后在输出目录生成 `version.json`
|
|
55
64
|
- 构建后的 HTML 中注入 `window["__VERSION__"]`
|
|
65
|
+
- 自动尝试读取业务项目 `package.json` 中的 `name` 和 `version`
|
|
56
66
|
- 开发态默认版本号为 `0`
|
|
57
67
|
- 构建态默认版本号为当前时间戳,格式为 `YYYYMMDDHHmmss`
|
|
58
68
|
|
|
@@ -60,8 +70,10 @@ export default defineConfig({
|
|
|
60
70
|
|
|
61
71
|
```json
|
|
62
72
|
{
|
|
73
|
+
"pkgName": "your-app-name",
|
|
74
|
+
"pkgVersion": "1.0.0",
|
|
63
75
|
"version": "20260401153045",
|
|
64
|
-
"
|
|
76
|
+
"env": "production"
|
|
65
77
|
}
|
|
66
78
|
```
|
|
67
79
|
|
|
@@ -69,11 +81,36 @@ export default defineConfig({
|
|
|
69
81
|
|
|
70
82
|
```json
|
|
71
83
|
{
|
|
84
|
+
"pkgName": "your-app-name",
|
|
85
|
+
"pkgVersion": "1.0.0",
|
|
72
86
|
"version": 0,
|
|
73
|
-
"
|
|
87
|
+
"env": "development"
|
|
74
88
|
}
|
|
75
89
|
```
|
|
76
90
|
|
|
91
|
+
## 职责边界
|
|
92
|
+
|
|
93
|
+
这个库的职责是:
|
|
94
|
+
|
|
95
|
+
- 生成版本号
|
|
96
|
+
- 输出 `version.json`
|
|
97
|
+
- 向页面注入版本信息
|
|
98
|
+
- 让业务代码能读取当前版本
|
|
99
|
+
|
|
100
|
+
这些逻辑建议写在业务项目里,而不是放进这个库里:
|
|
101
|
+
|
|
102
|
+
- 多久检查一次新版本
|
|
103
|
+
- 请求失败后是否重试
|
|
104
|
+
- 用什么 UI 提示用户
|
|
105
|
+
- 用户点击取消后怎么处理
|
|
106
|
+
- 是否立即刷新页面
|
|
107
|
+
|
|
108
|
+
如果你的项目要做“检测到新版本后提示刷新”,推荐做法是:
|
|
109
|
+
|
|
110
|
+
- 用 `import.meta.env.__VERSION__` 读取当前页面版本
|
|
111
|
+
- 请求 `version.json` 读取服务端版本
|
|
112
|
+
- 在业务项目里自行决定提示方式和刷新时机
|
|
113
|
+
|
|
77
114
|
## 配置项
|
|
78
115
|
|
|
79
116
|
```ts
|
|
@@ -87,6 +124,7 @@ type BuildVersionPluginOptions = {
|
|
|
87
124
|
globalName?: string
|
|
88
125
|
injectToHtml?: boolean
|
|
89
126
|
version?: string | number | ((ctx: BuildVersionContext) => string | number)
|
|
127
|
+
data?: Record<string, any>
|
|
90
128
|
}
|
|
91
129
|
```
|
|
92
130
|
|
|
@@ -112,10 +150,12 @@ type BuildVersionPluginOptions = {
|
|
|
112
150
|
|
|
113
151
|
```html
|
|
114
152
|
<script>
|
|
115
|
-
window["__VERSION__"] = "20260401153045";
|
|
153
|
+
window["__VERSION__"] = { "version": "20260401153045", "env": "production" };
|
|
116
154
|
</script>
|
|
117
155
|
```
|
|
118
156
|
|
|
157
|
+
这里注入的是完整对象,不是单独的版本字符串。
|
|
158
|
+
|
|
119
159
|
### `injectToHtml`
|
|
120
160
|
|
|
121
161
|
- 类型:`boolean`
|
|
@@ -142,6 +182,20 @@ type BuildVersionPluginOptions = {
|
|
|
142
182
|
}
|
|
143
183
|
```
|
|
144
184
|
|
|
185
|
+
### `data`
|
|
186
|
+
|
|
187
|
+
- 类型:`Record<string, any>`
|
|
188
|
+
- 默认值:`{}`
|
|
189
|
+
- 作用:向最终生成的版本信息对象中追加自定义字段
|
|
190
|
+
|
|
191
|
+
说明:
|
|
192
|
+
|
|
193
|
+
- 插件会自动从业务项目的 `package.json` 中读取 `name` 和 `version`,分别写入 `pkgName` 和 `pkgVersion`
|
|
194
|
+
- 查找位置是从当前 Vite 项目根目录开始,向上寻找最近的 `package.json`
|
|
195
|
+
- 会同时影响开发态接口返回、构建产物中的 `version.json` 和注入到 `window` 的对象
|
|
196
|
+
- 如果 `data` 里存在 `version` 或 `env` 同名字段,最终仍以插件生成的值为准
|
|
197
|
+
- 如果 `data` 里存在 `pkgName` 或 `pkgVersion`,读取到业务项目 `package.json` 时会以自动读取的值为准;读取不到时会保留 `data` 里的值
|
|
198
|
+
|
|
145
199
|
## 使用示例
|
|
146
200
|
|
|
147
201
|
### 1. 使用默认配置
|
|
@@ -156,6 +210,11 @@ export default defineConfig({
|
|
|
156
210
|
})
|
|
157
211
|
```
|
|
158
212
|
|
|
213
|
+
默认情况下,插件会尝试从业务项目的 `package.json` 中读取:
|
|
214
|
+
|
|
215
|
+
- `name` -> `pkgName`
|
|
216
|
+
- `version` -> `pkgVersion`
|
|
217
|
+
|
|
159
218
|
### 2. 自定义全局变量名
|
|
160
219
|
|
|
161
220
|
```ts
|
|
@@ -176,7 +235,8 @@ export default defineConfig({
|
|
|
176
235
|
注入后可以这样读取:
|
|
177
236
|
|
|
178
237
|
```ts
|
|
179
|
-
const
|
|
238
|
+
const payload = window['__APP_VERSION__']
|
|
239
|
+
const version = payload.version
|
|
180
240
|
```
|
|
181
241
|
|
|
182
242
|
### 3. 只保留 `version.json`,不注入 `window`
|
|
@@ -242,6 +302,39 @@ export default defineConfig({
|
|
|
242
302
|
})
|
|
243
303
|
```
|
|
244
304
|
|
|
305
|
+
### 6. 追加自定义数据
|
|
306
|
+
|
|
307
|
+
```ts
|
|
308
|
+
import { defineConfig } from 'vite'
|
|
309
|
+
import vue from '@vitejs/plugin-vue'
|
|
310
|
+
import buildVersionPlugin from 'vite-plugin-build-version-file'
|
|
311
|
+
|
|
312
|
+
export default defineConfig({
|
|
313
|
+
plugins: [
|
|
314
|
+
vue(),
|
|
315
|
+
buildVersionPlugin({
|
|
316
|
+
data: {
|
|
317
|
+
appName: 'admin',
|
|
318
|
+
gitBranch: 'release/2026-04',
|
|
319
|
+
commitSha: 'abc1234'
|
|
320
|
+
}
|
|
321
|
+
})
|
|
322
|
+
]
|
|
323
|
+
})
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
生成结果示例:
|
|
327
|
+
|
|
328
|
+
```json
|
|
329
|
+
{
|
|
330
|
+
"appName": "admin",
|
|
331
|
+
"gitBranch": "release/2026-04",
|
|
332
|
+
"commitSha": "abc1234",
|
|
333
|
+
"version": "20260401153045",
|
|
334
|
+
"env": "production"
|
|
335
|
+
}
|
|
336
|
+
```
|
|
337
|
+
|
|
245
338
|
## 在项目中读取版本
|
|
246
339
|
|
|
247
340
|
插件提供三种方式读取版本号,可根据场景选择:
|
|
@@ -276,10 +369,17 @@ interface ImportMeta {
|
|
|
276
369
|
### 方式二:读取注入的全局变量
|
|
277
370
|
|
|
278
371
|
```ts
|
|
279
|
-
const
|
|
372
|
+
const payload = window['__VERSION__']
|
|
373
|
+
|
|
374
|
+
console.log(payload.version)
|
|
375
|
+
console.log(payload.env)
|
|
280
376
|
```
|
|
281
377
|
|
|
282
|
-
**说明:**
|
|
378
|
+
**说明:**
|
|
379
|
+
|
|
380
|
+
- 需要确保 `injectToHtml` 为 `true`(默认值)
|
|
381
|
+
- 这里读到的是完整对象,不是单独字符串
|
|
382
|
+
- 如果配置了 `data`,这里也可以直接读取对应字段
|
|
283
383
|
|
|
284
384
|
### 方式三:读取 `version.json`
|
|
285
385
|
|
|
@@ -288,11 +388,78 @@ const response = await fetch('/version.json')
|
|
|
288
388
|
const payload = await response.json()
|
|
289
389
|
|
|
290
390
|
console.log(payload.version)
|
|
291
|
-
console.log(payload.
|
|
391
|
+
console.log(payload.env)
|
|
292
392
|
```
|
|
293
393
|
|
|
294
394
|
如果你配置了自定义 `filename`,这里的请求路径也需要改成对应地址。
|
|
295
395
|
|
|
396
|
+
如果你配置了 `data`,返回结果中也会包含这些额外字段。
|
|
397
|
+
|
|
398
|
+
默认情况下,如果业务项目存在 `package.json`,返回结果中也会包含:
|
|
399
|
+
|
|
400
|
+
- `pkgName`
|
|
401
|
+
- `pkgVersion`
|
|
402
|
+
|
|
403
|
+
## 在项目中做版本检查
|
|
404
|
+
|
|
405
|
+
推荐把“检查新版本并提示刷新”的逻辑写在业务项目里。
|
|
406
|
+
|
|
407
|
+
通用伪代码:
|
|
408
|
+
|
|
409
|
+
```js
|
|
410
|
+
const CHECK_INTERVAL = 60 * 1000
|
|
411
|
+
const VERSION_URL = `${import.meta.env.VITE_BASE_PATH}/version.json`
|
|
412
|
+
|
|
413
|
+
async function checkVersion() {
|
|
414
|
+
try {
|
|
415
|
+
const response = await fetch(VERSION_URL, {
|
|
416
|
+
cache: 'no-store'
|
|
417
|
+
})
|
|
418
|
+
|
|
419
|
+
const payload = await response.json()
|
|
420
|
+
|
|
421
|
+
if (payload.version !== import.meta.env.__VERSION__) {
|
|
422
|
+
const shouldReload = await showUpdatePrompt()
|
|
423
|
+
|
|
424
|
+
if (shouldReload) {
|
|
425
|
+
window.location.reload()
|
|
426
|
+
return
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
} catch (error) {
|
|
430
|
+
console.warn('check version failed', error)
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
scheduleNextCheck()
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
function scheduleNextCheck() {
|
|
437
|
+
setTimeout(checkVersion, CHECK_INTERVAL)
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
function showUpdatePrompt() {
|
|
441
|
+
// 这里替换成你自己的弹窗、消息组件或确认框
|
|
442
|
+
return Promise.resolve(window.confirm('检测到新版本,是否刷新页面?'))
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
checkVersion()
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
建议:
|
|
449
|
+
|
|
450
|
+
- 版本比较只判断 `payload.version` 和 `import.meta.env.__VERSION__` 是否一致
|
|
451
|
+
- 提示方式由业务项目自己决定,可以是弹窗、消息条、通知或静默刷新
|
|
452
|
+
- 轮询间隔不要过短,通常用 1 分钟或更长更合适
|
|
453
|
+
- 请求失败后继续下一轮检查,避免一次失败后整个流程中断
|
|
454
|
+
|
|
455
|
+
上面这段逻辑故意没有放进插件里,因为不同项目通常会有不同要求:
|
|
456
|
+
|
|
457
|
+
- 轮询频率不同
|
|
458
|
+
- 请求路径可能不同
|
|
459
|
+
- 弹窗组件不同
|
|
460
|
+
- 刷新策略不同
|
|
461
|
+
- 失败重试策略不同
|
|
462
|
+
|
|
296
463
|
## 开发态行为说明
|
|
297
464
|
|
|
298
465
|
开发态下,插件不会往项目的 `public/` 目录写文件。
|
package/dist/index.cjs
CHANGED
|
@@ -24,6 +24,8 @@ __export(index_exports, {
|
|
|
24
24
|
default: () => index_default
|
|
25
25
|
});
|
|
26
26
|
module.exports = __toCommonJS(index_exports);
|
|
27
|
+
var import_node_fs = require("fs");
|
|
28
|
+
var import_node_path = require("path");
|
|
27
29
|
var PLUGIN_NAME = "vite-plugin-build-version-file";
|
|
28
30
|
var DEFAULT_FILENAME = "version.json";
|
|
29
31
|
var DEFAULT_GLOBAL_NAME = "__VERSION__";
|
|
@@ -55,6 +57,49 @@ function normalizeGlobalName(globalName) {
|
|
|
55
57
|
}
|
|
56
58
|
return globalName;
|
|
57
59
|
}
|
|
60
|
+
function normalizeData(data) {
|
|
61
|
+
if (data === void 0) {
|
|
62
|
+
return {};
|
|
63
|
+
}
|
|
64
|
+
if (!data || Array.isArray(data) || typeof data !== "object") {
|
|
65
|
+
throw new Error(`[${PLUGIN_NAME}] "data" must be a plain object.`);
|
|
66
|
+
}
|
|
67
|
+
return data;
|
|
68
|
+
}
|
|
69
|
+
function findNearestPackageJson(root) {
|
|
70
|
+
let currentDir = root;
|
|
71
|
+
while (true) {
|
|
72
|
+
const packageJsonPath = (0, import_node_path.join)(currentDir, "package.json");
|
|
73
|
+
if ((0, import_node_fs.existsSync)(packageJsonPath)) {
|
|
74
|
+
return packageJsonPath;
|
|
75
|
+
}
|
|
76
|
+
const parentDir = (0, import_node_path.dirname)(currentDir);
|
|
77
|
+
if (parentDir === currentDir) {
|
|
78
|
+
return void 0;
|
|
79
|
+
}
|
|
80
|
+
currentDir = parentDir;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function readPackageInfo(root) {
|
|
84
|
+
const packageJsonPath = findNearestPackageJson(root);
|
|
85
|
+
if (!packageJsonPath) {
|
|
86
|
+
return {};
|
|
87
|
+
}
|
|
88
|
+
try {
|
|
89
|
+
const content = (0, import_node_fs.readFileSync)(packageJsonPath, "utf-8");
|
|
90
|
+
const packageJson = JSON.parse(content);
|
|
91
|
+
const packageInfo = {};
|
|
92
|
+
if (packageJson.name !== void 0) {
|
|
93
|
+
packageInfo.pkgName = packageJson.name;
|
|
94
|
+
}
|
|
95
|
+
if (packageJson.version !== void 0) {
|
|
96
|
+
packageInfo.pkgVersion = packageJson.version;
|
|
97
|
+
}
|
|
98
|
+
return packageInfo;
|
|
99
|
+
} catch {
|
|
100
|
+
return {};
|
|
101
|
+
}
|
|
102
|
+
}
|
|
58
103
|
function serializePayload(payload) {
|
|
59
104
|
return `${JSON.stringify(payload, null, 2)}
|
|
60
105
|
`;
|
|
@@ -77,6 +122,8 @@ function buildVersionPlugin(options = {}) {
|
|
|
77
122
|
options.globalName ?? DEFAULT_GLOBAL_NAME
|
|
78
123
|
);
|
|
79
124
|
const injectToHtml = options.injectToHtml ?? true;
|
|
125
|
+
const data = normalizeData(options.data);
|
|
126
|
+
let packageInfo = {};
|
|
80
127
|
let payload;
|
|
81
128
|
return {
|
|
82
129
|
name: PLUGIN_NAME,
|
|
@@ -100,6 +147,7 @@ function buildVersionPlugin(options = {}) {
|
|
|
100
147
|
};
|
|
101
148
|
},
|
|
102
149
|
configResolved(config) {
|
|
150
|
+
packageInfo = readPackageInfo(config.root);
|
|
103
151
|
const context = {
|
|
104
152
|
command: config.command,
|
|
105
153
|
mode: config.mode
|
|
@@ -113,8 +161,10 @@ function buildVersionPlugin(options = {}) {
|
|
|
113
161
|
version = createDefaultVersion(context.command);
|
|
114
162
|
}
|
|
115
163
|
payload = {
|
|
164
|
+
...data,
|
|
165
|
+
...packageInfo,
|
|
116
166
|
version,
|
|
117
|
-
|
|
167
|
+
env: config.mode
|
|
118
168
|
};
|
|
119
169
|
if (options.payload) {
|
|
120
170
|
payload = options.payload(payload);
|
package/dist/index.d.cts
CHANGED
|
@@ -6,13 +6,15 @@ interface BuildVersionContext {
|
|
|
6
6
|
}
|
|
7
7
|
interface BuildVersionPayload {
|
|
8
8
|
version: string | number;
|
|
9
|
-
|
|
9
|
+
env: string;
|
|
10
|
+
[key: string]: any;
|
|
10
11
|
}
|
|
11
12
|
interface BuildVersionPluginOptions {
|
|
12
13
|
filename?: string;
|
|
13
14
|
globalName?: string;
|
|
14
15
|
injectToHtml?: boolean;
|
|
15
16
|
version?: string | number | ((ctx: BuildVersionContext) => string | number);
|
|
17
|
+
data?: Record<string, any>;
|
|
16
18
|
log?: (content: any) => string;
|
|
17
19
|
payload?: (json: any) => any;
|
|
18
20
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,13 +6,15 @@ interface BuildVersionContext {
|
|
|
6
6
|
}
|
|
7
7
|
interface BuildVersionPayload {
|
|
8
8
|
version: string | number;
|
|
9
|
-
|
|
9
|
+
env: string;
|
|
10
|
+
[key: string]: any;
|
|
10
11
|
}
|
|
11
12
|
interface BuildVersionPluginOptions {
|
|
12
13
|
filename?: string;
|
|
13
14
|
globalName?: string;
|
|
14
15
|
injectToHtml?: boolean;
|
|
15
16
|
version?: string | number | ((ctx: BuildVersionContext) => string | number);
|
|
17
|
+
data?: Record<string, any>;
|
|
16
18
|
log?: (content: any) => string;
|
|
17
19
|
payload?: (json: any) => any;
|
|
18
20
|
}
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
// src/index.ts
|
|
2
|
+
import { existsSync, readFileSync } from "fs";
|
|
3
|
+
import { dirname, join } from "path";
|
|
2
4
|
var PLUGIN_NAME = "vite-plugin-build-version-file";
|
|
3
5
|
var DEFAULT_FILENAME = "version.json";
|
|
4
6
|
var DEFAULT_GLOBAL_NAME = "__VERSION__";
|
|
@@ -30,6 +32,49 @@ function normalizeGlobalName(globalName) {
|
|
|
30
32
|
}
|
|
31
33
|
return globalName;
|
|
32
34
|
}
|
|
35
|
+
function normalizeData(data) {
|
|
36
|
+
if (data === void 0) {
|
|
37
|
+
return {};
|
|
38
|
+
}
|
|
39
|
+
if (!data || Array.isArray(data) || typeof data !== "object") {
|
|
40
|
+
throw new Error(`[${PLUGIN_NAME}] "data" must be a plain object.`);
|
|
41
|
+
}
|
|
42
|
+
return data;
|
|
43
|
+
}
|
|
44
|
+
function findNearestPackageJson(root) {
|
|
45
|
+
let currentDir = root;
|
|
46
|
+
while (true) {
|
|
47
|
+
const packageJsonPath = join(currentDir, "package.json");
|
|
48
|
+
if (existsSync(packageJsonPath)) {
|
|
49
|
+
return packageJsonPath;
|
|
50
|
+
}
|
|
51
|
+
const parentDir = dirname(currentDir);
|
|
52
|
+
if (parentDir === currentDir) {
|
|
53
|
+
return void 0;
|
|
54
|
+
}
|
|
55
|
+
currentDir = parentDir;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function readPackageInfo(root) {
|
|
59
|
+
const packageJsonPath = findNearestPackageJson(root);
|
|
60
|
+
if (!packageJsonPath) {
|
|
61
|
+
return {};
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
const content = readFileSync(packageJsonPath, "utf-8");
|
|
65
|
+
const packageJson = JSON.parse(content);
|
|
66
|
+
const packageInfo = {};
|
|
67
|
+
if (packageJson.name !== void 0) {
|
|
68
|
+
packageInfo.pkgName = packageJson.name;
|
|
69
|
+
}
|
|
70
|
+
if (packageJson.version !== void 0) {
|
|
71
|
+
packageInfo.pkgVersion = packageJson.version;
|
|
72
|
+
}
|
|
73
|
+
return packageInfo;
|
|
74
|
+
} catch {
|
|
75
|
+
return {};
|
|
76
|
+
}
|
|
77
|
+
}
|
|
33
78
|
function serializePayload(payload) {
|
|
34
79
|
return `${JSON.stringify(payload, null, 2)}
|
|
35
80
|
`;
|
|
@@ -52,6 +97,8 @@ function buildVersionPlugin(options = {}) {
|
|
|
52
97
|
options.globalName ?? DEFAULT_GLOBAL_NAME
|
|
53
98
|
);
|
|
54
99
|
const injectToHtml = options.injectToHtml ?? true;
|
|
100
|
+
const data = normalizeData(options.data);
|
|
101
|
+
let packageInfo = {};
|
|
55
102
|
let payload;
|
|
56
103
|
return {
|
|
57
104
|
name: PLUGIN_NAME,
|
|
@@ -75,6 +122,7 @@ function buildVersionPlugin(options = {}) {
|
|
|
75
122
|
};
|
|
76
123
|
},
|
|
77
124
|
configResolved(config) {
|
|
125
|
+
packageInfo = readPackageInfo(config.root);
|
|
78
126
|
const context = {
|
|
79
127
|
command: config.command,
|
|
80
128
|
mode: config.mode
|
|
@@ -88,8 +136,10 @@ function buildVersionPlugin(options = {}) {
|
|
|
88
136
|
version = createDefaultVersion(context.command);
|
|
89
137
|
}
|
|
90
138
|
payload = {
|
|
139
|
+
...data,
|
|
140
|
+
...packageInfo,
|
|
91
141
|
version,
|
|
92
|
-
|
|
142
|
+
env: config.mode
|
|
93
143
|
};
|
|
94
144
|
if (options.payload) {
|
|
95
145
|
payload = options.payload(payload);
|