From b827c6e16831473675e3e1b3c56e4c886f8a9e2a Mon Sep 17 00:00:00 2001 From: Alexander Akait Date: Fri, 23 Oct 2020 16:46:02 +0300 Subject: [PATCH] refactor: logger (#545) --- package-lock.json | 19 +- package.json | 2 +- src/index.js | 440 ++++++++++++--------- test/CopyPlugin.test.js | 35 +- test/__snapshots__/CopyPlugin.test.js.snap | 136 ++++--- test/from-option.test.js | 13 +- test/globOptions-option.test.js | 10 +- test/toType-option.test.js | 6 +- 8 files changed, 390 insertions(+), 271 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9fb628d4..c7da0393 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11754,9 +11754,9 @@ } }, "terser": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.3.7.tgz", - "integrity": "sha512-lJbKdfxWvjpV330U4PBZStCT9h3N9A4zZVA5Y4k9sCWXknrpdyxi1oMsRKLmQ/YDMDxSBKIh88v0SkdhdqX06w==", + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.3.8.tgz", + "integrity": "sha512-zVotuHoIfnYjtlurOouTazciEfL7V38QMAOhGqpXDEg6yT13cF4+fEP9b0rrCEQTn+tT46uxgFsTZzhygk+CzQ==", "dev": true, "requires": { "commander": "^2.20.0", @@ -12249,8 +12249,9 @@ "dev": true }, "webpack": { - "version": "5.1.3", - "resolved": "github:webpack/webpack#4d0db65e6409bbac90378c8104f0846c9c4e73a6", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.2.0.tgz", + "integrity": "sha512-evtOjOJQq3zaHJIWsJjM4TGtNHtSrNVAIyQ+tdPW/fRd+4PLGbUG6S3xt+N4+QwDBOaCVd0xCWiHd4R6lWO5DQ==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.0", @@ -12259,11 +12260,11 @@ "@webassemblyjs/helper-module-context": "1.9.0", "@webassemblyjs/wasm-edit": "1.9.0", "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^8.0.3", - "browserslist": "^4.14.3", + "acorn": "^8.0.4", + "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.2.0", - "eslint-scope": "^5.1.0", + "enhanced-resolve": "^5.3.0", + "eslint-scope": "^5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.4", diff --git a/package.json b/package.json index f8ebd7a3..1be7be98 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "npm-run-all": "^4.1.5", "prettier": "^2.1.2", "standard-version": "^9.0.0", - "webpack": "^5.1.3" + "webpack": "^5.2.0" }, "keywords": [ "webpack", diff --git a/src/index.js b/src/index.js index 129b69cf..f96140b8 100644 --- a/src/index.js +++ b/src/index.js @@ -87,7 +87,6 @@ class CopyPlugin { }); } - // eslint-disable-next-line class-methods-use-this static async runPattern(compiler, compilation, logger, cache, inputPattern) { const pattern = typeof inputPattern === 'string' @@ -108,7 +107,9 @@ class CopyPlugin { : pattern.compilerContext ); - logger.debug(`processing from "${pattern.from}" to "${pattern.to}"`); + logger.log( + `starting to process a pattern from '${pattern.from}' using '${pattern.context}' context to '${pattern.to}'...` + ); const isToDirectory = path.extname(pattern.to) === '' || pattern.to.slice(-1) === path.sep; @@ -133,9 +134,7 @@ class CopyPlugin { pattern.absoluteFrom = path.resolve(pattern.context, pattern.from); } - logger.debug( - `getting stats for "${pattern.absoluteFrom}" to determinate "fromType"` - ); + logger.debug(`getting stats for '${pattern.absoluteFrom}'...`); const { inputFileSystem } = compiler; @@ -150,8 +149,12 @@ class CopyPlugin { if (stats) { if (stats.isDirectory()) { pattern.fromType = 'dir'; + logger.debug(`determined '${pattern.absoluteFrom}' is a directory`); } else if (stats.isFile()) { pattern.fromType = 'file'; + logger.debug(`determined '${pattern.absoluteFrom}' is a file`); + } else { + logger.debug(`determined '${pattern.absoluteFrom}' is a glob`); } } @@ -176,11 +179,9 @@ class CopyPlugin { switch (pattern.fromType) { case 'dir': - logger.debug(`determined "${pattern.absoluteFrom}" is a directory`); - compilation.contextDependencies.add(pattern.absoluteFrom); - logger.debug(`add "${pattern.absoluteFrom}" as a context dependency`); + logger.debug(`added '${pattern.absoluteFrom}' as a context dependency`); /* eslint-disable no-param-reassign */ pattern.context = pattern.absoluteFrom; @@ -198,11 +199,9 @@ class CopyPlugin { /* eslint-enable no-param-reassign */ break; case 'file': - logger.debug(`determined "${pattern.absoluteFrom}" is a file`); - compilation.fileDependencies.add(pattern.absoluteFrom); - logger.debug(`add "${pattern.absoluteFrom}" as a file dependency`); + logger.debug(`added '${pattern.absoluteFrom}' as a file dependency`); /* eslint-disable no-param-reassign */ pattern.context = path.dirname(pattern.absoluteFrom); @@ -216,15 +215,13 @@ class CopyPlugin { /* eslint-enable no-param-reassign */ break; default: { - logger.debug(`determined "${pattern.absoluteFrom}" is a glob`); - const contextDependencies = path.normalize( globParent(pattern.absoluteFrom) ); compilation.contextDependencies.add(contextDependencies); - logger.debug(`add "${contextDependencies}" as a context dependency`); + logger.debug(`added '${contextDependencies}' as a context dependency`); /* eslint-disable no-param-reassign */ pattern.fromType = 'glob'; @@ -238,9 +235,7 @@ class CopyPlugin { } } - logger.log( - `begin globbing "${pattern.glob}" with a context of "${pattern.context}"` - ); + logger.log(`begin globbing '${pattern.glob}'...`); let paths; @@ -254,14 +249,14 @@ class CopyPlugin { if (paths.length === 0) { if (pattern.noErrorOnMissing) { + logger.log( + `finished to process a pattern from '${pattern.from}' using '${pattern.context}' context to '${pattern.to}'` + ); + return; } - const missingError = new Error( - `unable to locate "${pattern.from}" at "${pattern.absoluteFrom}"` - ); - - logger.error(missingError.message); + const missingError = new Error(`unable to locate '${pattern.glob}' glob`); compilation.errors.push(missingError); @@ -287,6 +282,10 @@ class CopyPlugin { return false; } + if (!isFiltered) { + logger.log(`skip '${item.path}', because it was filtered`); + } + return isFiltered ? item : false; } @@ -296,13 +295,18 @@ class CopyPlugin { ).filter((item) => item); if (filteredPaths.length === 0) { + // TODO should be error in the next major release + logger.log( + `finished to process a pattern from '${pattern.from}' using '${pattern.context}' context to '${pattern.to}'` + ); + return; } const files = filteredPaths.map((item) => { const from = item.path; - logger.debug(`found "${from}"`); + logger.debug(`found '${from}'`); // `globby`/`fast-glob` return the relative path when the path contains special characters on windows const absoluteFilename = path.resolve(pattern.context, from); @@ -318,7 +322,7 @@ class CopyPlugin { filename = path.relative(compiler.options.output.path, filename); } - logger.log(`determined that "${from}" should write to "${filename}"`); + logger.log(`determined that '${from}' should write to '${filename}'`); const sourceFilename = normalizePath( path.relative(pattern.compilerContext, absoluteFilename) @@ -327,210 +331,268 @@ class CopyPlugin { return { absoluteFilename, sourceFilename, filename }; }); - // eslint-disable-next-line consistent-return - return Promise.all( - files.map(async (file) => { - // If this came from a glob, add it to the file watchlist - if (pattern.fromType === 'glob') { - logger.debug(`add ${file.absoluteFilename} as fileDependencies`); + let assets; - compilation.fileDependencies.add(file.absoluteFilename); - } - - let source; - - if (cache) { - let cacheEntry; - - try { - cacheEntry = await cache.getPromise(file.sourceFilename, null); - } catch (error) { - compilation.errors.push(error); - - return; + try { + assets = await Promise.all( + files.map(async (file) => { + const { absoluteFilename, sourceFilename, filename } = file; + const result = { + absoluteFilename, + sourceFilename, + filename, + force: pattern.force, + }; + + // If this came from a glob, add it to the file dependencies + if (pattern.fromType === 'glob') { + compilation.fileDependencies.add(absoluteFilename); + + logger.debug(`added '${absoluteFilename}' as a file dependency`); } - if (cacheEntry) { - let isValidSnapshot; + if (cache) { + let cacheEntry; + + logger.debug(`getting cache for '${absoluteFilename}'...`); try { - isValidSnapshot = await CopyPlugin.checkSnapshotValid( - compilation, - cacheEntry.snapshot - ); + cacheEntry = await cache.getPromise(sourceFilename, null); } catch (error) { compilation.errors.push(error); return; } - if (isValidSnapshot) { - ({ source } = cacheEntry); - } - } - } - - if (!source) { - let startTime; - - if (cache) { - startTime = Date.now(); - } - - logger.debug(`reading "${file.absoluteFilename}" to write to assets`); + if (cacheEntry) { + logger.debug(`found cache for '${absoluteFilename}'...`); - let data; - - try { - data = await readFile(inputFileSystem, file.absoluteFilename); - } catch (error) { - compilation.errors.push(error); + let isValidSnapshot; - return; - } - - if (pattern.transform) { - logger.log(`transforming content for "${file.absoluteFilename}"`); - - if (pattern.cacheTransform) { - const cacheDirectory = pattern.cacheTransform.directory - ? pattern.cacheTransform.directory - : typeof pattern.cacheTransform === 'string' - ? pattern.cacheTransform - : findCacheDir({ name: 'copy-webpack-plugin' }) || os.tmpdir(); - let defaultCacheKeys = { - version, - transform: pattern.transform, - contentHash: crypto - .createHash('md4') - .update(data) - .digest('hex'), - }; - - defaultCacheKeys = - typeof pattern.cacheTransform.keys === 'function' - ? await pattern.cacheTransform.keys( - defaultCacheKeys, - file.absoluteFilename - ) - : { - ...defaultCacheKeys, - ...pattern.cacheTransform.keys, - }; - - const cacheKeys = serialize(defaultCacheKeys); + logger.debug( + `checking snapshot on valid for '${absoluteFilename}'...` + ); try { - const result = await cacache.get(cacheDirectory, cacheKeys); - - logger.debug( - `getting cached transformation for "${file.absoluteFilename}"` + isValidSnapshot = await CopyPlugin.checkSnapshotValid( + compilation, + cacheEntry.snapshot ); + } catch (error) { + compilation.errors.push(error); - ({ data } = result); - } catch (_ignoreError) { - data = await pattern.transform(data, file.absoluteFilename); + return; + } - logger.debug( - `caching transformation for "${file.absoluteFilename}"` - ); + if (isValidSnapshot) { + logger.debug(`snapshot for '${absoluteFilename}' is valid`); - await cacache.put(cacheDirectory, cacheKeys, data); + result.source = cacheEntry.source; + } else { + logger.debug(`snapshot for '${absoluteFilename}' is invalid`); } } else { - data = await pattern.transform(data, file.absoluteFilename); + logger.debug(`missed cache for '${absoluteFilename}'`); } } - source = new RawSource(data); + if (!result.source) { + let startTime; - if (cache) { - let snapshot; + if (cache) { + startTime = Date.now(); + } + + logger.debug(`reading '${absoluteFilename}'...`); + + let data; try { - snapshot = await CopyPlugin.createSnapshot( - compilation, - startTime, - file.sourceFilename - ); + data = await readFile(inputFileSystem, absoluteFilename); } catch (error) { compilation.errors.push(error); return; } - if (snapshot) { + logger.debug(`read '${absoluteFilename}'`); + + if (pattern.transform) { + logger.log(`transforming content for '${absoluteFilename}'...`); + + if (pattern.cacheTransform) { + const cacheDirectory = pattern.cacheTransform.directory + ? pattern.cacheTransform.directory + : typeof pattern.cacheTransform === 'string' + ? pattern.cacheTransform + : findCacheDir({ name: 'copy-webpack-plugin' }) || + os.tmpdir(); + let defaultCacheKeys = { + version, + transform: pattern.transform, + contentHash: crypto + .createHash('md4') + .update(data) + .digest('hex'), + }; + + defaultCacheKeys = + typeof pattern.cacheTransform.keys === 'function' + ? await pattern.cacheTransform.keys( + defaultCacheKeys, + absoluteFilename + ) + : { + ...defaultCacheKeys, + ...pattern.cacheTransform.keys, + }; + + const cacheKeys = serialize(defaultCacheKeys); + + try { + logger.debug( + `getting transformation cache for '${absoluteFilename}'...` + ); + + const cachedResult = await cacache.get( + cacheDirectory, + cacheKeys + ); + + ({ data } = cachedResult); + } catch (_ignoreError) { + logger.debug( + `no transformation cache for '${absoluteFilename}'...` + ); + + data = await pattern.transform(data, absoluteFilename); + + logger.debug( + `caching transformation for '${absoluteFilename}'` + ); + + await cacache.put(cacheDirectory, cacheKeys, data); + + logger.debug( + `cached transformation for '${absoluteFilename}'` + ); + } + } else { + data = await pattern.transform(data, absoluteFilename); + } + } + + result.source = new RawSource(data); + + if (cache) { + let snapshot; + + logger.debug(`creating snapshot for '${absoluteFilename}'...`); + try { - await cache.storePromise(file.sourceFilename, null, { - source, - snapshot, - }); + snapshot = await CopyPlugin.createSnapshot( + compilation, + startTime, + sourceFilename + ); } catch (error) { compilation.errors.push(error); return; } + + if (snapshot) { + logger.debug(`created snapshot for '${absoluteFilename}'`); + logger.debug(`storing cache for '${absoluteFilename}'...`); + + try { + await cache.storePromise(sourceFilename, null, { + source: result.source, + snapshot, + }); + } catch (error) { + compilation.errors.push(error); + + return; + } + + logger.debug(`stored cache for '${absoluteFilename}'`); + } } } - } - if (pattern.toType === 'template') { - logger.log( - `interpolating template "${file.filename}" for "${file.sourceFilename}"` - ); + if (pattern.toType === 'template') { + logger.log( + `interpolating template '${filename}' for '${sourceFilename}'...` + ); + + // If it doesn't have an extension, remove it from the pattern + // ie. [name].[ext] or [name][ext] both become [name] + if (!path.extname(absoluteFilename)) { + // eslint-disable-next-line no-param-reassign + result.filename = result.filename.replace(/\.?\[ext]/g, ''); + } - // If it doesn't have an extension, remove it from the pattern - // ie. [name].[ext] or [name][ext] both become [name] - if (!path.extname(file.absoluteFilename)) { // eslint-disable-next-line no-param-reassign - file.filename = file.filename.replace(/\.?\[ext]/g, ''); - } + result.immutable = /\[(?:([^:\]]+):)?(?:hash|contenthash)(?::([a-z]+\d*))?(?::(\d+))?\]/gi.test( + result.filename + ); - // eslint-disable-next-line no-param-reassign - file.immutable = /\[(?:([^:\]]+):)?(?:hash|contenthash)(?::([a-z]+\d*))?(?::(\d+))?\]/gi.test( - file.filename - ); + // eslint-disable-next-line no-param-reassign + result.filename = loaderUtils.interpolateName( + { resourcePath: absoluteFilename }, + result.filename, + { + content: result.source.source(), + context: pattern.context, + } + ); - // eslint-disable-next-line no-param-reassign - file.filename = loaderUtils.interpolateName( - { resourcePath: file.absoluteFilename }, - file.filename, - { - content: source.source(), - context: pattern.context, - } - ); + // Bug in `loader-utils`, package convert `\\` to `/`, need fix in loader-utils + // eslint-disable-next-line no-param-reassign + result.filename = path.normalize(result.filename); - // Bug in `loader-utils`, package convert `\\` to `/`, need fix in loader-utils - // eslint-disable-next-line no-param-reassign - file.filename = path.normalize(file.filename); - } + logger.log( + `interpolated template '${filename}' for '${sourceFilename}'` + ); + } - if (pattern.transformPath) { - logger.log( - `transforming path "${file.filename}" for "${file.absoluteFilename}"` - ); + if (pattern.transformPath) { + logger.log( + `transforming '${result.filename}' for '${absoluteFilename}'...` + ); + + // eslint-disable-next-line no-param-reassign + result.immutable = false; + // eslint-disable-next-line no-param-reassign + result.filename = await pattern.transformPath( + result.filename, + absoluteFilename + ); + logger.log( + `transformed new '${result.filename}' for '${absoluteFilename}'...` + ); + } // eslint-disable-next-line no-param-reassign - file.immutable = false; - // eslint-disable-next-line no-param-reassign - file.filename = await pattern.transformPath( - file.filename, - file.absoluteFilename - ); - } + result.filename = normalizePath(result.filename); + + // eslint-disable-next-line consistent-return + return result; + }) + ); + } catch (error) { + compilation.errors.push(error); - // eslint-disable-next-line no-param-reassign - file.source = source; - // eslint-disable-next-line no-param-reassign - file.filename = normalizePath(file.filename); - // eslint-disable-next-line no-param-reassign - file.force = pattern.force; + return; + } - // eslint-disable-next-line consistent-return - return file; - }) + logger.log( + `finished to process a pattern from '${pattern.from}' using '${pattern.context}' context to '${pattern.to}'` ); + + // eslint-disable-next-line consistent-return + return assets; } apply(compiler) { @@ -547,7 +609,7 @@ class CopyPlugin { compilation.hooks.additionalAssets.tapAsync( 'copy-webpack-plugin', async (callback) => { - logger.debug('start to adding additional assets'); + logger.log('starting to add additional assets...'); let assets; @@ -574,7 +636,7 @@ class CopyPlugin { } // Avoid writing assets inside `p-limit`, because it creates concurrency. - // It could potentially lead to an error - "Multiple assets emit different content to the same filename" + // It could potentially lead to an error - 'Multiple assets emit different content to the same filename' assets .reduce((acc, val) => acc.concat(val), []) .filter(Boolean) @@ -600,28 +662,34 @@ class CopyPlugin { if (existingAsset) { if (force) { - logger.log( - `force updating "${filename}" to compilation assets from "${absoluteFilename}"` - ); - const info = { copied: true, sourceFilename }; if (asset.immutable) { info.immutable = true; } + logger.log( + `force updating '${filename}' from '${absoluteFilename}' to compilation assets, because it already exists...` + ); + compilation.updateAsset(filename, source, info); + logger.log( + `force updated '${filename}' from '${absoluteFilename}' to compilation assets, because it already exists` + ); + return; } - logger.log(`skipping "${filename}", because it already exists`); + logger.log( + `skip adding '${filename}' from '${absoluteFilename}' to compilation assets, because it already exists` + ); return; } logger.log( - `writing "${filename}" to compilation assets from "${absoluteFilename}"` + `writing '${filename}' from '${absoluteFilename}' to compilation assets...` ); const info = { copied: true, sourceFilename }; @@ -631,9 +699,13 @@ class CopyPlugin { } compilation.emitAsset(filename, source, info); + + logger.log( + `written '${filename}' from '${absoluteFilename}' to compilation assets` + ); }); - logger.debug('end to adding additional assets'); + logger.log('finished to adding additional assets'); callback(); } diff --git a/test/CopyPlugin.test.js b/test/CopyPlugin.test.js index c4876954..d23f2da9 100644 --- a/test/CopyPlugin.test.js +++ b/test/CopyPlugin.test.js @@ -955,11 +955,12 @@ describe('CopyPlugin', () => { assetsInfo.push({ name, info: { - // Workaround for `file-loader` + // TODO Workaround for `file-loader`, remove after update // eslint-disable-next-line no-undefined immutable: info.immutable === false ? undefined : info.immutable, copied: info.copied, - sourceFilename: info.sourceFilename, + // TODO Workaround for `file-loader`, remove after update + // sourceFilename: info.sourceFilename, }, }); } @@ -998,6 +999,16 @@ describe('CopyPlugin', () => { .map((entry) => entry.args[0].replace(/\\/g, '/').split(root).join('.') ) + // TODO remove after drop webpack@4 + .filter( + (item) => + !item.startsWith('created snapshot') && + !item.startsWith('creating snapshot') && + !item.startsWith('getting cache') && + !item.startsWith('missed cache') && + !item.startsWith('stored cache') && + !item.startsWith('storing cache') + ) .sort(); expect( @@ -1031,6 +1042,16 @@ describe('CopyPlugin', () => { .map((entry) => entry.args[0].replace(/\\/g, '/').split(root).join('.') ) + // TODO remove after drop webpack@4 + .filter( + (item) => + !item.startsWith('created snapshot') && + !item.startsWith('creating snapshot') && + !item.startsWith('getting cache') && + !item.startsWith('missed cache') && + !item.startsWith('stored cache') && + !item.startsWith('storing cache') + ) .sort(); expect( @@ -1066,6 +1087,16 @@ describe('CopyPlugin', () => { .map((entry) => entry.args[0].replace(/\\/g, '/').split(root).join('.') ) + // TODO remove after drop webpack@4 + .filter( + (item) => + !item.startsWith('created snapshot') && + !item.startsWith('creating snapshot') && + !item.startsWith('getting cache') && + !item.startsWith('missed cache') && + !item.startsWith('stored cache') && + !item.startsWith('storing cache') + ) .sort(); expect( diff --git a/test/__snapshots__/CopyPlugin.test.js.snap b/test/__snapshots__/CopyPlugin.test.js.snap index 8d655eb0..a13e9ba7 100644 --- a/test/__snapshots__/CopyPlugin.test.js.snap +++ b/test/__snapshots__/CopyPlugin.test.js.snap @@ -143,29 +143,38 @@ exports[`CopyPlugin cache should work with the "memory" cache: warnings 2`] = `A exports[`CopyPlugin logging should logging when "from" is a directory: logs 1`] = ` Object { "logs": Array [ - "add \\"./fixtures/directory\\" as a context dependency", - "begin globbing \\"./fixtures/directory/**/*\\" with a context of \\"./fixtures/directory\\"", - "determined \\"./fixtures/directory\\" is a directory", - "determined that \\"./fixtures/directory/.dottedfile\\" should write to \\".dottedfile\\"", - "determined that \\"./fixtures/directory/directoryfile.txt\\" should write to \\"directoryfile.txt\\"", - "determined that \\"./fixtures/directory/nested/deep-nested/deepnested.txt\\" should write to \\"nested/deep-nested/deepnested.txt\\"", - "determined that \\"./fixtures/directory/nested/nestedfile.txt\\" should write to \\"nested/nestedfile.txt\\"", - "end to adding additional assets", - "found \\"./fixtures/directory/.dottedfile\\"", - "found \\"./fixtures/directory/directoryfile.txt\\"", - "found \\"./fixtures/directory/nested/deep-nested/deepnested.txt\\"", - "found \\"./fixtures/directory/nested/nestedfile.txt\\"", - "getting stats for \\"./fixtures/directory\\" to determinate \\"fromType\\"", - "processing from \\"directory\\" to \\".\\"", - "reading \\"./fixtures/directory/.dottedfile\\" to write to assets", - "reading \\"./fixtures/directory/directoryfile.txt\\" to write to assets", - "reading \\"./fixtures/directory/nested/deep-nested/deepnested.txt\\" to write to assets", - "reading \\"./fixtures/directory/nested/nestedfile.txt\\" to write to assets", - "start to adding additional assets", - "writing \\".dottedfile\\" to compilation assets from \\"./fixtures/directory/.dottedfile\\"", - "writing \\"directoryfile.txt\\" to compilation assets from \\"./fixtures/directory/directoryfile.txt\\"", - "writing \\"nested/deep-nested/deepnested.txt\\" to compilation assets from \\"./fixtures/directory/nested/deep-nested/deepnested.txt\\"", - "writing \\"nested/nestedfile.txt\\" to compilation assets from \\"./fixtures/directory/nested/nestedfile.txt\\"", + "added './fixtures/directory' as a context dependency", + "begin globbing './fixtures/directory/**/*'...", + "determined './fixtures/directory' is a directory", + "determined that './fixtures/directory/.dottedfile' should write to '.dottedfile'", + "determined that './fixtures/directory/directoryfile.txt' should write to 'directoryfile.txt'", + "determined that './fixtures/directory/nested/deep-nested/deepnested.txt' should write to 'nested/deep-nested/deepnested.txt'", + "determined that './fixtures/directory/nested/nestedfile.txt' should write to 'nested/nestedfile.txt'", + "finished to adding additional assets", + "finished to process a pattern from 'directory' using './fixtures/directory' context to '.'", + "found './fixtures/directory/.dottedfile'", + "found './fixtures/directory/directoryfile.txt'", + "found './fixtures/directory/nested/deep-nested/deepnested.txt'", + "found './fixtures/directory/nested/nestedfile.txt'", + "getting stats for './fixtures/directory'...", + "read './fixtures/directory/.dottedfile'", + "read './fixtures/directory/directoryfile.txt'", + "read './fixtures/directory/nested/deep-nested/deepnested.txt'", + "read './fixtures/directory/nested/nestedfile.txt'", + "reading './fixtures/directory/.dottedfile'...", + "reading './fixtures/directory/directoryfile.txt'...", + "reading './fixtures/directory/nested/deep-nested/deepnested.txt'...", + "reading './fixtures/directory/nested/nestedfile.txt'...", + "starting to add additional assets...", + "starting to process a pattern from 'directory' using './fixtures' context to '.'...", + "writing '.dottedfile' from './fixtures/directory/.dottedfile' to compilation assets...", + "writing 'directoryfile.txt' from './fixtures/directory/directoryfile.txt' to compilation assets...", + "writing 'nested/deep-nested/deepnested.txt' from './fixtures/directory/nested/deep-nested/deepnested.txt' to compilation assets...", + "writing 'nested/nestedfile.txt' from './fixtures/directory/nested/nestedfile.txt' to compilation assets...", + "written '.dottedfile' from './fixtures/directory/.dottedfile' to compilation assets", + "written 'directoryfile.txt' from './fixtures/directory/directoryfile.txt' to compilation assets", + "written 'nested/deep-nested/deepnested.txt' from './fixtures/directory/nested/deep-nested/deepnested.txt' to compilation assets", + "written 'nested/nestedfile.txt' from './fixtures/directory/nested/nestedfile.txt' to compilation assets", ], } `; @@ -173,17 +182,20 @@ Object { exports[`CopyPlugin logging should logging when "from" is a file: logs 1`] = ` Object { "logs": Array [ - "add \\"./fixtures/file.txt\\" as a file dependency", - "begin globbing \\"./fixtures/file.txt\\" with a context of \\"./fixtures\\"", - "determined \\"./fixtures/file.txt\\" is a file", - "determined that \\"./fixtures/file.txt\\" should write to \\"file.txt\\"", - "end to adding additional assets", - "found \\"./fixtures/file.txt\\"", - "getting stats for \\"./fixtures/file.txt\\" to determinate \\"fromType\\"", - "processing from \\"file.txt\\" to \\".\\"", - "reading \\"./fixtures/file.txt\\" to write to assets", - "start to adding additional assets", - "writing \\"file.txt\\" to compilation assets from \\"./fixtures/file.txt\\"", + "added './fixtures/file.txt' as a file dependency", + "begin globbing './fixtures/file.txt'...", + "determined './fixtures/file.txt' is a file", + "determined that './fixtures/file.txt' should write to 'file.txt'", + "finished to adding additional assets", + "finished to process a pattern from 'file.txt' using './fixtures' context to '.'", + "found './fixtures/file.txt'", + "getting stats for './fixtures/file.txt'...", + "read './fixtures/file.txt'", + "reading './fixtures/file.txt'...", + "starting to add additional assets...", + "starting to process a pattern from 'file.txt' using './fixtures' context to '.'...", + "writing 'file.txt' from './fixtures/file.txt' to compilation assets...", + "written 'file.txt' from './fixtures/file.txt' to compilation assets", ], } `; @@ -191,28 +203,34 @@ Object { exports[`CopyPlugin logging should logging when "from" is a glob: logs 1`] = ` Object { "logs": Array [ - "add \\"./fixtures/directory\\" as a context dependency", - "add ./fixtures/directory/directoryfile.txt as fileDependencies", - "add ./fixtures/directory/nested/deep-nested/deepnested.txt as fileDependencies", - "add ./fixtures/directory/nested/nestedfile.txt as fileDependencies", - "begin globbing \\"./fixtures/directory/**\\" with a context of \\"./fixtures\\"", - "determined \\"./fixtures/directory/**\\" is a glob", - "determined that \\"./fixtures/directory/directoryfile.txt\\" should write to \\"directory/directoryfile.txt\\"", - "determined that \\"./fixtures/directory/nested/deep-nested/deepnested.txt\\" should write to \\"directory/nested/deep-nested/deepnested.txt\\"", - "determined that \\"./fixtures/directory/nested/nestedfile.txt\\" should write to \\"directory/nested/nestedfile.txt\\"", - "end to adding additional assets", - "found \\"./fixtures/directory/directoryfile.txt\\"", - "found \\"./fixtures/directory/nested/deep-nested/deepnested.txt\\"", - "found \\"./fixtures/directory/nested/nestedfile.txt\\"", - "getting stats for \\"./fixtures/directory/**\\" to determinate \\"fromType\\"", - "processing from \\"directory/**\\" to \\".\\"", - "reading \\"./fixtures/directory/directoryfile.txt\\" to write to assets", - "reading \\"./fixtures/directory/nested/deep-nested/deepnested.txt\\" to write to assets", - "reading \\"./fixtures/directory/nested/nestedfile.txt\\" to write to assets", - "start to adding additional assets", - "writing \\"directory/directoryfile.txt\\" to compilation assets from \\"./fixtures/directory/directoryfile.txt\\"", - "writing \\"directory/nested/deep-nested/deepnested.txt\\" to compilation assets from \\"./fixtures/directory/nested/deep-nested/deepnested.txt\\"", - "writing \\"directory/nested/nestedfile.txt\\" to compilation assets from \\"./fixtures/directory/nested/nestedfile.txt\\"", + "added './fixtures/directory' as a context dependency", + "added './fixtures/directory/directoryfile.txt' as a file dependency", + "added './fixtures/directory/nested/deep-nested/deepnested.txt' as a file dependency", + "added './fixtures/directory/nested/nestedfile.txt' as a file dependency", + "begin globbing './fixtures/directory/**'...", + "determined that './fixtures/directory/directoryfile.txt' should write to 'directory/directoryfile.txt'", + "determined that './fixtures/directory/nested/deep-nested/deepnested.txt' should write to 'directory/nested/deep-nested/deepnested.txt'", + "determined that './fixtures/directory/nested/nestedfile.txt' should write to 'directory/nested/nestedfile.txt'", + "finished to adding additional assets", + "finished to process a pattern from 'directory/**' using './fixtures' context to '.'", + "found './fixtures/directory/directoryfile.txt'", + "found './fixtures/directory/nested/deep-nested/deepnested.txt'", + "found './fixtures/directory/nested/nestedfile.txt'", + "getting stats for './fixtures/directory/**'...", + "read './fixtures/directory/directoryfile.txt'", + "read './fixtures/directory/nested/deep-nested/deepnested.txt'", + "read './fixtures/directory/nested/nestedfile.txt'", + "reading './fixtures/directory/directoryfile.txt'...", + "reading './fixtures/directory/nested/deep-nested/deepnested.txt'...", + "reading './fixtures/directory/nested/nestedfile.txt'...", + "starting to add additional assets...", + "starting to process a pattern from 'directory/**' using './fixtures' context to '.'...", + "writing 'directory/directoryfile.txt' from './fixtures/directory/directoryfile.txt' to compilation assets...", + "writing 'directory/nested/deep-nested/deepnested.txt' from './fixtures/directory/nested/deep-nested/deepnested.txt' to compilation assets...", + "writing 'directory/nested/nestedfile.txt' from './fixtures/directory/nested/nestedfile.txt' to compilation assets...", + "written 'directory/directoryfile.txt' from './fixtures/directory/directoryfile.txt' to compilation assets", + "written 'directory/nested/deep-nested/deepnested.txt' from './fixtures/directory/nested/deep-nested/deepnested.txt' to compilation assets", + "written 'directory/nested/nestedfile.txt' from './fixtures/directory/nested/nestedfile.txt' to compilation assets", ], } `; @@ -234,7 +252,6 @@ Array [ "info": Object { "copied": true, "immutable": undefined, - "sourceFilename": "directory/.dottedfile", }, "name": ".dottedfile", }, @@ -242,7 +259,6 @@ Array [ "info": Object { "copied": undefined, "immutable": undefined, - "sourceFilename": undefined, }, "name": "asset-modules/deepnested.txt", }, @@ -250,7 +266,6 @@ Array [ "info": Object { "copied": true, "immutable": undefined, - "sourceFilename": "directory/directoryfile.txt", }, "name": "directoryfile.txt", }, @@ -258,7 +273,6 @@ Array [ "info": Object { "copied": undefined, "immutable": undefined, - "sourceFilename": undefined, }, "name": "main.js", }, @@ -266,7 +280,6 @@ Array [ "info": Object { "copied": true, "immutable": undefined, - "sourceFilename": "directory/nested/deep-nested/deepnested.txt", }, "name": "nested/deep-nested/deepnested.txt", }, @@ -274,7 +287,6 @@ Array [ "info": Object { "copied": true, "immutable": undefined, - "sourceFilename": "directory/nested/nestedfile.txt", }, "name": "nested/nestedfile.txt", }, diff --git a/test/from-option.test.js b/test/from-option.test.js index 2762f997..e3eec351 100644 --- a/test/from-option.test.js +++ b/test/from-option.test.js @@ -2,7 +2,6 @@ import path from 'path'; import { runEmit } from './helpers/run'; -const FIXTURES_DIR = path.join(__dirname, 'fixtures'); const FIXTURES_DIR_NORMALIZED = path .join(__dirname, 'fixtures') .replace(/\\/g, '/'); @@ -71,7 +70,7 @@ describe('from option', () => { process.platform === 'win32' ? [ new Error( - `unable to locate "symlink${path.sep}file-ln.txt" at "${FIXTURES_DIR}${path.sep}symlink${path.sep}file-ln.txt"` + `unable to locate '${FIXTURES_DIR_NORMALIZED}/symlink/file-ln.txt' glob` ), ] : [], @@ -91,7 +90,7 @@ describe('from option', () => { expectedAssetKeys: [], expectedErrors: [ new Error( - `unable to locate "nonexistent.txt" at "${FIXTURES_DIR}${path.sep}nonexistent.txt"` + `unable to locate '${FIXTURES_DIR_NORMALIZED}/nonexistent.txt' glob` ), ], patterns: [ @@ -210,7 +209,7 @@ describe('from option', () => { process.platform === 'win32' ? [ new Error( - `unable to locate "symlink${path.sep}directory-ln" at "${FIXTURES_DIR}${path.sep}symlink${path.sep}directory-ln\\**\\*"` + `unable to locate '${FIXTURES_DIR_NORMALIZED}/symlink/directory-ln/**/*' glob` ), ] : [], @@ -295,7 +294,7 @@ describe('from option', () => { expectedAssetKeys: [], expectedErrors: [ new Error( - `unable to locate "nonexistent" at "${FIXTURES_DIR}${path.sep}nonexistent"` + `unable to locate '${FIXTURES_DIR_NORMALIZED}/nonexistent' glob` ), ], patterns: [ @@ -475,7 +474,7 @@ describe('from option', () => { process.platform === 'win32' ? [ new Error( - `unable to locate "symlink\\**\\*.txt" at "${FIXTURES_DIR}${path.sep}symlink\\**\\*.txt"` + `unable to locate '${FIXTURES_DIR_NORMALIZED}/symlink/**/*.txt' glob` ), ] : [], @@ -505,7 +504,7 @@ describe('from option', () => { expectedAssetKeys: [], expectedErrors: [ new Error( - `unable to locate "nonexistent${path.sep}**${path.sep}*" at "${FIXTURES_DIR}${path.sep}nonexistent${path.sep}**${path.sep}*"` + `unable to locate '${FIXTURES_DIR_NORMALIZED}/nonexistent/**/*' glob` ), ], patterns: [ diff --git a/test/globOptions-option.test.js b/test/globOptions-option.test.js index 7eab8b45..c32052e5 100644 --- a/test/globOptions-option.test.js +++ b/test/globOptions-option.test.js @@ -2,7 +2,9 @@ import path from 'path'; import { runEmit } from './helpers/run'; -const FIXTURES_DIR = path.join(__dirname, 'fixtures'); +const FIXTURES_DIR_NORMALIZED = path + .join(__dirname, 'fixtures') + .replace(/\\/g, '/'); describe('globOptions option', () => { // Expected behavior from `globby`/`fast-glob` @@ -78,7 +80,7 @@ describe('globOptions option', () => { runEmit({ expectedErrors: [ new Error( - `unable to locate "file.txt" at "${FIXTURES_DIR}${path.sep}file.txt"` + `unable to locate '${FIXTURES_DIR_NORMALIZED}/file.txt' glob` ), ], patterns: [ @@ -255,7 +257,7 @@ describe('globOptions option', () => { runEmit({ expectedErrors: [ new Error( - `unable to locate "directory" at "${FIXTURES_DIR}${path.sep}directory${path.sep}**${path.sep}*"` + `unable to locate '${FIXTURES_DIR_NORMALIZED}/directory/**/*' glob` ), ], patterns: [ @@ -275,7 +277,7 @@ describe('globOptions option', () => { runEmit({ expectedErrors: [ new Error( - `unable to locate "file.txt" at "${FIXTURES_DIR}${path.sep}file.txt"` + `unable to locate '${FIXTURES_DIR_NORMALIZED}/file.txt' glob` ), ], patterns: [ diff --git a/test/toType-option.test.js b/test/toType-option.test.js index bcef65fa..a3d567d0 100644 --- a/test/toType-option.test.js +++ b/test/toType-option.test.js @@ -2,7 +2,9 @@ import path from 'path'; import { runEmit } from './helpers/run'; -const FIXTURES_DIR = path.join(__dirname, 'fixtures'); +const FIXTURES_DIR_NORMALIZED = path + .join(__dirname, 'fixtures') + .replace(/\\/g, '/'); describe('toType option', () => { it('should move a file to a new file', (done) => { @@ -88,7 +90,7 @@ describe('toType option', () => { expectedAssetKeys: [], expectedErrors: [ new Error( - `unable to locate "nonexistent.txt" at "${FIXTURES_DIR}${path.sep}nonexistent.txt"` + `unable to locate '${FIXTURES_DIR_NORMALIZED}/nonexistent.txt' glob` ), ], patterns: [