import {
ArrayUnique,
IsBoolean,
IsArray,
IsIn,
IsNumber,
IsString,
IsUrl,
Min,
Max,
ValidateIf,
validateSync,
ValidationError,
ValidatorOptions
} from 'class-validator';
import { IObfuscatorOptions } from '../interfaces/IObfuscatorOptions';
import { IOptions } from '../interfaces/IOptions';
import { TSourceMapMode } from '../types/TSourceMapMode';
import { TStringArrayEncoding } from '../types/TStringArrayEncoding';
import { DEFAULT_PRESET } from '../preset-options/DefaultPreset';
import { OptionsNormalizer } from './OptionsNormalizer';
import { ValidationErrorsFormatter } from './ValidationErrorsFormatter';
export class Options implements IOptions {
/**
* @type {ValidatorOptions}
*/
private static validatorOptions: ValidatorOptions = {
validationError: {
target: false
}
};
/**
* @type {boolean}
*/
@IsBoolean()
public readonly compact: boolean;
/**
* @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
})
public readonly domainLock: string[];
/**
* @type {string[]}
*/
@IsArray()
@ArrayUnique()
@IsString({
each: true
})
public readonly reservedNames: string[];
/**
* @type {boolean}
*/
@IsBoolean()
public readonly rotateStringArray: boolean;
/**
* @type {boolean}
*/
@IsBoolean()
public readonly selfDefending: boolean;
/**
* @type {boolean}
*/
@IsBoolean()
public readonly sourceMap: boolean;
/**
* @type {string}
*/
@IsString()
@ValidateIf((options: IOptions) => Boolean(options.sourceMapBaseUrl))
@IsUrl({
require_protocol: true,
require_valid_protocol: true
})
public readonly sourceMapBaseUrl: string;
/**
* @type {string}
*/
@IsString()
public readonly sourceMapFileName: string;
/**
* @type {TSourceMapMode}
*/
@IsIn(['inline', 'separate'])
public readonly sourceMapMode: TSourceMapMode;
/**
* @type {boolean}
*/
@IsBoolean()
public readonly stringArray: boolean;
/**
* @type {TStringArrayEncoding}
*/
@IsIn([true, false, 'base64', 'rc4'])
public readonly stringArrayEncoding: TStringArrayEncoding;
/**
* @type {number}
*/
@IsNumber()
@Min(0)
@Max(1)
public readonly stringArrayThreshold: number;
/**
* @type {boolean}
*/
@IsBoolean()
public readonly unicodeEscapeSequence: boolean;
/**
* @param obfuscatorOptions
*/
constructor (obfuscatorOptions: IObfuscatorOptions) {
Object.assign(this, DEFAULT_PRESET, obfuscatorOptions);
let errors: ValidationError[] = validateSync(this, Options.validatorOptions);
Iif (errors.length) {
throw new ReferenceError(`Validation failed. errors:\n${ValidationErrorsFormatter.format(errors)}`);
}
Object.assign(this, OptionsNormalizer.normalizeOptions(this));
}
}
|