mirror of https://github.com/webpack/webpack.git
				
				
				
			
		
			
	
	
		
			65 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
		
		
			
		
	
	
			65 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
|  | /* | ||
|  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | ||
|  | 	Author Alexander Akait @alexander-akait | ||
|  | */ | ||
|  | 
 | ||
|  | "use strict"; | ||
|  | 
 | ||
|  | const RuntimeGlobals = require("../RuntimeGlobals"); | ||
|  | const RuntimeModule = require("../RuntimeModule"); | ||
|  | const Template = require("../Template"); | ||
|  | 
 | ||
|  | /** @typedef {import("../Compilation")} Compilation */ | ||
|  | 
 | ||
|  | class ToBinaryRuntimeModule extends RuntimeModule { | ||
|  | 	constructor() { | ||
|  | 		super("to binary"); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * @returns {string | null} runtime code | ||
|  | 	 */ | ||
|  | 	generate() { | ||
|  | 		const compilation = /** @type {Compilation} */ (this.compilation); | ||
|  | 		const fn = RuntimeGlobals.toBinary; | ||
|  | 		const { runtimeTemplate } = compilation; | ||
|  | 
 | ||
|  | 		// Inspired by esbuild
 | ||
|  | 
 | ||
|  | 		const isNodePlatform = compilation.compiler.platform.node; | ||
|  | 		const isWebPlatform = compilation.compiler.platform.web; | ||
|  | 		const isNeutralPlatform = runtimeTemplate.isNeutralPlatform(); | ||
|  | 
 | ||
|  | 		return Template.asString([ | ||
|  | 			"// define to binary helper", | ||
|  | 			`${fn} = ${isNeutralPlatform ? "typeof Buffer !== 'undefined' ? " : ""}${ | ||
|  | 				isNodePlatform || isNeutralPlatform | ||
|  | 					? `${runtimeTemplate.returningFunction("new Uint8Array(Buffer.from(base64, 'base64'))", "base64")}` | ||
|  | 					: "" | ||
|  | 			} ${isNeutralPlatform ? ": " : ""}${ | ||
|  | 				isWebPlatform || isNeutralPlatform | ||
|  | 					? `(${runtimeTemplate.basicFunction("", [ | ||
|  | 							"var table = new Uint8Array(128);", | ||
|  | 							"for (var i = 0; i < 64; i++) table[i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i * 4 - 205] = i;", | ||
|  | 							`return ${runtimeTemplate.basicFunction("base64", [ | ||
|  | 								"var n = base64.length, bytes = new Uint8Array((n - (base64[n - 1] == '=') - (base64[n - 2] == '=')) * 3 / 4 | 0);", | ||
|  | 								"for (var i = 0, j = 0; i < n;) {", | ||
|  | 								Template.indent([ | ||
|  | 									"var c0 = table[base64.charCodeAt(i++)], c1 = table[base64.charCodeAt(i++)];", | ||
|  | 									"var c2 = table[base64.charCodeAt(i++)], c3 = table[base64.charCodeAt(i++)];", | ||
|  | 									"bytes[j++] = (c0 << 2) | (c1 >> 4);", | ||
|  | 									"bytes[j++] = (c1 << 4) | (c2 >> 2);", | ||
|  | 									"bytes[j++] = (c2 << 6) | c3;" | ||
|  | 								]), | ||
|  | 								"}", | ||
|  | 								"return bytes" | ||
|  | 							])}`
 | ||
|  | 						])})();`
 | ||
|  | 					: "" | ||
|  | 			}`
 | ||
|  | 		]); | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | module.exports = ToBinaryRuntimeModule; |