diff --git a/examples/refactor-react/farm.config.ts b/examples/refactor-react/farm.config.ts index 2494f824b..01edc50ca 100644 --- a/examples/refactor-react/farm.config.ts +++ b/examples/refactor-react/farm.config.ts @@ -60,7 +60,7 @@ export default defineConfig({ // cacheDir: "node_modules/.adny", // }, output: { - // publicPath: "/aaa/", + publicPath: "/aaa/", }, }, server: { diff --git a/examples/vue3/farm.config.ts b/examples/vue3/farm.config.ts index 570d94883..ebbf17070 100644 --- a/examples/vue3/farm.config.ts +++ b/examples/vue3/farm.config.ts @@ -89,7 +89,7 @@ export default defineConfig({ // enabled: true, // }), // compressionMiddleware(), - myCustomPlugin(), + // myCustomPlugin(), // createHtmlPlugin({ // minify: true, // /** diff --git a/examples/vue3/public/aaa.jpg b/examples/vue3/public/aaa.jpg new file mode 100644 index 000000000..0fc806ec2 Binary files /dev/null and b/examples/vue3/public/aaa.jpg differ diff --git a/examples/vue3/src/App.vue b/examples/vue3/src/App.vue index 580e45437..77e69f349 100644 --- a/examples/vue3/src/App.vue +++ b/examples/vue3/src/App.vue @@ -8,13 +8,13 @@ fetch("https://wallhaven.fun/api/wallhaven/w/yx6e9l").then((res) => res.json()); // .then((data) => console.log(data)) // .catch((err) => console.error(err));+ -window.onbeforeunload = function () { - fetch("http://localhost:3000", { method: "post" }); - navigator.sendBeacon( - "http://localhost:3000", - JSON.stringify({ key: "value" }) - ); -}; +// window.onbeforeunload = function () { +// fetch("http://localhost:3000", { method: "post" }); +// navigator.sendBeacon( +// "http://localhost:3000", +// JSON.stringify({ key: "value" }) +// ); +// }; // const aa = ref(92922299) // console.log(aa.value); @@ -24,33 +24,15 @@ window.onbeforeunload = function () { diff --git a/packages/core/package.json b/packages/core/package.json index 6c39094c9..06864d932 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -74,12 +74,14 @@ "@types/connect": "^3.4.38", "@types/cors": "^2.8.17", "@types/debug": "^4.1.12", + "@types/escape-html": "^1.0.4", "@types/etag": "^1.8.3", "@types/figlet": "^1.5.5", "@types/fs-extra": "^11.0.1", "@types/http-proxy": "^1.17.14", "@types/mime-types": "^2.1.2", "@types/ws": "^8.5.8", + "escape-html": "^1.0.3", "react-refresh": "^0.14.0" }, "dependencies": { diff --git a/packages/core/src/config/types.ts b/packages/core/src/config/types.ts index 7f067c475..e146d46d8 100644 --- a/packages/core/src/config/types.ts +++ b/packages/core/src/config/types.ts @@ -56,7 +56,7 @@ export interface UserServerConfig { // whether to serve static assets in spa mode, default to true appType?: 'spa' | 'mpa' | 'custom'; middlewares?: DevServerMiddleware[]; - middlewareMode?: boolean | string; + middlewareMode?: boolean; writeToDisk?: boolean; /** Preview server config */ preview?: UserPreviewServerConfig; diff --git a/packages/core/src/server/index.ts b/packages/core/src/server/index.ts index d6955e74d..0ff729bcd 100644 --- a/packages/core/src/server/index.ts +++ b/packages/core/src/server/index.ts @@ -29,7 +29,6 @@ import { initPublicFiles } from '../utils/publicDir.js'; import { arrayEqual, isObject, normalizePath } from '../utils/share.js'; import { - adaptorViteMiddleware, hmrPingMiddleware, htmlFallbackMiddleware, lazyCompilationMiddleware, @@ -37,7 +36,8 @@ import { proxyMiddleware, publicMiddleware, publicPathMiddleware, - resourceMiddleware + resourceMiddleware, + staticMiddleware } from './middlewares/index.js'; import type * as http from 'node:http'; @@ -538,12 +538,14 @@ export class Server extends httpServer { : null) || this.httpServer; this.middlewares.use( - proxyMiddleware(this, middlewareServer as HttpServer) + proxyMiddleware(this, middlewareServer as HttpServer, proxy) ); } if (this.publicPath !== '/') { - this.middlewares.use(publicPathMiddleware(this)); + this.middlewares.use( + publicPathMiddleware(this, this.serverOptions.middlewareMode) + ); } if (fs.existsSync(this.publicDir as PathLike)) { @@ -554,9 +556,7 @@ export class Server extends httpServer { this.middlewares.use(lazyCompilationMiddleware(this)); } - if (this.resolvedUserConfig.vitePlugins?.length) { - this.middlewares.use(adaptorViteMiddleware(this)); - } + this.middlewares.use(staticMiddleware(this)); this.middlewares.use(resourceMiddleware(this)); @@ -566,7 +566,6 @@ export class Server extends httpServer { if (appType === 'spa' || appType === 'mpa') { this.middlewares.use(htmlFallbackMiddleware(this)); - this.middlewares.use(notFoundMiddleware()); } } diff --git a/packages/core/src/server/middlewares/adaptorVite.ts b/packages/core/src/server/middlewares/adaptorVite.ts deleted file mode 100644 index 6ad69c18c..000000000 --- a/packages/core/src/server/middlewares/adaptorVite.ts +++ /dev/null @@ -1,45 +0,0 @@ -/** - * when use vite-plugin-vue some assets resource not compiled in dev mode - * so we need to invalidate vite handler to recompile - * and automatically res.body to resolve this asset resource e.g: img - * if resource is image or font, try it in local file system to be compatible with vue - */ - -import { existsSync, readFileSync, statSync } from 'node:fs'; -import path from 'node:path'; - -import { stripQueryAndHash } from '../../utils/path.js'; -import { normalizePathByPublicPath } from '../publicDir.js'; -import { send } from '../send.js'; - -import type Connect from 'connect'; -import type { Server } from '../index.js'; - -export function adaptorViteMiddleware(app: Server): Connect.NextHandleFunction { - const { resolvedUserConfig, compiler } = app; - return function handleAdaptorViteMiddleware(req, res, next) { - let stripQueryAndHashUrl = stripQueryAndHash(req.url); - - const { resourceWithoutPublicPath } = normalizePathByPublicPath( - app.publicPath, - stripQueryAndHashUrl - ); - - // try local file system - const localFilePath = path.join( - compiler.config.root, - resourceWithoutPublicPath - ); - - // TODO maybe we can use sirv to serve static file - // try local file system - if (existsSync(localFilePath) && statSync(localFilePath).isFile()) { - const headers = resolvedUserConfig.server.headers; - send(req, res, readFileSync(localFilePath), stripQueryAndHashUrl, { - headers - }); - return; - } - next(); - }; -} diff --git a/packages/core/src/server/middlewares/htmlFallback.ts b/packages/core/src/server/middlewares/htmlFallback.ts index d4b073b59..4d1265511 100644 --- a/packages/core/src/server/middlewares/htmlFallback.ts +++ b/packages/core/src/server/middlewares/htmlFallback.ts @@ -1,6 +1,4 @@ -import path from 'node:path'; - -import { cleanUrl, commonFsUtils, removeSlash } from '../../utils/index.js'; +import { cleanUrl, removeSlash } from '../../utils/index.js'; import type Connect from 'connect'; import type { Server } from '../index.js'; diff --git a/packages/core/src/server/middlewares/index.ts b/packages/core/src/server/middlewares/index.ts index 91539a0cc..54f8629b7 100644 --- a/packages/core/src/server/middlewares/index.ts +++ b/packages/core/src/server/middlewares/index.ts @@ -3,7 +3,6 @@ export * from './lazyCompilation.js'; export * from './notFound.js'; export * from './proxy.js'; export * from './resource.js'; -export * from './publicResource.js'; export * from './publicPath.js'; export * from './hmrPing.js'; -export * from './adaptorVite.js'; +export * from './static.js'; diff --git a/packages/core/src/server/middlewares/lazyCompilation.ts b/packages/core/src/server/middlewares/lazyCompilation.ts index 97ea96fbc..dbd66bf50 100644 --- a/packages/core/src/server/middlewares/lazyCompilation.ts +++ b/packages/core/src/server/middlewares/lazyCompilation.ts @@ -7,7 +7,6 @@ import { VIRTUAL_FARM_DYNAMIC_IMPORT_SUFFIX, bold, cyan, - formatExecutionTime, getDynamicResources, green } from '../../index.js'; @@ -63,9 +62,7 @@ export function lazyCompilationMiddleware( return next(); } - // TODO 取的对象不对 writeToDisk - // if (isNodeEnvironment || resolvedUserConfig.writeToDisk) { - if (isNodeEnvironment) { + if (isNodeEnvironment || resolvedUserConfig.server.writeToDisk) { compiler.writeResourcesToDisk(); } diff --git a/packages/core/src/server/middlewares/proxy.ts b/packages/core/src/server/middlewares/proxy.ts index a89de53d4..f4699b3b7 100644 --- a/packages/core/src/server/middlewares/proxy.ts +++ b/packages/core/src/server/middlewares/proxy.ts @@ -1,12 +1,13 @@ import httpProxy from 'http-proxy'; + import { ResolvedUserConfig } from '../../config/types.js'; -import { isDevServer } from '../../utils/index.js'; import type * as http from 'node:http'; import type * as net from 'node:net'; import type Server from 'http-proxy'; import type Connect from 'connect'; +import { CommonServerOptions } from '../http.js'; import type { Server as DevServer, HttpServer } from '../index.js'; import { PreviewServer } from '../preview.js'; @@ -23,15 +24,14 @@ export interface ProxyOptions extends httpProxy.ServerOptions { export function proxyMiddleware( app: DevServer | PreviewServer, - middlewareServer: HttpServer + middlewareServer: HttpServer, + config: NonNullable ): Connect.NextHandleFunction { - const isDev = isDevServer(app); const { resolvedUserConfig } = app; - const serverOptions = isDev ? app.serverOptions : app.previewServerOptions; const proxies: Record = {}; - Object.keys(serverOptions.proxy).forEach((context) => { - let opts = serverOptions.proxy[context]; + Object.keys(config).forEach((context) => { + let opts = config[context]; if (!opts) { return; } diff --git a/packages/core/src/server/middlewares/publicPath.ts b/packages/core/src/server/middlewares/publicPath.ts index 95b32ae38..4548d7a70 100644 --- a/packages/core/src/server/middlewares/publicPath.ts +++ b/packages/core/src/server/middlewares/publicPath.ts @@ -1,16 +1,14 @@ -import { cleanUrl, isDevServer, withTrailingSlash } from '../../utils/index.js'; +import { cleanUrl, withTrailingSlash } from '../../utils/index.js'; import type Connect from 'connect'; import { Server as DevServer } from '../index.js'; import type { PreviewServer } from '../preview.js'; export function publicPathMiddleware( - app: DevServer | PreviewServer + app: DevServer | PreviewServer, + middlewareMode: boolean ): Connect.NextHandleFunction { - const isDev = isDevServer(app); - const publicPath = app.publicPath; - const middlewareMode = isDev ? app.serverOptions.middlewareMode : false; return function handlePublicPathMiddleware(req, res, next) { // auto redirect to public path diff --git a/packages/core/src/server/middlewares/publicResource.ts b/packages/core/src/server/middlewares/publicResource.ts deleted file mode 100644 index c22c786b5..000000000 --- a/packages/core/src/server/middlewares/publicResource.ts +++ /dev/null @@ -1,74 +0,0 @@ -import sirv from 'sirv'; - -import { - cleanUrl, - knownJavascriptExtensionRE, - normalizePath -} from '../../utils/index.js'; - -import type Connect from 'connect'; -import type { Server } from '../index.js'; - -// TODO: if url endsWith importQueryRE we need can check if it is a module then serve or not - -export function publicMiddleware(app: Server): Connect.NextHandleFunction { - const { - resolvedUserConfig: config, - publicDir, - publicFiles, - publicPath - } = app; - - const headers = config.server.headers; - const serve = sirv(publicDir, { - etag: true, - setHeaders: (res, path) => { - // res.setHeader("Cache-Control", "public,max-age=31536000,immutable"); - if (knownJavascriptExtensionRE.test(path)) { - res.setHeader('Content-Type', 'text/javascript'); - } - if (headers) { - for (const name in headers) { - res.setHeader(name, headers[name]); - } - } - } - }); - const toFilePath = (url: string) => { - let filePath = cleanUrl(url); - if (filePath.indexOf('%') !== -1) { - try { - filePath = decodeURI(filePath); - } catch (err) { - // ignore - } - } - return normalizePath(filePath); - }; - - return async function farmHandlerPublicMiddleware( - req: any, - res: any, - next: () => void - ) { - const originalUrl = req.url; - const filePath = toFilePath(originalUrl); - // TODO public 缓存问题 - // 移除 URL 开头的 publicPath - const urlWithoutPublicPath = filePath.startsWith('/' + publicPath) - ? filePath.slice(publicPath.length + 1) - : filePath; - - // 检查文件是否在 publicFiles 中或者在 public 目录中 - if ( - (publicFiles && publicFiles.has(urlWithoutPublicPath)) || - (publicDir && serve(req, res, () => {})) - ) { - req.url = urlWithoutPublicPath; - - return serve(req, res, next); - } - - next(); - }; -} diff --git a/packages/core/src/server/middlewares/resource.ts b/packages/core/src/server/middlewares/resource.ts index 186df81af..d3e08f7a3 100644 --- a/packages/core/src/server/middlewares/resource.ts +++ b/packages/core/src/server/middlewares/resource.ts @@ -1,7 +1,7 @@ -import mime from 'mime'; - import path from 'node:path/posix'; +import mime from 'mime'; + import { Compiler } from '../../compiler/index.js'; import { cleanUrl, @@ -26,7 +26,6 @@ export function resourceMiddleware(app: Server): Connect.NextHandleFunction { return next(); } const url = cleanUrl(req.url); - const { compiler, resolvedUserConfig: config, publicPath } = app; if (compiler._isInitialCompile) { @@ -39,11 +38,12 @@ export function resourceMiddleware(app: Server): Connect.NextHandleFunction { } } - const resourceResult: any = findResource(req, res, compiler, publicPath); + const resourceResult = findResource(req, res, compiler, publicPath); if (resourceResult === true) { return next(); } + // TODO if write to dist should be use sirv middleware if (resourceResult) { // need judge if resource is a deps node_modules set cache-control to 1 year @@ -66,7 +66,6 @@ export function resourceMiddleware(app: Server): Connect.NextHandleFunction { (!extension && req.headers.accept?.includes('text/html')); if (!isHtmlRequest) { - // 对于非 HTML 请求,尝试在根目录查找资源 const rootResource = compiler.resource( path.basename(resourceWithoutPublicPath) ); @@ -76,7 +75,6 @@ export function resourceMiddleware(app: Server): Connect.NextHandleFunction { }); return; } - // 如果在根目录也找不到,返回 404 res.statusCode = 404; res.end('Not found'); return; diff --git a/packages/core/src/server/middlewares/static.ts b/packages/core/src/server/middlewares/static.ts new file mode 100644 index 000000000..342edd6ed --- /dev/null +++ b/packages/core/src/server/middlewares/static.ts @@ -0,0 +1,124 @@ +/** + * when use vite-plugin-vue some assets resource not compiled in dev mode + * so we need to invalidate vite handler to recompile + * and automatically res.body to resolve this asset resource e.g: img + * if resource is image or font, try it in local file system to be compatible with vue + */ + +import { existsSync, statSync } from 'node:fs'; +import path from 'node:path'; + +import { + cleanUrl, + fsPathFromUrl, + isImportRequest, + normalizePath, + removeLeadingSlash +} from '../../utils/index.js'; +import { stripQueryAndHash, withTrailingSlash } from '../../utils/path.js'; + +import { OutgoingHttpHeaders } from 'node:http'; +import type Connect from 'connect'; +import sirv, { Options } from 'sirv'; +import type { Server } from '../index.js'; + +export function staticMiddleware(app: Server): Connect.NextHandleFunction { + const { resolvedUserConfig, compiler } = app; + const root = compiler.config.root; + const serve = sirv( + root, + sirvOptions({ + getHeaders: () => resolvedUserConfig.server.headers + }) + ); + return function handleStaticMiddleware(req, res, next) { + let stripQueryAndHashUrl = stripQueryAndHash(req.url); + + if ( + stripQueryAndHashUrl[stripQueryAndHashUrl.length - 1] === '/' || + path.extname(stripQueryAndHashUrl) === '.html' + ) { + return next(); + } + + // try local file system + let fileUrl = path.resolve(root, removeLeadingSlash(stripQueryAndHashUrl)); + if ( + stripQueryAndHashUrl[stripQueryAndHashUrl.length - 1] === '/' && + fileUrl[fileUrl.length - 1] !== '/' + ) { + fileUrl = withTrailingSlash(fileUrl); + } + const filePath = fsPathFromUrl(fileUrl); + + // TODO FS.allow FS.deny server.fs.allow server.fs.deny + + if (!existsSync(filePath) || !statSync(filePath).isFile()) { + next(); + } + serve(req, res, next); + }; +} + +export function publicMiddleware(app: Server): Connect.NextHandleFunction { + const { resolvedUserConfig: config, publicDir, publicFiles } = app; + const serve = sirv( + publicDir, + sirvOptions({ + getHeaders: () => config.server.headers + }) + ); + const toFilePath = (url: string) => { + let filePath = cleanUrl(url); + if (filePath.indexOf('%') !== -1) { + try { + filePath = decodeURI(filePath); + } catch {} + } + return normalizePath(filePath); + }; + + return async function farmHandlerPublicMiddleware( + req: any, + res: any, + next: () => void + ) { + if ( + (publicFiles && !publicFiles.has(toFilePath(req.url!))) || + isImportRequest(req.url!) + ) { + return next(); + } + serve(req, res, next); + }; +} + +const knownJavascriptExtensionRE = /\.[tj]sx?$/; + +const sirvOptions = ({ + getHeaders +}: { + getHeaders: () => OutgoingHttpHeaders | undefined; +}): Options => { + return { + dev: true, + etag: true, + extensions: [], + setHeaders(res, pathname) { + // Matches js, jsx, ts, tsx. + // The reason this is done, is that the .ts file extension is reserved + // for the MIME type video/mp2t. In almost all cases, we can expect + // these files to be TypeScript files, and for Vite to serve them with + // this Content-Type. + if (knownJavascriptExtensionRE.test(pathname)) { + res.setHeader('Content-Type', 'text/javascript'); + } + const headers = getHeaders(); + if (headers) { + for (const name in headers) { + res.setHeader(name, headers[name]!); + } + } + } + }; +}; diff --git a/packages/core/src/server/preview.ts b/packages/core/src/server/preview.ts index 1044c3d5c..600e273ae 100644 --- a/packages/core/src/server/preview.ts +++ b/packages/core/src/server/preview.ts @@ -126,13 +126,15 @@ export class PreviewServer extends httpServer { isObject(middlewareMode) && 'server' in middlewareMode ? middlewareMode.server : this.httpServer; - this.app.use(proxyMiddleware(this, middlewareServer as HttpServer)); + this.app.use( + proxyMiddleware(this, middlewareServer as HttpServer, proxy) + ); } this.app.use(compression()); if (this.publicPath !== '/') { - this.app.use(publicPathMiddleware(this)); + this.app.use(publicPathMiddleware(this, false)); } this.app.use(this.serve); diff --git a/packages/core/src/utils/share.ts b/packages/core/src/utils/share.ts index 346ad9b9f..bdef17aab 100644 --- a/packages/core/src/utils/share.ts +++ b/packages/core/src/utils/share.ts @@ -5,6 +5,7 @@ import path, { dirname } from 'node:path'; import readline from 'node:readline'; import { fileURLToPath } from 'node:url'; import { Config, OutputConfig } from '../types/binding.js'; +import { cleanUrl } from './url.js'; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import packageJson from '../../package.json'; @@ -75,10 +76,25 @@ export const version = JSON.parse( fs.readFileSync(path.resolve(__dirname, '../../package.json')).toString() ).version; +export const VOLUME_RE = /^[A-Z]:/i; + +export const FS_PREFIX = `/@fs/`; + export function normalizePath(id: string): string { return path.posix.normalize(isWindows ? id.replace(/\\/g, '/') : id); } +export function fsPathFromId(id: string): string { + const fsPath = normalizePath( + id.startsWith(FS_PREFIX) ? id.slice(FS_PREFIX.length) : id + ); + return fsPath[0] === '/' || VOLUME_RE.test(fsPath) ? fsPath : `/${fsPath}`; +} + +export function fsPathFromUrl(url: string): string { + return fsPathFromId(cleanUrl(url)); +} + export function arraify(target: T | T[]): T[] { return Array.isArray(target) ? target : [target]; } diff --git a/packages/core/src/utils/url.ts b/packages/core/src/utils/url.ts index fa6d78c42..f51b181d1 100644 --- a/packages/core/src/utils/url.ts +++ b/packages/core/src/utils/url.ts @@ -15,3 +15,7 @@ export function removeImportQuery(url: string): string { export const knownJavascriptExtensionRE = /\.[tj]sx?$/; export const urlRE = /(\?|&)url(?:&|$)/; + +export function removeLeadingSlash(str: string): string { + return str[0] === '/' ? str.slice(1) : str; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 53f1ec992..84c2aa652 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2111,7 +2111,7 @@ importers: version: 0.3.2(vue@2.6.14) tdesign-vue: specifier: latest - version: 1.10.6(vue@2.6.14) + version: 1.10.7(vue@2.6.14) vite-plugin-vue2-svg: specifier: ^0.4.0 version: 0.4.0(ejs@3.1.10)(lodash@4.17.21)(vue-template-compiler@2.6.14(vue@2.6.14)) @@ -2145,7 +2145,7 @@ importers: version: 0.3.2(vue@2.7.16) tdesign-vue: specifier: latest - version: 1.10.6(vue@2.7.16) + version: 1.10.7(vue@2.7.16) vite-plugin-vue2-svg: specifier: ^0.4.0 version: 0.4.0(ejs@3.1.10)(lodash@4.17.21)(vue-template-compiler@2.7.16(vue@2.7.16)) @@ -2759,6 +2759,9 @@ importers: '@types/debug': specifier: ^4.1.12 version: 4.1.12 + '@types/escape-html': + specifier: ^1.0.4 + version: 1.0.4 '@types/etag': specifier: ^1.8.3 version: 1.8.3 @@ -2777,6 +2780,9 @@ importers: '@types/ws': specifier: ^8.5.8 version: 8.5.8 + escape-html: + specifier: ^1.0.3 + version: 1.0.3 react-refresh: specifier: ^0.14.0 version: 0.14.2 @@ -8523,6 +8529,9 @@ packages: '@types/envinfo@7.8.3': resolution: {integrity: sha512-qzV1XMjmzgmndci6L5HlzExf4w9A5jQPNpW/t4sSljErKbS8y6231ToHO9ir2Xjf+2zG1C540+Wmh0zpUsGu0A==} + '@types/escape-html@1.0.4': + resolution: {integrity: sha512-qZ72SFTgUAZ5a7Tj6kf2SHLetiH5S6f8G5frB2SPQ3EyF02kxdyBFf4Tz4banE3xCgGnKgWLt//a6VuYHKYJTg==} + '@types/eslint-scope@3.7.7': resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} @@ -18759,8 +18768,8 @@ packages: peerDependencies: vue: ^2.6.12 - tdesign-vue@1.10.6: - resolution: {integrity: sha512-ChRQW+xzBnE5/c3fAduQ4EPwE+xlXDz2DQhrkSMMVCl2gCy17qRgKlcb8m94HS/KOjecOHSMuqI+lvKL3IgUIA==} + tdesign-vue@1.10.7: + resolution: {integrity: sha512-TEZyQsv+mvZteJEpWGZjmbDavfA3UQ/SAofoFl8VUm0WzUSJkMH07tuVHO2zeAkbWB1qV2mk03IhVRj+urMu5A==} peerDependencies: vue: ~2.6.10 @@ -29990,6 +29999,8 @@ snapshots: '@types/envinfo@7.8.3': {} + '@types/escape-html@1.0.4': {} + '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 8.56.10 @@ -31776,7 +31787,7 @@ snapshots: '@babel/runtime': 7.25.0 '@types/js-cookie': 2.2.7 ahooks-v3-count: 1.0.0 - dayjs: 1.11.10 + dayjs: 1.11.13 intersection-observer: 0.12.2 js-cookie: 2.2.1 lodash: 4.17.21 @@ -37568,7 +37579,7 @@ snapshots: lower-case@2.0.2: dependencies: - tslib: 2.6.3 + tslib: 2.8.1 lowercase-keys@2.0.0: {} @@ -42750,7 +42761,7 @@ snapshots: classnames: 2.3.2 vue: 2.7.16 - tdesign-vue@1.10.6(vue@2.6.14): + tdesign-vue@1.10.7(vue@2.6.14): dependencies: '@babel/runtime': 7.23.2 '@popperjs/core': 2.11.8 @@ -42772,7 +42783,7 @@ snapshots: validator: 13.11.0 vue: 2.6.14 - tdesign-vue@1.10.6(vue@2.7.16): + tdesign-vue@1.10.7(vue@2.7.16): dependencies: '@babel/runtime': 7.23.2 '@popperjs/core': 2.11.8