diff --git a/src/utils.js b/src/utils.js index 0d9d5a20..887d3b24 100644 --- a/src/utils.js +++ b/src/utils.js @@ -317,25 +317,14 @@ function defaultGetLocalIdent( localName, options ) { - let relativeMatchResource = ""; - const { context, hashSalt } = options; const { resourcePath } = loaderContext; - - // eslint-disable-next-line no-underscore-dangle - if (loaderContext._module && loaderContext._module.matchResource) { - relativeMatchResource = `${normalizePath( - // eslint-disable-next-line no-underscore-dangle - path.relative(context, loaderContext._module.matchResource) - )}\x00`; - } - const relativeResourcePath = normalizePath( path.relative(context, resourcePath) ); // eslint-disable-next-line no-param-reassign - options.content = `${relativeMatchResource}${relativeResourcePath}\x00${localName}`; + options.content = `${relativeResourcePath}\x00${localName}`; let { hashFunction, hashDigest, hashDigestLength } = options; const matches = localIdentName.match( @@ -360,6 +349,7 @@ function defaultGetLocalIdent( } let localIdentHash = ""; + for (let tier = 0; localIdentHash.length < hashDigestLength; tier++) { // eslint-disable-next-line no-underscore-dangle const hash = loaderContext._compiler.webpack.util.createHash(hashFunction); @@ -369,9 +359,10 @@ function defaultGetLocalIdent( } const tierSalt = Buffer.allocUnsafe(4); + tierSalt.writeUInt32LE(tier); - hash.update(tierSalt); + hash.update(tierSalt); hash.update(options.content); localIdentHash = (localIdentHash + hash.digest(hashDigest)) diff --git a/test/__snapshots__/loader.test.js.snap b/test/__snapshots__/loader.test.js.snap index 9978085f..92ca8190 100644 --- a/test/__snapshots__/loader.test.js.snap +++ b/test/__snapshots__/loader.test.js.snap @@ -849,66 +849,66 @@ exports[`loader should work with inline module syntax: result 1`] = ` Array [ Array [ "other.modules.css!=!../../src/index.js??ruleSet[1].rules[0].rules[0]!../../node_modules/sass-loader/dist/cjs.js!./index-loader-syntax.modules.css", - ".cvQZFnfbeskbGiTlpe_P { + ".L34UCpsDMDUf5cci5FTp { color: red; } -.IB7LbbTxdNwrVPxtK0wC { +.cR0dzE36E911coHAsfAF { color: white; }", "", ], Array [ "button.modules.css!=!./index-loader-syntax-sass.css", - ".rZ5eCb_mQRy7Svv7Z30B { + ".Bm6FV6LbXUxAkIaBjl7y { width: 5px; }", "", ], Array [ "other.modules.scss!=!../../src/index.js??ruleSet[1].rules[0].rules[0]!../../node_modules/sass-loader/dist/cjs.js!./index-loader-syntax-sass.modules.css", - ".jLbxv4bqH2U20AlFuk92 > .ob3rZ9N1zVzUcOOazzYy { + ".JkECLtXaeLgZptjLMVOV > .cg9Qb_Gz48g_sQh4Pjap { color: red; }", "", ], Array [ "other.modules.css!=!../../src/index.js??ruleSet[1].rules[0].rules[0]!../../node_modules/sass-loader/dist/cjs.js!./my-inline-loader/index.js!./index-loader-syntax.modules.css", - ".cvQZFnfbeskbGiTlpe_P { + ".L34UCpsDMDUf5cci5FTp { color: red; } -.IB7LbbTxdNwrVPxtK0wC { +.cR0dzE36E911coHAsfAF { color: white; } -.x0ncp2H8kJ59binDkEa9 { +.BBGEY4nuDapXZ5Z5Llcd { from: custom; }", "", ], Array [ "other.modules.css!=!../../src/index.js??ruleSet[1].rules[0].rules[0]!../../node_modules/sass-loader/dist/cjs.js!./my-inline-loader/index.js!./index-loader-syntax.modules.css", - ".cvQZFnfbeskbGiTlpe_P { + ".L34UCpsDMDUf5cci5FTp { color: red; } -.IB7LbbTxdNwrVPxtK0wC { +.cR0dzE36E911coHAsfAF { color: white; } -.x0ncp2H8kJ59binDkEa9 { +.BBGEY4nuDapXZ5Z5Llcd { from: custom; }", "", ], Array [ "other.modules.scss!=!../../src/index.js??ruleSet[1].rules[0].rules[0]!../../node_modules/sass-loader/dist/cjs.js!./my-inline-loader/index.js!./index-loader-syntax-sass.modules.css", - ".jLbxv4bqH2U20AlFuk92 > .ob3rZ9N1zVzUcOOazzYy { + ".JkECLtXaeLgZptjLMVOV > .cg9Qb_Gz48g_sQh4Pjap { color: red; } -.yx69bmS9wijyDV84NXI9 { +.WJ9UGZwK6YvLQsxARKO1 { from: custom; }", "", @@ -922,21 +922,21 @@ Array [ ], Array [ "button.modules.css!=!./index-loader-syntax-sass.css", - ".rZ5eCb_mQRy7Svv7Z30B { + ".Bm6FV6LbXUxAkIaBjl7y { width: 5px; }", "", ], Array [ "button.module.scss!=!./base64-loader/index.js?LmZvbyB7IGNvbG9yOiByZWQ7IH0=!./simple.js?foo=bar", - ".y2EgZjTXV61h0Dgjp49t { + ".nQ7qpE_fxjuYDsViKqtM { color: red; }", "", ], Array [ "other.module.scss!=!./base64-loader/index.js?LmZvbyB7IGNvbG9yOiByZWQ7IH0=!./simple.js?foo=baz", - ".PTgI00lRDqe1Y8cb5zcw { + ".nQ7qpE_fxjuYDsViKqtM { color: red; }", "", diff --git a/test/__snapshots__/modules-option.test.js.snap b/test/__snapshots__/modules-option.test.js.snap index dcd1d6a5..b0e71bf6 100644 --- a/test/__snapshots__/modules-option.test.js.snap +++ b/test/__snapshots__/modules-option.test.js.snap @@ -1979,6 +1979,177 @@ Array [ exports[`"modules" option should work and correctly replace escaped symbols: warnings 1`] = `Array []`; +exports[`"modules" option should work and generate the same classes for client and server: client errors 1`] = `Array []`; + +exports[`"modules" option should work and generate the same classes for client and server: client module 1`] = ` +"// extracted by mini-css-extract-plugin +export default {\\"123\\":\\"oqRGsO4UR7_DWiqWXJMz\\",\\"test\\":\\"KuIShlgsYfxvLoLHT1mu\\",\\"_test\\":\\"Lb3fhDAuJv4v7BXOPttP\\",\\"className\\":\\"LdhpkZRWyKT7zDwJ0lt8\\",\\"someId\\":\\"b0rhwJStMR3eH63oapwW\\",\\"subClass\\":\\"Mw9j4nIdjx1xCGDt7d6a\\",\\"-a0-34a___f\\":\\"DdFWMPoluIgmQirKzoS6\\",\\"m_x_@\\":\\"OdAmghrme3xnUYOdzoDw\\",\\"B&W?\\":\\"h4SEF34CLwChRsak1742\\",\\":\`(\\":\\"fKJQkLarfQOel4wwbIrn\\",\\"1a2b3c\\":\\"YR1u_buYf6paLzzUM6Vc\\",\\"#fake-id\\":\\"AqiAGSfnwaXj3eqg0Om8\\",\\"-a-b-c-\\":\\"CwXv27VMwyQqKBvNNaFr\\",\\"©\\":\\"jBj0sZiWBysiwRyGu_go\\",\\"♥\\":\\"vJl9A9Ds21oujVsd5UD2\\",\\"“‘’”\\":\\"GM0Y0nFCPtkVMz6Esfno\\",\\"☺☃\\":\\"NKrBw7EAqPT7Cgn7JzrA\\",\\"⌘⌥\\":\\"edHWpSne18gmGmfN6SV6\\",\\"𝄞♪♩♫♬\\":\\"QyMp9YMEoYUmEHEdpRal\\",\\"💩\\":\\"B82YxwgREHbKn8IpgaWw\\",\\"?\\":\\"ndmpvNNltJXbDVvqKuxt\\",\\"@\\":\\"v3gq0wPogd6ZPfq_pfyZ\\",\\".\\":\\"zd5uIZq6KrAWTwBjwZdC\\",\\":)\\":\\"ZiZnRjRT03NgoqVQwkGO\\",\\"

\\":\\"TdAx2ZSkw7Hbktc7KR72\\",\\"<><<<>><>\\":\\"ozNsTIG0LL2gSQdL5dzv\\",\\"++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.\\":\\"ByKoYcSrMT2cN3V2iAgZ\\",\\"#\\":\\"HkwIsjW5i7WNAxVRd5cg\\",\\"##\\":\\"IJc6Xl4ZKVZvSoeIuI2Q\\",\\"#.#.#\\":\\"BnPpnJmPeNr51pj2ZTlf\\",\\"_\\":\\"bCwkZEDuxDAOhKnMdLVF\\",\\"{}\\":\\"IZkBfE9iUPen76w2bB_q\\",\\"foo.bar\\":\\"uajo7mHzD_tTqOXqaqdg\\",\\":hover\\":\\"HVudUNXnLNQoCLpVn82S\\",\\":hover:focus:active\\":\\"ZlaaXvHLUsJOCFzItB_1\\",\\"[attr=value]\\":\\"PWvC4jVM5SwUmKmw2tfW\\",\\"f/o/o\\":\\"A5l5sDODF4CQBW_PtlQD\\",\\"f\\\\\\\\o\\\\\\\\o\\":\\"DFfh4KyqOODVQsTPb3wt\\",\\"f*o*o\\":\\"gv1E2n_bVvy0iT8TaHIv\\",\\"f!o!o\\":\\"_aIyR9ETAs8ipXmRrrDO\\",\\"f'o'o\\":\\"HSXNnSjt1QaHBHUb_UIs\\",\\"f~o~o\\":\\"MrVzSIcSXyoDsr5G0K5_\\",\\"f+o+o\\":\\"EvMHRmCudyKg3GpLjAfj\\",\\"foo/bar\\":\\"hei2uQgDeX2YNkppCHp9\\",\\"foo\\\\\\\\bar\\":\\"IgSzmmsCqiJBl4SibwgR\\",\\"foo/bar/baz\\":\\"p6KJMhNWwmCU2bXHJB93\\",\\"foo\\\\\\\\bar\\\\\\\\baz\\":\\"HZerWgmU0ffpPzySVi_g\\"};" +`; + +exports[`"modules" option should work and generate the same classes for client and server: client result 1`] = ` +Object { + "#": "HkwIsjW5i7WNAxVRd5cg", + "##": "IJc6Xl4ZKVZvSoeIuI2Q", + "#.#.#": "BnPpnJmPeNr51pj2ZTlf", + "#fake-id": "AqiAGSfnwaXj3eqg0Om8", + "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.": "ByKoYcSrMT2cN3V2iAgZ", + "-a-b-c-": "CwXv27VMwyQqKBvNNaFr", + "-a0-34a___f": "DdFWMPoluIgmQirKzoS6", + ".": "zd5uIZq6KrAWTwBjwZdC", + "123": "oqRGsO4UR7_DWiqWXJMz", + "1a2b3c": "YR1u_buYf6paLzzUM6Vc", + ":)": "ZiZnRjRT03NgoqVQwkGO", + ":\`(": "fKJQkLarfQOel4wwbIrn", + ":hover": "HVudUNXnLNQoCLpVn82S", + ":hover:focus:active": "ZlaaXvHLUsJOCFzItB_1", + "<><<<>><>": "ozNsTIG0LL2gSQdL5dzv", + "

": "TdAx2ZSkw7Hbktc7KR72", + "?": "ndmpvNNltJXbDVvqKuxt", + "@": "v3gq0wPogd6ZPfq_pfyZ", + "B&W?": "h4SEF34CLwChRsak1742", + "[attr=value]": "PWvC4jVM5SwUmKmw2tfW", + "_": "bCwkZEDuxDAOhKnMdLVF", + "_test": "Lb3fhDAuJv4v7BXOPttP", + "className": "LdhpkZRWyKT7zDwJ0lt8", + "f!o!o": "_aIyR9ETAs8ipXmRrrDO", + "f'o'o": "HSXNnSjt1QaHBHUb_UIs", + "f*o*o": "gv1E2n_bVvy0iT8TaHIv", + "f+o+o": "EvMHRmCudyKg3GpLjAfj", + "f/o/o": "A5l5sDODF4CQBW_PtlQD", + "f\\\\o\\\\o": "DFfh4KyqOODVQsTPb3wt", + "foo.bar": "uajo7mHzD_tTqOXqaqdg", + "foo/bar": "hei2uQgDeX2YNkppCHp9", + "foo/bar/baz": "p6KJMhNWwmCU2bXHJB93", + "foo\\\\bar": "IgSzmmsCqiJBl4SibwgR", + "foo\\\\bar\\\\baz": "HZerWgmU0ffpPzySVi_g", + "f~o~o": "MrVzSIcSXyoDsr5G0K5_", + "m_x_@": "OdAmghrme3xnUYOdzoDw", + "someId": "b0rhwJStMR3eH63oapwW", + "subClass": "Mw9j4nIdjx1xCGDt7d6a", + "test": "KuIShlgsYfxvLoLHT1mu", + "{}": "IZkBfE9iUPen76w2bB_q", + "©": "jBj0sZiWBysiwRyGu_go", + "“‘’”": "GM0Y0nFCPtkVMz6Esfno", + "⌘⌥": "edHWpSne18gmGmfN6SV6", + "☺☃": "NKrBw7EAqPT7Cgn7JzrA", + "♥": "vJl9A9Ds21oujVsd5UD2", + "𝄞♪♩♫♬": "QyMp9YMEoYUmEHEdpRal", + "💩": "B82YxwgREHbKn8IpgaWw", +} +`; + +exports[`"modules" option should work and generate the same classes for client and server: client warnings 1`] = `Array []`; + +exports[`"modules" option should work and generate the same classes for client and server: server errors 1`] = `Array []`; + +exports[`"modules" option should work and generate the same classes for client and server: server module 1`] = ` +"// Exports +export default { + \\"123\\": \\"oqRGsO4UR7_DWiqWXJMz\\", + \\"test\\": \\"KuIShlgsYfxvLoLHT1mu\\", + \\"_test\\": \\"Lb3fhDAuJv4v7BXOPttP\\", + \\"className\\": \\"LdhpkZRWyKT7zDwJ0lt8\\", + \\"someId\\": \\"b0rhwJStMR3eH63oapwW\\", + \\"subClass\\": \\"Mw9j4nIdjx1xCGDt7d6a\\", + \\"-a0-34a___f\\": \\"DdFWMPoluIgmQirKzoS6\\", + \\"m_x_@\\": \\"OdAmghrme3xnUYOdzoDw\\", + \\"B&W?\\": \\"h4SEF34CLwChRsak1742\\", + \\":\`(\\": \\"fKJQkLarfQOel4wwbIrn\\", + \\"1a2b3c\\": \\"YR1u_buYf6paLzzUM6Vc\\", + \\"#fake-id\\": \\"AqiAGSfnwaXj3eqg0Om8\\", + \\"-a-b-c-\\": \\"CwXv27VMwyQqKBvNNaFr\\", + \\"©\\": \\"jBj0sZiWBysiwRyGu_go\\", + \\"♥\\": \\"vJl9A9Ds21oujVsd5UD2\\", + \\"“‘’”\\": \\"GM0Y0nFCPtkVMz6Esfno\\", + \\"☺☃\\": \\"NKrBw7EAqPT7Cgn7JzrA\\", + \\"⌘⌥\\": \\"edHWpSne18gmGmfN6SV6\\", + \\"𝄞♪♩♫♬\\": \\"QyMp9YMEoYUmEHEdpRal\\", + \\"💩\\": \\"B82YxwgREHbKn8IpgaWw\\", + \\"?\\": \\"ndmpvNNltJXbDVvqKuxt\\", + \\"@\\": \\"v3gq0wPogd6ZPfq_pfyZ\\", + \\".\\": \\"zd5uIZq6KrAWTwBjwZdC\\", + \\":)\\": \\"ZiZnRjRT03NgoqVQwkGO\\", + \\"

\\": \\"TdAx2ZSkw7Hbktc7KR72\\", + \\"<><<<>><>\\": \\"ozNsTIG0LL2gSQdL5dzv\\", + \\"++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.\\": \\"ByKoYcSrMT2cN3V2iAgZ\\", + \\"#\\": \\"HkwIsjW5i7WNAxVRd5cg\\", + \\"##\\": \\"IJc6Xl4ZKVZvSoeIuI2Q\\", + \\"#.#.#\\": \\"BnPpnJmPeNr51pj2ZTlf\\", + \\"_\\": \\"bCwkZEDuxDAOhKnMdLVF\\", + \\"{}\\": \\"IZkBfE9iUPen76w2bB_q\\", + \\"foo.bar\\": \\"uajo7mHzD_tTqOXqaqdg\\", + \\":hover\\": \\"HVudUNXnLNQoCLpVn82S\\", + \\":hover:focus:active\\": \\"ZlaaXvHLUsJOCFzItB_1\\", + \\"[attr=value]\\": \\"PWvC4jVM5SwUmKmw2tfW\\", + \\"f/o/o\\": \\"A5l5sDODF4CQBW_PtlQD\\", + \\"f\\\\\\\\o\\\\\\\\o\\": \\"DFfh4KyqOODVQsTPb3wt\\", + \\"f*o*o\\": \\"gv1E2n_bVvy0iT8TaHIv\\", + \\"f!o!o\\": \\"_aIyR9ETAs8ipXmRrrDO\\", + \\"f'o'o\\": \\"HSXNnSjt1QaHBHUb_UIs\\", + \\"f~o~o\\": \\"MrVzSIcSXyoDsr5G0K5_\\", + \\"f+o+o\\": \\"EvMHRmCudyKg3GpLjAfj\\", + \\"foo/bar\\": \\"hei2uQgDeX2YNkppCHp9\\", + \\"foo\\\\\\\\bar\\": \\"IgSzmmsCqiJBl4SibwgR\\", + \\"foo/bar/baz\\": \\"p6KJMhNWwmCU2bXHJB93\\", + \\"foo\\\\\\\\bar\\\\\\\\baz\\": \\"HZerWgmU0ffpPzySVi_g\\" +}; +" +`; + +exports[`"modules" option should work and generate the same classes for client and server: server result 1`] = ` +Object { + "#": "HkwIsjW5i7WNAxVRd5cg", + "##": "IJc6Xl4ZKVZvSoeIuI2Q", + "#.#.#": "BnPpnJmPeNr51pj2ZTlf", + "#fake-id": "AqiAGSfnwaXj3eqg0Om8", + "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.": "ByKoYcSrMT2cN3V2iAgZ", + "-a-b-c-": "CwXv27VMwyQqKBvNNaFr", + "-a0-34a___f": "DdFWMPoluIgmQirKzoS6", + ".": "zd5uIZq6KrAWTwBjwZdC", + "123": "oqRGsO4UR7_DWiqWXJMz", + "1a2b3c": "YR1u_buYf6paLzzUM6Vc", + ":)": "ZiZnRjRT03NgoqVQwkGO", + ":\`(": "fKJQkLarfQOel4wwbIrn", + ":hover": "HVudUNXnLNQoCLpVn82S", + ":hover:focus:active": "ZlaaXvHLUsJOCFzItB_1", + "<><<<>><>": "ozNsTIG0LL2gSQdL5dzv", + "

": "TdAx2ZSkw7Hbktc7KR72", + "?": "ndmpvNNltJXbDVvqKuxt", + "@": "v3gq0wPogd6ZPfq_pfyZ", + "B&W?": "h4SEF34CLwChRsak1742", + "[attr=value]": "PWvC4jVM5SwUmKmw2tfW", + "_": "bCwkZEDuxDAOhKnMdLVF", + "_test": "Lb3fhDAuJv4v7BXOPttP", + "className": "LdhpkZRWyKT7zDwJ0lt8", + "f!o!o": "_aIyR9ETAs8ipXmRrrDO", + "f'o'o": "HSXNnSjt1QaHBHUb_UIs", + "f*o*o": "gv1E2n_bVvy0iT8TaHIv", + "f+o+o": "EvMHRmCudyKg3GpLjAfj", + "f/o/o": "A5l5sDODF4CQBW_PtlQD", + "f\\\\o\\\\o": "DFfh4KyqOODVQsTPb3wt", + "foo.bar": "uajo7mHzD_tTqOXqaqdg", + "foo/bar": "hei2uQgDeX2YNkppCHp9", + "foo/bar/baz": "p6KJMhNWwmCU2bXHJB93", + "foo\\\\bar": "IgSzmmsCqiJBl4SibwgR", + "foo\\\\bar\\\\baz": "HZerWgmU0ffpPzySVi_g", + "f~o~o": "MrVzSIcSXyoDsr5G0K5_", + "m_x_@": "OdAmghrme3xnUYOdzoDw", + "someId": "b0rhwJStMR3eH63oapwW", + "subClass": "Mw9j4nIdjx1xCGDt7d6a", + "test": "KuIShlgsYfxvLoLHT1mu", + "{}": "IZkBfE9iUPen76w2bB_q", + "©": "jBj0sZiWBysiwRyGu_go", + "“‘’”": "GM0Y0nFCPtkVMz6Esfno", + "⌘⌥": "edHWpSne18gmGmfN6SV6", + "☺☃": "NKrBw7EAqPT7Cgn7JzrA", + "♥": "vJl9A9Ds21oujVsd5UD2", + "𝄞♪♩♫♬": "QyMp9YMEoYUmEHEdpRal", + "💩": "B82YxwgREHbKn8IpgaWw", +} +`; + +exports[`"modules" option should work and generate the same classes for client and server: server warnings 1`] = `Array []`; + exports[`"modules" option should work and has "undefined" context if no context was given: errors 1`] = `Array []`; exports[`"modules" option should work and has "undefined" context if no context was given: module 1`] = ` @@ -5079,11 +5250,11 @@ import ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \\"../../src/runtime/noSour import ___CSS_LOADER_API_IMPORT___ from \\"../../src/runtime/api.js\\"; var ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___); // Module -___CSS_LOADER_EXPORT___.push([module.id, \\".j8UqMCngCVlrlUe9X5iP {\\\\n color: red;\\\\n}\\\\n\\\\n.rSiZpoeHP51qJfp_DRMi { from: custom; }\\", \\"\\"]); +___CSS_LOADER_EXPORT___.push([module.id, \\".dvYI1gdIOPlJqjwAWOo8 {\\\\n color: red;\\\\n}\\\\n\\\\n.s4qiGaiPSoYikcMyZg9a { from: custom; }\\", \\"\\"]); // Exports ___CSS_LOADER_EXPORT___.locals = { - \\"some-class\\": \\"j8UqMCngCVlrlUe9X5iP\\", - \\"class\\": \\"rSiZpoeHP51qJfp_DRMi\\" + \\"some-class\\": \\"dvYI1gdIOPlJqjwAWOo8\\", + \\"class\\": \\"s4qiGaiPSoYikcMyZg9a\\" }; export default ___CSS_LOADER_EXPORT___; " @@ -5118,11 +5289,11 @@ Array [ ], Array [ "other.modules.css!=!./my-inline-loader/index.js!./simple.css", - ".j8UqMCngCVlrlUe9X5iP { + ".dvYI1gdIOPlJqjwAWOo8 { color: red; } -.rSiZpoeHP51qJfp_DRMi { from: custom; }", +.s4qiGaiPSoYikcMyZg9a { from: custom; }", "", ], Array [ @@ -15379,7 +15550,7 @@ exports[`"modules" option should work with the 'auto' and exctract CSS using min "/*!*****************************************************************!*\\\\ !*** css ../../src/index.js!./modules/mode/relative.module.css ***! \\\\*****************************************************************/ -.LnZI_FRppe2YbryCEqXn { +.cK4wjjU46XTRUXJefTb2 { color: red; } @@ -15390,7 +15561,7 @@ exports[`"modules" option should work with the 'auto' and exctract CSS using min exports[`"modules" option should work with the 'auto' and exctract CSS using mini-css-extract-plugin: module 1`] = ` "// extracted by mini-css-extract-plugin -export default {\\"relative\\":\\"LnZI_FRppe2YbryCEqXn\\"};" +export default {\\"relative\\":\\"cK4wjjU46XTRUXJefTb2\\"};" `; exports[`"modules" option should work with the 'auto' and exctract CSS using mini-css-extract-plugin: warnings 1`] = `Array []`; diff --git a/test/modules-option.test.js b/test/modules-option.test.js index 2308be5c..9cca27ee 100644 --- a/test/modules-option.test.js +++ b/test/modules-option.test.js @@ -2132,4 +2132,72 @@ describe('"modules" option', () => { expect(getWarnings(stats)).toMatchSnapshot("warnings"); expect(getErrors(stats)).toMatchSnapshot("errors"); }); + + it("should work and generate the same classes for client and server", async () => { + const clientCompiler = getCompiler( + "./modules/localIdentName/localIdentName.js", + {}, + { + module: { + rules: [ + { + test: /\.css$/i, + use: [ + { + loader: MiniCssExtractPlugin.loader, + }, + { + loader: path.resolve(__dirname, "../src"), + options: { + modules: true, + }, + }, + ], + }, + ], + }, + plugins: [ + new MiniCssExtractPlugin({ + filename: "[name].css", + chunkFilename: "[id].css", + }), + ], + } + ); + const clientStats = await compile(clientCompiler); + + expect( + getModuleSource( + "./modules/localIdentName/localIdentName.css", + clientStats + ) + ).toMatchSnapshot("client module"); + expect( + getExecutedCode("main.bundle.js", clientCompiler, clientStats) + ).toMatchSnapshot("client result"); + expect(getWarnings(clientStats)).toMatchSnapshot("client warnings"); + expect(getErrors(clientStats)).toMatchSnapshot("client errors"); + + const serverCompiler = getCompiler( + "./modules/localIdentName/localIdentName.js", + { + modules: { + exportOnlyLocals: true, + }, + } + ); + const serverStats = await compile(serverCompiler); + + expect( + getModuleSource( + "./modules/localIdentName/localIdentName.css", + serverStats + ) + ).toMatchSnapshot("server module"); + expect( + getExecutedCode("main.bundle.js", serverCompiler, serverStats) + ).toMatchSnapshot("server result"); + expect(getWarnings(serverStats)).toMatchSnapshot("server warnings"); + expect(getErrors(serverStats)).toMatchSnapshot("server errors"); + }); });