From 52ec97edbad9e3155bfbb25634d3829ec560ce49 Mon Sep 17 00:00:00 2001 From: Ryan Christian Date: Sun, 5 Feb 2023 03:39:49 -0600 Subject: [PATCH 1/3] test: Refactor snapshot testing --- packages/cli/global.d.ts | 7 - packages/cli/package.json | 1 + .../tests/__snapshots__/build.test.js.snap | 85 +++++++++++ .../tests/__snapshots__/create.test.js.snap | 44 ++++++ packages/cli/tests/build.test.js | 24 +-- packages/cli/tests/create.test.js | 15 +- packages/cli/tests/images/build.js | 49 ------ packages/cli/tests/images/create.js | 33 ----- packages/cli/tests/lib/utils.js | 139 +++++++++--------- yarn.lock | 85 ++++++++++- 10 files changed, 295 insertions(+), 187 deletions(-) create mode 100644 packages/cli/tests/__snapshots__/build.test.js.snap create mode 100644 packages/cli/tests/__snapshots__/create.test.js.snap delete mode 100644 packages/cli/tests/images/create.js diff --git a/packages/cli/global.d.ts b/packages/cli/global.d.ts index babb3438b..e1cdef0fd 100644 --- a/packages/cli/global.d.ts +++ b/packages/cli/global.d.ts @@ -1,12 +1,5 @@ declare const __webpack_public_path__: string; -declare namespace jest { - interface Matchers { - toBeCloseInSize(receivedSize: number, expectedSize: number): R; - toFindMatchingKey(receivedKey: string): R; - } -} - // Modified from https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/shelljs/index.d.ts declare module 'shelljs' { const shell: { diff --git a/packages/cli/package.json b/packages/cli/package.json index 479afd66f..c69254b5e 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -118,6 +118,7 @@ "devDependencies": { "@types/express": "^4.17.13", "@types/jest": "^24.9.1", + "directory-tree": "^3.5.1", "html-looks-like": "^1.0.2", "jest": "^24.9.0", "less": "^4.1.1", diff --git a/packages/cli/tests/__snapshots__/build.test.js.snap b/packages/cli/tests/__snapshots__/build.test.js.snap new file mode 100644 index 000000000..f8811150b --- /dev/null +++ b/packages/cli/tests/__snapshots__/build.test.js.snap @@ -0,0 +1,85 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`preact build builds the \`default\` template 1`] = ` +"build + assets + icons + android-chrome-192x192.png: 14058 + android-chrome-512x512.png: 51484 + apple-touch-icon.png: 12746 + favicon-16x16.png: 626 + favicon-32x32.png: 1487 + mstile-150x150.png: 9050 + favicon.ico: 15086 + preact-logo-inverse.svg: 649 + preact-logo.svg: 645 + ssr-build + asset-manifest.json: 178 + ssr-bundle.js: 30158 + ssr-bundle.js.map: 54671 + ssr-bundle.82489.css: 2585 + ssr-bundle.82489.css.map: 3680 + asset-manifest.json: 1142 + bundle.c4895.js: 22552 + bundle.c4895.js.map: 113627 + bundle.4c6ac.css: 1276 + favicon.ico: 15086 + index.html: 4162 + manifest.json: 455 + polyfills.1ea90.js: 6426 + polyfills.1ea90.js.map: 21116 + preact_prerender_data.json: 11 + push-manifest.json: 388 + route-home.chunk.5d28d.js: 1174 + route-home.chunk.5d28d.js.map: 2028 + route-home.chunk.9bcab.css: 821 + route-profile.chunk.4c330.js: 3490 + route-profile.chunk.4c330.js.map: 15002 +" +`; + +exports[`preact build builds the \`default\` template with esm 1`] = ` +"build + assets + icons + android-chrome-192x192.png: 14058 + android-chrome-512x512.png: 51484 + apple-touch-icon.png: 12746 + favicon-16x16.png: 626 + favicon-32x32.png: 1487 + mstile-150x150.png: 9050 + favicon.ico: 15086 + preact-logo-inverse.svg: 649 + preact-logo.svg: 645 + ssr-build + asset-manifest.json: 178 + ssr-bundle.js: 30158 + ssr-bundle.js.map: 54671 + ssr-bundle.82489.css: 2585 + ssr-bundle.82489.css.map: 3680 + asset-manifest.json: 1174 + bundle.c4895.js: 22552 + bundle.c4895.js.map: 113627 + bundle.9eeeb.esm.js: 22272 + bundle.9eeeb.esm.js.map: 113603 + bundle.4c6ac.css: 1276 + favicon.ico: 15086 + index.html: 4256 + manifest.json: 455 + polyfills.1ea90.js: 6426 + polyfills.1ea90.js.map: 21116 + polyfills.bfe9e.esm.js: 5721 + polyfills.bfe9e.esm.js.map: 21081 + preact_prerender_data.json: 11 + push-manifest.json: 404 + route-home.chunk.5d28d.js: 1174 + route-home.chunk.5d28d.js.map: 2028 + route-home.chunk.f8caa.esm.js: 1152 + route-home.chunk.f8caa.esm.js.map: 2024 + route-home.chunk.9bcab.css: 821 + route-profile.chunk.4c330.js: 3490 + route-profile.chunk.4c330.js.map: 15002 + route-profile.chunk.44303.esm.js: 2424 + route-profile.chunk.44303.esm.js.map: 14942 +" +`; diff --git a/packages/cli/tests/__snapshots__/create.test.js.snap b/packages/cli/tests/__snapshots__/create.test.js.snap new file mode 100644 index 000000000..d502fd2a7 --- /dev/null +++ b/packages/cli/tests/__snapshots__/create.test.js.snap @@ -0,0 +1,44 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`preact create scaffolds the \`default\` official template 1`] = ` +"default-template-project + .gitignore + README.md + package.json + src + assets + favicon.ico + icons + android-chrome-192x192.png + android-chrome-512x512.png + apple-touch-icon.png + favicon-16x16.png + favicon-32x32.png + mstile-150x150.png + preact-logo-inverse.svg + preact-logo.svg + components + app.js + header + index.js + style.css + index.js + manifest.json + routes + home + index.js + style.css + profile + index.js + style + index.css + sw.js + template.html + tests + __mocks__ + browserMocks.js + fileMocks.js + setupTests.js + header.test.js +" +`; diff --git a/packages/cli/tests/build.test.js b/packages/cli/tests/build.test.js index df70c15e1..53a2dd045 100644 --- a/packages/cli/tests/build.test.js +++ b/packages/cli/tests/build.test.js @@ -3,11 +3,11 @@ const { access, mkdir, readdir, readFile, rename, unlink, writeFile } = require('fs').promises; const looksLike = require('html-looks-like'); const { create, build } = require('./lib/cli'); -const { snapshot } = require('./lib/utils'); +const { snapshotDir } = require('./lib/utils'); const { subject } = require('./lib/output'); const images = require('./images/build'); -const minimatch = require('minimatch'); const shell = require('shelljs'); +const dirTree = require('directory-tree'); const prerenderUrlFiles = [ 'prerender-urls.json', @@ -35,18 +35,6 @@ function getRegExpFromMarkup(markup) { return new RegExp(minifiedMarkup); } -function testMatch(received, expected) { - let receivedKeys = Object.keys(received); - let expectedKeys = Object.keys(expected); - expect(receivedKeys).toHaveLength(expectedKeys.length); - for (let key in expected) { - const receivedKey = receivedKeys.find(k => minimatch(k, key)); - expect(key).toFindMatchingKey(receivedKey); - - expect(receivedKey).toBeCloseInSize(received[receivedKey], expected[key]); - } -} - /** * Get build output file as utf-8 string * @param {string} dir @@ -67,8 +55,8 @@ describe('preact build', () => { await build(dir); - let output = await snapshot(join(dir, 'build')); - testMatch(output, images.default); + const directoryTree = dirTree(join(dir, 'build'), { attributes: ['size'] }); + expect(await snapshotDir([directoryTree])).toMatchSnapshot(); }); it('builds the `default` template with esm', async () => { @@ -76,8 +64,8 @@ describe('preact build', () => { await build(dir, { esm: true }); - let output = await snapshot(join(dir, 'build')); - testMatch(output, images['default-esm']); + const directoryTree = dirTree(join(dir, 'build'), { attributes: ['size'] }); + expect(await snapshotDir([directoryTree])).toMatchSnapshot(); }); it('builds the `typescript` template', async () => { diff --git a/packages/cli/tests/create.test.js b/packages/cli/tests/create.test.js index aa531e650..f04020729 100644 --- a/packages/cli/tests/create.test.js +++ b/packages/cli/tests/create.test.js @@ -1,19 +1,22 @@ const { access, readFile } = require('fs').promises; -const { join, relative } = require('path'); +const { join } = require('path'); const { create } = require('./lib/cli'); -const { expand } = require('./lib/utils'); -const snapshots = require('./images/create'); +const { snapshotDir } = require('./lib/utils'); const shell = require('shelljs'); +const dirTree = require('directory-tree'); describe('preact create', () => { it('scaffolds the `default` official template', async () => { let dir = await create('default'); - let output = await expand(dir).then(arr => { - return arr.map(x => relative(dir, x)); + const directoryTree = dirTree(dir, { + exclude: /node_modules|package-lock|yarn.lock/, }); - expect(output.sort()).toEqual(snapshots.default); + // Creating a stable name, as the test directory is normally a randomized string + directoryTree.name = 'default-template-project'; + + expect(await snapshotDir([directoryTree], false)).toMatchSnapshot(); }); it('should use template.html from the github repo', async () => { diff --git a/packages/cli/tests/images/build.js b/packages/cli/tests/images/build.js index 431c8f244..e2536b0a2 100644 --- a/packages/cli/tests/images/build.js +++ b/packages/cli/tests/images/build.js @@ -1,52 +1,3 @@ -const common = { - 'polyfills.1ea90.js': 6426, - 'polyfills.1ea90.js.map': 21668, -}; - -exports.default = Object.assign({}, common, { - 'assets/icons/android-chrome-192x192.png': 14058, - 'assets/icons/android-chrome-512x512.png': 51484, - 'assets/icons/apple-touch-icon.png': 12746, - 'assets/icons/favicon-16x16.png': 626, - 'assets/icons/favicon-32x32.png': 1487, - 'assets/icons/mstile-150x150.png': 9050, - 'assets/preact-logo.svg': 645, - 'assets/preact-logo-inverse.svg': 649, - 'assets/favicon.ico': 15086, - 'ssr-build/ssr-bundle.82489.css': 2601, - 'ssr-build/ssr-bundle.82489.css.map': 3708, - 'ssr-build/ssr-bundle.js': 28830, - 'ssr-build/ssr-bundle.js.map': 52686, - 'ssr-build/asset-manifest.json': 178, - 'bundle.4c6ac.css': 1276, - 'bundle.c4895.js': 22529, - 'bundle.c4895.js.map': 111801, - 'favicon.ico': 15086, - 'index.html': 4127, - 'manifest.json': 455, - 'preact_prerender_data.json': 11, - 'push-manifest.json': 388, - 'asset-manifest.json': 1142, - 'route-home.chunk.9bcab.css': 834, - 'route-home.chunk.5d28d.js': 1149, - 'route-home.chunk.5d28d.js.map': 1961, - 'route-profile.chunk.4c330.js': 3490, - 'route-profile.chunk.4c330.js.map': 15002, -}); -exports['default-esm'] = Object.assign({}, exports.default, { - 'bundle.*.esm.js': 22249, - 'bundle.*.esm.js.map': 113538, - 'polyfills.*.esm.js': 5721, - 'polyfills.*.esm.js.map': 21633, - 'route-home.chunk.*.esm.js': 1127, - 'route-home.chunk.*.esm.js.map': 1957, - 'route-profile.chunk.*.esm.js': 2424, - 'route-profile.chunk.*.esm.js.map': 14942, - 'index.html': 4221, - 'push-manifest.json': 404, - 'asset-manifest.json': 1174, -}); - exports.sass = `
diff --git a/packages/cli/tests/images/create.js b/packages/cli/tests/images/create.js deleted file mode 100644 index 734e5a4a2..000000000 --- a/packages/cli/tests/images/create.js +++ /dev/null @@ -1,33 +0,0 @@ -const path = require('path'); - -exports.default = [ - '.gitignore', - 'package.json', - 'README.md', - 'src/assets/favicon.ico', - 'src/assets/icons/android-chrome-192x192.png', - 'src/assets/icons/android-chrome-512x512.png', - 'src/assets/icons/apple-touch-icon.png', - 'src/assets/icons/favicon-16x16.png', - 'src/assets/icons/favicon-32x32.png', - 'src/assets/icons/mstile-150x150.png', - 'src/assets/preact-logo-inverse.svg', - 'src/assets/preact-logo.svg', - 'src/components/app.js', - 'src/components/header/index.js', - 'src/components/header/style.css', - 'src/index.js', - 'src/manifest.json', - 'src/routes/home/index.js', - 'src/routes/home/style.css', - 'src/routes/profile/index.js', - 'src/style/index.css', - 'src/sw.js', - 'src/template.html', - 'tests/__mocks__/browserMocks.js', - 'tests/__mocks__/fileMocks.js', - 'tests/__mocks__/setupTests.js', - 'tests/header.test.js', -] - .map(s => s.replace(/\//g, path.sep)) - .sort(); diff --git a/packages/cli/tests/lib/utils.js b/packages/cli/tests/lib/utils.js index 99def9402..e50e8c811 100644 --- a/packages/cli/tests/lib/utils.js +++ b/packages/cli/tests/lib/utils.js @@ -1,43 +1,79 @@ /* eslint-disable no-console */ -const { join, relative, resolve } = require('path'); -const { stat, symlink, readFile, writeFile } = require('fs').promises; +const { join } = require('path'); +const { symlink, readFile } = require('fs').promises; const pRetry = require('p-retry'); const { promisify } = require('util'); -const glob = promisify(require('glob').glob); const LOG = !!process.env.WITH_LOG; const logger = (lvl, msg) => (lvl === 'error' || LOG) && console[lvl](msg); -// `node-glob` ignore pattern buggy? -const ignores = x => !/node_modules|package-lock|yarn.lock/i.test(x); +const snapshotExtensionOrder = [ + { ext: /(? arr.filter(ignores)); -} +/** + * @typedef {Object} Node + * @property {string} path + * @property {string} name + * @property {Node[]} [children] + * @property {number} [size] + */ -async function bytes(str) { - // Sourcemap paths will be different in different environments, - // and therefore not useful to test. This strips them out before - // file size comparisons. - if (/\.map$/.test(str)) { - let fileContent = await readFile(str, 'utf-8'); - fileContent = fileContent.replace(/"sources":[^\]]*]/, ''); - await writeFile(str, fileContent); - } - return (await stat(str)).size; -} +/** + * Generate prettified directory snapshot + * Modified from: https://github.com/developit/microbundle/blob/master/test/index.test.js + * + * @param {Node[]} nodes + * @param {boolean} isBuild + * @param {number} indentLevel + */ +async function snapshotDir(nodes, isBuild = true, indentLevel = 0) { + const indent = ' '.repeat(indentLevel); -async function snapshot(dir) { - let str, - tmp, - out = {}; - for (str of await expand(dir)) { - tmp = relative(dir, str); - out[tmp] = await bytes(str); + if (isBuild) { + // Directories[A->Z], files [A->Z] + [.js -> .js.map -> .esm.js -> esm.js.map -> .css -> .css.map] + // Ensures consistent ordering so that changing hashes don't massacre the diff when updated + nodes.sort((a, b) => { + if (a.children && !b.children) return -1; + + const assetName = ({ name }) => name.match(/([^.]*)/); + const extIndex = ({ name }) => + snapshotExtensionOrder.findIndex(e => e.ext.test(name)); + + if (assetName(a)?.[1] === assetName(b)?.[1]) { + return extIndex(a) - extIndex(b); + } + return a.name < b.name ? -1 : 1; + }); } - return out; + + return ( + await Promise.all( + nodes.map(async node => { + // Sourcemaps paths can differ between environments and are therefore + // not useful to test. Strip before comparing sizes. + if (isBuild && /\.map$/.test(node.name)) { + let fileContent = await readFile(node.path, 'utf-8'); + fileContent = fileContent.replace(/"sources":[^\]]*]/, ''); + node.size = new TextEncoder().encode(fileContent).length; + } + + const isDir = node.children; + return `${indent}${node.name}${ + isBuild && !isDir ? `: ${node.size}` : '' + }\n${ + isDir + ? await snapshotDir(node.children, isBuild, indentLevel + 1) + : `` + }`; + }) + ) + ).join(''); } async function log(fn, msg) { @@ -71,51 +107,8 @@ async function linkPackage(name, cwd) { } catch {} } -expect.extend({ - toFindMatchingKey(key, matchingKey) { - if (matchingKey) { - return { - message: () => `expected '${key}'' not to exist in received keys`, - pass: true, - }; - } - return { - message: () => `expected '${key}' to exist in received keys`, - pass: false, - }; - }, - toBeCloseInSize(key, receivedSize, expectedSize) { - const expectedMin = expectedSize * 0.95; - const expectedMax = expectedSize * 1.05; - - const message = (comparator, val) => - `expected '${key}' to be ${comparator} than ${val}, but it's ${receivedSize}`; - - if (receivedSize < expectedMin) { - return { - message: () => message('greater', expectedMin), - pass: false, - }; - } - - if (receivedSize > expectedMax) { - return { - message: () => message('less', expectedMax), - pass: false, - }; - } - - return { - message: () => '', - pass: true, - }; - }, -}); - module.exports = { - expand, - bytes, - snapshot, + snapshotDir, log, waitUntil, sleep, diff --git a/yarn.lock b/yarn.lock index 7479916e9..3e3bfd1c0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2387,6 +2387,16 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= +array-back@^3.0.1, array-back@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" + integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== + +array-back@^4.0.1, array-back@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" + integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== + array-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" @@ -3593,6 +3603,26 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" +command-line-args@^5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.2.1.tgz#c44c32e437a57d7c51157696893c5909e9cec42e" + integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg== + dependencies: + array-back "^3.1.0" + find-replace "^3.0.0" + lodash.camelcase "^4.3.0" + typical "^4.0.0" + +command-line-usage@^6.1.1: + version "6.1.3" + resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-6.1.3.tgz#428fa5acde6a838779dfa30e44686f4b6761d957" + integrity sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw== + dependencies: + array-back "^4.0.2" + chalk "^2.4.2" + table-layout "^1.0.2" + typical "^5.2.0" + commander@2.17.x: version "2.17.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" @@ -4337,7 +4367,7 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= -deep-extend@^0.6.0: +deep-extend@^0.6.0, deep-extend@~0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== @@ -4514,6 +4544,14 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +directory-tree@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/directory-tree/-/directory-tree-3.5.1.tgz#004d599c2478d752e7906e3a922b09c7ee2f03e2" + integrity sha512-HqjZ49fDzUnKYUhHxVw9eKBqbQ+lL0v4kSBInlDlaktmLtGoV9tC54a6A0ZfYeIrkMHWTE6MwwmUXP477+UEKQ== + dependencies: + command-line-args "^5.2.0" + command-line-usage "^6.1.1" + dns-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" @@ -5470,6 +5508,13 @@ find-npm-prefix@^1.0.2: resolved "https://registry.yarnpkg.com/find-npm-prefix/-/find-npm-prefix-1.0.2.tgz#8d8ce2c78b3b4b9e66c8acc6a37c231eb841cfdf" integrity sha512-KEftzJ+H90x6pcKtdXZEPsQse8/y/UnvzRKrOSQFprnrGaFuJ62fVkP34Iu2IYuMvyauCyoLTNkJZgrrGA2wkA== +find-replace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" + integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ== + dependencies: + array-back "^3.0.1" + find-up@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" @@ -8132,6 +8177,11 @@ lodash._root@~3.0.0: resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" integrity sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI= +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + lodash.clonedeep@^4.5.0, lodash.clonedeep@~4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" @@ -11092,6 +11142,11 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" +reduce-flatten@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" + integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== + regenerate-unicode-properties@^8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" @@ -12541,6 +12596,16 @@ symbol-tree@^3.2.1, symbol-tree@^3.2.2: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== +table-layout@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04" + integrity sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A== + dependencies: + array-back "^4.0.1" + deep-extend "~0.6.0" + typical "^5.2.0" + wordwrapjs "^4.0.0" + table@^6.0.9: version "6.7.1" resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" @@ -12968,6 +13033,16 @@ typescript@~4.6.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.4.tgz#caa78bbc3a59e6a5c510d35703f6a09877ce45e9" integrity sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg== +typical@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" + integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== + +typical@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066" + integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== + uglify-js@3.4.x: version "3.4.10" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.10.tgz#9ad9563d8eb3acdfb8d38597d2af1d815f6a755f" @@ -13674,6 +13749,14 @@ word-wrap@^1.2.3, word-wrap@~1.2.3: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +wordwrapjs@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-4.0.1.tgz#d9790bccfb110a0fc7836b5ebce0937b37a8b98f" + integrity sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA== + dependencies: + reduce-flatten "^2.0.0" + typical "^5.2.0" + workbox-background-sync@6.5.3: version "6.5.3" resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-6.5.3.tgz#7c66c1836aeca6f3762dc48d17a1852a33b3168c" From 64b6fae1ab86d64bec72641535eedca95f96fde4 Mon Sep 17 00:00:00 2001 From: Ryan Christian Date: Sun, 5 Feb 2023 04:01:12 -0600 Subject: [PATCH 2/3] fix: Remove optional chaining for Node v12 --- packages/cli/tests/lib/utils.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/cli/tests/lib/utils.js b/packages/cli/tests/lib/utils.js index e50e8c811..051d8658a 100644 --- a/packages/cli/tests/lib/utils.js +++ b/packages/cli/tests/lib/utils.js @@ -45,7 +45,10 @@ async function snapshotDir(nodes, isBuild = true, indentLevel = 0) { const extIndex = ({ name }) => snapshotExtensionOrder.findIndex(e => e.ext.test(name)); - if (assetName(a)?.[1] === assetName(b)?.[1]) { + const assetNameA = assetName(a); + const assetNameB = assetName(b); + + if (assetNameA && assetNameB && assetNameA[1] === assetNameB[1]) { return extIndex(a) - extIndex(b); } return a.name < b.name ? -1 : 1; From effd025e4910ccd07d41aed90c62d9272458c59d Mon Sep 17 00:00:00 2001 From: Ryan Christian Date: Sun, 5 Feb 2023 04:10:23 -0600 Subject: [PATCH 3/3] ci: Debug --- packages/cli/tests/lib/utils.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/cli/tests/lib/utils.js b/packages/cli/tests/lib/utils.js index 051d8658a..4b718d3cf 100644 --- a/packages/cli/tests/lib/utils.js +++ b/packages/cli/tests/lib/utils.js @@ -66,6 +66,10 @@ async function snapshotDir(nodes, isBuild = true, indentLevel = 0) { node.size = new TextEncoder().encode(fileContent).length; } + if (node.name === 'ssr-bundle.js') { + console.log(await readFile(node.path, 'utf-8')); + } + const isDir = node.children; return `${indent}${node.name}${ isBuild && !isDir ? `: ${node.size}` : ''