From 4fc21146abf24e95a668fb0903c816cc141c510c Mon Sep 17 00:00:00 2001 From: Juan Picado Date: Sun, 19 Feb 2023 11:43:28 +0100 Subject: [PATCH] fix: missing logo on header (#3636) --- .changeset/old-apples-fail.md | 8 +++++ packages/core/types/src/configuration.ts | 1 - .../src/middlewares/web/render-web.ts | 25 ++++------------ .../src/middlewares/web/utils/renderHTML.ts | 17 ++++------- packages/middleware/test/config/dark-logo.png | Bin 0 -> 2613 bytes .../middleware/test/config/file-logo.yaml | 24 +++++++++++++++ .../test/config/login-disabled.yaml | 1 + packages/middleware/test/config/no-logo.yaml | 24 +++++++++++++++ packages/middleware/test/config/web.yaml | 3 +- .../middleware/test/config/wrong-logo.yaml | 24 +++++++++++++++ packages/middleware/test/render.spec.ts | 28 +++++++++++++++++- packages/plugins/ui-theme/package.json | 3 +- packages/ui-components/public/dark-logo.png | Bin 0 -> 2613 bytes packages/web/test/config/web.yaml | 2 +- pnpm-lock.yaml | 8 ++--- 15 files changed, 128 insertions(+), 40 deletions(-) create mode 100644 .changeset/old-apples-fail.md create mode 100644 packages/middleware/test/config/dark-logo.png create mode 100644 packages/middleware/test/config/file-logo.yaml create mode 100644 packages/middleware/test/config/no-logo.yaml create mode 100644 packages/middleware/test/config/wrong-logo.yaml create mode 100644 packages/ui-components/public/dark-logo.png diff --git a/.changeset/old-apples-fail.md b/.changeset/old-apples-fail.md new file mode 100644 index 000000000..9b76fee55 --- /dev/null +++ b/.changeset/old-apples-fail.md @@ -0,0 +1,8 @@ +--- +'@verdaccio/types': patch +'@verdaccio/middleware': patch +'@verdaccio/ui-theme': patch +'@verdaccio/web': patch +--- + +fix: missing logo on header diff --git a/packages/core/types/src/configuration.ts b/packages/core/types/src/configuration.ts index 09dce2314..1ac79a235 100644 --- a/packages/core/types/src/configuration.ts +++ b/packages/core/types/src/configuration.ts @@ -128,7 +128,6 @@ export type TemplateUIOptions = { base: string; primaryColor: string; version?: string; - logoURI?: string; flags: FlagsConfig; } & CommonWebConf; diff --git a/packages/middleware/src/middlewares/web/render-web.ts b/packages/middleware/src/middlewares/web/render-web.ts index bc849eca6..1bc76d91f 100644 --- a/packages/middleware/src/middlewares/web/render-web.ts +++ b/packages/middleware/src/middlewares/web/render-web.ts @@ -7,7 +7,7 @@ import { HTTP_STATUS } from '@verdaccio/core'; import { isURLhasValidProtocol } from '@verdaccio/url'; import { setSecurityWebHeaders } from './security'; -import renderHTML, { isHTTPProtocol } from './utils/renderHTML'; +import renderHTML from './utils/renderHTML'; const debug = buildDebug('verdaccio:web:render'); @@ -31,23 +31,10 @@ export function renderWebMiddleware(config, tokenMiddleware, pluginOptions) { if (typeof tokenMiddleware === 'function') { router.use(tokenMiddleware); } + router.use(setSecurityWebHeaders); - // Logo - let logoURI = config?.web?.logo ?? ''; - if (logoURI && !isURLhasValidProtocol(logoURI)) { - // URI related to a local file - - // Note: `path.join` will break on Windows, because it transforms `/` to `\` - // Use POSIX version `path.posix.join` instead. - logoURI = path.posix.join('/-/static/', path.basename(logoURI)); - router.get(logoURI, function (req, res, next) { - res.sendFile(path.resolve(config.web.logo), sendFileCallback(next)); - debug('render static'); - }); - } - - // Static + // any match within the static is routed to the file system router.get('/-/static/*', function (req, res, next) { const filename = req.params[0]; const file = `${staticPath}/${filename}`; @@ -55,13 +42,13 @@ export function renderWebMiddleware(config, tokenMiddleware, pluginOptions) { res.sendFile(file, sendFileCallback(next)); }); - // logo - if (config?.web?.logo && !isHTTPProtocol(config?.web?.logo)) { + // check the origin of the logo + if (config?.web?.logo && !isURLhasValidProtocol(config?.web?.logo)) { // URI related to a local file const absoluteLocalFile = path.posix.resolve(config.web.logo); debug('serve local logo %s', absoluteLocalFile); try { - // TODO: remove existsSync by async alternative + // TODO: replace existsSync by async alternative if ( fs.existsSync(absoluteLocalFile) && typeof fs.accessSync(absoluteLocalFile, fs.constants.R_OK) === 'undefined' diff --git a/packages/middleware/src/middlewares/web/utils/renderHTML.ts b/packages/middleware/src/middlewares/web/utils/renderHTML.ts index 2326a26e6..15727d273 100644 --- a/packages/middleware/src/middlewares/web/utils/renderHTML.ts +++ b/packages/middleware/src/middlewares/web/utils/renderHTML.ts @@ -6,6 +6,7 @@ import { URL } from 'url'; import { WEB_TITLE } from '@verdaccio/config'; import { HEADERS } from '@verdaccio/core'; import { TemplateUIOptions } from '@verdaccio/types'; +import { isURLhasValidProtocol } from '@verdaccio/url'; import { getPublicUrl } from '@verdaccio/url'; import renderTemplate from './template'; @@ -21,20 +22,12 @@ const defaultManifestFiles = { ico: 'favicon.ico', }; -/** - * Check if URI is starting with "http://", "https://" or "//" - * @param {string} uri - */ -export function isHTTPProtocol(uri: string): boolean { - return /^(https?:)?\/\//.test(uri); -} - export function resolveLogo(config, req) { - const isLocalFile = config?.web?.logo && !isHTTPProtocol(config?.web?.logo); + const isLocalFile = config?.web?.logo && !isURLhasValidProtocol(config?.web?.logo); if (isLocalFile) { return `${getPublicUrl(config?.url_prefix, req)}-/static/${path.basename(config?.web?.logo)}`; - } else if (isHTTPProtocol(config?.web?.logo)) { + } else if (isURLhasValidProtocol(config?.web?.logo)) { return config?.web?.logo; } else { return ''; @@ -53,7 +46,7 @@ export default function renderHTML(config, manifest, manifestFiles, req, res) { const title = config?.web?.title ?? WEB_TITLE; const login = hasLogin(config); const scope = config?.web?.scope ?? ''; - const logoURI = resolveLogo(config, req); + const logo = resolveLogo(config, req); const pkgManagers = config?.web?.pkgManagers ?? ['yarn', 'pnpm', 'npm']; const version = config?.web?.version; const flags = { @@ -94,7 +87,7 @@ export default function renderHTML(config, manifest, manifestFiles, req, res) { base, primaryColor, version, - logoURI, + logo, flags, login, pkgManagers, diff --git a/packages/middleware/test/config/dark-logo.png b/packages/middleware/test/config/dark-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8a46f23234e80ac5f6ff5c65f65e8743df634435 GIT binary patch literal 2613 zcmV-53d;3~P)Nkl^WcCow>KueQ$SlRd?N_ z51dqYbuH(7UsrY4ayuC;JQ+k)=a9}Kon&Yhg=0xala4a*m6o5#x-FzNq*f>T>p6Ud&+uI- znMc;tlJ-~NQ~3qofkEhkhjIyNCuu69`}=iZ04zd#QOTpq@p{7z68+@*Aa)ZA?`D4~&6z zN~xg~5n#b!0IZV=R>2}Ng2f*xOc`KnV8QMiMRpItOSWn0ds;XQA@q#S5ls8kgR>bxWu%D2&$@ zyL{KLUl(p46$lRW+4q^SSF{!u7LqS~($mwUEm^Wes7-v9*ymcle7R8D;;;u7EI%$n zXhn^UjrJb7h`n>?j!;{+ZQG`qdg;<77Z%tjsjjXTYL^9jaKVZ!k-{o0C@8S^%0=w= z@87lD++1#3GBYzZJI%_<(%RbETv%YA#E(rba0VCb4;Kl!fqC}qnZ0K&V(aSaxa)OM zyyqn6&!6YE$0f$#f>pRo%w*X1o>93TQQc*hl zYu2pcZY8*_SFc{3)JCpb-$f>jiRR9oo3w6$_~{e8Zv_^Z)bRWF@4JA&KFPy}50jQ{ zpUZ!2Wo2d3dIe(#F4#xGg*rO0YSk)Vtz_-mwT@*6<%8sUzy+9>eZ(Dj> zODHQyy925VTr`Oq-(55wjF z>kOWdWy_ZNY9$!`2MAE0bz!8A3Imthw{J6=7U8OwW|7(K*;qbsmeHd}vk4QhRlr`T ziP~PkxQDt__Wb#C+v~C;LnCDI;>E1Cww4VVq_4?%_H*mjt?bmPQ;zwHii+5rIddGZ zC%ZsX|E!_{Q+&aTxuza?&6uM?E8&%rk`l+P)22;hG?-(!+r27H)v${fFFKYj`$A}h zz_C4h_UPRMkCQWI%wV)CX`6NP=FOgoFo~lV4)*q~K0dQ8TXtlqggkigfZe!pgWJbL zhYt10o0F5HKVM9My@Y5Tw3^tb%pfB|B?OM{-o2ZwvAH69OZ4?b^iv2#-vi zI+g9%u|v=5r*&ZK(Ytr=cuWwQM+rh28XDM@D_6K3J88eL7beU0q#DveZ_Z`Bf0KkRBBb!N}Op`#&x7a=Fpj*~uSoG@ED|YVO zIqs5Et-D(bM(d!Rh}P&Z&%2dsAwUA7cL2pB-hBP zQ>tV^UvF2Ekfx?4cIM0(ZZH-uT$nU(M@NT>tphfzNeC=MEBX3WU-QSQC!t-64D(!0 zf~lI%pFcZY4m18eT1ab{7C6=2+}zBns;ZnWr;K-cmVjgo1QnGw5YnWmacuA2z1*z? zOSqVdw+hJk^5u&)T9xxA5b{P9Ypiy(w6w6}$B$d1U7zDwg7pwnK!l%}WwRWK;Txq1 zf#du3?c=_qt*rzTn7q#=i6q1qtrOB1AEVlFYilbzcI+6pS$LM9mEa*R>DRN|w%KIV zxxluMK(~`peV+C@jTtjWqY*Xt<~o|M(&*<1p6c{!qk#0_09@$u7yVV*;PUcvZbE2T zRvR{Kn9}|c{@|cj%IQdHgGY@TrO~V`7byY!SW^Uc;GkCu=}1JOQp-4U^a}P|DsS|N5hFbRPLQTxl=sWPzR$kbwD@0xhYufi-AZU0UzxP~IN{b70>`Vibe*b>*EXEiFw+2u6DLko-WLON zU~em!%}WO-`jd@GXHat^LIS@bfq7D?p{xDr4pi9}V4WbCT(nA=H6l8fhQOb0N(M=_ zq$=N8{lPY1Y}X)cIl`xVuotI4IIf}(z}EKjNWHU*7Ft^9{1?(ZOMG-H27yv4rqXLs z(LV)~(?h%@A{_rISSpgxLa;$f#b%$5HUUfDy-xIxCB@y4zW=eL*@B9rR^q#tIB0?? zDm)sI!c7XW6D~uk#E2B{-4`$ecG4v3zTA@ntO5}{oT9fcXJUYjum`wXM)CTFcj|O} z{gi1lF!B9r>y`v-It*}1NTX?%9~b}&?m?dwTtDZSml?ePT5K^QJChLxAK*)j zRGR$%;|Xb1^cFmUj#e1DltO$oQHcj2* literal 0 HcmV?d00001 diff --git a/packages/middleware/test/config/file-logo.yaml b/packages/middleware/test/config/file-logo.yaml new file mode 100644 index 000000000..4a4b4adbf --- /dev/null +++ b/packages/middleware/test/config/file-logo.yaml @@ -0,0 +1,24 @@ +web: + title: verdaccio web + login: true + scope: '@scope' + pkgManagers: + - pnpm + - yarn + showInfo: true + showSettings: true + showSearch: true + showFooter: true + showThemeSwitch: true + showDownloadTarball: true + showRaw: true + primary_color: '#ffffff' + logo: './test/config/dark-logo.png' + html_cache: false + +url_prefix: /prefix + +log: { type: stdout, format: pretty, level: trace } + +flags: + changePassword: true diff --git a/packages/middleware/test/config/login-disabled.yaml b/packages/middleware/test/config/login-disabled.yaml index 938df11e1..92748d29f 100644 --- a/packages/middleware/test/config/login-disabled.yaml +++ b/packages/middleware/test/config/login-disabled.yaml @@ -8,6 +8,7 @@ auth: web: title: verdaccio login: false + html_cache: false publish: allow_offline: false diff --git a/packages/middleware/test/config/no-logo.yaml b/packages/middleware/test/config/no-logo.yaml new file mode 100644 index 000000000..794b8a441 --- /dev/null +++ b/packages/middleware/test/config/no-logo.yaml @@ -0,0 +1,24 @@ +web: + title: verdaccio web + login: true + scope: '@scope' + pkgManagers: + - pnpm + - yarn + showInfo: true + showSettings: true + showSearch: true + showFooter: true + showThemeSwitch: true + showDownloadTarball: true + showRaw: true + primary_color: '#ffffff' + logo: + html_cache: false + +url_prefix: /prefix + +log: { type: stdout, format: pretty, level: trace } + +flags: + changePassword: true diff --git a/packages/middleware/test/config/web.yaml b/packages/middleware/test/config/web.yaml index 19f1d0032..d1d3ff948 100644 --- a/packages/middleware/test/config/web.yaml +++ b/packages/middleware/test/config/web.yaml @@ -13,7 +13,8 @@ web: showDownloadTarball: true showRaw: true primary_color: '#ffffff' - logoURI: 'http://logo.org/logo.png' + logo: 'http://logo.org/logo.png' + html_cache: false url_prefix: /prefix diff --git a/packages/middleware/test/config/wrong-logo.yaml b/packages/middleware/test/config/wrong-logo.yaml new file mode 100644 index 000000000..461ee15dc --- /dev/null +++ b/packages/middleware/test/config/wrong-logo.yaml @@ -0,0 +1,24 @@ +web: + title: verdaccio web + login: true + scope: '@scope' + pkgManagers: + - pnpm + - yarn + showInfo: true + showSettings: true + showSearch: true + showFooter: true + showThemeSwitch: true + showDownloadTarball: true + showRaw: true + primary_color: '#ffffff' + logo: './does_not_exist/config/dark-logo.png' + html_cache: false + +url_prefix: /prefix + +log: { type: stdout, format: pretty, level: trace } + +flags: + changePassword: true diff --git a/packages/middleware/test/render.spec.ts b/packages/middleware/test/render.spec.ts index 49144bae5..4cf40bec7 100644 --- a/packages/middleware/test/render.spec.ts +++ b/packages/middleware/test/render.spec.ts @@ -37,6 +37,10 @@ describe('test web server', () => { return new JSDOM(response.text, { runScripts: 'dangerously' }); }; + const loadLogo = async (config = 'default-test.yaml', url) => { + return supertest(initializeServer(config)).get(url).expect(HTTP_STATUS.OK); + }; + test('should match render set ui properties', async () => { const { window: { __VERDACCIO_BASENAME_UI_OPTIONS }, @@ -56,7 +60,7 @@ describe('test web server', () => { // FIXME: mock these values, avoid random // base: 'http://127.0.0.1:60864/prefix/', // version: '6.0.0-6-next.28', - logoURI: '', + logo: 'http://logo.org/logo.png', flags: { changePassword: true }, login: true, pkgManagers: ['pnpm', 'yarn'], @@ -67,6 +71,28 @@ describe('test web server', () => { ); }); + test('should render logo as file', async () => { + const { + window: { __VERDACCIO_BASENAME_UI_OPTIONS }, + } = await render('file-logo.yaml'); + expect(__VERDACCIO_BASENAME_UI_OPTIONS.logo).toMatch('/prefix/-/static/dark-logo.png'); + return loadLogo('file-logo.yaml', '/-/static/dark-logo.png'); + }); + + test('should not render logo as absolute file is wrong', async () => { + const { + window: { __VERDACCIO_BASENAME_UI_OPTIONS }, + } = await render('wrong-logo.yaml'); + expect(__VERDACCIO_BASENAME_UI_OPTIONS.logo).toEqual(''); + }); + + test('should render not render a logo', async () => { + const { + window: { __VERDACCIO_BASENAME_UI_OPTIONS }, + } = await render('no-logo.yaml'); + expect(__VERDACCIO_BASENAME_UI_OPTIONS.logo).toEqual(''); + }); + test.todo('should default title'); test.todo('should need html cache'); }); diff --git a/packages/plugins/ui-theme/package.json b/packages/plugins/ui-theme/package.json index 81fa639ca..f06541b5d 100644 --- a/packages/plugins/ui-theme/package.json +++ b/packages/plugins/ui-theme/package.json @@ -109,9 +109,10 @@ "test": "cross-env TZ=UTC jest --config ./jest/jest.config.js", "test:update-snapshot": "yarn run test -- -u", "lint": "pnpm lint:js && pnpm lint:css", + "clean": "rimraf ./static", "lint:css": "yarn stylelint \"src/**/styles.ts\"", "verdaccio:server": "node tools/verdaccio.js", - "build": "webpack --config tools/webpack.prod.config.babel.js", + "build": "pnpm clean && webpack --config tools/webpack.prod.config.babel.js", "build:stats": "webpack --config tools/webpack.prod.config.babel.js --json > stats.json", "build:size": "webpack --config tools/webpack.prod.config.babel.js --json | webpack-bundle-size-analyzer" }, diff --git a/packages/ui-components/public/dark-logo.png b/packages/ui-components/public/dark-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8a46f23234e80ac5f6ff5c65f65e8743df634435 GIT binary patch literal 2613 zcmV-53d;3~P)Nkl^WcCow>KueQ$SlRd?N_ z51dqYbuH(7UsrY4ayuC;JQ+k)=a9}Kon&Yhg=0xala4a*m6o5#x-FzNq*f>T>p6Ud&+uI- znMc;tlJ-~NQ~3qofkEhkhjIyNCuu69`}=iZ04zd#QOTpq@p{7z68+@*Aa)ZA?`D4~&6z zN~xg~5n#b!0IZV=R>2}Ng2f*xOc`KnV8QMiMRpItOSWn0ds;XQA@q#S5ls8kgR>bxWu%D2&$@ zyL{KLUl(p46$lRW+4q^SSF{!u7LqS~($mwUEm^Wes7-v9*ymcle7R8D;;;u7EI%$n zXhn^UjrJb7h`n>?j!;{+ZQG`qdg;<77Z%tjsjjXTYL^9jaKVZ!k-{o0C@8S^%0=w= z@87lD++1#3GBYzZJI%_<(%RbETv%YA#E(rba0VCb4;Kl!fqC}qnZ0K&V(aSaxa)OM zyyqn6&!6YE$0f$#f>pRo%w*X1o>93TQQc*hl zYu2pcZY8*_SFc{3)JCpb-$f>jiRR9oo3w6$_~{e8Zv_^Z)bRWF@4JA&KFPy}50jQ{ zpUZ!2Wo2d3dIe(#F4#xGg*rO0YSk)Vtz_-mwT@*6<%8sUzy+9>eZ(Dj> zODHQyy925VTr`Oq-(55wjF z>kOWdWy_ZNY9$!`2MAE0bz!8A3Imthw{J6=7U8OwW|7(K*;qbsmeHd}vk4QhRlr`T ziP~PkxQDt__Wb#C+v~C;LnCDI;>E1Cww4VVq_4?%_H*mjt?bmPQ;zwHii+5rIddGZ zC%ZsX|E!_{Q+&aTxuza?&6uM?E8&%rk`l+P)22;hG?-(!+r27H)v${fFFKYj`$A}h zz_C4h_UPRMkCQWI%wV)CX`6NP=FOgoFo~lV4)*q~K0dQ8TXtlqggkigfZe!pgWJbL zhYt10o0F5HKVM9My@Y5Tw3^tb%pfB|B?OM{-o2ZwvAH69OZ4?b^iv2#-vi zI+g9%u|v=5r*&ZK(Ytr=cuWwQM+rh28XDM@D_6K3J88eL7beU0q#DveZ_Z`Bf0KkRBBb!N}Op`#&x7a=Fpj*~uSoG@ED|YVO zIqs5Et-D(bM(d!Rh}P&Z&%2dsAwUA7cL2pB-hBP zQ>tV^UvF2Ekfx?4cIM0(ZZH-uT$nU(M@NT>tphfzNeC=MEBX3WU-QSQC!t-64D(!0 zf~lI%pFcZY4m18eT1ab{7C6=2+}zBns;ZnWr;K-cmVjgo1QnGw5YnWmacuA2z1*z? zOSqVdw+hJk^5u&)T9xxA5b{P9Ypiy(w6w6}$B$d1U7zDwg7pwnK!l%}WwRWK;Txq1 zf#du3?c=_qt*rzTn7q#=i6q1qtrOB1AEVlFYilbzcI+6pS$LM9mEa*R>DRN|w%KIV zxxluMK(~`peV+C@jTtjWqY*Xt<~o|M(&*<1p6c{!qk#0_09@$u7yVV*;PUcvZbE2T zRvR{Kn9}|c{@|cj%IQdHgGY@TrO~V`7byY!SW^Uc;GkCu=}1JOQp-4U^a}P|DsS|N5hFbRPLQTxl=sWPzR$kbwD@0xhYufi-AZU0UzxP~IN{b70>`Vibe*b>*EXEiFw+2u6DLko-WLON zU~em!%}WO-`jd@GXHat^LIS@bfq7D?p{xDr4pi9}V4WbCT(nA=H6l8fhQOb0N(M=_ zq$=N8{lPY1Y}X)cIl`xVuotI4IIf}(z}EKjNWHU*7Ft^9{1?(ZOMG-H27yv4rqXLs z(LV)~(?h%@A{_rISSpgxLa;$f#b%$5HUUfDy-xIxCB@y4zW=eL*@B9rR^q#tIB0?? zDm)sI!c7XW6D~uk#E2B{-4`$ecG4v3zTA@ntO5}{oT9fcXJUYjum`wXM)CTFcj|O} z{gi1lF!B9r>y`v-It*}1NTX?%9~b}&?m?dwTtDZSml?ePT5K^QJChLxAK*)j zRGR$%;|Xb1^cFmUj#e1DltO$oQHcj2* literal 0 HcmV?d00001 diff --git a/packages/web/test/config/web.yaml b/packages/web/test/config/web.yaml index 157dd3338..019dd0b7a 100644 --- a/packages/web/test/config/web.yaml +++ b/packages/web/test/config/web.yaml @@ -20,7 +20,7 @@ web: showDownloadTarball: true showRaw: true primary_color: '#ffffff' - logoURI: 'http://logo.org/logo.png' + logo: 'http://logo.org/logo.png' flags: - something: false diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index db1ca702c..c043918af 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10248,7 +10248,7 @@ packages: /axios/0.21.3_debug@4.3.4: resolution: {integrity: sha512-JtoZ3Ndke/+Iwt5n+BgSli/3idTvpt5OjKyoCmz4LX5+lPiY5l7C1colYezhlxThjNa/NhngCUWZSZFypIFuaA==} dependencies: - follow-redirects: 1.14.9_debug@4.3.4 + follow-redirects: 1.14.9_debug@4.3.3 transitivePeerDependencies: - debug dev: false @@ -10256,7 +10256,7 @@ packages: /axios/0.25.0_debug@4.3.4: resolution: {integrity: sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==} dependencies: - follow-redirects: 1.14.9_debug@4.3.4 + follow-redirects: 1.14.9_debug@4.3.3 transitivePeerDependencies: - debug @@ -25406,7 +25406,7 @@ packages: resolution: {integrity: sha512-FnHq5sTMxC0sk957wHDzRnemFnNBvt/gSY99HzK8F7UP5WAbvP70yX5bd7CjEQkN+TjdxwI7g7lJ6podqrG2/w==} /truncate-utf8-bytes/1.0.2: - resolution: {integrity: sha1-QFkjkJWS1W94pYGENLC3hInKXys=} + resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} dependencies: utf8-byte-length: 1.0.4 dev: false @@ -26157,7 +26157,7 @@ packages: dev: false /utf8-byte-length/1.0.4: - resolution: {integrity: sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=} + resolution: {integrity: sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==} dev: false /util-deprecate/1.0.2: