diff --git a/dist/index.js b/dist/index.js index 604ae482..c932db66 100644 --- a/dist/index.js +++ b/dist/index.js @@ -257,6 +257,7 @@ module.exports = function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + var chance_1 = __webpack_require__(39); var JSFuck_1 = __webpack_require__(8); var Utils = function () { @@ -304,9 +305,9 @@ module.exports = return (dec + Math.pow(radix, exponent)).toString(radix).substr(decToHexSliceValue).replace(Utils.hexRepetitiveZerosRegExp, ''); } }, { - key: 'getRandomInteger', - value: function getRandomInteger(min, max) { - return Math.round(Math.floor(Math.random() * (max - min + 1)) + min); + key: 'getRandomGenerator', + value: function getRandomGenerator() { + return Utils.randomGenerator; } }, { key: 'getRandomVariableName', @@ -316,7 +317,10 @@ module.exports = var rangeMinInteger = 10000, rangeMaxInteger = 99999999, prefix = '_0x'; - return '' + prefix + Utils.decToHex(Utils.getRandomInteger(rangeMinInteger, rangeMaxInteger)).substr(0, length); + return '' + prefix + Utils.decToHex(Utils.getRandomGenerator().integer({ + min: rangeMinInteger, + max: rangeMaxInteger + })).substr(0, length); } }, { key: 'isInteger', @@ -359,6 +363,7 @@ module.exports = }(); Utils.hexRepetitiveZerosRegExp = new RegExp('^(0{2,})+(?!$)', ''); + Utils.randomGenerator = new chance_1.Chance(); exports.Utils = Utils; /***/ }, @@ -1216,7 +1221,10 @@ module.exports = key: 'appendNode', value: function appendNode(blockScopeNode) { var programBodyLength = blockScopeNode.body.length, - randomIndex = Utils_1.Utils.getRandomInteger(0, programBodyLength); + randomIndex = Utils_1.Utils.getRandomGenerator().integer({ + min: 0, + max: programBodyLength + }); NodeUtils_1.NodeUtils.insertNodeAtIndex(blockScopeNode.body, this.getNode(), randomIndex); } }, { @@ -1279,7 +1287,10 @@ module.exports = var programBodyLength = blockScopeNode.body.length, randomIndex = 0; if (programBodyLength > 2) { - randomIndex = Utils_1.Utils.getRandomInteger(programBodyLength / 2, programBodyLength - 1); + randomIndex = Utils_1.Utils.getRandomGenerator().integer({ + min: programBodyLength / 2, + max: programBodyLength - 1 + }); } NodeUtils_1.NodeUtils.insertNodeAtIndex(blockScopeNode.body, this.getNode(), randomIndex); } @@ -1745,7 +1756,14 @@ module.exports = _this.unicodeArrayName = Utils_1.Utils.getRandomVariableName(UnicodeArrayNode_1.UnicodeArrayNode.UNICODE_ARRAY_RANDOM_LENGTH); _this.unicodeArrayTranslatorName = Utils_1.Utils.getRandomVariableName(UnicodeArrayNode_1.UnicodeArrayNode.UNICODE_ARRAY_RANDOM_LENGTH); - _this.unicodeArrayRotateValue = _this.options.get('rotateUnicodeArray') ? Utils_1.Utils.getRandomInteger(100, 500) : 0; + if (_this.options.get('rotateUnicodeArray')) { + _this.unicodeArrayRotateValue = Utils_1.Utils.getRandomGenerator().integer({ + min: 100, + max: 500 + }); + } else { + _this.unicodeArrayRotateValue = 0; + } var unicodeArrayNode = new UnicodeArrayNode_1.UnicodeArrayNode(_this.unicodeArrayName, _this.unicodeArrayRotateValue, _this.options), unicodeArray = unicodeArrayNode.getNodeData(); _this.nodes.set('unicodeArrayNode', unicodeArrayNode); @@ -2443,6 +2461,12 @@ module.exports = wrapUnicodeArrayCalls: true }); +/***/ }, +/* 39 */ +/***/ function(module, exports) { + + module.exports = require("chance"); + /***/ } /******/ ]); //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/package.json b/package.json index 41faa4bf..6f405480 100644 --- a/package.json +++ b/package.json @@ -13,8 +13,9 @@ ], "main": "dist/index.js", "dependencies": { - "esprima": "^2.7.2", + "chance": "^1.0.3", "escodegen": "^1.8.0", + "esprima": "^2.7.2", "estraverse": "^4.2.0" }, "devDependencies": { diff --git a/src/Utils.ts b/src/Utils.ts index b0f35a74..bcc38190 100644 --- a/src/Utils.ts +++ b/src/Utils.ts @@ -1,3 +1,5 @@ +import { Chance } from 'chance'; + import { JSFuck } from './enums/JSFuck'; export class Utils { @@ -6,6 +8,11 @@ export class Utils { */ private static hexRepetitiveZerosRegExp: RegExp = new RegExp('^(0{2,})+(?!$)', ''); + /** + * @type {Chance.Chance} + */ + private static randomGenerator: Chance.Chance = new Chance(); + /** * @param array * @param searchElement @@ -65,12 +72,10 @@ export class Utils { } /** - * @param min - * @param max - * @returns {number} + * @returns {Chance.Chance} */ - public static getRandomInteger (min: number, max: number): number { - return Math.round(Math.floor(Math.random() * (max - min + 1)) + min); + public static getRandomGenerator (): Chance.Chance { + return Utils.randomGenerator; } /** @@ -82,7 +87,14 @@ export class Utils { rangeMaxInteger: number = 99999999, prefix: string = '_0x'; - return `${prefix}${(Utils.decToHex(Utils.getRandomInteger(rangeMinInteger, rangeMaxInteger))).substr(0, length)}`; + return `${prefix}${( + Utils.decToHex( + Utils.getRandomGenerator().integer({ + min: rangeMinInteger, + max: rangeMaxInteger + }) + ) + ).substr(0, length)}`; } /** diff --git a/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionNode.ts b/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionNode.ts index d067c690..a827b4ae 100644 --- a/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionNode.ts +++ b/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionNode.ts @@ -32,7 +32,10 @@ export class DebugProtectionFunctionNode extends Node { */ public appendNode (blockScopeNode: TBlockScopeNode): void { let programBodyLength: number = blockScopeNode.body.length, - randomIndex: number = Utils.getRandomInteger(0, programBodyLength); + randomIndex: number = Utils.getRandomGenerator().integer({ + min: 0, + max: programBodyLength + }); NodeUtils.insertNodeAtIndex(blockScopeNode.body, this.getNode(), randomIndex); } diff --git a/src/custom-nodes/self-defending-nodes/SelfDefendingUnicodeNode.ts b/src/custom-nodes/self-defending-nodes/SelfDefendingUnicodeNode.ts index 07132c04..b0832cfe 100644 --- a/src/custom-nodes/self-defending-nodes/SelfDefendingUnicodeNode.ts +++ b/src/custom-nodes/self-defending-nodes/SelfDefendingUnicodeNode.ts @@ -38,7 +38,10 @@ export class SelfDefendingUnicodeNode extends Node { randomIndex: number = 0; if (programBodyLength > 2) { - randomIndex = Utils.getRandomInteger(programBodyLength / 2, programBodyLength - 1); + randomIndex = Utils.getRandomGenerator().integer({ + min: programBodyLength / 2, + max: programBodyLength - 1 + }); } NodeUtils.insertNodeAtIndex(blockScopeNode.body, this.getNode(), randomIndex); diff --git a/src/node-groups/UnicodeArrayNodesGroup.ts b/src/node-groups/UnicodeArrayNodesGroup.ts index 8d8d711f..863df5c5 100644 --- a/src/node-groups/UnicodeArrayNodesGroup.ts +++ b/src/node-groups/UnicodeArrayNodesGroup.ts @@ -29,7 +29,14 @@ export class UnicodeArrayNodesGroup extends NodesGroup { constructor (options: IOptions) { super(options); - this.unicodeArrayRotateValue = this.options.get('rotateUnicodeArray') ? Utils.getRandomInteger(100, 500) : 0; + if (this.options.get('rotateUnicodeArray')) { + this.unicodeArrayRotateValue = Utils.getRandomGenerator().integer({ + min: 100, + max: 500 + }); + } else { + this.unicodeArrayRotateValue = 0; + } let unicodeArrayNode: UnicodeArrayNode = new UnicodeArrayNode( this.unicodeArrayName, diff --git a/typings.json b/typings.json index e8c2027e..f6deb5b0 100644 --- a/typings.json +++ b/typings.json @@ -3,6 +3,7 @@ "version": false, "ambientDependencies": { "node": "github:DefinitelyTyped/DefinitelyTyped/node/node.d.ts#6834f97fb33561a3ad40695084da2b660efaee29", + "chance": "github:DefinitelyTyped/DefinitelyTyped/chance/chance.d.ts", "estree": "github:DefinitelyTyped/DefinitelyTyped/estree/estree.d.ts", "esprima": "github:DefinitelyTyped/DefinitelyTyped/esprima/esprima.d.ts", "escodegen": "github:DefinitelyTyped/DefinitelyTyped/escodegen/escodegen.d.ts", diff --git a/typings/browser.d.ts b/typings/browser.d.ts index f5c34c5d..d539a696 100644 --- a/typings/browser.d.ts +++ b/typings/browser.d.ts @@ -1,4 +1,5 @@ /// +/// /// /// /// diff --git a/typings/browser/ambient/chance/index.d.ts b/typings/browser/ambient/chance/index.d.ts new file mode 100644 index 00000000..a3630ea5 --- /dev/null +++ b/typings/browser/ambient/chance/index.d.ts @@ -0,0 +1,224 @@ +// Generated by typings +// Source: https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/chance/chance.d.ts +// Type definitions for Chance 0.7.3 +// Project: http://chancejs.com +// Definitions by: Chris Bowdon +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped + +declare namespace Chance { + + interface ChanceStatic { + (): Chance + (seed: number): Chance + (generator: () => any): Chance + + new(): Chance; + new(seed: number): Chance; + new(generator: () => any): Chance; + } + + interface Chance { + + // Basics + bool(opts?: Options): boolean; + character(opts?: Options): string; + floating(opts?: Options): number; + integer(opts?: Options): number; + natural(opts?: Options): number; + string(opts?: Options): string; + + // Text + paragraph(opts?: Options): string; + sentence(opts?: Options): string; + syllable(opts?: Options): string; + word(opts?: Options): string; + + // Person + age(opts?: Options): number; + birthday(): Date; + birthday(opts?: Options): Date|string; + cpf(): string; + first(opts?: Options): string; + last(opts?: Options): string; + name(opts?: Options): string; + name_prefix(opts?: Options): string; + name_suffix(opts?: Options): string; + prefix(opts?: Options): string; + ssn(opts?: Options): string; + suffix(opts?: Options): string; + + // Mobile + android_id(): string; + apple_token(): string; + bb_pin(): string; + wp7_anid(): string; + wp8_anid2(): string; + + // Web + color(opts?: Options): string; + domain(opts?: Options): string; + email(opts?: Options): string; + fbid(): string; + google_analytics(): string; + hashtag(): string; + ip(): string; + ipv6(): string; + klout(): string; + tld(): string; + twitter(): string; + url(opts?: Options): string; + + // Location + address(opts?: Options): string; + altitude(opts?: Options): number; + areacode(): string; + city(): string; + coordinates(opts?: Options): string; + country(opts?: Options): string; + depth(opts?: Options): number; + geohash(opts?: Options): string; + latitude(opts?: Options): number; + longitude(opts?: Options): number; + phone(opts?: Options): string; + postal(): string; + province(opts?: Options): string; + state(opts?: Options): string; + street(opts?: Options): string; + zip(opts?: Options): string; + + // Time + ampm(): string; + date(): Date; + date(opts: DateOptions): Date|string; + hammertime(): number; + hour(opts?: Options): number; + millisecond(): number; + minute(): number; + month(): string; + month(opts: Options): Month; + second(): number; + timestamp(): number; + year(opts?: Options): string; + + // Finance + cc(opts?: Options): string; + cc_type(): string; + cc_type(opts: Options): string|CreditCardType; + currency(): Currency; + currency_pair(): [ Currency, Currency ]; + dollar(opts?: Options): string; + exp(): string; + exp(opts: Options): string|CreditCardExpiration; + exp_month(opts?: Options): string; + exp_year(opts?: Options): string; + + // Helpers + capitalize(str: string): string; + mixin(desc: MixinDescriptor): any; + pad(num: number, width: number, padChar?: string): string; + pick(arr: T[]): T; + pick(arr: T[], count: number): T[]; + set: Setter; + shuffle(arr: T[]): T[]; + + // Miscellaneous + d4(): number; + d6(): number; + d8(): number; + d10(): number; + d12(): number; + d20(): number; + d30(): number; + d100(): number; + guid(): string; + hash(opts?: Options): string; + n(generator: () => T, count: number, opts?: Options): T[]; + normal(opts?: Options): number; + radio(opts?: Options): string; + rpg(dice: string): number[]; + rpg(dice: string, opts?: Options): number[]|number; + tv(opts?: Options): string; + unique(generator: () => T, count: number, opts?: Options): T[]; + weighted(values: T[], weights: number[]): T; + + // "Hidden" + cc_types(): CreditCardType[]; + mersenne_twister(seed?: number): any; // API return type not defined in docs + months(): Month[]; + name_prefixes(): Name[]; + provinces(): Name[]; + states(): Name[]; + street_suffix(): Name; + street_suffixes(): Name[]; + } + + // A more rigorous approach might be to produce + // the correct options interfaces for each method + interface Options { [id: string]: any; } + + interface DateOptions { + string?: boolean; + american?: boolean; + year?: number; + month?: number; + day?: number; + } + + interface Month { + name: string; + short_name: string; + numeric: string; + } + + interface CreditCardType { + name: string; + short_name: string; + prefix: string; + length: number; + } + + interface Currency { + code: string; + name: string; + } + + interface CreditCardExpiration { + month: string; + year: string; + } + + interface MixinDescriptor { [id: string]: () => any; } + + interface Setter { + (key: 'firstNames', values: string[]): any; + (key: 'lastNames', values: string[]): any; + (key: 'provinces', values: string[]): any; + (key: 'us_states_and_dc', values: string[]): any; + (key: 'territories', values: string[]): any; + (key: 'armed_forces', values: string[]): any; + (key: 'street_suffixes', values: string[]): any; + (key: 'months', values: string[]): any; + (key: 'cc_types', values: string[]): any; + (key: 'currency_types', values: string[]): any; + (key: string, values: T[]): any; + } + + interface Name { + name: string; + abbreviation: string; + } +} + +// window.chance +declare var chance: Chance.Chance; +declare var Chance: Chance.ChanceStatic; + +// import Chance = require('chance'); +declare module 'chance' { + interface ExportedChance extends Chance.ChanceStatic { + Chance: ExportedChance; + } + var Chance: ExportedChance; + + export = Chance; +} \ No newline at end of file diff --git a/typings/main.d.ts b/typings/main.d.ts index a3c327a1..6c3129d0 100644 --- a/typings/main.d.ts +++ b/typings/main.d.ts @@ -1,4 +1,5 @@ /// +/// /// /// /// diff --git a/typings/main/ambient/chance/index.d.ts b/typings/main/ambient/chance/index.d.ts new file mode 100644 index 00000000..a3630ea5 --- /dev/null +++ b/typings/main/ambient/chance/index.d.ts @@ -0,0 +1,224 @@ +// Generated by typings +// Source: https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/master/chance/chance.d.ts +// Type definitions for Chance 0.7.3 +// Project: http://chancejs.com +// Definitions by: Chris Bowdon +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped + +declare namespace Chance { + + interface ChanceStatic { + (): Chance + (seed: number): Chance + (generator: () => any): Chance + + new(): Chance; + new(seed: number): Chance; + new(generator: () => any): Chance; + } + + interface Chance { + + // Basics + bool(opts?: Options): boolean; + character(opts?: Options): string; + floating(opts?: Options): number; + integer(opts?: Options): number; + natural(opts?: Options): number; + string(opts?: Options): string; + + // Text + paragraph(opts?: Options): string; + sentence(opts?: Options): string; + syllable(opts?: Options): string; + word(opts?: Options): string; + + // Person + age(opts?: Options): number; + birthday(): Date; + birthday(opts?: Options): Date|string; + cpf(): string; + first(opts?: Options): string; + last(opts?: Options): string; + name(opts?: Options): string; + name_prefix(opts?: Options): string; + name_suffix(opts?: Options): string; + prefix(opts?: Options): string; + ssn(opts?: Options): string; + suffix(opts?: Options): string; + + // Mobile + android_id(): string; + apple_token(): string; + bb_pin(): string; + wp7_anid(): string; + wp8_anid2(): string; + + // Web + color(opts?: Options): string; + domain(opts?: Options): string; + email(opts?: Options): string; + fbid(): string; + google_analytics(): string; + hashtag(): string; + ip(): string; + ipv6(): string; + klout(): string; + tld(): string; + twitter(): string; + url(opts?: Options): string; + + // Location + address(opts?: Options): string; + altitude(opts?: Options): number; + areacode(): string; + city(): string; + coordinates(opts?: Options): string; + country(opts?: Options): string; + depth(opts?: Options): number; + geohash(opts?: Options): string; + latitude(opts?: Options): number; + longitude(opts?: Options): number; + phone(opts?: Options): string; + postal(): string; + province(opts?: Options): string; + state(opts?: Options): string; + street(opts?: Options): string; + zip(opts?: Options): string; + + // Time + ampm(): string; + date(): Date; + date(opts: DateOptions): Date|string; + hammertime(): number; + hour(opts?: Options): number; + millisecond(): number; + minute(): number; + month(): string; + month(opts: Options): Month; + second(): number; + timestamp(): number; + year(opts?: Options): string; + + // Finance + cc(opts?: Options): string; + cc_type(): string; + cc_type(opts: Options): string|CreditCardType; + currency(): Currency; + currency_pair(): [ Currency, Currency ]; + dollar(opts?: Options): string; + exp(): string; + exp(opts: Options): string|CreditCardExpiration; + exp_month(opts?: Options): string; + exp_year(opts?: Options): string; + + // Helpers + capitalize(str: string): string; + mixin(desc: MixinDescriptor): any; + pad(num: number, width: number, padChar?: string): string; + pick(arr: T[]): T; + pick(arr: T[], count: number): T[]; + set: Setter; + shuffle(arr: T[]): T[]; + + // Miscellaneous + d4(): number; + d6(): number; + d8(): number; + d10(): number; + d12(): number; + d20(): number; + d30(): number; + d100(): number; + guid(): string; + hash(opts?: Options): string; + n(generator: () => T, count: number, opts?: Options): T[]; + normal(opts?: Options): number; + radio(opts?: Options): string; + rpg(dice: string): number[]; + rpg(dice: string, opts?: Options): number[]|number; + tv(opts?: Options): string; + unique(generator: () => T, count: number, opts?: Options): T[]; + weighted(values: T[], weights: number[]): T; + + // "Hidden" + cc_types(): CreditCardType[]; + mersenne_twister(seed?: number): any; // API return type not defined in docs + months(): Month[]; + name_prefixes(): Name[]; + provinces(): Name[]; + states(): Name[]; + street_suffix(): Name; + street_suffixes(): Name[]; + } + + // A more rigorous approach might be to produce + // the correct options interfaces for each method + interface Options { [id: string]: any; } + + interface DateOptions { + string?: boolean; + american?: boolean; + year?: number; + month?: number; + day?: number; + } + + interface Month { + name: string; + short_name: string; + numeric: string; + } + + interface CreditCardType { + name: string; + short_name: string; + prefix: string; + length: number; + } + + interface Currency { + code: string; + name: string; + } + + interface CreditCardExpiration { + month: string; + year: string; + } + + interface MixinDescriptor { [id: string]: () => any; } + + interface Setter { + (key: 'firstNames', values: string[]): any; + (key: 'lastNames', values: string[]): any; + (key: 'provinces', values: string[]): any; + (key: 'us_states_and_dc', values: string[]): any; + (key: 'territories', values: string[]): any; + (key: 'armed_forces', values: string[]): any; + (key: 'street_suffixes', values: string[]): any; + (key: 'months', values: string[]): any; + (key: 'cc_types', values: string[]): any; + (key: 'currency_types', values: string[]): any; + (key: string, values: T[]): any; + } + + interface Name { + name: string; + abbreviation: string; + } +} + +// window.chance +declare var chance: Chance.Chance; +declare var Chance: Chance.ChanceStatic; + +// import Chance = require('chance'); +declare module 'chance' { + interface ExportedChance extends Chance.ChanceStatic { + Chance: ExportedChance; + } + var Chance: ExportedChance; + + export = Chance; +} \ No newline at end of file