123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- /*
- MIT License http://www.opensource.org/licenses/mit-license.php
- Author Tobias Koppers @sokra
- */
- "use strict";
- const SetVarMainTemplatePlugin = require("./SetVarMainTemplatePlugin");
- /** @typedef {import("../declarations/WebpackOptions").LibraryCustomUmdObject} LibraryCustomUmdObject */
- /** @typedef {import("./Compiler")} Compiler */
- /**
- * @param {string[]} accessor the accessor to convert to path
- * @returns {string} the path
- */
- const accessorToObjectAccess = accessor => {
- return accessor.map(a => `[${JSON.stringify(a)}]`).join("");
- };
- /**
- * @param {string=} base the path prefix
- * @param {string|string[]|LibraryCustomUmdObject} accessor the accessor
- * @param {"amd" | "commonjs" | "root"} umdProperty property used when a custom umd object is provided
- * @param {string=} joinWith the element separator
- * @returns {string} the path
- */
- const accessorAccess = (base, accessor, umdProperty, joinWith = "; ") => {
- const normalizedAccessor =
- typeof accessor === "object" && !Array.isArray(accessor)
- ? accessor[umdProperty]
- : accessor;
- const accessors = Array.isArray(normalizedAccessor)
- ? normalizedAccessor
- : [normalizedAccessor];
- return accessors
- .map((_, idx) => {
- const a = base
- ? base + accessorToObjectAccess(accessors.slice(0, idx + 1))
- : accessors[0] + accessorToObjectAccess(accessors.slice(1, idx + 1));
- if (idx === accessors.length - 1) return a;
- if (idx === 0 && base === undefined) {
- return `${a} = typeof ${a} === "object" ? ${a} : {}`;
- }
- return `${a} = ${a} || {}`;
- })
- .join(joinWith);
- };
- class LibraryTemplatePlugin {
- /**
- * @param {string|string[]|LibraryCustomUmdObject} name name of library
- * @param {string} target type of library
- * @param {boolean} umdNamedDefine setting this to true will name the UMD module
- * @param {string|TODO} auxiliaryComment comment in the UMD wrapper
- * @param {string|string[]} exportProperty which export should be exposed as library
- */
- constructor(name, target, umdNamedDefine, auxiliaryComment, exportProperty) {
- this.name = name;
- this.target = target;
- this.umdNamedDefine = umdNamedDefine;
- this.auxiliaryComment = auxiliaryComment;
- this.exportProperty = exportProperty;
- }
- /**
- * @param {Compiler} compiler the compiler instance
- * @returns {void}
- */
- apply(compiler) {
- compiler.hooks.thisCompilation.tap("LibraryTemplatePlugin", compilation => {
- if (this.exportProperty) {
- const ExportPropertyMainTemplatePlugin = require("./ExportPropertyMainTemplatePlugin");
- new ExportPropertyMainTemplatePlugin(this.exportProperty).apply(
- compilation
- );
- }
- switch (this.target) {
- case "var":
- if (
- !this.name ||
- (typeof this.name === "object" && !Array.isArray(this.name))
- ) {
- throw new Error(
- "library name must be set and not an UMD custom object for non-UMD target"
- );
- }
- new SetVarMainTemplatePlugin(
- `var ${accessorAccess(undefined, this.name, "root")}`,
- false
- ).apply(compilation);
- break;
- case "assign":
- new SetVarMainTemplatePlugin(
- accessorAccess(undefined, this.name, "root"),
- false
- ).apply(compilation);
- break;
- case "this":
- case "self":
- case "window":
- if (this.name) {
- new SetVarMainTemplatePlugin(
- accessorAccess(this.target, this.name, "root"),
- false
- ).apply(compilation);
- } else {
- new SetVarMainTemplatePlugin(this.target, true).apply(compilation);
- }
- break;
- case "global":
- if (this.name) {
- new SetVarMainTemplatePlugin(
- accessorAccess(
- compilation.runtimeTemplate.outputOptions.globalObject,
- this.name,
- "root"
- ),
- false
- ).apply(compilation);
- } else {
- new SetVarMainTemplatePlugin(
- compilation.runtimeTemplate.outputOptions.globalObject,
- true
- ).apply(compilation);
- }
- break;
- case "commonjs":
- if (this.name) {
- new SetVarMainTemplatePlugin(
- accessorAccess("exports", this.name, "commonjs"),
- false
- ).apply(compilation);
- } else {
- new SetVarMainTemplatePlugin("exports", true).apply(compilation);
- }
- break;
- case "commonjs2":
- case "commonjs-module":
- new SetVarMainTemplatePlugin("module.exports", false).apply(
- compilation
- );
- break;
- case "amd":
- case "amd-require": {
- const AmdMainTemplatePlugin = require("./AmdMainTemplatePlugin");
- if (this.name && typeof this.name !== "string") {
- throw new Error("library name must be a string for amd target");
- }
- new AmdMainTemplatePlugin({
- name: this.name,
- requireAsWrapper: this.target === "amd-require"
- }).apply(compilation);
- break;
- }
- case "umd":
- case "umd2": {
- const UmdMainTemplatePlugin = require("./UmdMainTemplatePlugin");
- new UmdMainTemplatePlugin(this.name, {
- optionalAmdExternalAsGlobal: this.target === "umd2",
- namedDefine: this.umdNamedDefine,
- auxiliaryComment: this.auxiliaryComment
- }).apply(compilation);
- break;
- }
- case "jsonp": {
- const JsonpExportMainTemplatePlugin = require("./web/JsonpExportMainTemplatePlugin");
- if (typeof this.name !== "string")
- throw new Error("library name must be a string for jsonp target");
- new JsonpExportMainTemplatePlugin(this.name).apply(compilation);
- break;
- }
- default:
- throw new Error(`${this.target} is not a valid Library target`);
- }
- });
- }
- }
- module.exports = LibraryTemplatePlugin;
|