using System.Text.RegularExpressions; namespace Jint; public interface IParsingOptions { /// /// Gets or sets whether to create compiled instances when adapting regular expressions. /// Defaults to , which means that in the case of non-prepared scripts and modules /// regular expressions will be interpreted, otherwise they will be compiled. /// bool? CompileRegex { get; init; } /// /// Gets or sets the default timeout for created instances. /// Defaults to , which means that in the case of non-prepared scripts and modules /// the setting should apply, /// otherwise the default of the setting (10 seconds). /// /// /// Please note that setting will be ignored /// if this option is set to a value other than . /// TimeSpan? RegexTimeout { get; init; } /// /// Gets or sets whether to parse the source code in tolerant mode. /// Defaults to . /// bool Tolerant { get; init; } } public sealed record ScriptParsingOptions : IParsingOptions { private static readonly ParserOptions _defaultParserOptions = Engine.BaseParserOptions with { AllowReturnOutsideFunction = true, AllowTopLevelUsing = true, RegExpParseMode = RegExpParseMode.AdaptToInterpreted, }; public static readonly ScriptParsingOptions Default = new(); /// /// Gets or sets whether to allow return statements at the top level. /// Defaults to . /// public bool AllowReturnOutsideFunction { get; init; } = _defaultParserOptions.AllowReturnOutsideFunction; /// public bool? CompileRegex { get; init; } /// public TimeSpan? RegexTimeout { get; init; } /// public bool Tolerant { get; init; } = _defaultParserOptions.Tolerant; internal ParserOptions ApplyTo(ParserOptions parserOptions, RegExpParseMode defaultRegExpParseMode, TimeSpan defaultRegexTimeout) => parserOptions with { AllowReturnOutsideFunction = AllowReturnOutsideFunction, RegExpParseMode = CompileRegex is null ? defaultRegExpParseMode : (CompileRegex.Value ? RegExpParseMode.AdaptToCompiled : RegExpParseMode.AdaptToInterpreted), RegexTimeout = RegexTimeout ?? defaultRegexTimeout, Tolerant = Tolerant, }; internal ParserOptions GetParserOptions() => ReferenceEquals(this, Default) ? _defaultParserOptions : ApplyTo(_defaultParserOptions, _defaultParserOptions.RegExpParseMode, _defaultParserOptions.RegexTimeout); internal ParserOptions GetParserOptions(Options engineOptions) => ApplyTo(_defaultParserOptions, _defaultParserOptions.RegExpParseMode, engineOptions.Constraints.RegexTimeout); } public sealed record class ModuleParsingOptions : IParsingOptions { private static readonly ParserOptions _defaultParserOptions = Engine.BaseParserOptions with { RegExpParseMode = RegExpParseMode.AdaptToInterpreted, }; public static readonly ModuleParsingOptions Default = new(); /// public bool? CompileRegex { get; init; } /// public TimeSpan? RegexTimeout { get; init; } /// public bool Tolerant { get; init; } = _defaultParserOptions.Tolerant; internal ParserOptions ApplyTo(ParserOptions baseOptions, RegExpParseMode defaultRegExpParseMode, TimeSpan defaultRegexTimeout) => baseOptions with { RegExpParseMode = CompileRegex is null ? defaultRegExpParseMode : (CompileRegex.Value ? RegExpParseMode.AdaptToCompiled : RegExpParseMode.AdaptToInterpreted), RegexTimeout = RegexTimeout ?? defaultRegexTimeout, Tolerant = Tolerant, }; internal ParserOptions GetParserOptions() => ReferenceEquals(this, Default) ? _defaultParserOptions : ApplyTo(_defaultParserOptions, _defaultParserOptions.RegExpParseMode, _defaultParserOptions.RegexTimeout); internal ParserOptions GetParserOptions(Options engineOptions) => ApplyTo(_defaultParserOptions, _defaultParserOptions.RegExpParseMode, engineOptions.Constraints.RegexTimeout); }