js-confuser 1.7.2 → 2.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/ISSUE_TEMPLATE/bug_report.md +6 -4
- package/.github/workflows/node.js.yml +1 -1
- package/CHANGELOG.md +105 -0
- package/Migration.md +57 -0
- package/README.md +23 -913
- package/dist/constants.js +69 -13
- package/dist/index.js +108 -152
- package/dist/obfuscator.js +316 -118
- package/dist/options.js +1 -109
- package/dist/order.js +30 -30
- package/dist/presets.js +47 -45
- package/dist/probability.js +25 -32
- package/dist/templates/bufferToStringTemplate.js +9 -0
- package/dist/templates/deadCodeTemplates.js +9 -0
- package/dist/templates/getGlobalTemplate.js +19 -0
- package/dist/templates/integrityTemplate.js +30 -0
- package/dist/templates/setFunctionLengthTemplate.js +9 -0
- package/dist/templates/stringCompressionTemplate.js +10 -0
- package/dist/templates/tamperProtectionTemplates.js +21 -0
- package/dist/templates/template.js +213 -93
- package/dist/transforms/astScrambler.js +100 -0
- package/dist/transforms/calculator.js +70 -127
- package/dist/transforms/controlFlowFlattening.js +1182 -0
- package/dist/transforms/deadCode.js +62 -577
- package/dist/transforms/dispatcher.js +300 -309
- package/dist/transforms/extraction/duplicateLiteralsRemoval.js +88 -189
- package/dist/transforms/extraction/objectExtraction.js +131 -215
- package/dist/transforms/finalizer.js +56 -59
- package/dist/transforms/flatten.js +275 -276
- package/dist/transforms/functionOutlining.js +230 -0
- package/dist/transforms/identifier/globalConcealing.js +217 -103
- package/dist/transforms/identifier/movedDeclarations.js +167 -91
- package/dist/transforms/identifier/renameVariables.js +240 -187
- package/dist/transforms/lock/integrity.js +61 -184
- package/dist/transforms/lock/lock.js +263 -303
- package/dist/transforms/minify.js +431 -436
- package/dist/transforms/opaquePredicates.js +65 -118
- package/dist/transforms/pack.js +160 -0
- package/dist/transforms/plugin.js +179 -0
- package/dist/transforms/preparation.js +263 -163
- package/dist/transforms/renameLabels.js +132 -56
- package/dist/transforms/rgf.js +142 -240
- package/dist/transforms/shuffle.js +52 -145
- package/dist/transforms/string/encoding.js +45 -173
- package/dist/transforms/string/stringCompression.js +81 -126
- package/dist/transforms/string/stringConcealing.js +189 -224
- package/dist/transforms/string/stringEncoding.js +32 -40
- package/dist/transforms/string/stringSplitting.js +54 -55
- package/dist/transforms/variableMasking.js +232 -0
- package/dist/utils/ControlObject.js +125 -0
- package/dist/utils/IntGen.js +46 -0
- package/dist/utils/NameGen.js +106 -0
- package/dist/utils/ast-utils.js +560 -0
- package/dist/utils/function-utils.js +56 -0
- package/dist/utils/gen-utils.js +48 -0
- package/dist/utils/node.js +77 -0
- package/dist/utils/object-utils.js +21 -0
- package/dist/utils/random-utils.js +91 -0
- package/dist/utils/static-utils.js +64 -0
- package/dist/validateOptions.js +122 -0
- package/index.d.ts +1 -17
- package/package.json +27 -22
- package/src/constants.ts +139 -77
- package/src/index.ts +70 -163
- package/src/obfuscationResult.ts +43 -0
- package/src/obfuscator.ts +328 -135
- package/src/options.ts +154 -623
- package/src/order.ts +14 -14
- package/src/presets.ts +39 -34
- package/src/probability.ts +21 -36
- package/src/templates/{bufferToString.ts → bufferToStringTemplate.ts} +5 -54
- package/src/templates/deadCodeTemplates.ts +1185 -0
- package/src/templates/getGlobalTemplate.ts +72 -0
- package/src/templates/integrityTemplate.ts +69 -0
- package/src/templates/setFunctionLengthTemplate.ts +11 -0
- package/src/templates/stringCompressionTemplate.ts +42 -0
- package/src/templates/tamperProtectionTemplates.ts +116 -0
- package/src/templates/template.ts +183 -92
- package/src/transforms/astScrambler.ts +99 -0
- package/src/transforms/calculator.ts +96 -224
- package/src/transforms/controlFlowFlattening.ts +1594 -0
- package/src/transforms/deadCode.ts +85 -628
- package/src/transforms/dispatcher.ts +431 -636
- package/src/transforms/extraction/duplicateLiteralsRemoval.ts +147 -299
- package/src/transforms/extraction/objectExtraction.ts +160 -333
- package/src/transforms/finalizer.ts +63 -64
- package/src/transforms/flatten.ts +439 -557
- package/src/transforms/functionOutlining.ts +225 -0
- package/src/transforms/identifier/globalConcealing.ts +261 -189
- package/src/transforms/identifier/movedDeclarations.ts +228 -142
- package/src/transforms/identifier/renameVariables.ts +252 -258
- package/src/transforms/lock/integrity.ts +84 -260
- package/src/transforms/lock/lock.ts +342 -491
- package/src/transforms/minify.ts +523 -663
- package/src/transforms/opaquePredicates.ts +90 -229
- package/src/transforms/pack.ts +195 -0
- package/src/transforms/plugin.ts +185 -0
- package/src/transforms/preparation.ts +337 -215
- package/src/transforms/renameLabels.ts +176 -77
- package/src/transforms/rgf.ts +293 -386
- package/src/transforms/shuffle.ts +80 -254
- package/src/transforms/string/encoding.ts +26 -129
- package/src/transforms/string/stringCompression.ts +118 -236
- package/src/transforms/string/stringConcealing.ts +255 -339
- package/src/transforms/string/stringEncoding.ts +28 -47
- package/src/transforms/string/stringSplitting.ts +61 -75
- package/src/transforms/variableMasking.ts +257 -0
- package/src/utils/ControlObject.ts +141 -0
- package/src/utils/IntGen.ts +33 -0
- package/src/utils/NameGen.ts +106 -0
- package/src/utils/ast-utils.ts +667 -0
- package/src/utils/function-utils.ts +50 -0
- package/src/utils/gen-utils.ts +48 -0
- package/src/utils/node.ts +78 -0
- package/src/utils/object-utils.ts +21 -0
- package/src/utils/random-utils.ts +79 -0
- package/src/utils/static-utils.ts +66 -0
- package/src/validateOptions.ts +256 -0
- package/tsconfig.json +13 -8
- package/babel.config.js +0 -12
- package/dev.js +0 -8
- package/dist/compiler.js +0 -34
- package/dist/parser.js +0 -59
- package/dist/precedence.js +0 -66
- package/dist/templates/bufferToString.js +0 -108
- package/dist/templates/crash.js +0 -59
- package/dist/templates/es5.js +0 -137
- package/dist/templates/functionLength.js +0 -34
- package/dist/templates/globals.js +0 -9
- package/dist/transforms/antiTooling.js +0 -88
- package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +0 -1281
- package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +0 -131
- package/dist/transforms/es5/antiClass.js +0 -164
- package/dist/transforms/es5/antiDestructuring.js +0 -193
- package/dist/transforms/es5/antiES6Object.js +0 -185
- package/dist/transforms/es5/antiSpreadOperator.js +0 -35
- package/dist/transforms/es5/antiTemplate.js +0 -66
- package/dist/transforms/es5/es5.js +0 -123
- package/dist/transforms/extraction/classExtraction.js +0 -83
- package/dist/transforms/identifier/globalAnalysis.js +0 -70
- package/dist/transforms/identifier/variableAnalysis.js +0 -104
- package/dist/transforms/lock/antiDebug.js +0 -76
- package/dist/transforms/stack.js +0 -343
- package/dist/transforms/transform.js +0 -350
- package/dist/traverse.js +0 -110
- package/dist/util/compare.js +0 -145
- package/dist/util/gen.js +0 -564
- package/dist/util/guard.js +0 -9
- package/dist/util/identifiers.js +0 -355
- package/dist/util/insert.js +0 -362
- package/dist/util/math.js +0 -19
- package/dist/util/object.js +0 -40
- package/dist/util/random.js +0 -130
- package/dist/util/scope.js +0 -20
- package/docs/ControlFlowFlattening.md +0 -595
- package/docs/Countermeasures.md +0 -63
- package/docs/ES5.md +0 -197
- package/docs/Integrity.md +0 -75
- package/docs/RGF.md +0 -419
- package/samples/example.js +0 -15
- package/samples/high.js +0 -1
- package/samples/input.js +0 -3
- package/samples/javascriptobfuscator.com.js +0 -8
- package/samples/jscrambler_advanced.js +0 -1894
- package/samples/jscrambler_light.js +0 -1134
- package/samples/low.js +0 -1
- package/samples/medium.js +0 -1
- package/samples/obfuscator.io.js +0 -1686
- package/samples/preemptive.com.js +0 -16
- package/src/compiler.ts +0 -35
- package/src/parser.ts +0 -49
- package/src/precedence.ts +0 -61
- package/src/templates/crash.ts +0 -55
- package/src/templates/es5.ts +0 -131
- package/src/templates/functionLength.ts +0 -32
- package/src/templates/globals.ts +0 -3
- package/src/transforms/antiTooling.ts +0 -102
- package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +0 -2146
- package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +0 -179
- package/src/transforms/es5/antiClass.ts +0 -272
- package/src/transforms/es5/antiDestructuring.ts +0 -294
- package/src/transforms/es5/antiES6Object.ts +0 -267
- package/src/transforms/es5/antiSpreadOperator.ts +0 -56
- package/src/transforms/es5/antiTemplate.ts +0 -98
- package/src/transforms/es5/es5.ts +0 -149
- package/src/transforms/extraction/classExtraction.ts +0 -168
- package/src/transforms/identifier/globalAnalysis.ts +0 -85
- package/src/transforms/identifier/variableAnalysis.ts +0 -118
- package/src/transforms/lock/antiDebug.ts +0 -112
- package/src/transforms/stack.ts +0 -551
- package/src/transforms/transform.ts +0 -453
- package/src/traverse.ts +0 -120
- package/src/types.ts +0 -131
- package/src/util/compare.ts +0 -181
- package/src/util/gen.ts +0 -651
- package/src/util/guard.ts +0 -7
- package/src/util/identifiers.ts +0 -494
- package/src/util/insert.ts +0 -419
- package/src/util/math.ts +0 -15
- package/src/util/object.ts +0 -39
- package/src/util/random.ts +0 -141
- package/src/util/scope.ts +0 -21
- package/test/code/Cash.src.js +0 -1011
- package/test/code/Cash.test.ts +0 -49
- package/test/code/Dynamic.src.js +0 -118
- package/test/code/Dynamic.test.ts +0 -49
- package/test/code/ES6.src.js +0 -235
- package/test/code/ES6.test.ts +0 -42
- package/test/code/NewFeatures.test.ts +0 -19
- package/test/code/StrictMode.src.js +0 -65
- package/test/code/StrictMode.test.js +0 -37
- package/test/compare.test.ts +0 -104
- package/test/index.test.ts +0 -249
- package/test/options.test.ts +0 -132
- package/test/presets.test.ts +0 -22
- package/test/probability.test.ts +0 -44
- package/test/templates/template.test.ts +0 -14
- package/test/transforms/antiTooling.test.ts +0 -52
- package/test/transforms/calculator.test.ts +0 -78
- package/test/transforms/controlFlowFlattening/controlFlowFlattening.test.ts +0 -1274
- package/test/transforms/controlFlowFlattening/expressionObfuscation.test.ts +0 -192
- package/test/transforms/deadCode.test.ts +0 -85
- package/test/transforms/dispatcher.test.ts +0 -457
- package/test/transforms/es5/antiClass.test.ts +0 -427
- package/test/transforms/es5/antiDestructuring.test.ts +0 -157
- package/test/transforms/es5/antiES6Object.test.ts +0 -245
- package/test/transforms/es5/antiTemplate.test.ts +0 -116
- package/test/transforms/es5/es5.test.ts +0 -110
- package/test/transforms/extraction/classExtraction.test.ts +0 -86
- package/test/transforms/extraction/duplicateLiteralsRemoval.test.ts +0 -200
- package/test/transforms/extraction/objectExtraction.test.ts +0 -491
- package/test/transforms/flatten.test.ts +0 -721
- package/test/transforms/hexadecimalNumbers.test.ts +0 -62
- package/test/transforms/identifier/globalConcealing.test.ts +0 -72
- package/test/transforms/identifier/movedDeclarations.test.ts +0 -275
- package/test/transforms/identifier/renameVariables.test.ts +0 -621
- package/test/transforms/lock/antiDebug.test.ts +0 -66
- package/test/transforms/lock/browserLock.test.ts +0 -129
- package/test/transforms/lock/countermeasures.test.ts +0 -100
- package/test/transforms/lock/integrity.test.ts +0 -161
- package/test/transforms/lock/lock.test.ts +0 -204
- package/test/transforms/lock/osLock.test.ts +0 -312
- package/test/transforms/lock/selfDefending.test.ts +0 -68
- package/test/transforms/minify.test.ts +0 -575
- package/test/transforms/opaquePredicates.test.ts +0 -43
- package/test/transforms/preparation.test.ts +0 -157
- package/test/transforms/renameLabels.test.ts +0 -95
- package/test/transforms/rgf.test.ts +0 -378
- package/test/transforms/shuffle.test.ts +0 -135
- package/test/transforms/stack.test.ts +0 -573
- package/test/transforms/string/stringCompression.test.ts +0 -120
- package/test/transforms/string/stringConcealing.test.ts +0 -299
- package/test/transforms/string/stringEncoding.test.ts +0 -95
- package/test/transforms/string/stringSplitting.test.ts +0 -135
- package/test/transforms/transform.test.ts +0 -66
- package/test/traverse.test.ts +0 -139
- package/test/util/compare.test.ts +0 -34
- package/test/util/gen.test.ts +0 -121
- package/test/util/identifiers.test.ts +0 -253
- package/test/util/insert.test.ts +0 -142
- package/test/util/math.test.ts +0 -5
- package/test/util/random.test.ts +0 -71
- /package/dist/{types.js → obfuscationResult.js} +0 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { NodePath } from "@babel/traverse";
|
|
2
|
+
import { PluginInstance } from "../transforms/plugin";
|
|
3
|
+
import Template from "./template";
|
|
4
|
+
import { UNSAFE } from "../constants";
|
|
5
|
+
|
|
6
|
+
export const createGetGlobalTemplate = (
|
|
7
|
+
pluginInstance: PluginInstance,
|
|
8
|
+
path: NodePath
|
|
9
|
+
) => {
|
|
10
|
+
if (pluginInstance.options.lock?.tamperProtection) {
|
|
11
|
+
return new Template(`
|
|
12
|
+
function {getGlobalFnName}(){
|
|
13
|
+
var localVar = false;
|
|
14
|
+
eval(__JS_CONFUSER_VAR__(localVar) + " = true")
|
|
15
|
+
if (!localVar) {
|
|
16
|
+
{countermeasures}
|
|
17
|
+
|
|
18
|
+
return {};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const root = eval("this");
|
|
22
|
+
return root;
|
|
23
|
+
}
|
|
24
|
+
`)
|
|
25
|
+
.addSymbols(UNSAFE)
|
|
26
|
+
.setDefaultVariables({
|
|
27
|
+
countermeasures:
|
|
28
|
+
pluginInstance.globalState.lock.createCountermeasuresCode(),
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return GetGlobalTemplate;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const GetGlobalTemplate = new Template(`
|
|
36
|
+
function {getGlobalFnName}(){
|
|
37
|
+
var array = [
|
|
38
|
+
function (){
|
|
39
|
+
return globalThis
|
|
40
|
+
},
|
|
41
|
+
function (){
|
|
42
|
+
return global
|
|
43
|
+
},
|
|
44
|
+
function (){
|
|
45
|
+
return window
|
|
46
|
+
},
|
|
47
|
+
function (){
|
|
48
|
+
return new Function("return this")()
|
|
49
|
+
}
|
|
50
|
+
];
|
|
51
|
+
|
|
52
|
+
var bestMatch
|
|
53
|
+
var itemsToSearch = []
|
|
54
|
+
try {
|
|
55
|
+
bestMatch = Object
|
|
56
|
+
itemsToSearch["push"](("")["__proto__"]["constructor"]["name"])
|
|
57
|
+
} catch(e) {
|
|
58
|
+
|
|
59
|
+
}
|
|
60
|
+
A: for(var i = 0; i < array["length"]; i++) {
|
|
61
|
+
try {
|
|
62
|
+
bestMatch = array[i]()
|
|
63
|
+
for(var j = 0; j < itemsToSearch["length"]; j++) {
|
|
64
|
+
if(typeof bestMatch[itemsToSearch[j]] === "undefined") continue A;
|
|
65
|
+
}
|
|
66
|
+
return bestMatch
|
|
67
|
+
} catch(e) {}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return bestMatch || this;
|
|
71
|
+
}
|
|
72
|
+
`);
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { MULTI_TRANSFORM, SKIP, UNSAFE } from "../constants";
|
|
2
|
+
import Template from "./template";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Hashing Algorithm for Integrity: `cyrb53`
|
|
6
|
+
* @param str
|
|
7
|
+
* @param seed
|
|
8
|
+
*/
|
|
9
|
+
export function HashFunction(str: string, seed: number) {
|
|
10
|
+
let h1 = 0xdeadbeef ^ seed,
|
|
11
|
+
h2 = 0x41c6ce57 ^ seed;
|
|
12
|
+
for (let i = 0, ch; i < str.length; i++) {
|
|
13
|
+
ch = str.charCodeAt(i);
|
|
14
|
+
h1 = Math.imul(h1 ^ ch, 2654435761);
|
|
15
|
+
h2 = Math.imul(h2 ^ ch, 1597334677);
|
|
16
|
+
}
|
|
17
|
+
h1 =
|
|
18
|
+
Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^
|
|
19
|
+
Math.imul(h2 ^ (h2 >>> 13), 3266489909);
|
|
20
|
+
h2 =
|
|
21
|
+
Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^
|
|
22
|
+
Math.imul(h1 ^ (h1 >>> 13), 3266489909);
|
|
23
|
+
return 4294967296 * (2097151 & h2) + (h1 >>> 0);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// In template form to be inserted into code
|
|
27
|
+
export const HashTemplate = new Template(`
|
|
28
|
+
// Must be Function Declaration for hoisting
|
|
29
|
+
// Math.imul polyfill for ES5
|
|
30
|
+
function {imul}(opA, opB) {
|
|
31
|
+
var MathImul = Math["imul"] || function(opA, opB){
|
|
32
|
+
opB |= 0; // ensure that opB is an integer. opA will automatically be coerced.
|
|
33
|
+
// floating points give us 53 bits of precision to work with plus 1 sign bit
|
|
34
|
+
// automatically handled for our convienence:
|
|
35
|
+
// 1. 0x003fffff /*opA & 0x000fffff*/ * 0x7fffffff /*opB*/ = 0x1fffff7fc00001
|
|
36
|
+
// 0x1fffff7fc00001 < Number.MAX_SAFE_INTEGER /*0x1fffffffffffff*/
|
|
37
|
+
var result = (opA & 0x003fffff) * opB;
|
|
38
|
+
// 2. We can remove an integer coersion from the statement above because:
|
|
39
|
+
// 0x1fffff7fc00001 + 0xffc00000 = 0x1fffffff800001
|
|
40
|
+
// 0x1fffffff800001 < Number.MAX_SAFE_INTEGER /*0x1fffffffffffff*/
|
|
41
|
+
if (opA & 0xffc00000 /*!== 0*/) result += (opA & 0xffc00000) * opB |0;
|
|
42
|
+
return result |0;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
var result = MathImul(opA, opB);
|
|
46
|
+
|
|
47
|
+
return result;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
function {hashingUtilFnName}(str, seed) {
|
|
52
|
+
var h1 = 0xdeadbeef ^ seed;
|
|
53
|
+
var h2 = 0x41c6ce57 ^ seed;
|
|
54
|
+
for (var i = 0, ch; i < str.length; i++) {
|
|
55
|
+
ch = str.charCodeAt(i);
|
|
56
|
+
h1 = {imul}(h1 ^ ch, 2654435761);
|
|
57
|
+
h2 = {imul}(h2 ^ ch, 1597334677);
|
|
58
|
+
}
|
|
59
|
+
h1 = {imul}(h1 ^ (h1>>>16), 2246822507) ^ {imul}(h2 ^ (h2>>>13), 3266489909);
|
|
60
|
+
h2 = {imul}(h2 ^ (h2>>>16), 2246822507) ^ {imul}(h1 ^ (h1>>>13), 3266489909);
|
|
61
|
+
return 4294967296 * (2097151 & h2) + (h1>>>0);
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
// Simple function that returns .toString() value with spaces replaced out
|
|
65
|
+
function {name}(fnObject, seed, regex={sensitivityRegex}){
|
|
66
|
+
var fnStringed = fnObject["toString"]()["replace"](regex, "");
|
|
67
|
+
return {hashingUtilFnName}(fnStringed, seed);
|
|
68
|
+
}
|
|
69
|
+
`).addSymbols(SKIP, MULTI_TRANSFORM);
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import Template from "./template";
|
|
2
|
+
|
|
3
|
+
export const StringCompressionTemplate = new Template(
|
|
4
|
+
`
|
|
5
|
+
var {stringFn};
|
|
6
|
+
|
|
7
|
+
(function (){
|
|
8
|
+
{GetGlobalTemplate}
|
|
9
|
+
|
|
10
|
+
var __globalObject = {getGlobalFnName}() || {};
|
|
11
|
+
var _atob = __globalObject["atob"];
|
|
12
|
+
var _Uint8Array = __globalObject["Uint8Array"];
|
|
13
|
+
|
|
14
|
+
function convertBase64ToArrayBuffer(base64) {
|
|
15
|
+
var binaryString = _atob(base64); // Decode Base64
|
|
16
|
+
var len = binaryString.length;
|
|
17
|
+
var uint8Array = new _Uint8Array(len);
|
|
18
|
+
|
|
19
|
+
// Convert binary string back into Uint8Array
|
|
20
|
+
for (var i = 0; i < len; i++) {
|
|
21
|
+
uint8Array[i] = binaryString["charCodeAt"](i);
|
|
22
|
+
}
|
|
23
|
+
return uint8Array;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
var compressedBuffer = convertBase64ToArrayBuffer({stringValue});
|
|
27
|
+
var utf8String = {pakoName}["inflate"](compressedBuffer, { to: 'string' });
|
|
28
|
+
var stringArray = utf8String["split"]({stringDelimiter});
|
|
29
|
+
|
|
30
|
+
{stringFn} = function(index){
|
|
31
|
+
return stringArray[index];
|
|
32
|
+
}
|
|
33
|
+
})();
|
|
34
|
+
`
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
export const PakoInflateMin = `
|
|
38
|
+
var {pako} = {};
|
|
39
|
+
|
|
40
|
+
/*! pako 2.1.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */
|
|
41
|
+
!function(e,t){ t({pako}) }(this,(function(e){"use strict";var t=function(e,t,i,n){for(var a=65535&e|0,r=e>>>16&65535|0,o=0;0!==i;){i-=o=i>2e3?2e3:i;do{r=r+(a=a+t[n++]|0)|0}while(--o);a%=65521,r%=65521}return a|r<<16|0},i=new Uint32Array(function(){for(var e,t=[],i=0;i<256;i++){e=i;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[i]=e}return t}()),n=function(e,t,n,a){var r=i,o=a+n;e^=-1;for(var s=a;s<o;s++)e=e>>>8^r[255&(e^t[s])];return-1^e},a=16209,r=function(e,t){var i,n,r,o,s,l,f,d,h,c,u,w,b,m,k,_,v,g,p,y,x,E,R,A,Z=e.state;i=e.next_in,R=e.input,n=i+(e.avail_in-5),r=e.next_out,A=e.output,o=r-(t-e.avail_out),s=r+(e.avail_out-257),l=Z.dmax,f=Z.wsize,d=Z.whave,h=Z.wnext,c=Z.window,u=Z.hold,w=Z.bits,b=Z.lencode,m=Z.distcode,k=(1<<Z.lenbits)-1,_=(1<<Z.distbits)-1;e:do{w<15&&(u+=R[i++]<<w,w+=8,u+=R[i++]<<w,w+=8),v=b[u&k];t:for(;;){if(u>>>=g=v>>>24,w-=g,0===(g=v>>>16&255))A[r++]=65535&v;else{if(!(16&g)){if(0==(64&g)){v=b[(65535&v)+(u&(1<<g)-1)];continue t}if(32&g){Z.mode=16191;break e}e.msg="invalid literal/length code",Z.mode=a;break e}p=65535&v,(g&=15)&&(w<g&&(u+=R[i++]<<w,w+=8),p+=u&(1<<g)-1,u>>>=g,w-=g),w<15&&(u+=R[i++]<<w,w+=8,u+=R[i++]<<w,w+=8),v=m[u&_];i:for(;;){if(u>>>=g=v>>>24,w-=g,!(16&(g=v>>>16&255))){if(0==(64&g)){v=m[(65535&v)+(u&(1<<g)-1)];continue i}e.msg="invalid distance code",Z.mode=a;break e}if(y=65535&v,w<(g&=15)&&(u+=R[i++]<<w,(w+=8)<g&&(u+=R[i++]<<w,w+=8)),(y+=u&(1<<g)-1)>l){e.msg="invalid distance too far back",Z.mode=a;break e}if(u>>>=g,w-=g,y>(g=r-o)){if((g=y-g)>d&&Z.sane){e.msg="invalid distance too far back",Z.mode=a;break e}if(x=0,E=c,0===h){if(x+=f-g,g<p){p-=g;do{A[r++]=c[x++]}while(--g);x=r-y,E=A}}else if(h<g){if(x+=f+h-g,(g-=h)<p){p-=g;do{A[r++]=c[x++]}while(--g);if(x=0,h<p){p-=g=h;do{A[r++]=c[x++]}while(--g);x=r-y,E=A}}}else if(x+=h-g,g<p){p-=g;do{A[r++]=c[x++]}while(--g);x=r-y,E=A}for(;p>2;)A[r++]=E[x++],A[r++]=E[x++],A[r++]=E[x++],p-=3;p&&(A[r++]=E[x++],p>1&&(A[r++]=E[x++]))}else{x=r-y;do{A[r++]=A[x++],A[r++]=A[x++],A[r++]=A[x++],p-=3}while(p>2);p&&(A[r++]=A[x++],p>1&&(A[r++]=A[x++]))}break}}break}}while(i<n&&r<s);i-=p=w>>3,u&=(1<<(w-=p<<3))-1,e.next_in=i,e.next_out=r,e.avail_in=i<n?n-i+5:5-(i-n),e.avail_out=r<s?s-r+257:257-(r-s),Z.hold=u,Z.bits=w},o=15,s=new Uint16Array([3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0]),l=new Uint8Array([16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78]),f=new Uint16Array([1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0]),d=new Uint8Array([16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64]),h=function(e,t,i,n,a,r,h,c){var u,w,b,m,k,_,v,g,p,y=c.bits,x=0,E=0,R=0,A=0,Z=0,S=0,T=0,O=0,U=0,D=0,I=null,B=new Uint16Array(16),N=new Uint16Array(16),C=null;for(x=0;x<=o;x++)B[x]=0;for(E=0;E<n;E++)B[t[i+E]]++;for(Z=y,A=o;A>=1&&0===B[A];A--);if(Z>A&&(Z=A),0===A)return a[r++]=20971520,a[r++]=20971520,c.bits=1,0;for(R=1;R<A&&0===B[R];R++);for(Z<R&&(Z=R),O=1,x=1;x<=o;x++)if(O<<=1,(O-=B[x])<0)return-1;if(O>0&&(0===e||1!==A))return-1;for(N[1]=0,x=1;x<o;x++)N[x+1]=N[x]+B[x];for(E=0;E<n;E++)0!==t[i+E]&&(h[N[t[i+E]]++]=E);if(0===e?(I=C=h,_=20):1===e?(I=s,C=l,_=257):(I=f,C=d,_=0),D=0,E=0,x=R,k=r,S=Z,T=0,b=-1,m=(U=1<<Z)-1,1===e&&U>852||2===e&&U>592)return 1;for(;;){v=x-T,h[E]+1<_?(g=0,p=h[E]):h[E]>=_?(g=C[h[E]-_],p=I[h[E]-_]):(g=96,p=0),u=1<<x-T,R=w=1<<S;do{a[k+(D>>T)+(w-=u)]=v<<24|g<<16|p|0}while(0!==w);for(u=1<<x-1;D&u;)u>>=1;if(0!==u?(D&=u-1,D+=u):D=0,E++,0==--B[x]){if(x===A)break;x=t[i+h[E]]}if(x>Z&&(D&m)!==b){for(0===T&&(T=Z),k+=R,O=1<<(S=x-T);S+T<A&&!((O-=B[S+T])<=0);)S++,O<<=1;if(U+=1<<S,1===e&&U>852||2===e&&U>592)return 1;a[b=D&m]=Z<<24|S<<16|k-r|0}}return 0!==D&&(a[k+D]=x-T<<24|64<<16|0),c.bits=Z,0},c={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8},u=c.Z_FINISH,w=c.Z_BLOCK,b=c.Z_TREES,m=c.Z_OK,k=c.Z_STREAM_END,_=c.Z_NEED_DICT,v=c.Z_STREAM_ERROR,g=c.Z_DATA_ERROR,p=c.Z_MEM_ERROR,y=c.Z_BUF_ERROR,x=c.Z_DEFLATED,E=16180,R=16190,A=16191,Z=16192,S=16194,T=16199,O=16200,U=16206,D=16209,I=function(e){return(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)};function B(){this.strm=null,this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}var N,C,z=function(e){if(!e)return 1;var t=e.state;return!t||t.strm!==e||t.mode<E||t.mode>16211?1:0},F=function(e){if(z(e))return v;var t=e.state;return e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=E,t.last=0,t.havedict=0,t.flags=-1,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new Int32Array(852),t.distcode=t.distdyn=new Int32Array(592),t.sane=1,t.back=-1,m},L=function(e){if(z(e))return v;var t=e.state;return t.wsize=0,t.whave=0,t.wnext=0,F(e)},M=function(e,t){var i;if(z(e))return v;var n=e.state;return t<0?(i=0,t=-t):(i=5+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?v:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=i,n.wbits=t,L(e))},H=function(e,t){if(!e)return v;var i=new B;e.state=i,i.strm=e,i.window=null,i.mode=E;var n=M(e,t);return n!==m&&(e.state=null),n},j=!0,K=function(e){if(j){N=new Int32Array(512),C=new Int32Array(32);for(var t=0;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(h(1,e.lens,0,288,N,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;h(2,e.lens,0,32,C,0,e.work,{bits:5}),j=!1}e.lencode=N,e.lenbits=9,e.distcode=C,e.distbits=5},P=function(e,t,i,n){var a,r=e.state;return null===r.window&&(r.wsize=1<<r.wbits,r.wnext=0,r.whave=0,r.window=new Uint8Array(r.wsize)),n>=r.wsize?(r.window.set(t.subarray(i-r.wsize,i),0),r.wnext=0,r.whave=r.wsize):((a=r.wsize-r.wnext)>n&&(a=n),r.window.set(t.subarray(i-n,i-n+a),r.wnext),(n-=a)?(r.window.set(t.subarray(i-n,i),0),r.wnext=n,r.whave=r.wsize):(r.wnext+=a,r.wnext===r.wsize&&(r.wnext=0),r.whave<r.wsize&&(r.whave+=a))),0},Y={inflateReset:L,inflateReset2:M,inflateResetKeep:F,inflateInit:function(e){return H(e,15)},inflateInit2:H,inflate:function(e,i){var a,o,s,l,f,d,c,B,N,C,F,L,M,H,j,Y,G,X,W,q,J,Q,V,$,ee=0,te=new Uint8Array(4),ie=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(z(e)||!e.output||!e.input&&0!==e.avail_in)return v;(a=e.state).mode===A&&(a.mode=Z),f=e.next_out,s=e.output,c=e.avail_out,l=e.next_in,o=e.input,d=e.avail_in,B=a.hold,N=a.bits,C=d,F=c,Q=m;e:for(;;)switch(a.mode){case E:if(0===a.wrap){a.mode=Z;break}for(;N<16;){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}if(2&a.wrap&&35615===B){0===a.wbits&&(a.wbits=15),a.check=0,te[0]=255&B,te[1]=B>>>8&255,a.check=n(a.check,te,2,0),B=0,N=0,a.mode=16181;break}if(a.head&&(a.head.done=!1),!(1&a.wrap)||(((255&B)<<8)+(B>>8))%31){e.msg="incorrect header check",a.mode=D;break}if((15&B)!==x){e.msg="unknown compression method",a.mode=D;break}if(N-=4,J=8+(15&(B>>>=4)),0===a.wbits&&(a.wbits=J),J>15||J>a.wbits){e.msg="invalid window size",a.mode=D;break}a.dmax=1<<a.wbits,a.flags=0,e.adler=a.check=1,a.mode=512&B?16189:A,B=0,N=0;break;case 16181:for(;N<16;){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}if(a.flags=B,(255&a.flags)!==x){e.msg="unknown compression method",a.mode=D;break}if(57344&a.flags){e.msg="unknown header flags set",a.mode=D;break}a.head&&(a.head.text=B>>8&1),512&a.flags&&4&a.wrap&&(te[0]=255&B,te[1]=B>>>8&255,a.check=n(a.check,te,2,0)),B=0,N=0,a.mode=16182;case 16182:for(;N<32;){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}a.head&&(a.head.time=B),512&a.flags&&4&a.wrap&&(te[0]=255&B,te[1]=B>>>8&255,te[2]=B>>>16&255,te[3]=B>>>24&255,a.check=n(a.check,te,4,0)),B=0,N=0,a.mode=16183;case 16183:for(;N<16;){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}a.head&&(a.head.xflags=255&B,a.head.os=B>>8),512&a.flags&&4&a.wrap&&(te[0]=255&B,te[1]=B>>>8&255,a.check=n(a.check,te,2,0)),B=0,N=0,a.mode=16184;case 16184:if(1024&a.flags){for(;N<16;){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}a.length=B,a.head&&(a.head.extra_len=B),512&a.flags&&4&a.wrap&&(te[0]=255&B,te[1]=B>>>8&255,a.check=n(a.check,te,2,0)),B=0,N=0}else a.head&&(a.head.extra=null);a.mode=16185;case 16185:if(1024&a.flags&&((L=a.length)>d&&(L=d),L&&(a.head&&(J=a.head.extra_len-a.length,a.head.extra||(a.head.extra=new Uint8Array(a.head.extra_len)),a.head.extra.set(o.subarray(l,l+L),J)),512&a.flags&&4&a.wrap&&(a.check=n(a.check,o,L,l)),d-=L,l+=L,a.length-=L),a.length))break e;a.length=0,a.mode=16186;case 16186:if(2048&a.flags){if(0===d)break e;L=0;do{J=o[l+L++],a.head&&J&&a.length<65536&&(a.head.name+=String.fromCharCode(J))}while(J&&L<d);if(512&a.flags&&4&a.wrap&&(a.check=n(a.check,o,L,l)),d-=L,l+=L,J)break e}else a.head&&(a.head.name=null);a.length=0,a.mode=16187;case 16187:if(4096&a.flags){if(0===d)break e;L=0;do{J=o[l+L++],a.head&&J&&a.length<65536&&(a.head.comment+=String.fromCharCode(J))}while(J&&L<d);if(512&a.flags&&4&a.wrap&&(a.check=n(a.check,o,L,l)),d-=L,l+=L,J)break e}else a.head&&(a.head.comment=null);a.mode=16188;case 16188:if(512&a.flags){for(;N<16;){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}if(4&a.wrap&&B!==(65535&a.check)){e.msg="header crc mismatch",a.mode=D;break}B=0,N=0}a.head&&(a.head.hcrc=a.flags>>9&1,a.head.done=!0),e.adler=a.check=0,a.mode=A;break;case 16189:for(;N<32;){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}e.adler=a.check=I(B),B=0,N=0,a.mode=R;case R:if(0===a.havedict)return e.next_out=f,e.avail_out=c,e.next_in=l,e.avail_in=d,a.hold=B,a.bits=N,_;e.adler=a.check=1,a.mode=A;case A:if(i===w||i===b)break e;case Z:if(a.last){B>>>=7&N,N-=7&N,a.mode=U;break}for(;N<3;){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}switch(a.last=1&B,N-=1,3&(B>>>=1)){case 0:a.mode=16193;break;case 1:if(K(a),a.mode=T,i===b){B>>>=2,N-=2;break e}break;case 2:a.mode=16196;break;case 3:e.msg="invalid block type",a.mode=D}B>>>=2,N-=2;break;case 16193:for(B>>>=7&N,N-=7&N;N<32;){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}if((65535&B)!=(B>>>16^65535)){e.msg="invalid stored block lengths",a.mode=D;break}if(a.length=65535&B,B=0,N=0,a.mode=S,i===b)break e;case S:a.mode=16195;case 16195:if(L=a.length){if(L>d&&(L=d),L>c&&(L=c),0===L)break e;s.set(o.subarray(l,l+L),f),d-=L,l+=L,c-=L,f+=L,a.length-=L;break}a.mode=A;break;case 16196:for(;N<14;){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}if(a.nlen=257+(31&B),B>>>=5,N-=5,a.ndist=1+(31&B),B>>>=5,N-=5,a.ncode=4+(15&B),B>>>=4,N-=4,a.nlen>286||a.ndist>30){e.msg="too many length or distance symbols",a.mode=D;break}a.have=0,a.mode=16197;case 16197:for(;a.have<a.ncode;){for(;N<3;){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}a.lens[ie[a.have++]]=7&B,B>>>=3,N-=3}for(;a.have<19;)a.lens[ie[a.have++]]=0;if(a.lencode=a.lendyn,a.lenbits=7,V={bits:a.lenbits},Q=h(0,a.lens,0,19,a.lencode,0,a.work,V),a.lenbits=V.bits,Q){e.msg="invalid code lengths set",a.mode=D;break}a.have=0,a.mode=16198;case 16198:for(;a.have<a.nlen+a.ndist;){for(;Y=(ee=a.lencode[B&(1<<a.lenbits)-1])>>>16&255,G=65535&ee,!((j=ee>>>24)<=N);){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}if(G<16)B>>>=j,N-=j,a.lens[a.have++]=G;else{if(16===G){for($=j+2;N<$;){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}if(B>>>=j,N-=j,0===a.have){e.msg="invalid bit length repeat",a.mode=D;break}J=a.lens[a.have-1],L=3+(3&B),B>>>=2,N-=2}else if(17===G){for($=j+3;N<$;){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}N-=j,J=0,L=3+(7&(B>>>=j)),B>>>=3,N-=3}else{for($=j+7;N<$;){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}N-=j,J=0,L=11+(127&(B>>>=j)),B>>>=7,N-=7}if(a.have+L>a.nlen+a.ndist){e.msg="invalid bit length repeat",a.mode=D;break}for(;L--;)a.lens[a.have++]=J}}if(a.mode===D)break;if(0===a.lens[256]){e.msg="invalid code -- missing end-of-block",a.mode=D;break}if(a.lenbits=9,V={bits:a.lenbits},Q=h(1,a.lens,0,a.nlen,a.lencode,0,a.work,V),a.lenbits=V.bits,Q){e.msg="invalid literal/lengths set",a.mode=D;break}if(a.distbits=6,a.distcode=a.distdyn,V={bits:a.distbits},Q=h(2,a.lens,a.nlen,a.ndist,a.distcode,0,a.work,V),a.distbits=V.bits,Q){e.msg="invalid distances set",a.mode=D;break}if(a.mode=T,i===b)break e;case T:a.mode=O;case O:if(d>=6&&c>=258){e.next_out=f,e.avail_out=c,e.next_in=l,e.avail_in=d,a.hold=B,a.bits=N,r(e,F),f=e.next_out,s=e.output,c=e.avail_out,l=e.next_in,o=e.input,d=e.avail_in,B=a.hold,N=a.bits,a.mode===A&&(a.back=-1);break}for(a.back=0;Y=(ee=a.lencode[B&(1<<a.lenbits)-1])>>>16&255,G=65535&ee,!((j=ee>>>24)<=N);){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}if(Y&&0==(240&Y)){for(X=j,W=Y,q=G;Y=(ee=a.lencode[q+((B&(1<<X+W)-1)>>X)])>>>16&255,G=65535&ee,!(X+(j=ee>>>24)<=N);){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}B>>>=X,N-=X,a.back+=X}if(B>>>=j,N-=j,a.back+=j,a.length=G,0===Y){a.mode=16205;break}if(32&Y){a.back=-1,a.mode=A;break}if(64&Y){e.msg="invalid literal/length code",a.mode=D;break}a.extra=15&Y,a.mode=16201;case 16201:if(a.extra){for($=a.extra;N<$;){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}a.length+=B&(1<<a.extra)-1,B>>>=a.extra,N-=a.extra,a.back+=a.extra}a.was=a.length,a.mode=16202;case 16202:for(;Y=(ee=a.distcode[B&(1<<a.distbits)-1])>>>16&255,G=65535&ee,!((j=ee>>>24)<=N);){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}if(0==(240&Y)){for(X=j,W=Y,q=G;Y=(ee=a.distcode[q+((B&(1<<X+W)-1)>>X)])>>>16&255,G=65535&ee,!(X+(j=ee>>>24)<=N);){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}B>>>=X,N-=X,a.back+=X}if(B>>>=j,N-=j,a.back+=j,64&Y){e.msg="invalid distance code",a.mode=D;break}a.offset=G,a.extra=15&Y,a.mode=16203;case 16203:if(a.extra){for($=a.extra;N<$;){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}a.offset+=B&(1<<a.extra)-1,B>>>=a.extra,N-=a.extra,a.back+=a.extra}if(a.offset>a.dmax){e.msg="invalid distance too far back",a.mode=D;break}a.mode=16204;case 16204:if(0===c)break e;if(L=F-c,a.offset>L){if((L=a.offset-L)>a.whave&&a.sane){e.msg="invalid distance too far back",a.mode=D;break}L>a.wnext?(L-=a.wnext,M=a.wsize-L):M=a.wnext-L,L>a.length&&(L=a.length),H=a.window}else H=s,M=f-a.offset,L=a.length;L>c&&(L=c),c-=L,a.length-=L;do{s[f++]=H[M++]}while(--L);0===a.length&&(a.mode=O);break;case 16205:if(0===c)break e;s[f++]=a.length,c--,a.mode=O;break;case U:if(a.wrap){for(;N<32;){if(0===d)break e;d--,B|=o[l++]<<N,N+=8}if(F-=c,e.total_out+=F,a.total+=F,4&a.wrap&&F&&(e.adler=a.check=a.flags?n(a.check,s,F,f-F):t(a.check,s,F,f-F)),F=c,4&a.wrap&&(a.flags?B:I(B))!==a.check){e.msg="incorrect data check",a.mode=D;break}B=0,N=0}a.mode=16207;case 16207:if(a.wrap&&a.flags){for(;N<32;){if(0===d)break e;d--,B+=o[l++]<<N,N+=8}if(4&a.wrap&&B!==(4294967295&a.total)){e.msg="incorrect length check",a.mode=D;break}B=0,N=0}a.mode=16208;case 16208:Q=k;break e;case D:Q=g;break e;case 16210:return p;default:return v}return e.next_out=f,e.avail_out=c,e.next_in=l,e.avail_in=d,a.hold=B,a.bits=N,(a.wsize||F!==e.avail_out&&a.mode<D&&(a.mode<U||i!==u))&&P(e,e.output,e.next_out,F-e.avail_out),C-=e.avail_in,F-=e.avail_out,e.total_in+=C,e.total_out+=F,a.total+=F,4&a.wrap&&F&&(e.adler=a.check=a.flags?n(a.check,s,F,e.next_out-F):t(a.check,s,F,e.next_out-F)),e.data_type=a.bits+(a.last?64:0)+(a.mode===A?128:0)+(a.mode===T||a.mode===S?256:0),(0===C&&0===F||i===u)&&Q===m&&(Q=y),Q},inflateEnd:function(e){if(z(e))return v;var t=e.state;return t.window&&(t.window=null),e.state=null,m},inflateGetHeader:function(e,t){if(z(e))return v;var i=e.state;return 0==(2&i.wrap)?v:(i.head=t,t.done=!1,m)},inflateSetDictionary:function(e,i){var n,a=i.length;return z(e)||0!==(n=e.state).wrap&&n.mode!==R?v:n.mode===R&&t(1,i,a,0)!==n.check?g:P(e,i,a,a)?(n.mode=16210,p):(n.havedict=1,m)},inflateInfo:"pako inflate (from Nodeca project)"};function G(e){return G="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},G(e)}var X=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},W=function(e){for(var t=Array.prototype.slice.call(arguments,1);t.length;){var i=t.shift();if(i){if("object"!==G(i))throw new TypeError(i+"must be non-object");for(var n in i)X(i,n)&&(e[n]=i[n])}}return e},q=function(e){for(var t=0,i=0,n=e.length;i<n;i++)t+=e[i].length;for(var a=new Uint8Array(t),r=0,o=0,s=e.length;r<s;r++){var l=e[r];a.set(l,o),o+=l.length}return a},J=!0;try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(e){J=!1}for(var Q=new Uint8Array(256),V=0;V<256;V++)Q[V]=V>=252?6:V>=248?5:V>=240?4:V>=224?3:V>=192?2:1;Q[254]=Q[254]=1;var $=function(e){if("function"==typeof TextEncoder&&TextEncoder.prototype.encode)return(new TextEncoder).encode(e);var t,i,n,a,r,o=e.length,s=0;for(a=0;a<o;a++)55296==(64512&(i=e.charCodeAt(a)))&&a+1<o&&56320==(64512&(n=e.charCodeAt(a+1)))&&(i=65536+(i-55296<<10)+(n-56320),a++),s+=i<128?1:i<2048?2:i<65536?3:4;for(t=new Uint8Array(s),r=0,a=0;r<s;a++)55296==(64512&(i=e.charCodeAt(a)))&&a+1<o&&56320==(64512&(n=e.charCodeAt(a+1)))&&(i=65536+(i-55296<<10)+(n-56320),a++),i<128?t[r++]=i:i<2048?(t[r++]=192|i>>>6,t[r++]=128|63&i):i<65536?(t[r++]=224|i>>>12,t[r++]=128|i>>>6&63,t[r++]=128|63&i):(t[r++]=240|i>>>18,t[r++]=128|i>>>12&63,t[r++]=128|i>>>6&63,t[r++]=128|63&i);return t},ee=function(e,t){var i,n,a=t||e.length;if("function"==typeof TextDecoder&&TextDecoder.prototype.decode)return(new TextDecoder).decode(e.subarray(0,t));var r=new Array(2*a);for(n=0,i=0;i<a;){var o=e[i++];if(o<128)r[n++]=o;else{var s=Q[o];if(s>4)r[n++]=65533,i+=s-1;else{for(o&=2===s?31:3===s?15:7;s>1&&i<a;)o=o<<6|63&e[i++],s--;s>1?r[n++]=65533:o<65536?r[n++]=o:(o-=65536,r[n++]=55296|o>>10&1023,r[n++]=56320|1023&o)}}}return function(e,t){if(t<65534&&e.subarray&&J)return String.fromCharCode.apply(null,e.length===t?e:e.subarray(0,t));for(var i="",n=0;n<t;n++)i+=String.fromCharCode(e[n]);return i}(r,n)},te=function(e,t){(t=t||e.length)>e.length&&(t=e.length);for(var i=t-1;i>=0&&128==(192&e[i]);)i--;return i<0||0===i?t:i+Q[e[i]]>t?i:t},ie={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"};var ne=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0};var ae=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1},re=Object.prototype.toString,oe=c.Z_NO_FLUSH,se=c.Z_FINISH,le=c.Z_OK,fe=c.Z_STREAM_END,de=c.Z_NEED_DICT,he=c.Z_STREAM_ERROR,ce=c.Z_DATA_ERROR,ue=c.Z_MEM_ERROR;function we(e){this.options=W({chunkSize:65536,windowBits:15,to:""},e||{});var t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new ne,this.strm.avail_out=0;var i=Y.inflateInit2(this.strm,t.windowBits);if(i!==le)throw new Error(ie[i]);if(this.header=new ae,Y.inflateGetHeader(this.strm,this.header),t.dictionary&&("string"==typeof t.dictionary?t.dictionary=$(t.dictionary):"[object ArrayBuffer]"===re.call(t.dictionary)&&(t.dictionary=new Uint8Array(t.dictionary)),t.raw&&(i=Y.inflateSetDictionary(this.strm,t.dictionary))!==le))throw new Error(ie[i])}function be(e,t){var i=new we(t);if(i.push(e),i.err)throw i.msg||ie[i.err];return i.result}we.prototype.push=function(e,t){var i,n,a,r=this.strm,o=this.options.chunkSize,s=this.options.dictionary;if(this.ended)return!1;for(n=t===~~t?t:!0===t?se:oe,"[object ArrayBuffer]"===re.call(e)?r.input=new Uint8Array(e):r.input=e,r.next_in=0,r.avail_in=r.input.length;;){for(0===r.avail_out&&(r.output=new Uint8Array(o),r.next_out=0,r.avail_out=o),(i=Y.inflate(r,n))===de&&s&&((i=Y.inflateSetDictionary(r,s))===le?i=Y.inflate(r,n):i===ce&&(i=de));r.avail_in>0&&i===fe&&r.state.wrap>0&&0!==e[r.next_in];)Y.inflateReset(r),i=Y.inflate(r,n);switch(i){case he:case ce:case de:case ue:return this.onEnd(i),this.ended=!0,!1}if(a=r.avail_out,r.next_out&&(0===r.avail_out||i===fe))if("string"===this.options.to){var l=te(r.output,r.next_out),f=r.next_out-l,d=ee(r.output,l);r.next_out=f,r.avail_out=o-f,f&&r.output.set(r.output.subarray(l,l+f),0),this.onData(d)}else this.onData(r.output.length===r.next_out?r.output:r.output.subarray(0,r.next_out));if(i!==le||0!==a){if(i===fe)return i=Y.inflateEnd(this.strm),this.onEnd(i),this.ended=!0,!0;if(0===r.avail_in)break}}return!0},we.prototype.onData=function(e){this.chunks.push(e)},we.prototype.onEnd=function(e){e===le&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=q(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg};var me=we,ke=be,_e=function(e,t){return(t=t||{}).raw=!0,be(e,t)},ve=be,ge=c,pe={Inflate:me,inflate:ke,inflateRaw:_e,ungzip:ve,constants:ge};e.Inflate=me,e.constants=ge,e.default=pe,e.inflate=ke,e.inflateRaw=_e,e.ungzip=ve,Object.defineProperty(e,"__esModule",{value:!0})}));
|
|
42
|
+
`;
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { NodePath } from "@babel/traverse";
|
|
2
|
+
import { PluginInstance } from "../transforms/plugin";
|
|
3
|
+
import Template from "./template";
|
|
4
|
+
import { MULTI_TRANSFORM, UNSAFE } from "../constants";
|
|
5
|
+
|
|
6
|
+
export const StrictModeTemplate = new Template(`
|
|
7
|
+
(function(){
|
|
8
|
+
function isStrictMode(){
|
|
9
|
+
try {
|
|
10
|
+
var arr = []
|
|
11
|
+
delete arr["length"]
|
|
12
|
+
} catch(e) {
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
if(isStrictMode()) {
|
|
19
|
+
{countermeasures}
|
|
20
|
+
{nativeFunctionName} = undefined;
|
|
21
|
+
}
|
|
22
|
+
})()
|
|
23
|
+
`);
|
|
24
|
+
|
|
25
|
+
export const IndexOfTemplate = new Template(`
|
|
26
|
+
function indexOf(str, substr) {
|
|
27
|
+
const len = str.length;
|
|
28
|
+
const sublen = substr.length;
|
|
29
|
+
let count = 0;
|
|
30
|
+
|
|
31
|
+
if (sublen > len) {
|
|
32
|
+
return -1;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
for (let i = 0; i <= len - sublen; i++) {
|
|
36
|
+
for (let j = 0; j < sublen; j++) {
|
|
37
|
+
if (str[i + j] === substr[j]) {
|
|
38
|
+
count++;
|
|
39
|
+
if (count === sublen) {
|
|
40
|
+
return i;
|
|
41
|
+
}
|
|
42
|
+
} else {
|
|
43
|
+
count = 0;
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return -1;
|
|
50
|
+
}
|
|
51
|
+
`);
|
|
52
|
+
|
|
53
|
+
export const NativeFunctionTemplate = new Template(`
|
|
54
|
+
function {nativeFunctionName}() {
|
|
55
|
+
{IndexOfTemplate}
|
|
56
|
+
|
|
57
|
+
function checkFunction(fn) {
|
|
58
|
+
if (
|
|
59
|
+
indexOf("" + fn, "{ [native code] }") === -1 ||
|
|
60
|
+
typeof Object.getOwnPropertyDescriptor(fn, "toString") !== "undefined"
|
|
61
|
+
) {
|
|
62
|
+
{countermeasures}
|
|
63
|
+
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return fn;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
var args = arguments;
|
|
71
|
+
if (args.length === 1) {
|
|
72
|
+
return checkFunction(args[0]);
|
|
73
|
+
} else if (args.length === 2) {
|
|
74
|
+
var object = args[0];
|
|
75
|
+
var property = args[1];
|
|
76
|
+
|
|
77
|
+
var fn = object[property];
|
|
78
|
+
fn = checkFunction(fn);
|
|
79
|
+
|
|
80
|
+
return fn.bind(object);
|
|
81
|
+
}
|
|
82
|
+
}`).addSymbols(UNSAFE, MULTI_TRANSFORM);
|
|
83
|
+
|
|
84
|
+
export const createEvalIntegrityTemplate = (
|
|
85
|
+
pluginInstance: PluginInstance,
|
|
86
|
+
path: NodePath
|
|
87
|
+
) => {
|
|
88
|
+
if (pluginInstance.options.lock?.tamperProtection) {
|
|
89
|
+
return new Template(`
|
|
90
|
+
function {EvalIntegrityName}(){
|
|
91
|
+
var localVar = false;
|
|
92
|
+
eval(__JS_CONFUSER_VAR__(localVar) + " = true")
|
|
93
|
+
|
|
94
|
+
if (!localVar) {
|
|
95
|
+
// Eval was tampered!
|
|
96
|
+
{countermeasures}
|
|
97
|
+
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
`)
|
|
104
|
+
.addSymbols(UNSAFE)
|
|
105
|
+
.setDefaultVariables({
|
|
106
|
+
countermeasures:
|
|
107
|
+
pluginInstance.globalState.lock.createCountermeasuresCode(),
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return new Template(`
|
|
112
|
+
function {EvalIntegrityName}(a = true){
|
|
113
|
+
return a;
|
|
114
|
+
}
|
|
115
|
+
`);
|
|
116
|
+
};
|
|
@@ -1,131 +1,222 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
1
|
+
import * as babelTypes from "@babel/types";
|
|
2
|
+
import { parse } from "@babel/parser";
|
|
3
|
+
import traverse from "@babel/traverse";
|
|
4
|
+
import { NodePath } from "@babel/traverse";
|
|
3
5
|
import { ok } from "assert";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
+
import { getRandomString } from "../utils/random-utils";
|
|
7
|
+
import { NodeSymbol } from "../constants";
|
|
8
|
+
|
|
9
|
+
// Create a union type of the symbol keys in NodeSymbol
|
|
10
|
+
type NodeSymbolKeys = keyof {
|
|
11
|
+
[K in keyof NodeSymbol as K extends symbol ? K : never]: NodeSymbol[K];
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export interface TemplateVariables {
|
|
15
|
+
[varName: string]:
|
|
16
|
+
| string
|
|
17
|
+
| number
|
|
18
|
+
| (() => babelTypes.Node | babelTypes.Node[] | Template)
|
|
19
|
+
| babelTypes.Node
|
|
20
|
+
| babelTypes.Node[]
|
|
21
|
+
| Template;
|
|
22
|
+
}
|
|
6
23
|
|
|
7
|
-
export
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
24
|
+
export default class Template {
|
|
25
|
+
private templates: string[];
|
|
26
|
+
private defaultVariables: TemplateVariables;
|
|
27
|
+
private requiredVariables: Set<string>;
|
|
28
|
+
private astVariableMappings: Map<string, string>;
|
|
29
|
+
private astIdentifierPrefix = "__t_" + getRandomString(6);
|
|
30
|
+
private symbols: NodeSymbolKeys[] = [];
|
|
12
31
|
|
|
13
|
-
|
|
32
|
+
constructor(...templates: string[]) {
|
|
33
|
+
this.templates = templates;
|
|
34
|
+
this.defaultVariables = Object.create(null);
|
|
35
|
+
this.requiredVariables = new Set<string>();
|
|
14
36
|
|
|
15
|
-
|
|
37
|
+
this.findRequiredVariables();
|
|
38
|
+
}
|
|
16
39
|
|
|
17
|
-
|
|
40
|
+
addSymbols(...symbols: NodeSymbolKeys[]): this {
|
|
41
|
+
this.symbols.push(...symbols);
|
|
42
|
+
return this;
|
|
43
|
+
}
|
|
18
44
|
|
|
19
|
-
|
|
45
|
+
setDefaultVariables(defaultVariables: TemplateVariables): this {
|
|
46
|
+
this.defaultVariables = defaultVariables;
|
|
47
|
+
return this;
|
|
48
|
+
}
|
|
20
49
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
50
|
+
private findRequiredVariables() {
|
|
51
|
+
const matches = this.templates[0].match(/{[$A-Za-z0-9_]+}/g);
|
|
52
|
+
if (matches !== null) {
|
|
53
|
+
matches.forEach((variable) => {
|
|
54
|
+
const name = variable.slice(1, -1);
|
|
24
55
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
var requiredVariables = new Set<string>();
|
|
29
|
-
var providedVariables = {};
|
|
30
|
-
var defaultVariables: { [key: string]: string } = Object.create(null);
|
|
31
|
-
|
|
32
|
-
// This may picked up "$mb[pP`x]" from String Encoding function
|
|
33
|
-
// ignoreMissingVariables() prevents this
|
|
34
|
-
var matches = templates[0].match(/{[$A-z0-9_]+}/g);
|
|
35
|
-
if (matches !== null) {
|
|
36
|
-
matches.forEach((variable) => {
|
|
37
|
-
var name = variable.slice(1, -1);
|
|
38
|
-
|
|
39
|
-
// $ variables are for default variables
|
|
40
|
-
if (name.startsWith("$")) {
|
|
41
|
-
defaultVariables[name] =
|
|
42
|
-
placeholderVariablePrefix +
|
|
43
|
-
"td_" +
|
|
44
|
-
Object.keys(defaultVariables).length;
|
|
45
|
-
} else {
|
|
46
|
-
requiredVariables.add(name);
|
|
47
|
-
}
|
|
48
|
-
});
|
|
56
|
+
this.requiredVariables.add(name);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
49
59
|
}
|
|
50
60
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
) {
|
|
54
|
-
var userVariables = { ...providedVariables, ...variables };
|
|
61
|
+
private interpolateTemplate(variables: TemplateVariables) {
|
|
62
|
+
const allVariables = { ...this.defaultVariables, ...variables };
|
|
55
63
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
if (typeof userVariables[requiredVariable] === "undefined") {
|
|
64
|
+
for (const requiredVariable of this.requiredVariables) {
|
|
65
|
+
if (typeof allVariables[requiredVariable] === "undefined") {
|
|
59
66
|
throw new Error(
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
67
|
+
`${
|
|
68
|
+
this.templates[0]
|
|
69
|
+
} missing variable: ${requiredVariable} from ${JSON.stringify(
|
|
70
|
+
allVariables
|
|
71
|
+
)}`
|
|
65
72
|
);
|
|
66
73
|
}
|
|
67
74
|
}
|
|
68
75
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
};
|
|
76
|
+
const template =
|
|
77
|
+
this.templates[Math.floor(Math.random() * this.templates.length)];
|
|
78
|
+
let output = template;
|
|
79
|
+
|
|
80
|
+
this.astVariableMappings = new Map();
|
|
75
81
|
|
|
76
82
|
Object.keys(allVariables).forEach((name) => {
|
|
77
|
-
|
|
78
|
-
|
|
83
|
+
const bracketName = `{${name.replace("$", "\\$")}}`;
|
|
84
|
+
let value = allVariables[name] as string;
|
|
79
85
|
|
|
80
|
-
|
|
86
|
+
if (this.isASTVariable(value)) {
|
|
87
|
+
let astIdentifierName = this.astIdentifierPrefix + name;
|
|
88
|
+
this.astVariableMappings.set(name, astIdentifierName);
|
|
81
89
|
|
|
90
|
+
value = astIdentifierName;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const reg = new RegExp(bracketName, "g");
|
|
82
94
|
output = output.replace(reg, value);
|
|
83
95
|
});
|
|
84
96
|
|
|
85
97
|
return { output, template };
|
|
86
98
|
}
|
|
87
99
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
100
|
+
private isASTVariable(variable: any): boolean {
|
|
101
|
+
return typeof variable !== "string" && typeof variable !== "number";
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
private interpolateAST(ast: babelTypes.Node, variables: TemplateVariables) {
|
|
105
|
+
if (this.astVariableMappings.size === 0) return;
|
|
92
106
|
|
|
93
|
-
|
|
107
|
+
const allVariables = { ...this.defaultVariables, ...variables };
|
|
108
|
+
const template = this;
|
|
109
|
+
|
|
110
|
+
// Reverse the lookup map
|
|
111
|
+
// Before {name -> __t_m4H6nk_name}
|
|
112
|
+
// After {__t_m4H6nk_name -> name}
|
|
113
|
+
const reverseMappings = new Map<string, string>();
|
|
114
|
+
this.astVariableMappings.forEach((value, key) => {
|
|
115
|
+
reverseMappings.set(value, key);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
const insertedVariables = new Set<string>();
|
|
119
|
+
|
|
120
|
+
traverse(ast, {
|
|
121
|
+
Identifier(path: NodePath<babelTypes.Identifier>) {
|
|
122
|
+
const idName = path.node.name;
|
|
123
|
+
if (!idName.startsWith(template.astIdentifierPrefix)) return;
|
|
124
|
+
|
|
125
|
+
const variableName = reverseMappings.get(idName);
|
|
126
|
+
ok(variableName, `Variable ${idName} not found in mappings`);
|
|
127
|
+
|
|
128
|
+
let value = allVariables[variableName];
|
|
129
|
+
let isSingleUse = true; // Hard-coded nodes are deemed 'single use'
|
|
130
|
+
if (typeof value === "function") {
|
|
131
|
+
value = value();
|
|
132
|
+
isSingleUse = false;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if (value instanceof Template) {
|
|
136
|
+
value = value.compile(allVariables);
|
|
137
|
+
isSingleUse = false;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Duplicate node check
|
|
141
|
+
if (isSingleUse) {
|
|
142
|
+
if (insertedVariables.has(variableName)) {
|
|
143
|
+
ok(false, "Duplicate node inserted for variable: " + variableName);
|
|
144
|
+
}
|
|
145
|
+
insertedVariables.add(variableName);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Insert new nodes
|
|
149
|
+
if (!Array.isArray(value)) {
|
|
150
|
+
path.replaceWith(value as babelTypes.Node);
|
|
151
|
+
} else {
|
|
152
|
+
path.replaceWithMultiple(value as babelTypes.Node[]);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
path.skip();
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
file(variables: TemplateVariables = {}): babelTypes.File {
|
|
161
|
+
const { output } = this.interpolateTemplate(variables);
|
|
162
|
+
|
|
163
|
+
let file: babelTypes.File;
|
|
164
|
+
try {
|
|
165
|
+
file = parse(output, {
|
|
166
|
+
sourceType: "module",
|
|
167
|
+
allowReturnOutsideFunction: true,
|
|
168
|
+
});
|
|
94
169
|
} catch (e) {
|
|
95
|
-
console.error(e);
|
|
96
|
-
console.error(template);
|
|
97
|
-
console.error({ ...providedVariables, ...variables });
|
|
98
170
|
throw new Error(
|
|
99
|
-
"Template failed to parse:
|
|
171
|
+
output + "\n" + "Template failed to parse: " + (e as Error).message
|
|
100
172
|
);
|
|
101
173
|
}
|
|
102
|
-
}
|
|
103
174
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
175
|
+
this.interpolateAST(file, variables);
|
|
176
|
+
|
|
177
|
+
if (this.symbols.length > 0) {
|
|
178
|
+
file.program.body.forEach((node) => {
|
|
179
|
+
for (const symbol of this.symbols) {
|
|
180
|
+
node[symbol] = true;
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
return file;
|
|
107
186
|
}
|
|
108
187
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
188
|
+
compile(variables: TemplateVariables = {}): babelTypes.Statement[] {
|
|
189
|
+
const file = this.file(variables);
|
|
190
|
+
|
|
191
|
+
return file.program.body;
|
|
112
192
|
}
|
|
113
193
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
194
|
+
single<T extends babelTypes.Statement>(variables: TemplateVariables = {}): T {
|
|
195
|
+
const nodes = this.compile(variables);
|
|
196
|
+
|
|
197
|
+
if (nodes.length !== 1) {
|
|
198
|
+
const filteredNodes = nodes.filter(
|
|
199
|
+
(node) => node.type !== "EmptyStatement"
|
|
200
|
+
);
|
|
201
|
+
ok(
|
|
202
|
+
filteredNodes.length === 1,
|
|
203
|
+
`Expected single node, got ${filteredNodes
|
|
204
|
+
.map((node) => node.type)
|
|
205
|
+
.join(", ")}`
|
|
206
|
+
);
|
|
207
|
+
return filteredNodes[0] as T;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
return nodes[0] as T;
|
|
118
211
|
}
|
|
119
212
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
single
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
return obj;
|
|
213
|
+
expression<T extends babelTypes.Expression>(
|
|
214
|
+
variables: TemplateVariables = {}
|
|
215
|
+
): T {
|
|
216
|
+
const statement = this.single(variables);
|
|
217
|
+
|
|
218
|
+
babelTypes.assertExpressionStatement(statement);
|
|
219
|
+
|
|
220
|
+
return statement.expression as T;
|
|
221
|
+
}
|
|
131
222
|
}
|