"use strict"; const Promise = require("bluebird"); const path = require("path"); const stream = require("../stream"); const createFilePostprocessor = require("../postcss/postprocess"); const loaderShimPath = require("../loader-shim-path"); // NOTE: This stream is inserted directly after the 'dedupe' phase, and *not* before the 'pack' phase like in postcssify-icss, because that would break `extract-css` - which inserts itself before the 'label' phase that comes after the 'dedupe' phase, and by which time all the CSS needs to be prepared. module.exports = function (state) { const isCss = require("../is-css")(state); return function createDedupeBundleCssStream(options) { // TODO: Reuse instance? let processFile = createFilePostprocessor(options); let allCss = ""; let loaderItem; let entryPoint = (options._flags.entries != null) // Get the (absolute!) path of the folder containing the initial entry file, as a reference point for relative paths in the output ? path.dirname(path.resolve(options._flags.entries[0])) // ... or, if no entry file is specified, go off the current working directory : process.cwd() return stream((item) => { // And the same for the loader shim path. All this relative-path stuff is to prevent absolute filesystem URLs from leaking into the output, as those might contain sensitive information. let relativeLoaderPath = path.relative(path.dirname(item.file), loaderShimPath); if (isCss(item)) { return Promise.try(() => { return processFile(item); }).then(({ result, icssExports }) => { allCss += `/* from ${path.relative(entryPoint, item.file)} */\n\n${result.css}\n\n`; if (!item.__icssify__discardable) { return { ... item, source: `require(${JSON.stringify(relativeLoaderPath)}); module.exports = ${JSON.stringify(icssExports)};` }; } }); } else if (item.file === loaderShimPath) { // Stockpile this item, to emit at the very end, right before the browser-pack operation (because by that time, we'll have processed and therefore concatenated all the CSS files) loaderItem = item; return null; } else { return item; } }, () => { if (allCss.length > 0) { if (loaderItem != null) { return { ... loaderItem, source: loaderItem.source.replace('"## CONTENT MARKER ##"', JSON.stringify(allCss)) }; } else { throw new Error("Processed CSS, but global loader was not encountered. This should never happen, please report it as a bug!"); } } }); }; };