From 11705f6e9b111ad19156c85bb4acd3f63809ebe0 Mon Sep 17 00:00:00 2001 From: chilingling Date: Tue, 28 Oct 2025 19:57:06 +0800 Subject: [PATCH 1/5] feat: move upload script to template MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 将同步物料的脚本移动到用户工程以及模板中。(通过 cli 模板可以直接得到 script) 2. 使用 FormData API 替代手动构造 multipart/form-data 请求体;增强错误处理和日志输出;增强功能详细说明 3. 将 `updateTempmlate` 中的 `assert` 语法改为 `with` (Node.js v22 assert 语法已经被废弃) --- designer-demo/package.json | 6 +- designer-demo/scripts/logger.mjs | 43 +++++++++++++ designer-demo/scripts/uploadMaterials.mjs | 62 +++++++++++++++++++ package.json | 2 +- .../engine-cli/template/designer/package.json | 4 ++ .../template/designer/scripts/logger.mjs | 43 +++++++++++++ .../designer/scripts/uploadMaterials.mjs | 62 +++++++++++++++++++ scripts/updateTemplate.mjs | 2 +- scripts/uploadMaterials.mjs | 40 ------------ 9 files changed, 221 insertions(+), 43 deletions(-) create mode 100644 designer-demo/scripts/logger.mjs create mode 100644 designer-demo/scripts/uploadMaterials.mjs create mode 100644 packages/engine-cli/template/designer/scripts/logger.mjs create mode 100644 packages/engine-cli/template/designer/scripts/uploadMaterials.mjs delete mode 100644 scripts/uploadMaterials.mjs diff --git a/designer-demo/package.json b/designer-demo/package.json index 4e17ecd492..15bf982874 100644 --- a/designer-demo/package.json +++ b/designer-demo/package.json @@ -8,7 +8,8 @@ "build:alpha": "cross-env NODE_OPTIONS=--max-old-space-size=10240 vite build --mode alpha", "build": "cross-env NODE_OPTIONS=--max-old-space-size=10240 vite build", "test": "vitest run", - "test:watch": "vitest" + "test:watch": "vitest", + "uploadMaterials": "node ./scripts/uploadMaterials.mjs" }, "dependencies": { "@opentiny/tiny-engine": "workspace:^", @@ -28,6 +29,9 @@ "@opentiny/tiny-engine-vite-config": "workspace:^", "@vitejs/plugin-vue": "^5.1.2", "cross-env": "^7.0.3", + "dotenv": "^16.6.1", + "fs-extra": "^11.3.2", + "picocolors": "^1.1.1", "vite": "^5.4.2", "vitest": "3.0.9" } diff --git a/designer-demo/scripts/logger.mjs b/designer-demo/scripts/logger.mjs new file mode 100644 index 0000000000..c4615cfdbf --- /dev/null +++ b/designer-demo/scripts/logger.mjs @@ -0,0 +1,43 @@ +import colors from 'picocolors' + +class Logger { + constructor(command) { + this.command = command + } + + output(type, msg) { + const format = () => { + const colorMap = { + info: 'cyan', + warn: 'yellow', + error: 'red', + success: 'green' + } + const time = new Date().toLocaleTimeString() + const colorMsg = colors[colorMap[type]](type) + + return `[${this.command}] [${colors.dim(time)}] ${colorMsg} ${msg}` + } + const _logger = console + + return _logger.log(format()) + } + + info(msg) { + this.output('info', msg) + } + + warn(msg) { + this.output('warn', msg) + } + + error(msg) { + this.output('error', msg) + } + + success(msg) { + this.output('success', msg) + } +} + +export default Logger diff --git a/designer-demo/scripts/uploadMaterials.mjs b/designer-demo/scripts/uploadMaterials.mjs new file mode 100644 index 0000000000..00e4271944 --- /dev/null +++ b/designer-demo/scripts/uploadMaterials.mjs @@ -0,0 +1,62 @@ +import { Buffer } from 'node:buffer' +import path from 'node:path' +import dotenv from 'dotenv' +import fs from 'fs-extra' +import Logger from './logger.mjs' + + +/** + * 同步物料资产包到后端数据库 + * 1. 读取 env/.env.local 文件,获取后端地址。需要设置地址如:backend_url=http://localhost:9090 + * 2. 读取 public/mock/bundle.json 文件,获取物料资产包数据 + * 3. 将物料资产包数据通过 POST 请求上传到后端接口 /material-center/api/component/bundle/create + * 4. 检查数据库t_component表中数据是否更新成功 + * + * 使用场景: + * 1. 本地已经将 bundle.json 文件进行修改,但是数据需要同步到后端数据库中。 + * 2. 本地已经将 bundle.json 文件进行修改,但是出码仍然不正确。 + * @returns + */ +async function main() { + const logger = new Logger('uploadMaterials') + + // 先构造出.env*文件的绝对路径 + const appDirectory = fs.realpathSync(process.cwd()) + const resolveApp = (relativePath) => path.resolve(appDirectory, relativePath) + const pathsDotenv = resolveApp('env') + logger.info(`Start to load .env.local file from ${pathsDotenv}/.env.local`) + dotenv.config({ path: `${pathsDotenv}/.env.local` }) + const { backend_url } = process.env + + if (!backend_url) { + logger.error('backend_url is not set in .env.local file') + return + } + + const bundlePath = path.join(process.cwd(), './public/mock/bundle.json') + logger.info(`Start to read bundle.json file from ${bundlePath}`) + const bundle = fs.readJSONSync(bundlePath) + const jsonBuffer = Buffer.from(JSON.stringify(bundle)) + + const requestUrl = (backend_url.endsWith('/') ? backend_url.slice(0, -1) : backend_url) + '/material-center/api/component/bundle/create' + logger.info(`Start to upload bundle.json file to ${requestUrl}`) + try { + const formData = new FormData() + formData.append('file', new Blob([jsonBuffer], { type: 'application/json'}), 'bundle.json') + const response = await fetch(requestUrl, { + method: 'POST', + body: formData + }) + const data = await response.json() + logger.success('File uploaded successfully:', data) + } catch (error) { + logger.error('Error uploading file:', error instanceof Error ? error.message : String(error)) + } +} + +main() +.catch((e) => { + const logger = new Logger('uploadMaterials') + logger.error('Error uploading file:', e instanceof Error ? e.message : String(e)); + process.exit(1); +}) diff --git a/package.json b/package.json index 5e101abe25..38c87c8875 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "splitMaterials": "node ./scripts/splitMaterials.mjs", "buildMaterials": "node ./scripts/buildMaterials.mjs", "updateTemplate": "node ./scripts/updateTemplate.mjs", - "uploadMaterials": "node scripts/uploadMaterials.mjs" + "uploadMaterials": "pnpm --filter designer-demo uploadMaterials" }, "devDependencies": { "@eslint/js": "^8.57.1", diff --git a/packages/engine-cli/template/designer/package.json b/packages/engine-cli/template/designer/package.json index 895a70aa07..c920c270a3 100644 --- a/packages/engine-cli/template/designer/package.json +++ b/packages/engine-cli/template/designer/package.json @@ -7,6 +7,7 @@ "dev": "concurrently 'pnpm:serve:mock' 'pnpm:serve:frontend'", "build:alpha": "cross-env NODE_OPTIONS=--max-old-space-size=10240 vite build --mode alpha", "build": "cross-env NODE_OPTIONS=--max-old-space-size=10240 vite build", + "uploadMaterials": "node ./scripts/uploadMaterials.mjs", "serve:frontend": "cross-env vite", "serve:mock": "node node_modules/@opentiny/tiny-engine-mock/dist/app.js" }, @@ -28,6 +29,9 @@ "@opentiny/tiny-engine-vite-config": "^2.8.0", "@vitejs/plugin-vue": "^5.1.2", "cross-env": "^7.0.3", + "dotenv": "^16.6.1", + "fs-extra": "^11.3.2", + "picocolors": "^1.1.1", "vite": "^5.4.2", "concurrently": "^8.2.0" } diff --git a/packages/engine-cli/template/designer/scripts/logger.mjs b/packages/engine-cli/template/designer/scripts/logger.mjs new file mode 100644 index 0000000000..c4615cfdbf --- /dev/null +++ b/packages/engine-cli/template/designer/scripts/logger.mjs @@ -0,0 +1,43 @@ +import colors from 'picocolors' + +class Logger { + constructor(command) { + this.command = command + } + + output(type, msg) { + const format = () => { + const colorMap = { + info: 'cyan', + warn: 'yellow', + error: 'red', + success: 'green' + } + const time = new Date().toLocaleTimeString() + const colorMsg = colors[colorMap[type]](type) + + return `[${this.command}] [${colors.dim(time)}] ${colorMsg} ${msg}` + } + const _logger = console + + return _logger.log(format()) + } + + info(msg) { + this.output('info', msg) + } + + warn(msg) { + this.output('warn', msg) + } + + error(msg) { + this.output('error', msg) + } + + success(msg) { + this.output('success', msg) + } +} + +export default Logger diff --git a/packages/engine-cli/template/designer/scripts/uploadMaterials.mjs b/packages/engine-cli/template/designer/scripts/uploadMaterials.mjs new file mode 100644 index 0000000000..ac821912a8 --- /dev/null +++ b/packages/engine-cli/template/designer/scripts/uploadMaterials.mjs @@ -0,0 +1,62 @@ +import { Buffer } from 'node:buffer' +import path from 'node:path' +import dotenv from 'dotenv' +import fs from 'fs-extra' +import Logger from './logger.mjs' + +/** + * 同步物料资产包到后端数据库 + * 1. 读取 env/.env.local 文件,获取后端地址。需要设置地址如:backend_url=http://localhost:9090 + * 2. 读取 public/mock/bundle.json 文件,获取物料资产包数据 + * 3. 将物料资产包数据通过 POST 请求上传到后端接口 /material-center/api/component/bundle/create + * 4. 检查数据库t_component表中数据是否更新成功 + * + * 使用场景: + * 1. 本地已经将 bundle.json 文件进行修改,但是数据需要同步到后端数据库中。 + * 2. 本地已经将 bundle.json 文件进行修改,但是出码仍然不正确。 + * @returns + */ +async function main() { + const logger = new Logger('uploadMaterials') + + // 先构造出.env*文件的绝对路径 + const appDirectory = fs.realpathSync(process.cwd()) + const resolveApp = (relativePath) => path.resolve(appDirectory, relativePath) + const pathsDotenv = resolveApp('env') + logger.info(`Start to load .env.local file from ${pathsDotenv}/.env.local`) + dotenv.config({ path: `${pathsDotenv}/.env.local` }) + const { backend_url } = process.env + + if (!backend_url) { + logger.error('backend_url is not set in .env.local file') + return + } + + const bundlePath = path.join(process.cwd(), './public/mock/bundle.json') + logger.info(`Start to read bundle.json file from ${bundlePath}`) + const bundle = fs.readJSONSync(bundlePath) + const jsonBuffer = Buffer.from(JSON.stringify(bundle)) + + const requestUrl = + (backend_url.endsWith('/') ? backend_url.slice(0, -1) : backend_url) + + '/material-center/api/component/bundle/create' + logger.info(`Start to upload bundle.json file to ${requestUrl}`) + try { + const formData = new FormData() + formData.append('file', new Blob([jsonBuffer], { type: 'application/json' }), 'bundle.json') + const response = await fetch(requestUrl, { + method: 'POST', + body: formData + }) + const data = await response.json() + logger.success('File uploaded successfully:', data) + } catch (error) { + logger.error('Error uploading file:', error instanceof Error ? error.message : String(error)) + } +} + +main().catch((e) => { + const logger = new Logger('uploadMaterials') + logger.error('Error uploading file:', e instanceof Error ? e.message : String(e)) + process.exit(1) +}) diff --git a/scripts/updateTemplate.mjs b/scripts/updateTemplate.mjs index 9557c5c626..b3edd01db1 100644 --- a/scripts/updateTemplate.mjs +++ b/scripts/updateTemplate.mjs @@ -2,7 +2,7 @@ import fs from 'fs-extra' import path from 'node:path' import { fileURLToPath } from 'node:url' import Logger from './logger.mjs' -import pkg from '../packages/design-core/package.json' assert { type: 'json' } +import pkg from '../packages/design-core/package.json' with { type: 'json' } const logger = new Logger('updateTemplate') diff --git a/scripts/uploadMaterials.mjs b/scripts/uploadMaterials.mjs deleted file mode 100644 index 9435f87e1d..0000000000 --- a/scripts/uploadMaterials.mjs +++ /dev/null @@ -1,40 +0,0 @@ -import { Buffer } from 'buffer' -import dotenv from 'dotenv' -import fs from 'fs-extra' -import path from 'node:path' -import Logger from './logger.mjs' - -const logger = new Logger('uploadMaterials') - -// 先构造出.env*文件的绝对路径 -const appDirectory = fs.realpathSync(process.cwd()) -const resolveApp = (relativePath) => path.resolve(appDirectory, relativePath) -const pathsDotenv = resolveApp('.env') -dotenv.config({ path: `${pathsDotenv}.local` }) -const { backend_url } = process.env - -const bundlePath = path.join(process.cwd(), '/designer-demo/public/mock/bundle.json') -const bundle = fs.readJSONSync(bundlePath) -const jsonBuffer = Buffer.from(JSON.stringify(bundle)) -const boundary = '----WebKitFormBoundary7MA4YWxkTrZu0gW' -const formHeaders = { - 'Content-Type': `multipart/form-data; boundary=${boundary}`, -} - -let body = `--${boundary}\r\n` -body += 'Content-Disposition: form-data; name="file"; filename="bundle.json"\r\n' -body += 'Content-Type: application/json\r\n\r\n' -body += jsonBuffer.toString() + `\r\n--${boundary}--` - -fetch(backend_url, { - method: 'POST', - headers: formHeaders, - body: body, -}) - .then(response => response.json()) - .then(data => { - logger.success('File uploaded successfully:', data) - }) - .catch(error => { - logger.error('Error uploading file:', error) - }) From f6861e8f2f835ff38601c1c549b06998ece7c9a7 Mon Sep 17 00:00:00 2001 From: chilingling Date: Wed, 29 Oct 2025 09:56:18 +0800 Subject: [PATCH 2/5] fix: review issue --- designer-demo/scripts/uploadMaterials.mjs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/designer-demo/scripts/uploadMaterials.mjs b/designer-demo/scripts/uploadMaterials.mjs index 00e4271944..8e3903aa92 100644 --- a/designer-demo/scripts/uploadMaterials.mjs +++ b/designer-demo/scripts/uploadMaterials.mjs @@ -30,7 +30,7 @@ async function main() { if (!backend_url) { logger.error('backend_url is not set in .env.local file') - return + process.exit(1) } const bundlePath = path.join(process.cwd(), './public/mock/bundle.json') @@ -47,6 +47,11 @@ async function main() { method: 'POST', body: formData }) + + if (!response.ok) { + const errorText = await response.text() + throw new Error(`Upload failed with status ${response.status}: ${errorText}`) + } const data = await response.json() logger.success('File uploaded successfully:', data) } catch (error) { From 72544122de90dd46eebf0b12ec7ac2dcfd5edabd Mon Sep 17 00:00:00 2001 From: lu17301156525 Date: Tue, 28 Oct 2025 20:00:46 -0700 Subject: [PATCH 3/5] fix: modify log output --- designer-demo/scripts/logger.mjs | 72 +++++++++++++++-------- designer-demo/scripts/uploadMaterials.mjs | 10 +++- 2 files changed, 57 insertions(+), 25 deletions(-) diff --git a/designer-demo/scripts/logger.mjs b/designer-demo/scripts/logger.mjs index c4615cfdbf..24f1c7bbca 100644 --- a/designer-demo/scripts/logger.mjs +++ b/designer-demo/scripts/logger.mjs @@ -1,43 +1,67 @@ -import colors from 'picocolors' - class Logger { - constructor(command) { + constructor(command = 'default') { this.command = command + this.hasColors = this.checkColorSupport() } - output(type, msg) { - const format = () => { + checkColorSupport() { + try { + require('colors') + return true + } catch (e) { + console.warn('colors package not found, using basic logging') + return false + } + } + + output(type, ...args) { // 支持多个参数 + const time = new Date().toLocaleTimeString() + const prefix = `[${this.command}] [${time}]` + + // 将所有参数合并为一个字符串 + const message = args.map(arg => { + if (typeof arg === 'object') { + return JSON.stringify(arg, null, 2) + } + return String(arg) + }).join(' ') + + if (this.hasColors) { + const colors = require('colors') const colorMap = { - info: 'cyan', - warn: 'yellow', - error: 'red', - success: 'green' + info: colors.cyan, + warn: colors.yellow, + error: colors.red, + success: colors.green } - const time = new Date().toLocaleTimeString() - const colorMsg = colors[colorMap[type]](type) - return `[${this.command}] [${colors.dim(time)}] ${colorMsg} ${msg}` + const coloredType = colorMap[type] ? colorMap[type](type.toUpperCase()) : type.toUpperCase() + console.log(`${prefix} ${coloredType} ${message}`) + } else { + const emojiMap = { + info: 'ℹ️', + warn: '⚠️', + error: '❌', + success: '✅' + } + console.log(`${prefix} ${emojiMap[type] || ''} ${message}`) } - const _logger = console - - return _logger.log(format()) } - info(msg) { - this.output('info', msg) + success(...args) { + this.output('success', ...args) } - warn(msg) { - this.output('warn', msg) + info(...args) { + this.output('info', ...args) } - error(msg) { - this.output('error', msg) + warn(...args) { + this.output('warn', ...args) } - success(msg) { - this.output('success', msg) + error(...args) { + this.output('error', ...args) } } - export default Logger diff --git a/designer-demo/scripts/uploadMaterials.mjs b/designer-demo/scripts/uploadMaterials.mjs index 8e3903aa92..64b6d9210b 100644 --- a/designer-demo/scripts/uploadMaterials.mjs +++ b/designer-demo/scripts/uploadMaterials.mjs @@ -53,7 +53,15 @@ async function main() { throw new Error(`Upload failed with status ${response.status}: ${errorText}`) } const data = await response.json() - logger.success('File uploaded successfully:', data) + if (data && data.success) { + logger.success('File uploaded successfully!') + logger.success('Inserted records:', data.data?.insertNum || 0) + logger.success('Updated records:', data.data?.updateNum || 0) + logger.success('Message:', data.message) + } else { + logger.warn('Upload completed but success flag is false:', data) + logger.warn('Upload completed with warnings:', data.message) + } } catch (error) { logger.error('Error uploading file:', error instanceof Error ? error.message : String(error)) } From 7c85d4e33c57a56a631dd92946768ccdbfbc138d Mon Sep 17 00:00:00 2001 From: lu17301156525 Date: Sun, 2 Nov 2025 22:22:17 -0800 Subject: [PATCH 4/5] fix: modify uploadMaterials.mjs --- bash.exe.stackdump | 19 ++++ designer-demo/scripts/logger.mjs | 89 ++++++++++++------- designer-demo/scripts/uploadMaterials.mjs | 13 ++- .../template/designer/scripts/logger.mjs | 89 ++++++++++++++----- .../designer/scripts/uploadMaterials.mjs | 18 +++- 5 files changed, 160 insertions(+), 68 deletions(-) create mode 100644 bash.exe.stackdump diff --git a/bash.exe.stackdump b/bash.exe.stackdump new file mode 100644 index 0000000000..f6a53cfcfe --- /dev/null +++ b/bash.exe.stackdump @@ -0,0 +1,19 @@ +Stack trace: +Frame Function Args +000005FF320 00210062B0E (00210298702, 00210275E3E, 0000000005A, 000005FAE80) +000005FF320 0021004846A (00000000000, 00000000000, 7FFD00000000, 00000001000) +000005FF320 002100484A2 (00000000000, 000000005AF, 0000000005A, 00000000000) +000005FF320 002100DA818 (00000000000, 00200000000, 002102759F2, 000005FBFCC) +000005FF320 002101334F7 (00000000000, 0021022B1A0, 0021022B190, 000005FDDE0) +000005FF320 002100488B4 (00210317960, 000005FDDE0, 002100DB7A0, 00000000000) +000005FF320 0021004A01F (0007FFE0384, 00000000000, 00000000000, 00000000000) +000005FF320 002100DB858 (00000000000, 00000000000, 00000000000, 00000000000) +000005FF5C0 7FFD03635D37 (00210040000, 00000000001, 00000000000, 000005FF508) +000005FF5C0 7FFD036385E9 (7FFD03638900, 000006E4201, 7FFD00000001, 00000000001) +000005FF5C0 7FFD03638854 (000006E4250, 000005FF5C0, 000006E4A80, 0000023F000) +000005FF5C0 7FFD0363887E (00000000010, 00000000000, 7FFD03730E50, 000005FF654) +00000000000 7FFD036E6116 (00000000000, 00000000000, 00000000001, 00000000000) +00000000000 7FFD036883FB (7FFD03610000, 00000000000, 00000240000, 00000000000) +00000000000 7FFD03688283 (00000000000, 00000000000, 00000000000, 00000000000) +00000000000 7FFD0368822E (00000000000, 00000000000, 00000000000, 00000000000) +End of stack trace diff --git a/designer-demo/scripts/logger.mjs b/designer-demo/scripts/logger.mjs index 24f1c7bbca..5b1fe344eb 100644 --- a/designer-demo/scripts/logger.mjs +++ b/designer-demo/scripts/logger.mjs @@ -1,67 +1,88 @@ +const log = (() => { + return (...args) => { + process.stdout.write(args.map(arg => + typeof arg === 'object' ? JSON.stringify(arg, null, 2) : String(arg) + ).join(' ') + '\n'); + }; +})(); + +const warn = (() => { + return (...args) => { + process.stderr.write(args.map(arg => + typeof arg === 'object' ? JSON.stringify(arg, null, 2) : String(arg) + ).join(' ') + '\n'); + }; +})(); + class Logger { constructor(command = 'default') { - this.command = command - this.hasColors = this.checkColorSupport() + this.command = command; + this.colors = null; + this.hasColors = false; + this.initColors(); } - checkColorSupport() { + async initColors() { try { - require('colors') - return true - } catch (e) { - console.warn('colors package not found, using basic logging') - return false + const colorsModule = await import('colors'); + this.colors = colorsModule.default || colorsModule; + this.hasColors = true; + } catch (err) { + warn('colors package not found, using basic logging'); + this.hasColors = false; } } - output(type, ...args) { // 支持多个参数 - const time = new Date().toLocaleTimeString() - const prefix = `[${this.command}] [${time}]` - - // 将所有参数合并为一个字符串 - const message = args.map(arg => { + output(type, ...args) { + const time = new Date().toLocaleTimeString(); + const prefix = `[${this.command}] [${time}]`; + const message = args.map((arg) => { if (typeof arg === 'object') { - return JSON.stringify(arg, null, 2) + return JSON.stringify(arg, null, 2); } - return String(arg) - }).join(' ') + return String(arg); + }).join(' '); + + const outputFn = type === 'error' || type === 'warn' ? warn : log; - if (this.hasColors) { - const colors = require('colors') + if (this.hasColors && this.colors) { const colorMap = { - info: colors.cyan, - warn: colors.yellow, - error: colors.red, - success: colors.green - } + info: this.colors.cyan, + warn: this.colors.yellow, + error: this.colors.red, + success: this.colors.green, + }; + const coloredType = colorMap[type] + ? colorMap[type](type.toUpperCase()) + : type.toUpperCase(); - const coloredType = colorMap[type] ? colorMap[type](type.toUpperCase()) : type.toUpperCase() - console.log(`${prefix} ${coloredType} ${message}`) + outputFn(`${prefix} ${coloredType} ${message}`); } else { const emojiMap = { info: 'ℹ️', warn: '⚠️', error: '❌', - success: '✅' - } - console.log(`${prefix} ${emojiMap[type] || ''} ${message}`) + success: '✅', + }; + outputFn(`${prefix} ${emojiMap[type] || ''} ${message}`); } } success(...args) { - this.output('success', ...args) + this.output('success', ...args); } info(...args) { - this.output('info', ...args) + this.output('info', ...args); } warn(...args) { - this.output('warn', ...args) + this.output('warn', ...args); } error(...args) { - this.output('error', ...args) + this.output('error', ...args); } } -export default Logger + +export default Logger; diff --git a/designer-demo/scripts/uploadMaterials.mjs b/designer-demo/scripts/uploadMaterials.mjs index 64b6d9210b..17aceaa876 100644 --- a/designer-demo/scripts/uploadMaterials.mjs +++ b/designer-demo/scripts/uploadMaterials.mjs @@ -1,7 +1,7 @@ -import { Buffer } from 'node:buffer' -import path from 'node:path' import dotenv from 'dotenv' import fs from 'fs-extra' +import { Buffer } from 'node:buffer' +import path from 'node:path' import Logger from './logger.mjs' @@ -54,13 +54,10 @@ async function main() { } const data = await response.json() if (data && data.success) { - logger.success('File uploaded successfully!') - logger.success('Inserted records:', data.data?.insertNum || 0) - logger.success('Updated records:', data.data?.updateNum || 0) - logger.success('Message:', data.message) + logger.success(`File uploaded successfully:${JSON.stringify(data)}`) } else { - logger.warn('Upload completed but success flag is false:', data) - logger.warn('Upload completed with warnings:', data.message) + logger.warn(`Upload completed but success flag is false: ${JSON.stringify(data)}`) + logger.warn(`Upload completed with warnings: ${JSON.stringify(data.message)}`) } } catch (error) { logger.error('Error uploading file:', error instanceof Error ? error.message : String(error)) diff --git a/packages/engine-cli/template/designer/scripts/logger.mjs b/packages/engine-cli/template/designer/scripts/logger.mjs index c4615cfdbf..f19994e935 100644 --- a/packages/engine-cli/template/designer/scripts/logger.mjs +++ b/packages/engine-cli/template/designer/scripts/logger.mjs @@ -1,42 +1,87 @@ -import colors from 'picocolors' +const log = (() => { + return (...args) => { + process.stdout.write( + args.map((arg) => (typeof arg === 'object' ? JSON.stringify(arg, null, 2) : String(arg))).join(' ') + '\n' + ) + } +})() + +const warn = (() => { + return (...args) => { + process.stderr.write( + args.map((arg) => (typeof arg === 'object' ? JSON.stringify(arg, null, 2) : String(arg))).join(' ') + '\n' + ) + } +})() class Logger { - constructor(command) { + constructor(command = 'default') { this.command = command + this.colors = null + this.hasColors = false + this.initColors() + } + + async initColors() { + try { + const colorsModule = await import('colors') + this.colors = colorsModule.default || colorsModule + this.hasColors = true + } catch (err) { + warn('colors package not found, using basic logging') + this.hasColors = false + } } - output(type, msg) { - const format = () => { + output(type, ...args) { + const time = new Date().toLocaleTimeString() + const prefix = `[${this.command}] [${time}]` + const message = args + .map((arg) => { + if (typeof arg === 'object') { + return JSON.stringify(arg, null, 2) + } + return String(arg) + }) + .join(' ') + + const outputFn = type === 'error' || type === 'warn' ? warn : log + + if (this.hasColors && this.colors) { const colorMap = { - info: 'cyan', - warn: 'yellow', - error: 'red', - success: 'green' + info: this.colors.cyan, + warn: this.colors.yellow, + error: this.colors.red, + success: this.colors.green } - const time = new Date().toLocaleTimeString() - const colorMsg = colors[colorMap[type]](type) + const coloredType = colorMap[type] ? colorMap[type](type.toUpperCase()) : type.toUpperCase() - return `[${this.command}] [${colors.dim(time)}] ${colorMsg} ${msg}` + outputFn(`${prefix} ${coloredType} ${message}`) + } else { + const emojiMap = { + info: 'ℹ️', + warn: '⚠️', + error: '❌', + success: '✅' + } + outputFn(`${prefix} ${emojiMap[type] || ''} ${message}`) } - const _logger = console - - return _logger.log(format()) } - info(msg) { - this.output('info', msg) + success(...args) { + this.output('success', ...args) } - warn(msg) { - this.output('warn', msg) + info(...args) { + this.output('info', ...args) } - error(msg) { - this.output('error', msg) + warn(...args) { + this.output('warn', ...args) } - success(msg) { - this.output('success', msg) + error(...args) { + this.output('error', ...args) } } diff --git a/packages/engine-cli/template/designer/scripts/uploadMaterials.mjs b/packages/engine-cli/template/designer/scripts/uploadMaterials.mjs index ac821912a8..763c91fb5f 100644 --- a/packages/engine-cli/template/designer/scripts/uploadMaterials.mjs +++ b/packages/engine-cli/template/designer/scripts/uploadMaterials.mjs @@ -1,7 +1,7 @@ -import { Buffer } from 'node:buffer' -import path from 'node:path' import dotenv from 'dotenv' import fs from 'fs-extra' +import { Buffer } from 'node:buffer' +import path from 'node:path' import Logger from './logger.mjs' /** @@ -29,7 +29,7 @@ async function main() { if (!backend_url) { logger.error('backend_url is not set in .env.local file') - return + process.exit(1) } const bundlePath = path.join(process.cwd(), './public/mock/bundle.json') @@ -48,8 +48,18 @@ async function main() { method: 'POST', body: formData }) + + if (!response.ok) { + const errorText = await response.text() + throw new Error(`Upload failed with status ${response.status}: ${errorText}`) + } const data = await response.json() - logger.success('File uploaded successfully:', data) + if (data && data.success) { + logger.success(`File uploaded successfully:${JSON.stringify(data)}`) + } else { + logger.warn(`Upload completed but success flag is false: ${JSON.stringify(data)}`) + logger.warn(`Upload completed with warnings: ${JSON.stringify(data.message)}`) + } } catch (error) { logger.error('Error uploading file:', error instanceof Error ? error.message : String(error)) } From dbdafe26f706efaf25a19259cc8648ad7bda7dcc Mon Sep 17 00:00:00 2001 From: lu17301156525 Date: Thu, 6 Nov 2025 18:33:20 -0800 Subject: [PATCH 5/5] fix: modify uploadMaterials.mjs --- bash.exe.stackdump | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 bash.exe.stackdump diff --git a/bash.exe.stackdump b/bash.exe.stackdump deleted file mode 100644 index f6a53cfcfe..0000000000 --- a/bash.exe.stackdump +++ /dev/null @@ -1,19 +0,0 @@ -Stack trace: -Frame Function Args -000005FF320 00210062B0E (00210298702, 00210275E3E, 0000000005A, 000005FAE80) -000005FF320 0021004846A (00000000000, 00000000000, 7FFD00000000, 00000001000) -000005FF320 002100484A2 (00000000000, 000000005AF, 0000000005A, 00000000000) -000005FF320 002100DA818 (00000000000, 00200000000, 002102759F2, 000005FBFCC) -000005FF320 002101334F7 (00000000000, 0021022B1A0, 0021022B190, 000005FDDE0) -000005FF320 002100488B4 (00210317960, 000005FDDE0, 002100DB7A0, 00000000000) -000005FF320 0021004A01F (0007FFE0384, 00000000000, 00000000000, 00000000000) -000005FF320 002100DB858 (00000000000, 00000000000, 00000000000, 00000000000) -000005FF5C0 7FFD03635D37 (00210040000, 00000000001, 00000000000, 000005FF508) -000005FF5C0 7FFD036385E9 (7FFD03638900, 000006E4201, 7FFD00000001, 00000000001) -000005FF5C0 7FFD03638854 (000006E4250, 000005FF5C0, 000006E4A80, 0000023F000) -000005FF5C0 7FFD0363887E (00000000010, 00000000000, 7FFD03730E50, 000005FF654) -00000000000 7FFD036E6116 (00000000000, 00000000000, 00000000001, 00000000000) -00000000000 7FFD036883FB (7FFD03610000, 00000000000, 00000240000, 00000000000) -00000000000 7FFD03688283 (00000000000, 00000000000, 00000000000, 00000000000) -00000000000 7FFD0368822E (00000000000, 00000000000, 00000000000, 00000000000) -End of stack trace