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);
}