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