webpack/lib/Generator.js

62 lines
1.7 KiB
JavaScript
Raw Normal View History

2018-04-28 00:53:07 +08:00
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
2018-07-30 23:08:51 +08:00
2018-04-28 00:53:07 +08:00
"use strict";
/** @typedef {import("webpack-sources").Source} Source */
/** @typedef {import("./DependencyTemplate")} DependencyTemplate */
2018-07-30 23:08:51 +08:00
/** @typedef {import("./DependencyTemplates")} DependencyTemplates */
/** @typedef {import("./NormalModule")} NormalModule */
/** @typedef {import("./RuntimeTemplate")} RuntimeTemplate */
2018-04-28 00:53:07 +08:00
/**
* @typedef {Object} GenerateContext
* @property {DependencyTemplates} dependencyTemplates mapping from dependencies to templates
* @property {RuntimeTemplate} runtimeTemplate the runtime template
* @property {string} type which kind of code should be generated
*/
2018-04-28 00:53:07 +08:00
/**
*
*/
class Generator {
static byType(map) {
return new ByTypeGenerator(map);
}
/**
* @abstract
* @param {NormalModule} module module for which the code should be generated
* @param {GenerateContext} generateContext context for generate
2018-04-28 00:53:07 +08:00
* @returns {Source} generated code
*/
generate(module, { dependencyTemplates, runtimeTemplate, type }) {
2018-07-10 04:48:12 +08:00
throw new Error("Generator.generate: must be overridden");
2018-04-28 00:53:07 +08:00
}
}
class ByTypeGenerator extends Generator {
constructor(map) {
super();
this.map = map;
}
/**
* @param {NormalModule} module module for which the code should be generated
* @param {GenerateContext} generateContext context for generate
* @returns {Source} generated code
*/
generate(module, generateContext) {
const type = generateContext.type;
2018-04-28 00:53:07 +08:00
const generator = this.map[type];
if (!generator) {
throw new Error(`Generator.byType: no generator specified for ${type}`);
}
return generator.generate(module, generateContext);
2018-04-28 00:53:07 +08:00
}
}
module.exports = Generator;