From 459fa25015b50bcc1f13a1033df23e15a6f160ce Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Tue, 26 Nov 2019 14:05:07 +0100 Subject: [PATCH] add source asset type --- lib/asset/AssetModulesPlugin.js | 11 +++ lib/asset/AssetSourceGenerator.js | 71 +++++++++++++++++++ .../configCases/asset-modules/source/index.js | 5 ++ .../asset-modules/source/webpack.config.js | 14 ++++ 4 files changed, 101 insertions(+) create mode 100644 lib/asset/AssetSourceGenerator.js create mode 100644 test/configCases/asset-modules/source/index.js create mode 100644 test/configCases/asset-modules/source/webpack.config.js diff --git a/lib/asset/AssetModulesPlugin.js b/lib/asset/AssetModulesPlugin.js index c99dd192e..7d828a42c 100644 --- a/lib/asset/AssetModulesPlugin.js +++ b/lib/asset/AssetModulesPlugin.js @@ -11,6 +11,7 @@ const parserSchema = require("../../schemas/plugins/AssetModulesPluginParser.jso const { compareModulesByIdentifier } = require("../util/comparators"); const AssetGenerator = require("./AssetGenerator"); const AssetParser = require("./AssetParser"); +const AssetSourceGenerator = require("./AssetSourceGenerator"); /** @typedef {import("webpack-sources").Source} Source */ /** @typedef {import("../Chunk")} Chunk */ @@ -57,6 +58,11 @@ class AssetModulesPlugin { .tap(plugin, parserOptions => { return new AssetParser(false); }); + normalModuleFactory.hooks.createParser + .for("asset/source") + .tap(plugin, parserOptions => { + return new AssetParser(false); + }); for (const type of ["asset", "asset/inline"]) { normalModuleFactory.hooks.createGenerator @@ -84,6 +90,11 @@ class AssetModulesPlugin { .tap(plugin, () => { return new AssetGenerator(compilation); }); + normalModuleFactory.hooks.createGenerator + .for("asset/source") + .tap(plugin, () => { + return new AssetSourceGenerator(); + }); compilation.hooks.renderManifest.tap(plugin, (result, options) => { const { chunkGraph } = compilation; diff --git a/lib/asset/AssetSourceGenerator.js b/lib/asset/AssetSourceGenerator.js new file mode 100644 index 000000000..563ee5af6 --- /dev/null +++ b/lib/asset/AssetSourceGenerator.js @@ -0,0 +1,71 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Sergey Melyukov @smelukov +*/ + +"use strict"; + +const { RawSource } = require("webpack-sources"); +const Generator = require("../Generator"); +const RuntimeGlobals = require("../RuntimeGlobals"); + +/** @typedef {import("webpack-sources").Source} Source */ +/** @typedef {import("../Generator").GenerateContext} GenerateContext */ +/** @typedef {import("../NormalModule")} NormalModule */ + +const TYPES = new Set(["javascript"]); + +class AssetSourceGenerator extends Generator { + /** + * @param {NormalModule} module module for which the code should be generated + * @param {GenerateContext} generateContext context for generate + * @returns {Source} generated code + */ + generate(module, { chunkGraph, runtimeTemplate, runtimeRequirements }) { + runtimeRequirements.add(RuntimeGlobals.module); + + const originalSource = module.originalSource(); + + if (!originalSource) { + return new RawSource(""); + } + + const content = originalSource.source(); + + let encodedSource; + if (typeof content === "string") { + encodedSource = content; + } else { + encodedSource = content.toString("utf-8"); + } + return new RawSource( + `${RuntimeGlobals.module}.exports = ${JSON.stringify(encodedSource)};` + ); + } + + /** + * @param {NormalModule} module fresh module + * @returns {Set} available types (do not mutate) + */ + getTypes(module) { + return TYPES; + } + + /** + * @param {NormalModule} module the module + * @param {string=} type source type + * @returns {number} estimate size of the module + */ + getSize(module, type = module.type) { + const originalSource = module.originalSource(); + + if (!originalSource) { + return 0; + } + + // Example: m.exports="abcd" + return originalSource.size() + 12; + } +} + +module.exports = AssetSourceGenerator; diff --git a/test/configCases/asset-modules/source/index.js b/test/configCases/asset-modules/source/index.js new file mode 100644 index 000000000..f57168259 --- /dev/null +++ b/test/configCases/asset-modules/source/index.js @@ -0,0 +1,5 @@ +import svg from "../_images/file.svg"; + +it("should receive asset source", () => { + expect(svg).toMatch(/^\s*$/); +}); diff --git a/test/configCases/asset-modules/source/webpack.config.js b/test/configCases/asset-modules/source/webpack.config.js new file mode 100644 index 000000000..8c96cd457 --- /dev/null +++ b/test/configCases/asset-modules/source/webpack.config.js @@ -0,0 +1,14 @@ +module.exports = { + mode: "development", + module: { + rules: [ + { + test: /\.svg$/, + type: "asset/source" + } + ] + }, + experiments: { + asset: true + } +};