diff --git a/.build-scripts/runner.dev.ts b/.build-scripts/runner.dev.ts index 18a2fb2..27f221f 100644 --- a/.build-scripts/runner.dev.ts +++ b/.build-scripts/runner.dev.ts @@ -101,8 +101,8 @@ function startMain(): Promise { if (process.platform === "win32") { const pid = electronProc.pid exec(`TASKKILL /F /IM electron.exe`, (err, data) => { - if (err) console.log(err) - else console.log(chalk['green']("kill pid: " + pid + " success!")) + if (err) console.log(chalk.bgRed.white(err)) + else console.log(chalk.bgRedBright.whiteBright(` kill pid: ${pid} success!`.padEnd(process.stdout.columns - 20, ' '))) electronProc = null startElectron() manualRestart = false @@ -122,16 +122,11 @@ function startMain(): Promise { function startElectron() { let args = [ - // '--trace-warnings', - // '--inspect=5858', - // '--experimental-worker', - // '--experimental-wasm-threads', - // '--unhandled-rejections=strict', path.join(dirname, '../dist/electron/main.cjs') ] if (process.platform !== 'linux') { - args.push('--remote-debugging-port=9223', '--experimental-wasm-bulk-memory') + // args.push('--remote-debugging-port=9223', '--experimental-wasm-bulk-memory') } else { args.push('--no-sandbox') } @@ -144,12 +139,16 @@ function startElectron() { } electronProc = spawn('electron', args, { - stdio: ['inherit', 'inherit', 'inherit'], + detached: false, + stdio: 'inherit', shell: process.platform === 'win32' }) - electronProc.stdout?.on('data', data => { consoleLog('Electron', data, 'blue') }) - electronProc.stderr?.on('data', data => { consoleLog('Electron', data, 'red') }) - electronProc.on('close', () => { if (!manualRestart) process.exit() }) + // electronProc.stdout.on('data', data => { consoleLog('Electron', data, 'blue') }) + // electronProc.stderr.on('data', data => { consoleLog('Electron', data, 'red') }) + electronProc.on('close', (code) => { + console.log(chalk.bgYellow.blue(` Electron Process Closed[${code}]`.padEnd(process.stdout.columns - 20, ' '))) + if (!manualRestart) process.exit() + }) } function consoleLog(proc: string, data: any, color?: string) { @@ -172,7 +171,7 @@ function consoleLog(proc: string, data: any, color?: string) { } async function start() { - console.log(chalk.bgGreen.white(' getting ready...'.padEnd(process.stdout.columns - 20, ' '))) + console.log(chalk.bgGreen.yellowBright(' getting ready...'.padEnd(process.stdout.columns - 20, ' '))) try { let ips = getLocalIPs() diff --git a/package.json b/package.json index cee4edb..1f8a122 100644 --- a/package.json +++ b/package.json @@ -38,8 +38,10 @@ "cors": "^2.8.5", "express": "^4.21.1", "express-fileupload": "^1.5.1", + "formidable": "^3.5.2", "inversify": "^6.0.3", "json-bigint": "^1.0.0", + "multer": "^1.4.4", "pouchdb-adapter-leveldb": "^9.0.0", "pouchdb-find": "^9.0.0", "pouchdb-node": "^9.0.0", @@ -56,8 +58,10 @@ "@types/express": "^5.0.0", "@types/express-fileupload": "^1.5.1", "@types/express-serve-static-core": "^5.0.0", + "@types/formidable": "^3.4.5", "@types/json-bigint": "^1.0.4", "@types/minimist": "^1.2.5", + "@types/multer": "^1.4.6", "@types/node": "22.7.7", "@types/pouchdb": "^6.4.2", "@types/pouchdb-find": "^7.3.3", diff --git a/src/main/MainApp.ts b/src/main/MainApp.ts index bbf483d..6e44ef2 100644 --- a/src/main/MainApp.ts +++ b/src/main/MainApp.ts @@ -30,37 +30,27 @@ export default class MainApp { constructor() { this.iconDir = IS_DEV ? path.join(__dirname, '../../icons') : path.join(__dirname, './static') - let ext = '' - switch (os.platform()) { - case 'win32': - ext = 'ico' - break - case 'darwin': - case 'linux': - ext = 'png' - break - } + let ext = os.platform() == 'win32' ? 'ico' : 'png' this.trayIconFile = path.join(this.iconDir, `icon.${ext}`) this.mainServer.bootstrap() } public async startApp() { - console.log(os.platform(), os.release(), process.version, process.electron) + app.disableHardwareAcceleration() + app.commandLine.appendSwitch('disable-features', 'OutOfBlinkCors') + app.commandLine.appendSwitch('ignore-certificate-errors') + app.commandLine.appendSwitch('disable-gpu') + app.commandLine.appendSwitch('disable-software-rasterizer') + if (process.env.NODE_ENV == 'development') { + app.commandLine.appendSwitch('trace-deprecation') app.commandLine.appendSwitch('trace-warnings') app.commandLine.appendSwitch('experimental-worker') app.commandLine.appendSwitch('experimental-wasm-threads') - app.commandLine.appendSwitch('inspect', '5858') app.commandLine.appendSwitch('unhandled-rejections', 'strict') - app.commandLine.appendSwitch('trace-deprecation') + app.commandLine.appendSwitch('inspect', '5858') } - app.commandLine.appendSwitch('disable-features', 'OutOfBlinkCors') - app.commandLine.appendSwitch('ignore-certificate-errors') - app.commandLine.appendSwitch('disable-gpu') - // app.commandLine.appendSwitch('disable-software-rasterizer') - app.disableHardwareAcceleration() - if (os.platform() == 'linux' && os.userInfo().username == 'root') { app.commandLine.appendSwitch('disable-chromium-sandbox') app.commandLine.appendSwitch('disable-gpu-sandbox') @@ -134,6 +124,7 @@ export default class MainApp { titleBarOverlay: { color: "#f8f8f800", symbolColor: "black" }, trafficLightPosition: { x: os.platform() == 'darwin' ? 1030 : 10, y: 10 }, webPreferences: { + offscreen: false, webSecurity: false, devTools: true, //process.env.NODE_ENV == 'development', nodeIntegration: true, @@ -144,7 +135,6 @@ export default class MainApp { this.mainWindow = new BrowserWindow(winOpt) this.mainWindow.loadURL(this.winURL) - this.mainWindow.webContents.frameRate = 30 this.mainWindow.setVibrancy('window') this.mainWindow.on('resize', () => { @@ -171,16 +161,16 @@ export default class MainApp { icon: path.join(this.iconDir, 'ic-rule.png'), label: '用例管理', click: () => { - this.mainWindow.show() - this.mainWindow.webContents.send(ElectronAPICMD.OpenMockRuleMgr) + this.mainWindow?.show() + this.mainWindow?.webContents.send(ElectronAPICMD.OpenMockRuleMgr) } }, { icon: path.join(this.iconDir, 'ic-setting.png'), label: '设置', click: () => { - this.mainWindow.show() - this.mainWindow.webContents.send(ElectronAPICMD.OpenSettings) + this.mainWindow?.show() + this.mainWindow?.webContents.send(ElectronAPICMD.OpenSettings) } }, { @@ -251,7 +241,6 @@ export default class MainApp { private initIPCService() { ipcMain.handle(ElectronAPICMD.Relaunch, (_) => { - console.log(process.resourcesPath) if (fse.pathExistsSync(path.join(process.resourcesPath, 'update.asar'))) { const logPath = app.getPath('logs') const out = fs.openSync(path.join(logPath, 'out.log'), 'a') @@ -313,19 +302,7 @@ export default class MainApp { } async fullUpdate(version: Version) { - let ext = '' - switch (os.platform()) { - case 'win32': - ext = 'exe' - break - case 'darwin': - ext = 'zip' - break - case 'linux': - ext = 'AppImage' - break - } - + let ext = os.platform() == 'linux' ? 'AppImage' : os.platform() == 'darwin' ? 'zip' : 'exe' let downloadDir = path.join(USER_DATA_DIR, 'update', `installer-${version.version}.${ext}`) if (os.platform() == 'linux') downloadDir.replace(/ /g, "\\ ") @@ -385,7 +362,10 @@ export default class MainApp { // https://github.com/electron-userland/electron-builder/issues/1129 const errorCode = (e as NodeJS.ErrnoException).code console.log( - `Cannot run installer: error code: ${errorCode}, error message: "${e.message}", will be executed again using elevate if EACCES, and will try to use electron.shell.openItem if ENOENT` + `Cannot run installer: + error code: ${errorCode}, + error message: "${e.message}", + will be executed again using elevate if EACCES, and will try to use electron.shell.openItem if ENOENT` ) if (errorCode === "UNKNOWN" || errorCode === "EACCES") { callUsingElevation() diff --git a/src/main/MainServer.ts b/src/main/MainServer.ts index 5b9c80d..d50abb5 100644 --- a/src/main/MainServer.ts +++ b/src/main/MainServer.ts @@ -2,7 +2,7 @@ import axios, { AxiosRequestConfig, HttpStatusCode, Method } from 'axios' import compression from 'compression' import cors, { CorsOptions } from 'cors' import express, { Application, Request, Response } from 'express' -import fileUpload from 'express-fileupload' +// import fileUpload from 'express-fileupload' import fs from 'fs' import { Server } from 'http' import path from 'path' @@ -105,23 +105,21 @@ export class MainServer { this.httpApp.use(express.urlencoded({ limit: '50mb', extended: true, parameterLimit: 50000 })) this.httpApp.use(express.text({ type: 'application/json', limit: '50mb' })) this.httpApp.use(express.json()) - this.httpApp.use(fileUpload()) + // this.httpApp.use(fileUpload()) this.httpApp.use('/appmock', this.appmockRouter.router) this.httpApp.use('/mapi', this.mapiRouter.router) - this.httpApp.use('/mediaproxy', (req: any, resp: Response) => { - this.proxyCorsMedia(req, resp) - }) + this.httpApp.use('/mediaproxy', this.proxyCorsMedia) + this.httpApp.use('/_proxy', (req, resp: Response) => this.proxyService.handleRequest(req, resp)) - this.httpApp.all('*', (req: any, resp: Response) => { this.handleRequest(req, resp) }) + this.httpApp.all('*', (req: any, resp: Response) => this.handleRequest(req, resp)) } private async startHttpServer() { let HTTP: any let baseDir = process.env.NODE_ENV == 'development' ? '' : __dirname + '/' - // console.log(this.buildConfig, baseDir) if (this.buildConfig.protocol == 'https') { HTTP = await import('https') var key = fs.readFileSync(baseDir + 'cert/private.key') @@ -151,9 +149,8 @@ export class MainServer { this.httpServer.listen( this.commonService.serverConfig.port, - '0.0.0.0', () => { - console.log(`--启动本地代理Http服务[${this.commonService.serverConfig.port}]`) + console.log(` http server bootstrap[${this.commonService.serverConfig.port}]`) let config = this.commonService.serverConfig config.portValid = true this.commonService.saveServerConfig(config) @@ -163,7 +160,7 @@ export class MainServer { } private handleRequest(req: any, resp: Response) { - if (/^\/appmock\//.test(req.path)) return + // if (/^\/appmock\//.test(req.path)) return if (/^\/burying-point\//.test(req.path)) { let buf = [] req.on('data', (data: any) => { buf.push(data) }) @@ -171,9 +168,10 @@ export class MainServer { req.rawbody = Buffer.concat(buf) this.proxyService.handleStatRequest(req, resp) }) - } else { - this.proxyService.handleRequest(req, resp) } + // else { + // this.proxyService.handleRequest(req, resp) + // } } private async proxyCorsMedia(req: Request, resp: Response) { diff --git a/src/main/MainUpdater.ts b/src/main/MainUpdater.ts deleted file mode 100644 index cb54486..0000000 --- a/src/main/MainUpdater.ts +++ /dev/null @@ -1,18 +0,0 @@ -// import { MacUpdater } from 'electron-updater' -// Or NsisUpdater, AppImageUpdater - -export default class AppUpdater { - constructor() { - const options = { - requestHeaders: { - // Any request headers to include here - }, - provider: 'generic', - url: 'https://example.com/auto-updates' - } - - // const autoUpdater = new MacUpdater(options) - // autoUpdater.addAuthHeader(`Bearer ${token}`) - // autoUpdater.checkForUpdatesAndNotify() - } -} diff --git a/src/main/index.ts b/src/main/index.ts index 636a62f..dd373f7 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -1,7 +1,7 @@ 'use strict' -import { install } from 'source-map-support' import path from 'path' +import { install } from 'source-map-support' import MainApp from './MainApp' install() @@ -11,8 +11,5 @@ if (process.env.NODE_ENV !== 'development') { } process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = 'true' - - let mainApp = new MainApp() - mainApp.startApp() \ No newline at end of file diff --git a/src/main/router/BaseRouter.ts b/src/main/router/BaseRouter.ts index 0fb5597..b06a43b 100644 --- a/src/main/router/BaseRouter.ts +++ b/src/main/router/BaseRouter.ts @@ -1,5 +1,7 @@ import express, { Request, Response, Router } from "express" +import formidable from 'formidable' import JSONBig from 'json-bigint' +import multer from 'multer' import { BizCode, BizContext, BizFail, BizResponse, UserDevice, UserNetwork } from "../../common/base.models" const BIZ_HEADER_TOKEN = 'x-token' @@ -30,6 +32,17 @@ export interface ApiInfo { params?: Array } +const storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, '/tmp/my-uploads') + }, + filename: function (req, file, cb) { + const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9) + cb(null, file.fieldname + '-' + uniqueSuffix) + } +}) +const upload = multer({ storage: storage }) + export abstract class BaseRouter { private _router: Router @@ -122,13 +135,7 @@ export abstract class BaseRouter { scheme = regArr[0].trim() // Mozilla/5.0 const os = regArr[1].trim().substring(1, regArr[1].length - 1).split(';')[0] // (Windows NT 10.0; Win64; x64) const [brand, _] = regArr[4].trim().split(' ') // Chrome/131.0.0.0 Safari/537.36 - console.log(scheme, os, platform) - deviceInfo = { - os, - version: '', - brand, - model: '' - } + deviceInfo = { os, version: '', brand, model: '' } } else { let regArr = ua.match(/[0-9A-Za-z\/\.\s:-]+/g) scheme = regArr[0] @@ -175,15 +182,30 @@ export abstract class BaseRouter { } protected parseBody(req: Request, name: string) { - let contentType = req.headers['content-type'] + let [contentType, charset, _] = req.headers['content-type'].match(/[\da-zA-Z\:\/\-\=]+/g) let body: any - if (contentType.indexOf('multipart/form-data') !== -1) { + console.log(contentType, charset, req.path) + if (contentType == 'multipart/form-data') { + + const form = formidable({ multiples: true }) try { + + form.parse(req, (err, fields, files) => { + + if (err) { + console.error(err) + return + } + console.log(fields, files) + }) + console.log(name, req.files) body = JSONBig.parse(req.body[name]) // try parse as JSON object + console.log('parseBody', body) } catch (err) { + console.log(err) body = req.body[name] // just as plain text } - } else if (contentType.indexOf('application/json') !== -1) { + } else if (contentType == 'application/json') { body = JSONBig.parse(req.body) } else { body = null @@ -192,8 +214,4 @@ export abstract class BaseRouter { return body } -} - - - - +} \ No newline at end of file diff --git a/src/main/router/MapiRouter.ts b/src/main/router/MapiRouter.ts index d803c2a..64a3cc4 100644 --- a/src/main/router/MapiRouter.ts +++ b/src/main/router/MapiRouter.ts @@ -10,10 +10,11 @@ export class MapiRouter extends BaseRouter { @inject(IocTypes.MapiService) private mapiService: IMapiService - override initApiInfos(): void { - - console.log(this.mapiService) + constructor() { + super() + } + override initApiInfos(): void { this.addApiInfo({ method: 'post', path: '/login', func: 'login', target: 'mapiService', params: [ diff --git a/src/main/service/mapi.service.ts b/src/main/service/mapi.service.ts index f62081e..c684ff9 100644 --- a/src/main/service/mapi.service.ts +++ b/src/main/service/mapi.service.ts @@ -53,7 +53,6 @@ export class MapiService implements IMapiService { } login(username: string, password: string, context: BizContext): String { - console.log('login', context) return 'token11111' } @@ -61,10 +60,10 @@ export class MapiService implements IMapiService { return 'logout success' } - register(username: string, password: string, useInfo: Mapi.UserInfo): String { + register(username: string, password: string, userInfo: Mapi.UserInfo): String { try { - console.log('register', useInfo) + console.log('register', userInfo) return 'register success' } catch (err) { console.error(err) diff --git a/src/main/service/mock.service.ts b/src/main/service/mock.service.ts index bf2c906..5ac0193 100644 --- a/src/main/service/mock.service.ts +++ b/src/main/service/mock.service.ts @@ -24,10 +24,10 @@ export interface IMockService { export class MockService implements IMockService { @inject(IocTypes.PushService) - private readonly pushService: IPushService + private pushService: IPushService @inject(IocTypes.MockRepo) - private readonly mockRepo: IMockRepo + private mockRepo: IMockRepo private clientMockStatus: Map = new Map() diff --git a/src/main/service/proxy.service.ts b/src/main/service/proxy.service.ts index 7fe9378..823fb02 100644 --- a/src/main/service/proxy.service.ts +++ b/src/main/service/proxy.service.ts @@ -27,10 +27,10 @@ export class ProxyService implements IProxyService { private proxyConfigs: Map @inject(IocTypes.MocksService) - private readonly mockService: IMockService + private mockService: IMockService @inject(IocTypes.PushService) - private readonly pushService: IPushService + private pushService: IPushService constructor() { this._sessionId = 0 @@ -93,6 +93,7 @@ export class ProxyService implements IProxyService { } public async handleRequest(req: Request, resp: Response) { + console.log('proxy service:', req.path) let uid = req.header('mock-uid') // 清理无效配置 if (!this.pushService.hasProxy(uid)) this.proxyConfigs.delete(uid) @@ -129,6 +130,7 @@ export class ProxyService implements IProxyService { bizResp = await this.mockService.mock(sessionId, req.header['mock-uid'], req.url, startTime, delay) } catch (err) { bizResp = await this.proxy(sessionId, req, startTime, delay) + console.log('proxy', bizResp) } finally { setTimeout(() => { resp.send(bizResp) @@ -154,6 +156,8 @@ export class ProxyService implements IProxyService { } let requestUrl = originHost + req.path + + console.log('proxy++:', requestUrl) if (this.proxyConfigs.has(uid) && this.proxyConfigs.get(uid).status && this.proxyConfigs.get(uid).dataServer != null) { @@ -182,6 +186,7 @@ export class ProxyService implements IProxyService { let data: ProxyMock.ProxyRequestRecord try { let resp = await axios(options) + console.log('proxy--:', resp.data) data = { id: sessionId, type: ProxyMock.PorxyType.REQUEST_END, @@ -193,7 +198,7 @@ export class ProxyService implements IProxyService { } return resp.data } catch (err: any) { - // console.error('axios', err.code) + console.error('axios', err.code) let resp = err.response let respData = !!resp ? resp.data : err.message data = { diff --git a/test/avatar.jpeg b/test/avatar.jpeg new file mode 100644 index 0000000..a62131f Binary files /dev/null and b/test/avatar.jpeg differ diff --git a/test/login.mock.http b/test/login.mock.http new file mode 100644 index 0000000..6fe9616 --- /dev/null +++ b/test/login.mock.http @@ -0,0 +1,11 @@ +@baseUrl="http://localhost:8884/mapi/" + + +POST http://localhost:8884/mapi/login +x-ua: mapi/1.0(Android 12;com.github.lynxchina.argus 1.0.1;vivo:V2171A;huaiwei) +Content-Type: application/json + +{ + "username": "test", + "password": "test" +} \ No newline at end of file diff --git a/test/proxy.mock.http b/test/proxy.mock.http new file mode 100644 index 0000000..6df5a4c --- /dev/null +++ b/test/proxy.mock.http @@ -0,0 +1,6 @@ + +POST http://192.168.41.111:8884/_proxy/user/XiKuSdUc1735915202741o +x-ua: mapi/1.0(Android 12;com.github.lynxchina.argus 1.0.1;vivo:V2171A;huaiwei) +mock-host: http://192.168.41.111:8884/mapi +mock-uid: XiKuSdUc1735915202741o +Content-Type: multipart/form-data; charset=utf-8; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW \ No newline at end of file diff --git a/test/register.mock.http b/test/register.mock.http new file mode 100644 index 0000000..29cbfb2 --- /dev/null +++ b/test/register.mock.http @@ -0,0 +1,27 @@ + + +POST http://localhost:8884/mapi/register +x-ua: mapi/1.0(Android 12;com.github.lynxchina.argus 1.0.1;vivo:V2171A;huaiwei) +Content-Type: multipart/form-data; charset=utf-8; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW + +------WebKitFormBoundary7MA4YWxkTrZu0gW +Content-Disposition: form-data; name="username"; +Content-Type: text/plain + +christmas +------WebKitFormBoundary7MA4YWxkTrZu0gW +Content-Disposition: form-data; name="password"; +Content-Type: text/plain + +123456 +------WebKitFormBoundary7MA4YWxkTrZu0gW +Content-Disposition: form-data; name="userInfo"; +Content-Type: text/plain + +"{\"nickname\":\"christmas\",\"password\":\"123456\",\"email\":\"avatar.jpg\"}" +------WebKitFormBoundary7MA4YWxkTrZu0gW +Content-Disposition: form-data; name="avatar"; filename="avatar.jpg" +Content-Type: image/jpeg + +< ./avatar.jpeg +------WebKitFormBoundary7MA4YWxkTrZu0gW-- \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 28f6ff3..e87e19f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -785,6 +785,15 @@ __metadata: languageName: node linkType: hard +"@types/formidable@npm:^3.4.5": + version: 3.4.5 + resolution: "@types/formidable@npm:3.4.5" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/733dc59d4d12152ba5fb70751184812345ff08691864dd9b1b7626b9d40045a306021b9721495cafb56cd375da54fecaaebdada98fc390b7406ebb81efe0bfbe + languageName: node + linkType: hard + "@types/fs-extra@npm:9.0.13, @types/fs-extra@npm:^9.0.11": version: 9.0.13 resolution: "@types/fs-extra@npm:9.0.13" @@ -868,6 +877,15 @@ __metadata: languageName: node linkType: hard +"@types/multer@npm:^1.4.6": + version: 1.4.12 + resolution: "@types/multer@npm:1.4.12" + dependencies: + "@types/express": "npm:*" + checksum: 10c0/1250a32a66b7c5929cc5b005dae4ad0768ded9b6b52ba6f90931ff39b4ed775b09a0fd9d880f0836bcac16a9a7febed6a479c6bf108a52a244c4c53badb82a7b + languageName: node + linkType: hard + "@types/node-forge@npm:^1.3.0": version: 1.3.11 resolution: "@types/node-forge@npm:1.3.11" @@ -1594,8 +1612,10 @@ __metadata: "@types/express": "npm:^5.0.0" "@types/express-fileupload": "npm:^1.5.1" "@types/express-serve-static-core": "npm:^5.0.0" + "@types/formidable": "npm:^3.4.5" "@types/json-bigint": "npm:^1.0.4" "@types/minimist": "npm:^1.2.5" + "@types/multer": "npm:^1.4.6" "@types/node": "npm:22.7.7" "@types/pouchdb": "npm:^6.4.2" "@types/pouchdb-find": "npm:^7.3.3" @@ -1628,11 +1648,13 @@ __metadata: express: "npm:^4.21.1" express-fileupload: "npm:^1.5.1" file-loader: "npm:^6.2.0" + formidable: "npm:^3.5.2" html-webpack-plugin: "npm:^5.6.2" inversify: "npm:^6.0.3" json-bigint: "npm:^1.0.0" md5: "npm:^2.3.0" minimist: "npm:^1.2.8" + multer: "npm:^1.4.4" node-loader: "npm:^2.0.0" node-polyfill-webpack-plugin: "npm:^4.1.0" overlayscrollbars: "npm:^2.10.1" @@ -1942,6 +1964,13 @@ __metadata: languageName: node linkType: hard +"append-field@npm:^1.0.0": + version: 1.0.0 + resolution: "append-field@npm:1.0.0" + checksum: 10c0/1b5abcc227e5179936a9e4f7e2af4769fa1f00eda85bbaed907f7964b0fd1f7d61f0f332b35337f391389ff13dd5310c2546ba670f8e5a743b23ec85185c73ef + languageName: node + linkType: hard + "archiver-utils@npm:^2.1.0": version: 2.1.0 resolution: "archiver-utils@npm:2.1.0" @@ -2007,6 +2036,13 @@ __metadata: languageName: node linkType: hard +"asap@npm:^2.0.0": + version: 2.0.6 + resolution: "asap@npm:2.0.6" + checksum: 10c0/c6d5e39fe1f15e4b87677460bd66b66050cd14c772269cee6688824c1410a08ab20254bb6784f9afb75af9144a9f9a7692d49547f4d19d715aeb7c0318f3136d + languageName: node + linkType: hard + "asn1.js@npm:^4.10.1": version: 4.10.1 resolution: "asn1.js@npm:4.10.1" @@ -2444,6 +2480,16 @@ __metadata: languageName: node linkType: hard +"busboy@npm:^0.2.11": + version: 0.2.14 + resolution: "busboy@npm:0.2.14" + dependencies: + dicer: "npm:0.2.5" + readable-stream: "npm:1.1.x" + checksum: 10c0/660ce531347a03210f46080c2447030c41f60202be0d8dd1544482786341a497b1d4d8941e3c7c9b5e6ed4edc42003c28c9451e1fde87dd94010df69bb27cc38 + languageName: node + linkType: hard + "busboy@npm:^1.6.0": version: 1.6.0 resolution: "busboy@npm:1.6.0" @@ -2884,6 +2930,18 @@ __metadata: languageName: node linkType: hard +"concat-stream@npm:^1.5.2": + version: 1.6.2 + resolution: "concat-stream@npm:1.6.2" + dependencies: + buffer-from: "npm:^1.0.0" + inherits: "npm:^2.0.3" + readable-stream: "npm:^2.2.2" + typedarray: "npm:^0.0.6" + checksum: 10c0/2e9864e18282946dabbccb212c5c7cec0702745e3671679eb8291812ca7fd12023f7d8cb36493942a62f770ac96a7f90009dc5c82ad69893438371720fa92617 + languageName: node + linkType: hard + "config-file-ts@npm:0.2.8-rc1": version: 0.2.8-rc1 resolution: "config-file-ts@npm:0.2.8-rc1" @@ -3389,6 +3447,26 @@ __metadata: languageName: node linkType: hard +"dezalgo@npm:^1.0.4": + version: 1.0.4 + resolution: "dezalgo@npm:1.0.4" + dependencies: + asap: "npm:^2.0.0" + wrappy: "npm:1" + checksum: 10c0/8a870ed42eade9a397e6141fe5c025148a59ed52f1f28b1db5de216b4d57f0af7a257070c3af7ce3d5508c1ce9dd5009028a76f4b2cc9370dc56551d2355fad8 + languageName: node + linkType: hard + +"dicer@npm:0.2.5": + version: 0.2.5 + resolution: "dicer@npm:0.2.5" + dependencies: + readable-stream: "npm:1.1.x" + streamsearch: "npm:0.1.2" + checksum: 10c0/c0520cee8c4d8c7e2db4f8fe30c0fdbf96d9623d53a65b54f4e0d9a89b76c3e0c397de54a1530c1d4b1788d1e87ff3ca5800e3ba93c748e0cd24827b505fb5e7 + languageName: node + linkType: hard + "diffie-hellman@npm:^5.0.3": version: 5.0.3 resolution: "diffie-hellman@npm:5.0.3" @@ -4431,6 +4509,17 @@ __metadata: languageName: node linkType: hard +"formidable@npm:^3.5.2": + version: 3.5.2 + resolution: "formidable@npm:3.5.2" + dependencies: + dezalgo: "npm:^1.0.4" + hexoid: "npm:^2.0.0" + once: "npm:^1.4.0" + checksum: 10c0/c26d89ba84d392f0e68ba1aca9f779e0f2e94db053d95df562c730782956f302e3f069c07ab96f991415af915ac7b8771f4c813d298df43577fdf439e1e8741e + languageName: node + linkType: hard + "forwarded@npm:0.2.0": version: 0.2.0 resolution: "forwarded@npm:0.2.0" @@ -4814,6 +4903,13 @@ __metadata: languageName: node linkType: hard +"hexoid@npm:^2.0.0": + version: 2.0.0 + resolution: "hexoid@npm:2.0.0" + checksum: 10c0/a9d5e6f4adeaefcb4a53803dd48bf0a242d92e8ec699555aea616c4bf8f91788f03093595085976f63d6830815dd080c063503540fabc7e854ebfb11161687c6 + languageName: node + linkType: hard + "hmac-drbg@npm:^1.0.1": version: 1.0.1 resolution: "hmac-drbg@npm:1.0.1" @@ -6284,6 +6380,17 @@ __metadata: languageName: node linkType: hard +"mkdirp@npm:^0.5.4": + version: 0.5.6 + resolution: "mkdirp@npm:0.5.6" + dependencies: + minimist: "npm:^1.2.6" + bin: + mkdirp: bin/cmd.js + checksum: 10c0/e2e2be789218807b58abced04e7b49851d9e46e88a2f9539242cc8a92c9b5c3a0b9bab360bd3014e02a140fc4fbc58e31176c408b493f8a2a6f4986bd7527b01 + languageName: node + linkType: hard + "mkdirp@npm:^1.0.3": version: 1.0.4 resolution: "mkdirp@npm:1.0.4" @@ -6330,6 +6437,22 @@ __metadata: languageName: node linkType: hard +"multer@npm:^1.4.4": + version: 1.4.4 + resolution: "multer@npm:1.4.4" + dependencies: + append-field: "npm:^1.0.0" + busboy: "npm:^0.2.11" + concat-stream: "npm:^1.5.2" + mkdirp: "npm:^0.5.4" + object-assign: "npm:^4.1.1" + on-finished: "npm:^2.3.0" + type-is: "npm:^1.6.4" + xtend: "npm:^4.0.0" + checksum: 10c0/ae7505b440b833bffe4d4b712659fc880b3a3735db1190745e738138b069b2344d0d17e3985c93f0aee287d795572dbb7a90af31ec33bd1293cbf90366934b7b + languageName: node + linkType: hard + "multicast-dns@npm:^7.2.5": version: 7.2.5 resolution: "multicast-dns@npm:7.2.5" @@ -6588,7 +6711,7 @@ __metadata: languageName: node linkType: hard -"object-assign@npm:^4": +"object-assign@npm:^4, object-assign@npm:^4.1.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 @@ -6640,7 +6763,7 @@ __metadata: languageName: node linkType: hard -"on-finished@npm:2.4.1, on-finished@npm:^2.4.1": +"on-finished@npm:2.4.1, on-finished@npm:^2.3.0, on-finished@npm:^2.4.1": version: 2.4.1 resolution: "on-finished@npm:2.4.1" dependencies: @@ -7511,7 +7634,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:1.1.14": +"readable-stream@npm:1.1.14, readable-stream@npm:1.1.x": version: 1.1.14 resolution: "readable-stream@npm:1.1.14" dependencies: @@ -7534,7 +7657,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^2.0.0, readable-stream@npm:^2.0.1, readable-stream@npm:^2.0.5, readable-stream@npm:^2.3.8": +"readable-stream@npm:^2.0.0, readable-stream@npm:^2.0.1, readable-stream@npm:^2.0.5, readable-stream@npm:^2.2.2, readable-stream@npm:^2.3.8": version: 2.3.8 resolution: "readable-stream@npm:2.3.8" dependencies: @@ -8361,6 +8484,13 @@ __metadata: languageName: node linkType: hard +"streamsearch@npm:0.1.2": + version: 0.1.2 + resolution: "streamsearch@npm:0.1.2" + checksum: 10c0/408a3db5b5643c1d6eb65c9d8ccc011b4857bfca41946d808b7f165b5b85f47755b2ff56ec1c4bbbeb5a496afcde9adfea12f9f67bd09ff3f04ae3f1f58d37c6 + languageName: node + linkType: hard + "streamsearch@npm:^1.1.0": version: 1.1.0 resolution: "streamsearch@npm:1.1.0" @@ -8800,7 +8930,7 @@ __metadata: languageName: node linkType: hard -"type-is@npm:~1.6.18": +"type-is@npm:^1.6.4, type-is@npm:~1.6.18": version: 1.6.18 resolution: "type-is@npm:1.6.18" dependencies: @@ -8817,6 +8947,13 @@ __metadata: languageName: node linkType: hard +"typedarray@npm:^0.0.6": + version: 0.0.6 + resolution: "typedarray@npm:0.0.6" + checksum: 10c0/6005cb31df50eef8b1f3c780eb71a17925f3038a100d82f9406ac2ad1de5eb59f8e6decbdc145b3a1f8e5836e17b0c0002fb698b9fe2516b8f9f9ff602d36412 + languageName: node + linkType: hard + "typescript@npm:^5.4.3, typescript@npm:^5.6.3": version: 5.7.2 resolution: "typescript@npm:5.7.2" @@ -9523,7 +9660,7 @@ __metadata: languageName: node linkType: hard -"xtend@npm:^4.0.2, xtend@npm:~4.0.0": +"xtend@npm:^4.0.0, xtend@npm:^4.0.2, xtend@npm:~4.0.0": version: 4.0.2 resolution: "xtend@npm:4.0.2" checksum: 10c0/366ae4783eec6100f8a02dff02ac907bf29f9a00b82ac0264b4d8b832ead18306797e283cf19de776538babfdcb2101375ec5646b59f08c52128ac4ab812ed0e