simple-squiggle

A restricted subset of Squiggle
Log | Files | Refs | README

ProvidedDependency.js (3205B)


      1 /*
      2 	MIT License http://www.opensource.org/licenses/mit-license.php
      3 	Author Florent Cailhol @ooflorent
      4 */
      5 
      6 "use strict";
      7 
      8 const InitFragment = require("../InitFragment");
      9 const makeSerializable = require("../util/makeSerializable");
     10 const ModuleDependency = require("./ModuleDependency");
     11 
     12 /** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
     13 /** @typedef {import("../ChunkGraph")} ChunkGraph */
     14 /** @typedef {import("../Dependency")} Dependency */
     15 /** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */
     16 /** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
     17 /** @typedef {import("../DependencyTemplates")} DependencyTemplates */
     18 /** @typedef {import("../ModuleGraph")} ModuleGraph */
     19 /** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */
     20 /** @typedef {import("../util/Hash")} Hash */
     21 
     22 /**
     23  * @param {string[]|null} path the property path array
     24  * @returns {string} the converted path
     25  */
     26 const pathToString = path =>
     27 	path !== null && path.length > 0
     28 		? path.map(part => `[${JSON.stringify(part)}]`).join("")
     29 		: "";
     30 
     31 class ProvidedDependency extends ModuleDependency {
     32 	constructor(request, identifier, path, range) {
     33 		super(request);
     34 		this.identifier = identifier;
     35 		this.path = path;
     36 		this.range = range;
     37 		this._hashUpdate = undefined;
     38 	}
     39 
     40 	get type() {
     41 		return "provided";
     42 	}
     43 
     44 	get category() {
     45 		return "esm";
     46 	}
     47 
     48 	/**
     49 	 * Update the hash
     50 	 * @param {Hash} hash hash to be updated
     51 	 * @param {UpdateHashContext} context context
     52 	 * @returns {void}
     53 	 */
     54 	updateHash(hash, context) {
     55 		if (this._hashUpdate === undefined) {
     56 			this._hashUpdate =
     57 				this.identifier + (this.path ? this.path.join(",") : "null");
     58 		}
     59 		hash.update(this._hashUpdate);
     60 	}
     61 
     62 	serialize(context) {
     63 		const { write } = context;
     64 		write(this.identifier);
     65 		write(this.path);
     66 		super.serialize(context);
     67 	}
     68 
     69 	deserialize(context) {
     70 		const { read } = context;
     71 		this.identifier = read();
     72 		this.path = read();
     73 		super.deserialize(context);
     74 	}
     75 }
     76 
     77 makeSerializable(
     78 	ProvidedDependency,
     79 	"webpack/lib/dependencies/ProvidedDependency"
     80 );
     81 
     82 class ProvidedDependencyTemplate extends ModuleDependency.Template {
     83 	/**
     84 	 * @param {Dependency} dependency the dependency for which the template should be applied
     85 	 * @param {ReplaceSource} source the current replace source which can be modified
     86 	 * @param {DependencyTemplateContext} templateContext the context object
     87 	 * @returns {void}
     88 	 */
     89 	apply(
     90 		dependency,
     91 		source,
     92 		{
     93 			runtimeTemplate,
     94 			moduleGraph,
     95 			chunkGraph,
     96 			initFragments,
     97 			runtimeRequirements
     98 		}
     99 	) {
    100 		const dep = /** @type {ProvidedDependency} */ (dependency);
    101 		initFragments.push(
    102 			new InitFragment(
    103 				`/* provided dependency */ var ${
    104 					dep.identifier
    105 				} = ${runtimeTemplate.moduleExports({
    106 					module: moduleGraph.getModule(dep),
    107 					chunkGraph,
    108 					request: dep.request,
    109 					runtimeRequirements
    110 				})}${pathToString(dep.path)};\n`,
    111 				InitFragment.STAGE_PROVIDES,
    112 				1,
    113 				`provided ${dep.identifier}`
    114 			)
    115 		);
    116 		source.replace(dep.range[0], dep.range[1] - 1, dep.identifier);
    117 	}
    118 }
    119 
    120 ProvidedDependency.Template = ProvidedDependencyTemplate;
    121 
    122 module.exports = ProvidedDependency;