|
|
- /*
- MIT License http://www.opensource.org/licenses/mit-license.php
- Author Tobias Koppers @sokra
- */
- "use strict";
-
- const HarmonyCompatibilityDependency = require("./HarmonyCompatibilityDependency");
- const HarmonyInitDependency = require("./HarmonyInitDependency");
-
- module.exports = class HarmonyDetectionParserPlugin {
- apply(parser) {
- parser.hooks.program.tap("HarmonyDetectionParserPlugin", ast => {
- const isStrictHarmony = parser.state.module.type === "javascript/esm";
- const isHarmony =
- isStrictHarmony ||
- ast.body.some(
- statement =>
- statement.type === "ImportDeclaration" ||
- statement.type === "ExportDefaultDeclaration" ||
- statement.type === "ExportNamedDeclaration" ||
- statement.type === "ExportAllDeclaration"
- );
- if (isHarmony) {
- const module = parser.state.module;
- const compatDep = new HarmonyCompatibilityDependency(module);
- compatDep.loc = {
- start: {
- line: -1,
- column: 0
- },
- end: {
- line: -1,
- column: 0
- },
- index: -3
- };
- module.addDependency(compatDep);
- const initDep = new HarmonyInitDependency(module);
- initDep.loc = {
- start: {
- line: -1,
- column: 0
- },
- end: {
- line: -1,
- column: 0
- },
- index: -2
- };
- module.addDependency(initDep);
- parser.state.harmonyParserScope = parser.state.harmonyParserScope || {};
- parser.scope.isStrict = true;
- module.buildMeta.exportsType = "namespace";
- module.buildInfo.strict = true;
- module.buildInfo.exportsArgument = "__webpack_exports__";
- if (isStrictHarmony) {
- module.buildMeta.strictHarmonyModule = true;
- module.buildInfo.moduleArgument = "__webpack_module__";
- }
- }
- });
-
- const skipInHarmony = () => {
- const module = parser.state.module;
- if (module && module.buildMeta && module.buildMeta.exportsType) {
- return true;
- }
- };
-
- const nullInHarmony = () => {
- const module = parser.state.module;
- if (module && module.buildMeta && module.buildMeta.exportsType) {
- return null;
- }
- };
-
- const nonHarmonyIdentifiers = ["define", "exports"];
- for (const identifer of nonHarmonyIdentifiers) {
- parser.hooks.evaluateTypeof
- .for(identifer)
- .tap("HarmonyDetectionParserPlugin", nullInHarmony);
- parser.hooks.typeof
- .for(identifer)
- .tap("HarmonyDetectionParserPlugin", skipInHarmony);
- parser.hooks.evaluate
- .for(identifer)
- .tap("HarmonyDetectionParserPlugin", nullInHarmony);
- parser.hooks.expression
- .for(identifer)
- .tap("HarmonyDetectionParserPlugin", skipInHarmony);
- parser.hooks.call
- .for(identifer)
- .tap("HarmonyDetectionParserPlugin", skipInHarmony);
- }
- }
- };
|