webpack/lib/dependencies/HarmonyModulesPlugin.js

155 lines
5.0 KiB
JavaScript
Raw Normal View History

2015-01-13 00:45:30 +08:00
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
2018-07-30 23:08:51 +08:00
"use strict";
2018-07-30 23:08:51 +08:00
2025-07-03 17:06:45 +08:00
const {
JAVASCRIPT_MODULE_TYPE_AUTO,
JAVASCRIPT_MODULE_TYPE_ESM
} = require("../ModuleTypeConstants");
2018-07-30 23:08:51 +08:00
const HarmonyAcceptDependency = require("./HarmonyAcceptDependency");
const HarmonyAcceptImportDependency = require("./HarmonyAcceptImportDependency");
const HarmonyCompatibilityDependency = require("./HarmonyCompatibilityDependency");
2025-07-03 17:06:45 +08:00
const HarmonyDetectionParserPlugin = require("./HarmonyDetectionParserPlugin");
2022-03-04 16:38:39 +08:00
const HarmonyEvaluatedImportSpecifierDependency = require("./HarmonyEvaluatedImportSpecifierDependency");
2025-07-03 17:06:45 +08:00
const HarmonyExportDependencyParserPlugin = require("./HarmonyExportDependencyParserPlugin");
const HarmonyExportExpressionDependency = require("./HarmonyExportExpressionDependency");
2018-07-30 23:08:51 +08:00
const HarmonyExportHeaderDependency = require("./HarmonyExportHeaderDependency");
const HarmonyExportImportedSpecifierDependency = require("./HarmonyExportImportedSpecifierDependency");
2018-07-30 23:08:51 +08:00
const HarmonyExportSpecifierDependency = require("./HarmonyExportSpecifierDependency");
2025-07-03 17:06:45 +08:00
const HarmonyImportDependencyParserPlugin = require("./HarmonyImportDependencyParserPlugin");
2018-07-30 23:08:51 +08:00
const HarmonyImportSideEffectDependency = require("./HarmonyImportSideEffectDependency");
const HarmonyImportSpecifierDependency = require("./HarmonyImportSpecifierDependency");
const HarmonyTopLevelThisParserPlugin = require("./HarmonyTopLevelThisParserPlugin");
2015-01-13 00:45:30 +08:00
2023-05-22 08:03:05 +08:00
/** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
2019-06-12 19:29:17 +08:00
/** @typedef {import("../Compiler")} Compiler */
2023-05-22 08:03:05 +08:00
/** @typedef {import("../javascript/JavascriptParser")} Parser */
/**
* @typedef HarmonyModulesPluginOptions
* @property {boolean=} topLevelAwait
* @property {boolean=} deferImport
*/
2019-06-12 19:29:17 +08:00
const PLUGIN_NAME = "HarmonyModulesPlugin";
class HarmonyModulesPlugin {
2023-05-22 10:12:44 +08:00
/**
* @param {HarmonyModulesPluginOptions} options options
*/
2017-02-23 05:31:46 +08:00
constructor(options) {
this.options = options;
}
2015-01-13 00:45:30 +08:00
2019-06-12 19:29:17 +08:00
/**
2020-04-23 16:48:36 +08:00
* Apply the plugin
* @param {Compiler} compiler the compiler instance
2019-06-12 19:29:17 +08:00
* @returns {void}
*/
apply(compiler) {
2018-02-25 09:00:20 +08:00
compiler.hooks.compilation.tap(
PLUGIN_NAME,
2018-02-25 09:00:20 +08:00
(compilation, { normalModuleFactory }) => {
compilation.dependencyTemplates.set(
HarmonyCompatibilityDependency,
new HarmonyCompatibilityDependency.Template()
);
compilation.dependencyFactories.set(
HarmonyImportSideEffectDependency,
normalModuleFactory
);
compilation.dependencyTemplates.set(
HarmonyImportSideEffectDependency,
new HarmonyImportSideEffectDependency.Template()
);
compilation.dependencyFactories.set(
HarmonyImportSpecifierDependency,
normalModuleFactory
);
compilation.dependencyTemplates.set(
HarmonyImportSpecifierDependency,
new HarmonyImportSpecifierDependency.Template()
);
2022-03-02 16:01:02 +08:00
compilation.dependencyFactories.set(
2022-03-04 16:38:39 +08:00
HarmonyEvaluatedImportSpecifierDependency,
2022-03-02 16:01:02 +08:00
normalModuleFactory
);
compilation.dependencyTemplates.set(
2022-03-04 16:38:39 +08:00
HarmonyEvaluatedImportSpecifierDependency,
new HarmonyEvaluatedImportSpecifierDependency.Template()
2022-03-02 16:01:02 +08:00
);
2018-02-25 09:00:20 +08:00
compilation.dependencyTemplates.set(
HarmonyExportHeaderDependency,
new HarmonyExportHeaderDependency.Template()
);
compilation.dependencyTemplates.set(
HarmonyExportExpressionDependency,
new HarmonyExportExpressionDependency.Template()
);
compilation.dependencyTemplates.set(
HarmonyExportSpecifierDependency,
new HarmonyExportSpecifierDependency.Template()
);
compilation.dependencyFactories.set(
HarmonyExportImportedSpecifierDependency,
normalModuleFactory
);
compilation.dependencyTemplates.set(
HarmonyExportImportedSpecifierDependency,
new HarmonyExportImportedSpecifierDependency.Template()
);
compilation.dependencyTemplates.set(
HarmonyAcceptDependency,
new HarmonyAcceptDependency.Template()
);
compilation.dependencyFactories.set(
HarmonyAcceptImportDependency,
normalModuleFactory
);
compilation.dependencyTemplates.set(
HarmonyAcceptImportDependency,
new HarmonyAcceptImportDependency.Template()
);
2023-05-22 08:03:05 +08:00
/**
* @param {Parser} parser parser parser
* @param {JavascriptParserOptions} parserOptions parserOptions
* @returns {void}
*/
2018-02-25 09:00:20 +08:00
const handler = (parser, parserOptions) => {
// TODO webpack 6: rename harmony to esm or module
if (parserOptions.harmony !== undefined && !parserOptions.harmony) {
2018-02-25 09:00:20 +08:00
return;
}
2018-02-25 09:00:20 +08:00
new HarmonyDetectionParserPlugin(this.options).apply(parser);
new HarmonyImportDependencyParserPlugin(parserOptions).apply(parser);
new HarmonyExportDependencyParserPlugin(parserOptions).apply(parser);
2018-02-25 09:00:20 +08:00
new HarmonyTopLevelThisParserPlugin().apply(parser);
};
normalModuleFactory.hooks.parser
.for(JAVASCRIPT_MODULE_TYPE_AUTO)
.tap(PLUGIN_NAME, handler);
2018-02-25 09:00:20 +08:00
normalModuleFactory.hooks.parser
.for(JAVASCRIPT_MODULE_TYPE_ESM)
.tap(PLUGIN_NAME, handler);
2018-02-25 09:00:20 +08:00
}
);
}
}
module.exports = HarmonyModulesPlugin;