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;
 |