From 91e1650ec87166eb7f320de8f2db4f5875eaabc2 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Wed, 28 Jun 2023 15:45:36 +0200 Subject: [PATCH] fix(utils): respect all flags in format function (#3695) --- packages/utils/src/display.ts | 23 ++- pnpm-lock.yaml | 269 ++++++++++++++++++-------------- test/utils/package.json | 12 ++ test/utils/test/display.spec.ts | 93 +++++++++++ 4 files changed, 278 insertions(+), 119 deletions(-) create mode 100644 test/utils/package.json create mode 100644 test/utils/test/display.spec.ts diff --git a/packages/utils/src/display.ts b/packages/utils/src/display.ts index 9bc5ef729f96..67cbe162ad72 100644 --- a/packages/utils/src/display.ts +++ b/packages/utils/src/display.ts @@ -18,13 +18,13 @@ interface LoupeOptions { truncate?: number } -const formatRegExp = /%[sdj%]/g +const formatRegExp = /%[sdjifoOcj%]/g export function format(...args: unknown[]) { if (typeof args[0] !== 'string') { const objects = [] for (let i = 0; i < args.length; i++) - objects.push(inspect(args[i])) + objects.push(inspect(args[i], { depth: 0, colors: false, compact: 3 })) return objects.join(' ') } @@ -62,13 +62,26 @@ export function format(...args: unknown[]) { case '%f': return Number.parseFloat(String(args[i++])).toString() case '%o': return inspect(args[i++], { showHidden: true, showProxy: true }) case '%O': return inspect(args[i++]) - case '%c': return '' + case '%c': { + i++ + return '' + } case '%j': try { return JSON.stringify(args[i++]) } - catch (_) { - return '[Circular]' + catch (err: any) { + const m = err.message + if ( + // chromium + m.includes('circular structure') + // safari + || m.includes('cyclic structures') + // firefox + || m.includes('cyclic object') + ) + return '[Circular]' + throw err } default: return x diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index efdcb8b0b1e7..38a4d2cd1b92 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -691,7 +691,7 @@ importers: version: 4.2.3(vite@4.3.9)(vue@3.3.4) '@vue/test-utils': specifier: latest - version: 2.4.0(vue@3.3.4) + version: 2.3.2(vue@3.3.4) jsdom: specifier: latest version: 22.1.0 @@ -737,10 +737,10 @@ importers: devDependencies: '@sveltejs/vite-plugin-svelte': specifier: latest - version: 2.4.2(svelte@4.0.0)(vite@4.3.9) + version: 2.4.2(svelte@3.59.1)(vite@4.3.9) '@testing-library/svelte': specifier: latest - version: 4.0.1(svelte@4.0.0) + version: 3.2.2(svelte@3.59.1) '@vitest/ui': specifier: latest version: link:../../packages/ui @@ -749,7 +749,7 @@ importers: version: 22.1.0 svelte: specifier: latest - version: 4.0.0 + version: 3.59.1 vite: specifier: ^4.3.9 version: 4.3.9(@types/node@18.16.18) @@ -850,7 +850,7 @@ importers: version: 3.0.1(vite@4.3.9)(vue@3.3.4) '@vue/test-utils': specifier: latest - version: 2.4.0(vue@3.3.4) + version: 2.3.2(vue@3.3.4) jsdom: specifier: latest version: 22.1.0 @@ -1510,7 +1510,7 @@ importers: version: link:../../packages/vitest webdriverio: specifier: latest - version: 8.11.2(typescript@5.1.3) + version: 8.10.7(typescript@5.1.3) test/base: devDependencies: @@ -1630,7 +1630,7 @@ importers: version: link:../../packages/coverage-v8 '@vue/test-utils': specifier: latest - version: 2.4.0(vue@3.3.4) + version: 2.3.2(vue@3.3.4) happy-dom: specifier: latest version: 9.20.3 @@ -1648,7 +1648,7 @@ importers: version: 3.3.4 webdriverio: specifier: latest - version: 8.11.2(typescript@5.1.3) + version: 8.10.7(typescript@5.1.3) test/css: devDependencies: @@ -1897,6 +1897,15 @@ importers: specifier: workspace:* version: link:../../packages/vitest + test/utils: + devDependencies: + '@vitest/utils': + specifier: workspace:* + version: link:../../packages/utils + vitest: + specifier: workspace:* + version: link:../../packages/vitest + test/vite-config: devDependencies: pathe: @@ -1937,7 +1946,7 @@ importers: version: link:../../packages/vitest webdriverio: specifier: latest - version: 8.11.2(typescript@5.1.3) + version: 8.10.7(typescript@5.1.3) test/web-worker: devDependencies: @@ -8329,22 +8338,6 @@ packages: - supports-color dev: true - /@sveltejs/vite-plugin-svelte-inspector@1.0.3(@sveltejs/vite-plugin-svelte@2.4.2)(svelte@4.0.0)(vite@4.3.9): - resolution: {integrity: sha512-Khdl5jmmPN6SUsVuqSXatKpQTMIifoQPDanaxC84m9JxIibWvSABJyHpyys0Z+1yYrxY5TTEQm+6elh0XCMaOA==} - engines: {node: ^14.18.0 || >= 16} - peerDependencies: - '@sveltejs/vite-plugin-svelte': ^2.2.0 - svelte: ^3.54.0 || ^4.0.0 - vite: ^4.0.0 - dependencies: - '@sveltejs/vite-plugin-svelte': 2.4.2(svelte@4.0.0)(vite@4.3.9) - debug: 4.3.4(supports-color@8.1.1) - svelte: 4.0.0 - vite: 4.3.9(@types/node@18.16.18) - transitivePeerDependencies: - - supports-color - dev: true - /@sveltejs/vite-plugin-svelte@2.4.2(svelte@3.59.1)(vite@4.3.9): resolution: {integrity: sha512-ePfcC48ftMKhkT0OFGdOyycYKnnkT6i/buzey+vHRTR/JpQvuPzzhf1PtKqCDQfJRgoPSN2vscXs6gLigx/zGw==} engines: {node: ^14.18.0 || >= 16} @@ -8365,26 +8358,6 @@ packages: - supports-color dev: true - /@sveltejs/vite-plugin-svelte@2.4.2(svelte@4.0.0)(vite@4.3.9): - resolution: {integrity: sha512-ePfcC48ftMKhkT0OFGdOyycYKnnkT6i/buzey+vHRTR/JpQvuPzzhf1PtKqCDQfJRgoPSN2vscXs6gLigx/zGw==} - engines: {node: ^14.18.0 || >= 16} - peerDependencies: - svelte: ^3.54.0 || ^4.0.0 - vite: ^4.0.0 - dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 1.0.3(@sveltejs/vite-plugin-svelte@2.4.2)(svelte@4.0.0)(vite@4.3.9) - debug: 4.3.4(supports-color@8.1.1) - deepmerge: 4.3.1 - kleur: 4.1.5 - magic-string: 0.30.0 - svelte: 4.0.0 - svelte-hmr: 0.15.2(svelte@4.0.0) - vite: 4.3.9(@types/node@18.16.18) - vitefu: 0.2.4(vite@4.3.9) - transitivePeerDependencies: - - supports-color - dev: true - /@szmarczak/http-timer@5.0.1: resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} @@ -8424,7 +8397,7 @@ packages: '@babel/code-frame': 7.22.5 '@babel/runtime': 7.18.9 '@types/aria-query': 4.2.2 - aria-query: 5.0.2 + aria-query: 5.3.0 chalk: 4.1.2 dom-accessibility-api: 0.5.14 lz-string: 1.4.4 @@ -8502,14 +8475,14 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: true - /@testing-library/svelte@4.0.1(svelte@4.0.0): - resolution: {integrity: sha512-rvqkMlkXPtbtMbYQsWTb666yBAJVrTJcek2TlDogBKhxwYKqbWgvtTftMNclPi5aLgy+QGndTyIf4gtdFKaiXA==} + /@testing-library/svelte@3.2.2(svelte@3.59.1): + resolution: {integrity: sha512-IKwZgqbekC3LpoRhSwhd0JswRGxKdAGkf39UiDXTywK61YyLXbCYoR831e/UUC6EeNW4hiHPY+2WuovxOgI5sw==} engines: {node: '>= 10'} peerDependencies: - svelte: ^3 || ^4 + svelte: 3.x dependencies: '@testing-library/dom': 8.19.0 - svelte: 4.0.0 + svelte: 3.59.1 dev: true /@testing-library/user-event@13.5.0(@testing-library/dom@8.17.1): @@ -9847,21 +9820,16 @@ packages: vue: 3.3.4 dev: true - /@vue/test-utils@2.4.0(vue@3.3.4): - resolution: {integrity: sha512-BKB9aj1yky63/I3IwSr1FjUeHYsKXI7D6S9F378AHt7a5vC0dLkOBtSsFXoRGC/7BfHmiB9HRhT+i9xrUHoAKw==} + /@vue/test-utils@2.3.2(vue@3.3.4): + resolution: {integrity: sha512-hJnVaYhbrIm0yBS0+e1Y0Sj85cMyAi+PAbK4JHqMRUZ6S622Goa+G7QzkRSyvCteG8wop7tipuEbHoZo26wsSA==} peerDependencies: - '@vue/compiler-dom': ^3.0.1 - '@vue/server-renderer': ^3.0.1 vue: ^3.0.1 - peerDependenciesMeta: - '@vue/compiler-dom': - optional: true - '@vue/server-renderer': - optional: true dependencies: js-beautify: 1.14.6 vue: 3.3.4 - vue-component-type-helpers: 1.6.5 + optionalDependencies: + '@vue/compiler-dom': 3.3.4 + '@vue/server-renderer': 3.3.4(vue@3.3.4) dev: true /@vueuse/core@10.2.0(vue@3.3.4): @@ -10017,6 +9985,20 @@ packages: vue-demi: 0.14.0(vue@3.2.39) dev: false + /@wdio/config@8.10.7: + resolution: {integrity: sha512-m7JX9X/RPM+4KZQkSUhPHXeS3PJJky0UB62ZLh28TYCzVxEKNq1gFb6Cvqfn+w6Ym/UCFBaZzDrRLLXUAgUifw==} + engines: {node: ^16.13 || >=18} + dependencies: + '@wdio/logger': 8.10.6 + '@wdio/types': 8.10.4 + '@wdio/utils': 8.10.7 + decamelize: 6.0.0 + deepmerge-ts: 5.0.0 + glob: 10.2.7 + import-meta-resolve: 3.0.0 + read-pkg-up: 9.1.0 + dev: true + /@wdio/config@8.11.0: resolution: {integrity: sha512-nBQXsXbPCjddtI/3rAK5yFs3eD3f0T3lZMivweTkLLR7GKBxGjiFoBjXtfqUrHJYa+2uwfXrwxo6y+dA6fVbuw==} engines: {node: ^16.13 || >=18} @@ -10031,6 +10013,16 @@ packages: read-pkg-up: 9.1.0 dev: true + /@wdio/logger@8.10.6: + resolution: {integrity: sha512-pJYKecNYS0vu0FxDaii6MYQlYkORDLGdRWi70hrihH20sMZofzMA1tvzRMRk1VTrsUUE4TLJXKdmT2JRMN+OPw==} + engines: {node: ^16.13 || >=18} + dependencies: + chalk: 5.2.0 + loglevel: 1.8.1 + loglevel-plugin-prefix: 0.8.4 + strip-ansi: 7.1.0 + dev: true + /@wdio/logger@8.11.0: resolution: {integrity: sha512-IsuKSaYi7NKEdgA57h8muzlN/MVp1dQG+V4C//7g4m03YJUnNQLvDhJzLjdeNTfvZy61U7foQSyt+3ktNzZkXA==} engines: {node: ^16.13 || >=18} @@ -10041,6 +10033,10 @@ packages: strip-ansi: 7.1.0 dev: true + /@wdio/protocols@8.10.2: + resolution: {integrity: sha512-Iv7Nqq6YsMQR9qvOM2mswUcKwx7bdx3cWVSmbMc8hwGJuNCBI+BP1fzmD9OidUftd1CQNvfugsG8Vq8vQWRyGg==} + dev: true + /@wdio/protocols@8.11.0: resolution: {integrity: sha512-eXTMYt/XoaX53H/Q2qmsn1uWthIC5aSTGtX9YyXD/AkagG2hXeX3lLmzNWBaSIvKR+vWXRYbg3Y/7IvL2s25Wg==} dev: true @@ -10059,6 +10055,16 @@ packages: '@types/node': 20.3.2 dev: true + /@wdio/utils@8.10.7: + resolution: {integrity: sha512-G9r/bQl4J25WPKeW0e+27gqNvG+x7MyZEOICl6SwyBe0SqO7JBFOBARx4oUEp2zQYmnCRNtCrHa7yM/O4OPuKA==} + engines: {node: ^16.13 || >=18} + dependencies: + '@wdio/logger': 8.10.6 + '@wdio/types': 8.10.4 + import-meta-resolve: 3.0.0 + p-iteration: 1.1.8 + dev: true + /@wdio/utils@8.11.0: resolution: {integrity: sha512-XBl1zalk5UPu8QKZ7LZIA82Ad363fpNHZHP5uI5OxUFnk4ZPWgY9eCWpeD+4f9a0DS0w2Dro15E4PORNX84pIw==} engines: {node: ^16.13 || >=18} @@ -11040,12 +11046,6 @@ packages: transitivePeerDependencies: - debug - /axobject-query@3.2.1: - resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} - dependencies: - dequal: 2.0.3 - dev: true - /babel-jest@27.5.1(@babel/core@7.22.5): resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -12218,16 +12218,6 @@ packages: engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} dev: true - /code-red@1.0.3: - resolution: {integrity: sha512-kVwJELqiILQyG5aeuyKFbdsI1fmQy1Cmf7dQ8eGmVuJoaRVdwey7WaMknr2ZFeVSYSKT0rExsa8EGw0aoI/1QQ==} - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - '@types/estree': 1.0.1 - acorn: 8.9.0 - estree-walker: 3.0.3 - periscopic: 3.1.0 - dev: true - /codemirror-theme-vars@0.1.2: resolution: {integrity: sha512-WTau8X2q58b0SOAY9DO+iQVw8JKVEgyQIqArp2D732tcc+pobbMta3bnVMdQdmgwuvNrOFFr6HoxPRoQOgooFA==} dev: true @@ -13329,6 +13319,10 @@ packages: resolution: {integrity: sha512-39fCpE3Z78IaIPChJsP6Lhmkbf4dWXOmzLk/KFTdRkNk/0JymRIfUynDVRndV9HoDz8PyalK1UH21ST/ivwW5Q==} dev: true + /devtools-protocol@0.0.1149535: + resolution: {integrity: sha512-vpM8tGaYz2nrN9n8rvUEhQCgU05ocejO5WIJySsftEHxUahQ/fWuNyPxXuQNBEmaISYyMZkxCunhjtSEyBl/Dg==} + dev: true + /devtools-protocol@0.0.1152884: resolution: {integrity: sha512-9eP6OmCoU1cWArpXLuzyZQcBJ2PkINOh8Nwx8W5i8u6NDigDE5/mPlLLBAfshwn5YVvIz6ZQ9jbs0PZvKGccdQ==} dev: true @@ -13337,6 +13331,32 @@ packages: resolution: {integrity: sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg==} dev: true + /devtools@8.10.7(typescript@5.1.3): + resolution: {integrity: sha512-picJDxsjpaOW7gnQjcQVGDXvxuP1RZ4VNJpvJ+qiy86Gf3l4FGLKYkpJJFAMsIugL0XPs89bIVhjbtIv5NGL1w==} + engines: {node: ^16.13 || >=18} + dependencies: + '@types/node': 20.3.2 + '@wdio/config': 8.10.7 + '@wdio/logger': 8.10.6 + '@wdio/protocols': 8.10.2 + '@wdio/types': 8.10.4 + '@wdio/utils': 8.10.7 + chrome-launcher: 0.15.1 + edge-paths: 3.0.5 + import-meta-resolve: 3.0.0 + puppeteer-core: 20.3.0(typescript@5.1.3) + query-selector-shadow-dom: 1.0.1 + ua-parser-js: 1.0.34 + uuid: 9.0.0 + which: 3.0.0 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - typescript + - utf-8-validate + dev: true + /devtools@8.11.0(typescript@5.1.3): resolution: {integrity: sha512-j1wXFQyjswJ6doAV1+h4Bxl8+Oeb8SMpWTpBVa0DurGsxfft8sU2OhDlMo5tx/zbX82X5sGyJDMnKHqBJ2XRvQ==} engines: {node: ^16.13 || >=18} @@ -18537,10 +18557,6 @@ packages: resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} engines: {node: '>=14'} - /locate-character@3.0.0: - resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} - dev: true - /locate-path@3.0.0: resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} engines: {node: '>=6'} @@ -18754,7 +18770,7 @@ packages: resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} engines: {node: '>=12'} dependencies: - '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/sourcemap-codec': 1.4.15 dev: true /magic-string@0.30.0: @@ -22591,7 +22607,7 @@ packages: resolution: {integrity: sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==} hasBin: true dependencies: - '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/sourcemap-codec': 1.4.15 buffer-crc32: 0.2.13 minimist: 1.2.8 sander: 0.5.1 @@ -23233,15 +23249,6 @@ packages: svelte: 3.59.1 dev: true - /svelte-hmr@0.15.2(svelte@4.0.0): - resolution: {integrity: sha512-q/bAruCvFLwvNbeE1x3n37TYFb3mTBJ6TrCq6p2CoFbSTNhDE9oAtEfpy+wmc9So8AG0Tja+X0/mJzX9tSfvIg==} - engines: {node: ^12.20 || ^14.13.1 || >= 16} - peerDependencies: - svelte: ^3.19.0 || ^4.0.0-next.0 - dependencies: - svelte: 4.0.0 - dev: true - /svelte-preprocess@5.0.4(svelte@3.59.1)(typescript@5.1.3): resolution: {integrity: sha512-ABia2QegosxOGsVlsSBJvoWeXy1wUKSfF7SWJdTjLAbx/Y3SrVevvvbFNQqrSJw89+lNSsM58SipmZJ5SRi5iw==} engines: {node: '>= 14.10.0'} @@ -23294,25 +23301,6 @@ packages: engines: {node: '>= 8'} dev: true - /svelte@4.0.0: - resolution: {integrity: sha512-+yCYu3AEUu9n91dnQNGIbnVp8EmNQtuF/YImW4+FTXRHard7NMo+yTsWzggPAbj3fUEJ1FBJLkql/jkp6YB5pg==} - engines: {node: '>=16'} - dependencies: - '@ampproject/remapping': 2.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.18 - acorn: 8.9.0 - aria-query: 5.3.0 - axobject-query: 3.2.1 - code-red: 1.0.3 - css-tree: 2.3.1 - estree-walker: 3.0.3 - is-reference: 3.0.1 - locate-character: 3.0.0 - magic-string: 0.30.0 - periscopic: 3.1.0 - dev: true - /sveltedoc-parser@4.2.1: resolution: {integrity: sha512-sWJRa4qOfRdSORSVw9GhfDEwsbsYsegnDzBevUCF6k/Eis/QqCu9lJ6I0+d/E2wOWCjOhlcJ3+jl/Iur+5mmCw==} engines: {node: '>=10.0.0'} @@ -24869,10 +24857,6 @@ packages: resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} dev: true - /vue-component-type-helpers@1.6.5: - resolution: {integrity: sha512-iGdlqtajmiqed8ptURKPJ/Olz0/mwripVZszg6tygfZSIL9kYFPJTNY6+Q6OjWGznl2L06vxG5HvNvAnWrnzbg==} - dev: true - /vue-demi@0.13.11(vue@3.2.39): resolution: {integrity: sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==} engines: {node: '>=12'} @@ -25082,6 +25066,26 @@ packages: resolution: {integrity: sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==} dev: true + /webdriver@8.10.7: + resolution: {integrity: sha512-pBy29S9e8IYKYHfS0gp91Jp9SUvXJQckJKJdj+VNLNL9toSFo10N7xRpv8W1f7HkniXrgESi9GHYNyc1J/5lLA==} + engines: {node: ^16.13 || >=18} + dependencies: + '@types/node': 20.3.2 + '@types/ws': 8.5.5 + '@wdio/config': 8.10.7 + '@wdio/logger': 8.10.6 + '@wdio/protocols': 8.10.2 + '@wdio/types': 8.10.4 + '@wdio/utils': 8.10.7 + deepmerge-ts: 5.0.0 + got: 12.6.1 + ky: 0.33.3 + ws: 8.13.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + /webdriver@8.11.1: resolution: {integrity: sha512-hSpUZYzUA65t4DDtKujCHUX6hpFTUleb7lWMcf5xjPz8sxWrK9R8NIw7pXt/GU6PVS331nGAaYkzoXrqz2VB8w==} engines: {node: ^16.13 || >=18} @@ -25102,6 +25106,43 @@ packages: - utf-8-validate dev: true + /webdriverio@8.10.7(typescript@5.1.3): + resolution: {integrity: sha512-TkkPE3zBxdLRdcsNLqHct2OARnfMYB9/A0ri4sccmc3C3dVFiW99NAstN88nzD1SYzXAbxALRuITVd5oswqqhg==} + engines: {node: ^16.13 || >=18} + dependencies: + '@types/node': 20.3.2 + '@wdio/config': 8.10.7 + '@wdio/logger': 8.10.6 + '@wdio/protocols': 8.10.2 + '@wdio/repl': 8.10.1 + '@wdio/types': 8.10.4 + '@wdio/utils': 8.10.7 + archiver: 5.3.1 + aria-query: 5.3.0 + css-shorthand-properties: 1.1.1 + css-value: 0.0.1 + devtools: 8.10.7(typescript@5.1.3) + devtools-protocol: 0.0.1149535 + grapheme-splitter: 1.0.4 + import-meta-resolve: 3.0.0 + is-plain-obj: 4.1.0 + lodash.clonedeep: 4.5.0 + lodash.zip: 4.2.0 + minimatch: 9.0.1 + puppeteer-core: 20.3.0(typescript@5.1.3) + query-selector-shadow-dom: 1.0.1 + resq: 1.11.0 + rgb2hex: 0.2.5 + serialize-error: 8.1.0 + webdriver: 8.10.7 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - typescript + - utf-8-validate + dev: true + /webdriverio@8.11.2(typescript@5.1.3): resolution: {integrity: sha512-e/9WkdNTfWeoaSo2UzK0Giec/nQX3i7U9J8esimhozH/EpwSqIaEJ2pRRlxRVafEhe2OBG1QDhnLnDjdCC5Hxg==} engines: {node: ^16.13 || >=18} diff --git a/test/utils/package.json b/test/utils/package.json new file mode 100644 index 000000000000..f8bbb264c217 --- /dev/null +++ b/test/utils/package.json @@ -0,0 +1,12 @@ +{ + "name": "@vitest/test-utils", + "private": true, + "scripts": { + "test": "vitest", + "coverage": "vitest run --coverage" + }, + "devDependencies": { + "@vitest/utils": "workspace:*", + "vitest": "workspace:*" + } +} diff --git a/test/utils/test/display.spec.ts b/test/utils/test/display.spec.ts new file mode 100644 index 000000000000..3e304fca1f94 --- /dev/null +++ b/test/utils/test/display.spec.ts @@ -0,0 +1,93 @@ +import util from 'node:util' +import { describe, expect, test } from 'vitest' +import { format } from '@vitest/utils' + +describe('format', () => { + const obj = {} as any + obj.obj = obj + + test.each([ + [''], + ['test'], + [{ obj: { nested: true }, value: 1 }], + ['test %s', 'test'], + ['test %s %s', 'test', 'test'], + ['test %s %s', 'test', 'test', 'test'], + ['%s', 100], + ['%s', 100n], + ['%s', -0], + ['%s', null], + ['%s', null, 'next'], + ['%d', 100], + ['%d', 100n], + ['%d', null], + ['%d', {}], + ['%d', {}, 'next'], + ['%i', 100], + ['%i', 100n], + ['%i', null], + ['%i', {}], + ['%i', {}, 'next'], + ['%f', 100], + ['%f', 100n], + ['%f', null], + ['%f', {}], + ['%f', {}, 'next'], + ['%o', 'string'], + ['%o', 100], + ['%o', 100n], + ['%o', null], + ['%o', {}], + ['%o', {}, 'next'], + ['%O', 'string'], + ['%O', 100], + ['%O', 100n], + ['%O', null], + ['%O', {}], + ['%O', {}, 'next'], + ['%c', 'css value'], + ['%c', 'css value', 'some other value'], + ['%c %f', 'css value', '100.00'], + ['%j', 'string'], + ['%j', 100], + ['%j', null], + ['%j', {}], + ['%j', {}, 'next'], + ['%j', { obj }], + ['%j', { fn: () => {} }], + ['%%', 'string'], + ])('format(%s)', (formatString, ...args) => { + expect(format(formatString, ...args), `failed ${formatString}`).toBe(util.format(formatString, ...args)) + }) + + test('cannont serialize some values', () => { + expect(() => format('%j', 100n)).toThrowErrorMatchingInlineSnapshot('"Do not know how to serialize a BigInt"') + }) + + test.each( + [ + { + name: 'without format', + args: [{ n: { a: { b: { c: { d: { e: '3' } } } } } }], + result: '{ n: { a: { b: { c: { d: { e: \'3\' } } } } } }', + }, + { + name: 'as an object', + args: ['%o', {}, { n: { a: { b: { c: '3' } } } }], + result: '{} { n: { a: { b: { c: \'3\' } } } }', + }, + { + name: 'as a full object', + args: ['%O', {}, { n: { a: { b: { c: '3' } } } }], + result: '{} { n: { a: { b: { c: \'3\' } } } }', + }, + { + name: 'as a json', + args: ['%j', {}, { n: { a: { b: { c: '3' } } } }], + result: '{} { n: { a: { b: { c: \'3\' } } } }', + }, + ], + )('formats objects $name (loupe doesn\'t respect depth)', ({ args, result }) => { + expect(format(...args)).toBe(result) + }) +})