@nocobase/cli 2.0.0-beta.8 → 2.0.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/package.json +5 -5
- package/src/commands/client.js +166 -0
- package/src/commands/dev.js +10 -0
- package/src/commands/index.js +1 -0
- package/src/commands/pkg.js +1 -1
- package/src/commands/pm2.js +1 -1
- package/src/util.js +10 -0
- package/templates/bundle-status.html +338 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nocobase/cli",
|
|
3
|
-
"version": "2.0.0
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"license": "AGPL-3.0",
|
|
6
6
|
"main": "./src/index.js",
|
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
"nocobase": "./bin/index.js"
|
|
9
9
|
},
|
|
10
10
|
"dependencies": {
|
|
11
|
-
"@nocobase/app": "2.0.0
|
|
12
|
-
"@nocobase/license-kit": "^0.3.
|
|
11
|
+
"@nocobase/app": "2.0.0",
|
|
12
|
+
"@nocobase/license-kit": "^0.3.7",
|
|
13
13
|
"@types/fs-extra": "^11.0.1",
|
|
14
14
|
"@umijs/utils": "3.5.20",
|
|
15
15
|
"chalk": "^4.1.1",
|
|
@@ -27,12 +27,12 @@
|
|
|
27
27
|
"tsx": "^4.19.0"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
|
-
"@nocobase/devtools": "2.0.0
|
|
30
|
+
"@nocobase/devtools": "2.0.0"
|
|
31
31
|
},
|
|
32
32
|
"repository": {
|
|
33
33
|
"type": "git",
|
|
34
34
|
"url": "git+https://github.com/nocobase/nocobase.git",
|
|
35
35
|
"directory": "packages/core/cli"
|
|
36
36
|
},
|
|
37
|
-
"gitHead": "
|
|
37
|
+
"gitHead": "3590c0087a56f0f285a5357f43a80bdc62b11bec"
|
|
38
38
|
}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
const chalk = require('chalk');
|
|
11
|
+
const { Command } = require('commander');
|
|
12
|
+
const fs = require('fs-extra');
|
|
13
|
+
const { resolve } = require('path');
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* 复制主应用客户端文件
|
|
17
|
+
* @param {string} source - 源目录路径
|
|
18
|
+
* @param {string} target - 目标目录路径
|
|
19
|
+
*/
|
|
20
|
+
async function copyMainClient(source, target) {
|
|
21
|
+
if (!(await fs.exists(source))) {
|
|
22
|
+
console.log(chalk.yellow(`Source directory does not exist: ${source}`));
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
// 确保目标目录存在且为空
|
|
26
|
+
await fs.ensureDir(target);
|
|
27
|
+
await fs.emptyDir(target);
|
|
28
|
+
await fs.copy(source, target, { recursive: true });
|
|
29
|
+
console.log(chalk.green(`Copied main client files from ${source} to ${target}`));
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* 复制插件客户端文件
|
|
34
|
+
* @param {string} pluginsBaseDir - 插件基础目录路径
|
|
35
|
+
* @param {string} namespace - 命名空间(如 '@nocobase' 或 '@nocobase-example')
|
|
36
|
+
* @param {string} target - 目标目录
|
|
37
|
+
*/
|
|
38
|
+
async function copyPluginClients(pluginsBaseDir, namespace, target) {
|
|
39
|
+
const pluginsDir = resolve(process.cwd(), pluginsBaseDir, namespace);
|
|
40
|
+
if (await fs.exists(pluginsDir)) {
|
|
41
|
+
const pluginNames = await fs.readdir(pluginsDir);
|
|
42
|
+
for (const pluginName of pluginNames) {
|
|
43
|
+
const pluginPath = resolve(pluginsDir, pluginName);
|
|
44
|
+
const pluginDistClient = resolve(pluginPath, 'dist/client');
|
|
45
|
+
if (await fs.exists(pluginDistClient)) {
|
|
46
|
+
const pluginTarget = resolve(target, 'static/plugins', namespace, pluginName, 'dist/client');
|
|
47
|
+
await fs.mkdir(resolve(pluginTarget, '..'), { recursive: true });
|
|
48
|
+
await fs.copy(pluginDistClient, pluginTarget, { recursive: true });
|
|
49
|
+
console.log(chalk.green(`Copied ${namespace}/${pluginName} client files`));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* 递归上传目录到 OSS
|
|
57
|
+
* @param {Client} client - OSS 客户端实例
|
|
58
|
+
* @param {string} localDir - 本地目录路径
|
|
59
|
+
* @param {string} ossPrefix - OSS 对象前缀(目录路径)
|
|
60
|
+
*/
|
|
61
|
+
async function uploadDirectoryToOSS(client, localDir, ossPrefix = '') {
|
|
62
|
+
if (!(await fs.exists(localDir))) {
|
|
63
|
+
console.log(chalk.yellow(`Directory does not exist: ${localDir}`));
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const stats = await fs.stat(localDir);
|
|
68
|
+
if (!stats.isDirectory()) {
|
|
69
|
+
throw new Error(`${localDir} is not a directory`);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const files = await fs.readdir(localDir);
|
|
73
|
+
let uploadedCount = 0;
|
|
74
|
+
|
|
75
|
+
for (const file of files) {
|
|
76
|
+
const filePath = resolve(localDir, file);
|
|
77
|
+
const fileStats = await fs.stat(filePath);
|
|
78
|
+
|
|
79
|
+
if (fileStats.isDirectory()) {
|
|
80
|
+
// 递归处理子目录
|
|
81
|
+
const subOssPrefix = ossPrefix ? `${ossPrefix}/${file}` : file;
|
|
82
|
+
const subCount = await uploadDirectoryToOSS(client, filePath, subOssPrefix);
|
|
83
|
+
uploadedCount += subCount;
|
|
84
|
+
} else {
|
|
85
|
+
// 上传文件
|
|
86
|
+
const ossKey = ossPrefix ? `${ossPrefix}/${file}` : file;
|
|
87
|
+
try {
|
|
88
|
+
await client.put(ossKey, filePath);
|
|
89
|
+
// console.log(chalk.green(`Uploaded: ${ossKey}`));
|
|
90
|
+
uploadedCount++;
|
|
91
|
+
} catch (error) {
|
|
92
|
+
console.error(chalk.red(`Failed to upload ${ossKey}:`), error.message);
|
|
93
|
+
throw error;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return uploadedCount;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
*
|
|
103
|
+
* @param {Command} cli
|
|
104
|
+
*/
|
|
105
|
+
module.exports = (cli) => {
|
|
106
|
+
cli
|
|
107
|
+
.command('client:extract')
|
|
108
|
+
.allowUnknownOption()
|
|
109
|
+
.action(async () => {
|
|
110
|
+
const version = require('../../package.json').version;
|
|
111
|
+
const target = resolve(process.cwd(), 'storage/dist-client', version);
|
|
112
|
+
const mainClientSource = resolve(process.cwd(), 'node_modules/@nocobase/app/dist/client');
|
|
113
|
+
await copyMainClient(mainClientSource, target);
|
|
114
|
+
await copyPluginClients('packages/plugins', '@nocobase', target);
|
|
115
|
+
await copyPluginClients('packages/plugins', '@nocobase-example', target);
|
|
116
|
+
await copyPluginClients('packages/pro-plugins', '@nocobase', target);
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
cli
|
|
120
|
+
.command('client:upload')
|
|
121
|
+
.allowUnknownOption()
|
|
122
|
+
.action(async () => {
|
|
123
|
+
const version = require('../../package.json').version;
|
|
124
|
+
const target = resolve(process.cwd(), 'storage/dist-client', version);
|
|
125
|
+
|
|
126
|
+
// 检查必要的环境变量
|
|
127
|
+
if (
|
|
128
|
+
!process.env.CDN_ALI_OSS_ACCESS_KEY_ID ||
|
|
129
|
+
!process.env.CDN_ALI_OSS_ACCESS_KEY_SECRET ||
|
|
130
|
+
!process.env.CDN_ALI_OSS_BUCKET ||
|
|
131
|
+
!process.env.CDN_ALI_OSS_REGION
|
|
132
|
+
) {
|
|
133
|
+
console.error(
|
|
134
|
+
chalk.red(
|
|
135
|
+
'Missing required environment variables: CDN_ALI_OSS_ACCESS_KEY_ID, CDN_ALI_OSS_ACCESS_KEY_SECRET, CDN_ALI_OSS_BUCKET, CDN_ALI_OSS_REGION',
|
|
136
|
+
),
|
|
137
|
+
);
|
|
138
|
+
process.exit(1);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const Client = require('ali-oss');
|
|
142
|
+
|
|
143
|
+
const client = new Client({
|
|
144
|
+
accessKeyId: process.env.CDN_ALI_OSS_ACCESS_KEY_ID,
|
|
145
|
+
accessKeySecret: process.env.CDN_ALI_OSS_ACCESS_KEY_SECRET,
|
|
146
|
+
bucket: process.env.CDN_ALI_OSS_BUCKET,
|
|
147
|
+
region: process.env.CDN_ALI_OSS_REGION,
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
if (!(await fs.exists(target))) {
|
|
151
|
+
console.error(chalk.red(`Target directory does not exist: ${target}`));
|
|
152
|
+
console.log(chalk.yellow('Please run "client:extract" first to generate the client files.'));
|
|
153
|
+
process.exit(1);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
console.log(chalk.blue(`Uploading directory ${target} to OSS...`));
|
|
157
|
+
const ossPrefix = `${version}`;
|
|
158
|
+
try {
|
|
159
|
+
const uploadedCount = await uploadDirectoryToOSS(client, target, ossPrefix);
|
|
160
|
+
console.log(chalk.green(`Successfully uploaded ${uploadedCount} files to OSS`));
|
|
161
|
+
} catch (error) {
|
|
162
|
+
console.error(chalk.red('Upload failed:'), error);
|
|
163
|
+
process.exit(1);
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
};
|
package/src/commands/dev.js
CHANGED
|
@@ -21,6 +21,15 @@ function sleep(ms = 1000) {
|
|
|
21
21
|
});
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
+
async function buildBundleStatusHtml() {
|
|
25
|
+
const data = await fs.promises.readFile(path.resolve(__dirname, '../../templates/bundle-status.html'), 'utf-8');
|
|
26
|
+
await fs.promises.writeFile(
|
|
27
|
+
path.resolve(process.cwd(), 'node_modules/@umijs/preset-umi/assets/bundle-status.html'),
|
|
28
|
+
data,
|
|
29
|
+
'utf-8',
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
|
|
24
33
|
/**
|
|
25
34
|
*
|
|
26
35
|
* @param {Command} cli
|
|
@@ -37,6 +46,7 @@ module.exports = (cli) => {
|
|
|
37
46
|
.allowUnknownOption()
|
|
38
47
|
.action(async (opts) => {
|
|
39
48
|
checkDBDialect();
|
|
49
|
+
await buildBundleStatusHtml();
|
|
40
50
|
let subprocess;
|
|
41
51
|
const runDevClient = () => {
|
|
42
52
|
console.log('starting client', 1 * clientPort);
|
package/src/commands/index.js
CHANGED
package/src/commands/pkg.js
CHANGED
package/src/commands/pm2.js
CHANGED
package/src/util.js
CHANGED
|
@@ -304,6 +304,8 @@ function buildIndexHtml(force = false) {
|
|
|
304
304
|
.replace(/\{\{env.API_BASE_URL\}\}/g, process.env.API_BASE_URL || process.env.API_BASE_PATH)
|
|
305
305
|
.replace(/\{\{env.WS_URL\}\}/g, process.env.WEBSOCKET_URL || '')
|
|
306
306
|
.replace(/\{\{env.WS_PATH\}\}/g, process.env.WS_PATH)
|
|
307
|
+
.replace(/\{\{env.ESM_CDN_BASE_URL\}\}/g, process.env.ESM_CDN_BASE_URL || '')
|
|
308
|
+
.replace(/\{\{env.ESM_CDN_SUFFIX\}\}/g, process.env.ESM_CDN_SUFFIX || '')
|
|
307
309
|
.replace('src="/umi.', `src="${process.env.APP_PUBLIC_PATH}umi.`);
|
|
308
310
|
|
|
309
311
|
if (process.env.CDN_BASE_URL) {
|
|
@@ -398,6 +400,8 @@ exports.initEnv = function initEnv() {
|
|
|
398
400
|
CDN_BASE_URL: '',
|
|
399
401
|
APP_PUBLIC_PATH: '/',
|
|
400
402
|
WATCH_FILE: resolve(process.cwd(), 'storage/app.watch.ts'),
|
|
403
|
+
ESM_CDN_BASE_URL: 'https://esm.sh',
|
|
404
|
+
ESM_CDN_SUFFIX: '',
|
|
401
405
|
};
|
|
402
406
|
|
|
403
407
|
if (
|
|
@@ -455,6 +459,12 @@ exports.initEnv = function initEnv() {
|
|
|
455
459
|
process.env.CDN_BASE_URL = process.env.APP_PUBLIC_PATH;
|
|
456
460
|
}
|
|
457
461
|
|
|
462
|
+
if (process.env.CDN_BASE_URL.includes('http') && process.env.CDN_VERSION === 'auto') {
|
|
463
|
+
const version = require('../package.json').version;
|
|
464
|
+
process.env.CDN_BASE_URL = process.env.CDN_BASE_URL.replace(/\/+$/, '') + '/' + version + '/';
|
|
465
|
+
process.env.CDN_VERSION = '';
|
|
466
|
+
}
|
|
467
|
+
|
|
458
468
|
if (!process.env.TZ) {
|
|
459
469
|
const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
460
470
|
process.env.TZ = getTimezonesByOffset(process.env.DB_TIMEZONE || timeZone);
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta
|
|
6
|
+
name="viewport"
|
|
7
|
+
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"
|
|
8
|
+
/>
|
|
9
|
+
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
|
|
10
|
+
<title>NocoBase Loading...</title>
|
|
11
|
+
<style data-basic>
|
|
12
|
+
body {
|
|
13
|
+
margin: 0;
|
|
14
|
+
font-family: system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
|
|
15
|
+
min-height: 100vh;
|
|
16
|
+
display: flex;
|
|
17
|
+
align-items: center;
|
|
18
|
+
justify-content: center;
|
|
19
|
+
flex-direction: column;
|
|
20
|
+
color: #333;
|
|
21
|
+
background-color: #f5f5f5;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
#loading {
|
|
25
|
+
position: relative;
|
|
26
|
+
padding: 20px 28px 24px 88px;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
#loading::before {
|
|
30
|
+
position: absolute;
|
|
31
|
+
left: 0;
|
|
32
|
+
top: 50%;
|
|
33
|
+
content: '';
|
|
34
|
+
display: inline-block;
|
|
35
|
+
width: 40px;
|
|
36
|
+
height: 40px;
|
|
37
|
+
border-radius: 50%;
|
|
38
|
+
border: 3px solid #e0e0e0;
|
|
39
|
+
border-top-color: #999;
|
|
40
|
+
animation: loading-spin 0.9s linear infinite;
|
|
41
|
+
transform: translateY(-50%);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
#loading h3 {
|
|
45
|
+
margin: 0 0 2px;
|
|
46
|
+
color: #666;
|
|
47
|
+
font-size: 20px;
|
|
48
|
+
font-weight: normal;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
#loading small {
|
|
52
|
+
color: #888;
|
|
53
|
+
font-size: 12px;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
#loading small::after {
|
|
57
|
+
content: 'from source';
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
#loading p {
|
|
61
|
+
box-sizing: border-box;
|
|
62
|
+
font-family: Georgia, 'Times New Roman', Times, serif;
|
|
63
|
+
color: #333;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
#loading p:empty {
|
|
67
|
+
display: none;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
#loading p span {
|
|
71
|
+
font-family: sans-serif;
|
|
72
|
+
padding: 0 6px 0 2px;
|
|
73
|
+
color: #666;
|
|
74
|
+
font-size: 14px;
|
|
75
|
+
vertical-align: bottom;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
#loading p.summary {
|
|
79
|
+
margin: 8px 0;
|
|
80
|
+
height: 28px;
|
|
81
|
+
font-size: 24px;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
#loading p.detail {
|
|
85
|
+
margin: 2px 0;
|
|
86
|
+
height: 40px;
|
|
87
|
+
font-size: 16px;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
code.progress-details {
|
|
91
|
+
margin-top: 20px;
|
|
92
|
+
font-size: 13px;
|
|
93
|
+
color: #999;
|
|
94
|
+
max-width: calc(100vw - 500px);
|
|
95
|
+
text-align: center;
|
|
96
|
+
white-space: pre-wrap;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
@keyframes fade-in-out {
|
|
100
|
+
0% {
|
|
101
|
+
opacity: 0.4;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
100% {
|
|
105
|
+
opacity: 1;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
@keyframes loading-spin {
|
|
110
|
+
0% {
|
|
111
|
+
transform: translateY(-50%) rotate(0deg);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
100% {
|
|
115
|
+
transform: translateY(-50%) rotate(360deg);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
</style>
|
|
119
|
+
<style data-mfsu>
|
|
120
|
+
#loading[data-mfsu]::after {
|
|
121
|
+
position: absolute;
|
|
122
|
+
top: 0;
|
|
123
|
+
left: 64px;
|
|
124
|
+
content: '';
|
|
125
|
+
width: 20px;
|
|
126
|
+
height: 22px;
|
|
127
|
+
background: center / 20px 22px;
|
|
128
|
+
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAuCAMAAABteatCAAABKVBMVEUAAAADAgAAAAAAAAAAAAAAAAAAAAAIBwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMCgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASDwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+2SgAAAD81ycWEwPxzSXOsCBBOAoqIwbjwiOWgBd2ZBJdTw741Ca1mhyhihlHPAswKQcbFwT00CbgvyLWtyG5nh2GchV7aRNYSw1VSA3zzybpxyTmxCTLrR+QehaMdxZvXxFmVxBjVQ85MQglIAXqxyTSsyG/ox6zmRyrkhqpkBqmjhqdhhiBbhRQRAxMQQyKBhJVAAAAM3RSTlMA/vrcEO3F/nA4BvfUqYx4aFAjBP7x6uOugCEdCrSllohUSj0yLRQC/se/k2FWJ7qamFjVvxppAAAB4klEQVQ4y42U10IaQRhG2QVBAaVIMxQNCthT9iwdkSoEEkss6e39HyIaQ4Zhdjee63PxH/h2XCqF4EbU9QQ8bsAb9vxXzNI7iYGeivgdvQ12h8ag09VgaXPF3sujjYwHzq96gNvu3OgSY2PGx1bf7txMkJ+mITBHNufmuKsYMm//nit5y8TODJXzKWTnvW2dL4YFpz5y63NeOkHLyvum8ao05/m91EwLr6mxJR24Sf+DhTeGkOQd4ruw8FpoYcnbCfBd1cwb9CPJKya5Vr32lEBe8kovuG0r3qBLfNslsUW5oXiVWxI7shdB+6R473okj2XvOM6l4g3vYK24OJmJGlK93gU9e5QRYor6wLCg/fWXBvGXs54QmjQZ6c5LMfOCDuX3VcOOsz8z3wvfjyYUBOrjhp1qXgHux//vIAFarVOx8honGkvLsz2u51cD4JucLg6t8sZHYM0jvRCH+yyeazbLsPrMtUg6lISm8D7XwWv5CBTitMRPXgN3xGVFOsnEVBpUPEFqbdGgiwYZ/z71itqgkqM/fPyO1QZ5vLHqv4bnLlvCaCO1QSWi0bl/kUSDDSsBfqgNKtEEN2qDStFN90JpUMnsUZ4+NPidvVIKUBtUDkA0OBBCNDjxWjQ4o4sGR34DhGGszb2iUaMAAAAASUVORK5CYII=');
|
|
129
|
+
animation: fade-in-out alternate infinite 1s;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
#loading[data-mfsu] small::after {
|
|
133
|
+
content: 'Umi with MFSU';
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
#loading[data-mfsu]:hover p.summary,
|
|
137
|
+
#loading[data-mfsu]:not(:hover) p.detail {
|
|
138
|
+
display: none;
|
|
139
|
+
}
|
|
140
|
+
</style>
|
|
141
|
+
<style data-progress>
|
|
142
|
+
#loading[data-percent^='2']:not([data-percent='2'])::before,
|
|
143
|
+
#loading[data-percent^='3']:not([data-percent='3'])::before {
|
|
144
|
+
background-position-x: -68px;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
#loading[data-percent^='4']:not([data-percent='4'])::before,
|
|
148
|
+
#loading[data-percent^='5']:not([data-percent='5'])::before {
|
|
149
|
+
background-position-x: -136px;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
#loading[data-percent^='6']:not([data-percent='6'])::before,
|
|
153
|
+
#loading[data-percent^='7']:not([data-percent='7'])::before {
|
|
154
|
+
background-position-x: -204px;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
#loading[data-percent^='8']:not([data-percent='8'])::before,
|
|
158
|
+
#loading[data-percent^='9']:not([data-percent='9'])::before {
|
|
159
|
+
background-position-x: -272px;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
#loading[data-percent='99']::before,
|
|
163
|
+
#loading[data-percent='100']::before {
|
|
164
|
+
background-position-x: -340px !important;
|
|
165
|
+
}
|
|
166
|
+
</style>
|
|
167
|
+
<style data-mako>
|
|
168
|
+
#loading[data-mako]::after {
|
|
169
|
+
position: absolute;
|
|
170
|
+
top: 0;
|
|
171
|
+
left: 64px;
|
|
172
|
+
content: '';
|
|
173
|
+
width: 20px;
|
|
174
|
+
height: 22px;
|
|
175
|
+
background: center / 20px 22px;
|
|
176
|
+
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAuCAMAAABteatCAAABKVBMVEUAAAADAgAAAAAAAAAAAAAAAAAAAAAIBwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMCgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASDwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+2SgAAAD81ycWEwPxzSXOsCBBOAoqIwbjwiOWgBd2ZBJdTw741Ca1mhyhihlHPAswKQcbFwT00CbgvyLWtyG5nh2GchV7aRNYSw1VSA3zzybpxyTmxCTLrR+QehaMdxZvXxFmVxBjVQ85MQglIAXqxyTSsyG/ox6zmRyrkhqpkBqmjhqdhhiBbhRQRAxMQQyKBhJVAAAAM3RSTlMA/vrcEO3F/nA4BvfUqYx4aFAjBP7x6uOugCEdCrSllohUSj0yLRQC/se/k2FWJ7qamFjVvxppAAAB4klEQVQ4y42U10IaQRhG2QVBAaVIMxQNCthT9iwdkSoEEkss6e39HyIaQ4Zhdjee63PxH/h2XCqF4EbU9QQ8bsAb9vxXzNI7iYGeivgdvQ12h8ag09VgaXPF3sujjYwHzq96gNvu3OgSY2PGx1bf7txMkJ+mITBHNufmuKsYMm//nit5y8TODJXzKWTnvW2dL4YFpz5y63NeOkHLyvum8ao05/m91EwLr6mxJR24Sf+DhTeGkOQd4ruw8FpoYcnbCfBd1cwb9CPJKya5Vr32lEBe8kovuG0r3qBLfNslsUW5oXiVWxI7shdB+6R473okj2XvOM6l4g3vYK24OJmJGlK93gU9e5QRYor6wLCg/fWXBvGXs54QmjQZ6c5LMfOCDuX3VcOOsz8z3wvfjyYUBOrjhp1qXgHux//vIAFarVOx8honGkvLsz2u51cD4JucLg6t8sZHYM0jvRCH+yyeazbLsPrMtUg6lISm8D7XwWv5CBTitMRPXgN3xGVFOsnEVBpUPEFqbdGgiwYZ/z71itqgkqM/fPyO1QZ5vLHqv4bnLlvCaCO1QSWi0bl/kUSDDSsBfqgNKtEEN2qDStFN90JpUMnsUZ4+NPidvVIKUBtUDkA0OBBCNDjxWjQ4o4sGR34DhGGszb2iUaMAAAAASUVORK5CYII=');
|
|
177
|
+
animation: fade-in-out alternate infinite 1s;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
#loading[data-mako] small::after {
|
|
181
|
+
content: 'Umi with Mako';
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
#loading[data-mako] .loader {
|
|
185
|
+
position: fixed;
|
|
186
|
+
left: 0;
|
|
187
|
+
top: 0;
|
|
188
|
+
height: 5px;
|
|
189
|
+
width: 100vw;
|
|
190
|
+
--c:no-repeat linear-gradient(#1d90fe 0 0);
|
|
191
|
+
background: var(--c),var(--c),#cddeee;
|
|
192
|
+
background-size: 60% 100%;
|
|
193
|
+
animation: l16 3s infinite;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
@keyframes l16 {
|
|
197
|
+
0% {background-position:-150% 0,-150% 0}
|
|
198
|
+
66% {background-position: 250% 0,-150% 0}
|
|
199
|
+
100% {background-position: 250% 0, 250% 0}
|
|
200
|
+
}
|
|
201
|
+
</style>
|
|
202
|
+
<style data-utoopack>
|
|
203
|
+
#loading[data-utoopack]::after {
|
|
204
|
+
position: absolute;
|
|
205
|
+
top: 0;
|
|
206
|
+
left: 64px;
|
|
207
|
+
content: '';
|
|
208
|
+
width: 20px;
|
|
209
|
+
height: 22px;
|
|
210
|
+
background: center / 20px 22px;
|
|
211
|
+
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAuCAMAAABteatCAAABKVBMVEUAAAADAgAAAAAAAAAAAAAAAAAAAAAIBwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMCgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASDwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+2SgAAAD81ycWEwPxzSXOsCBBOAoqIwbjwiOWgBd2ZBJdTw741Ca1mhyhihlHPAswKQcbFwT00CbgvyLWtyG5nh2GchV7aRNYSw1VSA3zzybpxyTmxCTLrR+QehaMdxZvXxFmVxBjVQ85MQglIAXqxyTSsyG/ox6zmRyrkhqpkBqmjhqdhhiBbhRQRAxMQQyKBhJVAAAAM3RSTlMA/vrcEO3F/nA4BvfUqYx4aFAjBP7x6uOugCEdCrSllohUSj0yLRQC/se/k2FWJ7qamFjVvxppAAAB4klEQVQ4y42U10IaQRhG2QVBAaVIMxQNCthT9iwdkSoEEkss6e39HyIaQ4Zhdjee63PxH/h2XCqF4EbU9QQ8bsAb9vxXzNI7iYGeivgdvQ12h8ag09VgaXPF3sujjYwHzq96gNvu3OgSY2PGx1bf7txMkJ+mITBHNufmuKsYMm//nit5y8TODJXzKWTnvW2dL4YFpz5y63NeOkHLyvum8ao05/m91EwLr6mxJR24Sf+DhTeGkOQd4ruw8FpoYcnbCfBd1cwb9CPJKya5Vr32lEBe8kovuG0r3qBLfNslsUW5oXiVWxI7shdB+6R473okj2XvOM6l4g3vYK24OJmJGlK93gU9e5QRYor6wLCg/fWXBvGXs54QmjQZ6c5LMfOCDuX3VcOOsz8z3wvfjyYUBOrjhp1qXgHux//vIAFarVOx8honGkvLsz2u51cD4JucLg6t8sZHYM0jvRCH+yyeazbLsPrMtUg6lISm8D7XwWv5CBTitMRPXgN3xGVFOsnEVBpUPEFqbdGgiwYZ/z71itqgkqM/fPyO1QZ5vLHqv4bnLlvCaCO1QSWi0bl/kUSDDSsBfqgNKtEEN2qDStFN90JpUMnsUZ4+NPidvVIKUBtUDkA0OBBCNDjxWjQ4o4sGR34DhGGszb2iUaMAAAAASUVORK5CYII=');
|
|
212
|
+
animation: fade-in-out alternate infinite 1s;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
#loading[data-utoopack] small::after {
|
|
216
|
+
content: 'Umi with Utoopack';
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
#loading[data-utoopack] .loader {
|
|
220
|
+
position: fixed;
|
|
221
|
+
left: 0;
|
|
222
|
+
top: 0;
|
|
223
|
+
height: 5px;
|
|
224
|
+
width: 100vw;
|
|
225
|
+
--c:no-repeat linear-gradient(#1d90fe 0 0);
|
|
226
|
+
background: var(--c),var(--c),#cddeee;
|
|
227
|
+
background-size: 60% 100%;
|
|
228
|
+
animation: l16 3s infinite;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
@keyframes l16 {
|
|
232
|
+
0% {background-position:-150% 0,-150% 0}
|
|
233
|
+
66% {background-position: 250% 0,-150% 0}
|
|
234
|
+
100% {background-position: 250% 0, 250% 0}
|
|
235
|
+
}
|
|
236
|
+
</style>
|
|
237
|
+
</head>
|
|
238
|
+
|
|
239
|
+
<body>
|
|
240
|
+
<div id="loading">
|
|
241
|
+
<div class="loader"></div>
|
|
242
|
+
<h3>Bundling...</h3>
|
|
243
|
+
<small></small>
|
|
244
|
+
<p class="summary"></p>
|
|
245
|
+
<p class="detail"></p>
|
|
246
|
+
</div>
|
|
247
|
+
<code class="progress-details"></code>
|
|
248
|
+
|
|
249
|
+
<script>
|
|
250
|
+
const loading = document.getElementById('loading');
|
|
251
|
+
const progressDetails = document.querySelector('.progress-details');
|
|
252
|
+
const summary = loading.querySelector('.summary');
|
|
253
|
+
const detail = loading.querySelector('.detail');
|
|
254
|
+
|
|
255
|
+
function check(data) {
|
|
256
|
+
renderStatus(data);
|
|
257
|
+
if (
|
|
258
|
+
data.bundleStatus.done &&
|
|
259
|
+
(!data.mfsuBundleStatus || data.mfsuBundleStatus.done)
|
|
260
|
+
) {
|
|
261
|
+
location.reload();
|
|
262
|
+
} else {
|
|
263
|
+
setTimeout(loadData, 300);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
function renderStatus(data) {
|
|
268
|
+
if (data.bundler === 'mako') {
|
|
269
|
+
loading.setAttribute('data-mako', '');
|
|
270
|
+
window.__MAKO_PERCENT = window.__MAKO_PERCENT || 0.1;
|
|
271
|
+
const makoPercent = Math.floor(window.__MAKO_PERCENT * 100);
|
|
272
|
+
loading.setAttribute('data-percent', makoPercent);
|
|
273
|
+
window.__MAKO_PERCENT = window.__MAKO_PERCENT >= 1 ? 0.2 : window.__MAKO_PERCENT + 0.1;
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
if (data.bundler === 'utoopack') {
|
|
277
|
+
loading.setAttribute('data-utoopack', '');
|
|
278
|
+
window.__UTOO_PERCENT = window.__UTOO_PERCENT || 0.1;
|
|
279
|
+
const utooPercent = Math.floor(window.__UTOO_PERCENT * 100);
|
|
280
|
+
loading.setAttribute('data-percent', utooPercent);
|
|
281
|
+
window.__UTOO_PERCENT = window.__UTOO_PERCENT >= 1 ? 0.2 : window.__UTOO_PERCENT + 0.1;
|
|
282
|
+
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
const hasMFSU = Boolean(data.mfsuBundleStatus);
|
|
286
|
+
const hasProgressDetails = Boolean(
|
|
287
|
+
data.bundleStatus.progresses[0].details,
|
|
288
|
+
);
|
|
289
|
+
|
|
290
|
+
if (hasProgressDetails) {
|
|
291
|
+
const details = data.bundleStatus.progresses[0].details;
|
|
292
|
+
if (details.length) {
|
|
293
|
+
progressDetails.innerHTML = details.join('<br />');
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
const srcPercent = Math.floor(
|
|
298
|
+
(data.bundleStatus.done
|
|
299
|
+
? 1
|
|
300
|
+
: data.bundleStatus.progresses[0].percent || 0) * 100,
|
|
301
|
+
);
|
|
302
|
+
const mfsuPrecent =
|
|
303
|
+
hasMFSU &&
|
|
304
|
+
Math.floor(
|
|
305
|
+
(data.mfsuBundleStatus.done
|
|
306
|
+
? 1
|
|
307
|
+
: data.mfsuBundleStatus.percent || 0) * 100,
|
|
308
|
+
);
|
|
309
|
+
const totalPercent = hasMFSU
|
|
310
|
+
? Math.floor((srcPercent + mfsuPrecent) / 2)
|
|
311
|
+
: srcPercent;
|
|
312
|
+
const summaryText = totalPercent + '<span>%</span>';
|
|
313
|
+
let detailText = summaryText;
|
|
314
|
+
|
|
315
|
+
if (hasMFSU) {
|
|
316
|
+
loading.setAttribute('data-mfsu', '');
|
|
317
|
+
detailText = [
|
|
318
|
+
srcPercent + '<span>% for src</span>',
|
|
319
|
+
'<br />',
|
|
320
|
+
mfsuPrecent + '<span>% for deps</span>',
|
|
321
|
+
].join('\n');
|
|
322
|
+
detail.innerHTML = detailText;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
loading.setAttribute('data-percent', totalPercent);
|
|
326
|
+
summary.innerHTML = summaryText;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
function loadData() {
|
|
330
|
+
fetch('/__umi/api/bundle-status')
|
|
331
|
+
.then((res) => res.json())
|
|
332
|
+
.then(check);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
loadData();
|
|
336
|
+
</script>
|
|
337
|
+
</body>
|
|
338
|
+
</html>
|