123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459 |
- import { inject, injectable } from 'inversify';
- import { ServiceIdentifiers } from '../container/ServiceIdentifiers';
- import {
- ArrayNotEmpty,
- ArrayUnique,
- IsArray,
- IsBoolean,
- IsIn,
- IsNumber,
- IsString,
- IsUrl,
- Max,
- Min,
- ValidateIf,
- validateSync,
- ValidationError,
- ValidatorOptions
- } from 'class-validator';
- import { TIdentifierNamesCache } from '../types/TIdentifierNamesCache';
- import { TInputOptions } from '../types/options/TInputOptions';
- import { TOptionsPreset } from '../types/options/TOptionsPreset';
- import { TRenamePropertiesMode } from '../types/options/TRenamePropertiesMode';
- import { TStringArrayIndexesType } from '../types/options/TStringArrayIndexesType';
- import { TStringArrayEncoding } from '../types/options/TStringArrayEncoding';
- import { TStringArrayWrappersType } from '../types/options/TStringArrayWrappersType';
- import { TTypeFromEnum } from '../types/utils/TTypeFromEnum';
- import { IOptions } from '../interfaces/options/IOptions';
- import { IOptionsNormalizer } from '../interfaces/options/IOptionsNormalizer';
- import { IdentifierNamesGenerator } from '../enums/generators/identifier-names-generators/IdentifierNamesGenerator';
- import { ObfuscationTarget } from '../enums/ObfuscationTarget';
- import { OptionsPreset } from '../enums/options/presets/OptionsPreset';
- import { RenamePropertiesMode } from '../enums/node-transformers/rename-properties-transformers/RenamePropertiesMode';
- import { SourceMapMode } from '../enums/source-map/SourceMapMode';
- import { SourceMapSourcesMode } from '../enums/source-map/SourceMapSourcesMode';
- import { StringArrayIndexesType } from '../enums/node-transformers/string-array-transformers/StringArrayIndexesType';
- import { StringArrayEncoding } from '../enums/node-transformers/string-array-transformers/StringArrayEncoding';
- import { StringArrayWrappersType } from '../enums/node-transformers/string-array-transformers/StringArrayWrappersType';
- import { DEFAULT_PRESET } from './presets/Default';
- import { LOW_OBFUSCATION_PRESET } from './presets/LowObfuscation';
- import { MEDIUM_OBFUSCATION_PRESET } from './presets/MediumObfuscation';
- import { HIGH_OBFUSCATION_PRESET } from './presets/HighObfuscation';
- import { ValidationErrorsFormatter } from './ValidationErrorsFormatter';
- import { IsAllowedForObfuscationTargets } from './validators/IsAllowedForObfuscationTargets';
- import { IsDomainLockRedirectUrl } from './validators/IsDomainLockRedirectUrl';
- import { IsIdentifierNamesCache } from './validators/IsIdentifierNamesCache';
- import { IsInputFileName } from './validators/IsInputFileName';
- @injectable()
- export class Options implements IOptions {
- /**
- * @type {Map<TOptionsPreset, TInputOptions>}
- */
- private static readonly optionPresetsMap: Map<TOptionsPreset, TInputOptions> = new Map([
- [OptionsPreset.Default, DEFAULT_PRESET],
- [OptionsPreset.LowObfuscation, LOW_OBFUSCATION_PRESET],
- [OptionsPreset.MediumObfuscation, MEDIUM_OBFUSCATION_PRESET],
- [OptionsPreset.HighObfuscation, HIGH_OBFUSCATION_PRESET]
- ]);
- /**
- * @type {ValidatorOptions}
- */
- private static readonly validatorOptions: ValidatorOptions = {
- forbidUnknownValues: true,
- validationError: {
- target: false
- }
- };
- /**
- * @type {boolean}
- */
- @IsBoolean()
- public readonly compact!: boolean;
- /**
- * @type {boolean}
- */
- @IsBoolean()
- public readonly controlFlowFlattening!: boolean;
- /**
- * @type {boolean}
- */
- @IsNumber()
- @Min(0)
- @Max(1)
- public readonly controlFlowFlatteningThreshold!: number;
- /**
- * @type {boolean}
- */
- @IsBoolean()
- public readonly deadCodeInjection!: boolean;
- /**
- * @type {number}
- */
- @IsNumber()
- public readonly deadCodeInjectionThreshold!: number;
- /**
- * @type {boolean}
- */
- @IsBoolean()
- public readonly debugProtection!: boolean;
- /**
- * @type {boolean}
- */
- @IsBoolean()
- public readonly debugProtectionInterval!: boolean;
- /**
- * @type {boolean}
- */
- @IsBoolean()
- public readonly disableConsoleOutput!: boolean;
- /**
- * @type {string[]}
- */
- @IsArray()
- @ArrayUnique()
- @IsString({
- each: true
- })
- @IsAllowedForObfuscationTargets([
- ObfuscationTarget.Browser,
- ObfuscationTarget.BrowserNoEval,
- ])
- public readonly domainLock!: string[];
- /**
- * @type {string}
- */
- @IsDomainLockRedirectUrl()
- public readonly domainLockRedirectUrl!: string;
- /**
- * @type {string[]}
- */
- @IsArray()
- @ArrayUnique()
- @IsString({
- each: true
- })
- public readonly forceTransformStrings!: string[];
- /**
- * @type {TIdentifierNamesCache}
- */
- @IsIdentifierNamesCache()
- public readonly identifierNamesCache!: TIdentifierNamesCache;
- /**
- * @type {IdentifierNamesGenerator}
- */
- @IsIn([
- IdentifierNamesGenerator.DictionaryIdentifierNamesGenerator,
- IdentifierNamesGenerator.HexadecimalIdentifierNamesGenerator,
- IdentifierNamesGenerator.MangledIdentifierNamesGenerator,
- IdentifierNamesGenerator.MangledShuffledIdentifierNamesGenerator
- ])
- public readonly identifierNamesGenerator!: TTypeFromEnum<typeof IdentifierNamesGenerator>;
- /**
- * @type {string}
- */
- @IsString()
- public readonly identifiersPrefix!: string;
- @IsArray()
- @ArrayUnique()
- @IsString({
- each: true
- })
- @ValidateIf((options: IOptions) =>
- options.identifierNamesGenerator === IdentifierNamesGenerator.DictionaryIdentifierNamesGenerator
- )
- @ArrayNotEmpty()
- public readonly identifiersDictionary!: string[];
- /**
- * @type {boolean}
- */
- @IsBoolean()
- public readonly ignoreImports!: boolean;
- /**
- * @type {string}
- */
- @IsInputFileName()
- public readonly inputFileName!: string;
- /**
- * @type {boolean}
- */
- @IsBoolean()
- public readonly log!: boolean;
- /**
- * @type {boolean}
- */
- @IsBoolean()
- public readonly numbersToExpressions!: boolean;
- /**
- * @type {TOptionsPreset}
- */
- @IsIn([
- OptionsPreset.Default,
- OptionsPreset.LowObfuscation,
- OptionsPreset.MediumObfuscation,
- OptionsPreset.HighObfuscation
- ])
- public readonly optionsPreset!: TOptionsPreset;
- /**
- * @type {boolean}
- */
- @IsBoolean()
- public readonly renameGlobals!: boolean;
- /**
- * @type {boolean}
- */
- @IsBoolean()
- public readonly renameProperties!: boolean;
- /**
- * @type {RenamePropertiesMode}
- */
- @IsIn([RenamePropertiesMode.Safe, RenamePropertiesMode.Unsafe])
- public readonly renamePropertiesMode!: TRenamePropertiesMode;
- /**
- * @type {string[]}
- */
- @IsArray()
- @ArrayUnique()
- @IsString({
- each: true
- })
- public readonly reservedNames!: string[];
- /**
- * @type {string[]}
- */
- @IsArray()
- @ArrayUnique()
- @IsString({
- each: true
- })
- public readonly reservedStrings!: string[];
- /**
- * @type {boolean}
- */
- @IsBoolean()
- public readonly selfDefending!: boolean;
- /**
- * @type {boolean}
- */
- @IsBoolean()
- public readonly simplify!: boolean;
- /**
- * @type {boolean}
- */
- @IsBoolean()
- public readonly sourceMap!: boolean;
- /**
- * @type {string}
- */
- @IsString()
- @ValidateIf((options: IOptions) => Boolean(options.sourceMapBaseUrl))
- @IsUrl({
- require_protocol: true,
- require_tld: false,
- require_valid_protocol: true
- })
- public readonly sourceMapBaseUrl!: string;
- /**
- * @type {string}
- */
- @IsString()
- public readonly sourceMapFileName!: string;
- /**
- * @type {SourceMapMode}
- */
- @IsIn([SourceMapMode.Inline, SourceMapMode.Separate])
- public readonly sourceMapMode!: TTypeFromEnum<typeof SourceMapMode>;
- /**
- * @type {SourceMapSourcesMode}
- */
- @IsIn([SourceMapSourcesMode.Sources, SourceMapSourcesMode.SourcesContent])
- public readonly sourceMapSourcesMode!: TTypeFromEnum<typeof SourceMapSourcesMode>;
- /**
- * @type {boolean}
- */
- @IsBoolean()
- public readonly splitStrings!: boolean;
- /**
- * @type {number}
- */
- @IsNumber()
- @ValidateIf((options: IOptions) => Boolean(options.splitStrings))
- @Min(1)
- public readonly splitStringsChunkLength!: number;
- /**
- * @type {boolean}
- */
- @IsBoolean()
- public readonly stringArray!: boolean;
- /**
- * @type {TStringArrayEncoding[]}
- */
- @IsArray()
- @ArrayUnique()
- @IsIn([StringArrayEncoding.None, StringArrayEncoding.Base64, StringArrayEncoding.Rc4], { each: true })
- public readonly stringArrayEncoding!: TStringArrayEncoding[];
- /**
- * @type {TStringArrayIndexesType[]}
- */
- @IsArray()
- @ArrayNotEmpty()
- @ArrayUnique()
- @IsIn([StringArrayIndexesType.HexadecimalNumber, StringArrayIndexesType.HexadecimalNumericString], { each: true })
- public readonly stringArrayIndexesType!: TStringArrayIndexesType[];
- /**
- * @type {boolean}
- */
- @IsBoolean()
- public readonly stringArrayIndexShift!: boolean;
- /**
- * @type {boolean}
- */
- @IsBoolean()
- public readonly stringArrayRotate!: boolean;
- /**
- * @type {boolean}
- */
- @IsBoolean()
- public readonly stringArrayShuffle!: boolean;
- /**
- * @type {boolean}
- */
- @IsBoolean()
- public readonly stringArrayWrappersChainedCalls!: boolean;
- /**
- * @type {boolean}
- */
- @IsNumber()
- @Min(0)
- public readonly stringArrayWrappersCount!: number;
- /**
- * @type {boolean}
- */
- @IsNumber()
- @Min(2)
- public readonly stringArrayWrappersParametersMaxCount!: number;
- /**
- * @type {TStringArrayWrappersType}
- */
- @IsIn([StringArrayWrappersType.Variable, StringArrayWrappersType.Function])
- public readonly stringArrayWrappersType!: TStringArrayWrappersType;
- /**
- * @type {number}
- */
- @IsNumber()
- @Min(0)
- @Max(1)
- public readonly stringArrayThreshold!: number;
- /**
- * @type {ObfuscationTarget}
- */
- @IsIn([ObfuscationTarget.Browser, ObfuscationTarget.BrowserNoEval, ObfuscationTarget.Node])
- public readonly target!: TTypeFromEnum<typeof ObfuscationTarget>;
- /**
- * @type {boolean}
- */
- @IsBoolean()
- public readonly transformObjectKeys!: boolean;
- /**
- * @type {boolean}
- */
- @IsBoolean()
- public readonly unicodeEscapeSequence!: boolean;
- /**
- * @type {string | number}
- */
- public readonly seed!: string | number;
- /**
- * @param {TInputOptions} inputOptions
- * @param {IOptionsNormalizer} optionsNormalizer
- */
- public constructor (
- @inject(ServiceIdentifiers.TInputOptions) inputOptions: TInputOptions,
- @inject(ServiceIdentifiers.IOptionsNormalizer) optionsNormalizer: IOptionsNormalizer
- ) {
- const optionsPreset: TInputOptions = Options.getOptionsByPreset(
- inputOptions.optionsPreset ?? OptionsPreset.Default
- );
- Object.assign(this, optionsPreset, inputOptions);
- const errors: ValidationError[] = validateSync(this, Options.validatorOptions);
- if (errors.length) {
- throw new ReferenceError(`Validation failed. errors:\n${ValidationErrorsFormatter.format(errors)}`);
- }
- Object.assign(this, optionsNormalizer.normalize(this));
- }
- /**
- * @param {TOptionsPreset} optionsPreset
- * @returns {TInputOptions}
- */
- public static getOptionsByPreset (optionsPreset: TOptionsPreset): TInputOptions {
- const options: TInputOptions | null = Options.optionPresetsMap.get(optionsPreset) ?? null;
- if (!options) {
- throw new Error(`Options for preset name \`${optionsPreset}\` are not found`);
- }
- return options;
- }
- }
|