| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- /*
- 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 => {
- return /^(Import|Export).*Declaration$/.test(statement.type);
- });
- 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);
- }
- }
- };
|