From 1acab70f5450f4bbeef144d0a249a230070bbb4a Mon Sep 17 00:00:00 2001 From: Tsar Nikolay Date: Tue, 8 Sep 2020 13:49:21 +0500 Subject: [PATCH 001/122] Fix net40 client profile --- src/log4net/AssemblyInfo.cs | 7 +++++-- src/log4net/Core/LoggingEvent.cs | 2 +- src/log4net/Util/PropertiesDictionary.cs | 7 ++++--- src/log4net/log4net.csproj | 6 +++--- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/log4net/AssemblyInfo.cs b/src/log4net/AssemblyInfo.cs index aa3c3e638..2e33cb7b5 100644 --- a/src/log4net/AssemblyInfo.cs +++ b/src/log4net/AssemblyInfo.cs @@ -73,14 +73,17 @@ [assembly: AssemblyInformationalVersionAttribute("2.0.9.0-.NET 4.0")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 4.0")] #endif // Client Profile -#elif (NET_2_0) +#elif (NET_3_5) #if CLIENT_PROFILE [assembly: AssemblyInformationalVersionAttribute("2.0.9.0-.NET 3.5 CP")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 3.5 Client Profile")] #else +[assembly: AssemblyInformationalVersionAttribute("2.0.9.0-.NET 3.5")] +[assembly: AssemblyTitle("Apache log4net for .NET Framework 3.5")] +#endif // Client Profile +#elif (NET_2_0) [assembly: AssemblyInformationalVersionAttribute("2.0.9.0-.NET 2.0")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 2.0")] -#endif // Client Profile #elif (NETCF_1_0) [assembly: AssemblyInformationalVersionAttribute("2.0.9.0-.NETCF 1.0")] [assembly: AssemblyTitle("Apache log4net for .NET Compact Framework 1.0")] diff --git a/src/log4net/Core/LoggingEvent.cs b/src/log4net/Core/LoggingEvent.cs index 1765929c3..0c733006c 100644 --- a/src/log4net/Core/LoggingEvent.cs +++ b/src/log4net/Core/LoggingEvent.cs @@ -324,7 +324,7 @@ [Flags] public enum FixFlags [Serializable] #endif public class LoggingEvent -#if !NETCF && NET_2_0 +#if !NETCF : ISerializable #endif { diff --git a/src/log4net/Util/PropertiesDictionary.cs b/src/log4net/Util/PropertiesDictionary.cs index 4510eaa07..a4dc6c46c 100644 --- a/src/log4net/Util/PropertiesDictionary.cs +++ b/src/log4net/Util/PropertiesDictionary.cs @@ -35,10 +35,11 @@ namespace log4net.Util /// /// Nicko Cadell /// Gert Driesen -#if NETCF || CLIENT_PROFILE +#if NETCF public sealed class PropertiesDictionary : ReadOnlyPropertiesDictionary, IDictionary #else - [Serializable] public sealed class PropertiesDictionary : ReadOnlyPropertiesDictionary, ISerializable, IDictionary + [Serializable] + public sealed class PropertiesDictionary : ReadOnlyPropertiesDictionary, ISerializable, IDictionary #endif { #region Public Instance Constructors @@ -72,7 +73,7 @@ public PropertiesDictionary(ReadOnlyPropertiesDictionary propertiesDictionary) : #region Private Instance Constructors -#if !(NETCF || CLIENT_PROFILE) +#if !NETCF /// /// Initializes a new instance of the class /// with serialized data. diff --git a/src/log4net/log4net.csproj b/src/log4net/log4net.csproj index 62b17340b..53c9c3e38 100644 --- a/src/log4net/log4net.csproj +++ b/src/log4net/log4net.csproj @@ -69,14 +69,14 @@ v3.5 Client ..\..\build\$(Configuration)\net35-client - $(DefineConstants);NET_2_0;CLIENT_PROFILE + $(DefineConstants);NET_2_0;NET_3_5;CLIENT_PROFILE .NETFramework - v3.5 + v4.0 Client ..\..\build\$(Configuration)\net40-client - $(DefineConstants);NET_2_0;CLIENT_PROFILE + $(DefineConstants);NET_2_0;NET_4_0;CLIENT_PROFILE $(DefineConstants);NETSTANDARD;NETSTANDARD1_3 From c3a6e32872e1eecbaa9af231f21bb20bf37e2413 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Thu, 10 Sep 2020 09:16:00 +0200 Subject: [PATCH 002/122] :wrench: run dotnet core tests as part of regular test run --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index ec8b812ec..7b41e90cf 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,8 @@ "version": "2.0.9", "description": "Log4Net is a logging framework for .NET", "scripts": { - "test": "cross-env NUNIT_PROCESS=Single MAX_CONCURRENCY=1 run-s clean-build \"zarro test-dotnet\"", + "test": "cross-env NUNIT_PROCESS=Single MAX_CONCURRENCY=1 run-s clean-build \"zarro test-dotnet\" run-dotnet-core-tests", + "run-dotnet-core-tests": "cross-env DOTNET_CORE=1 run-s \"zarro quick-test-dotnet\"", "clean-build": "rimraf build", "build": "run-s clean-build \"zarro build\"", "build-release": "cross-env BUILD_CONFIGURATION=Release run-s clean-build \"zarro build\"", From acda6883586d56d6788c4bd97aa65148d79f16a1 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Thu, 10 Sep 2020 11:23:28 +0200 Subject: [PATCH 003/122] :arrow_up: upgrade zarro, should resolve npm warnings about old yargs dependencies --- package-lock.json | 28 ++++++++++++++++++++-------- package.json | 2 +- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 15bcb2130..68573e0c6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1459,9 +1459,9 @@ } }, "dot-prop": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", - "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "dev": true, "requires": { "is-obj": "^2.0.0" @@ -6204,9 +6204,9 @@ } }, "zarro": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/zarro/-/zarro-1.77.0.tgz", - "integrity": "sha512-qTKIHiZU0okuM7k/qRB13gA7j+9FTQq86qY/PulIgnSC8/QntxlIqzGxFjr/AJFT4JNqMS6LLzYyuMZS9knv1Q==", + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/zarro/-/zarro-1.78.0.tgz", + "integrity": "sha512-lDpbakbZYnh9TtunnkQqANSaY0v7anNSb3MJyYSAC4HlR/ZpG8NdxzrVdPkLEproM110EkLAdilip4tgtQ72Ww==", "dev": true, "requires": { "ansi-colors": "^4.1.1", @@ -6223,7 +6223,7 @@ "gulp-filter": "^6.0.0", "gulp-msbuild": "^0.8.0", "mkdirp": "^1.0.4", - "nodemon": "^2.0.3", + "nodemon": "^2.0.4", "npm-run-all": "^4.1.5", "plugin-error": "^1.0.1", "readline": "^1.3.0", @@ -6235,11 +6235,23 @@ "sax": "^1.2.4", "simple-git": "^1.132.0", "temp": "^0.9.1", - "through2": "^3.0.1", + "through2": "^3.0.2", "undertaker-forward-reference": "^1.0.2", "vinyl": "^2.2.0", "which": "^2.0.2", "xml2js": "^0.4.23" + }, + "dependencies": { + "through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + } } } } diff --git a/package.json b/package.json index 7b41e90cf..b4999d831 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,6 @@ "rimraf": "^3.0.2", "which": "^2.0.2", "yafs": "^1.5.0", - "zarro": "^1.77.0" + "zarro": "^1.78.0" } } From 9b0c79d4a1a894e80146f08ac66ba72357576b69 Mon Sep 17 00:00:00 2001 From: Tsar Nikolay Date: Mon, 14 Sep 2020 12:28:00 +0500 Subject: [PATCH 004/122] Remove unused dependency for netstandard2.0. --- src/log4net/log4net.csproj | 1 - 1 file changed, 1 deletion(-) diff --git a/src/log4net/log4net.csproj b/src/log4net/log4net.csproj index 62b17340b..95bea2c44 100644 --- a/src/log4net/log4net.csproj +++ b/src/log4net/log4net.csproj @@ -153,7 +153,6 @@ - From 3941383c2fd7840726069b8b4e35b5d7a1fc73f5 Mon Sep 17 00:00:00 2001 From: Tsar Nikolay Date: Tue, 8 Sep 2020 13:58:44 +0500 Subject: [PATCH 005/122] Fix CA2000, CA2237, CA3075 --- src/log4net/Appender/AdoNetAppender.cs | 2 +- src/log4net/Appender/FileAppender.cs | 25 +- src/log4net/Appender/SmtpAppender.cs | 260 +++---- src/log4net/Config/XmlConfigurator.cs | 638 +++++++++--------- src/log4net/Layout/Layout2RawLayoutAdapter.cs | 2 +- src/log4net/Layout/LayoutSkeleton.cs | 182 ++--- src/log4net/ObjectRenderer/RendererMap.cs | 4 +- src/log4net/Util/PatternString.cs | 2 +- 8 files changed, 575 insertions(+), 540 deletions(-) diff --git a/src/log4net/Appender/AdoNetAppender.cs b/src/log4net/Appender/AdoNetAppender.cs index a509cc176..72a5a7620 100644 --- a/src/log4net/Appender/AdoNetAppender.cs +++ b/src/log4net/Appender/AdoNetAppender.cs @@ -617,7 +617,7 @@ virtual protected string GetLogStatement(LoggingEvent logEvent) } else { - StringWriter writer = new StringWriter(System.Globalization.CultureInfo.InvariantCulture); + using StringWriter writer = new StringWriter(System.Globalization.CultureInfo.InvariantCulture); Layout.Format(writer, logEvent); return writer.ToString(); } diff --git a/src/log4net/Appender/FileAppender.cs b/src/log4net/Appender/FileAppender.cs index e283f49ef..f0c2bc1f8 100644 --- a/src/log4net/Appender/FileAppender.cs +++ b/src/log4net/Appender/FileAppender.cs @@ -19,6 +19,9 @@ using System; using System.IO; +#if !NETCF && !NETSTANDARD1_3 +using System.Runtime.Serialization; +#endif using System.Text; using System.Threading; using log4net.Util; @@ -138,12 +141,29 @@ public class FileAppender : TextWriterAppender /// private sealed class LockingStream : Stream, IDisposable { +#if !NETCR + [Serializable] +#endif public sealed class LockStateException : LogException { public LockStateException(string message) : base(message) { } + + public LockStateException() + { + } + + public LockStateException(string message, Exception innerException) : base(message, innerException) + { + } + +#if !NETCR && !NETSTANDARD1_3 + private LockStateException(SerializationInfo info, StreamingContext context) : base(info, context) + { + } +#endif } private Stream m_realStream = null; @@ -1409,7 +1429,10 @@ virtual protected void OpenFile(string fileName, bool append) /// virtual protected void SetQWForFiles(Stream fileStream) { - SetQWForFiles(new StreamWriter(fileStream, m_encoding)); +#pragma warning disable CA2000 // Dispose objects before losing scope + StreamWriter writer = new StreamWriter(fileStream, m_encoding); +#pragma warning restore CA2000 // Dispose objects before losing scope + SetQWForFiles(writer); } /// diff --git a/src/log4net/Appender/SmtpAppender.cs b/src/log4net/Appender/SmtpAppender.cs index d19ad90a5..bbe8bd51a 100644 --- a/src/log4net/Appender/SmtpAppender.cs +++ b/src/log4net/Appender/SmtpAppender.cs @@ -92,20 +92,20 @@ public SmtpAppender() /// Gets or sets a comma- or semicolon-delimited list of recipient e-mail addresses (use semicolon on .NET 1.1 and comma for later versions). /// /// - /// - /// For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. - /// - /// - /// For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. - /// + /// + /// For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + /// + /// + /// For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + /// /// /// - /// - /// For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. - /// - /// - /// For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. - /// + /// + /// For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + /// + /// + /// For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + /// /// public string To { @@ -113,49 +113,49 @@ public string To set { m_to = MaybeTrimSeparators(value); } } - /// - /// Gets or sets a comma- or semicolon-delimited list of recipient e-mail addresses - /// that will be carbon copied (use semicolon on .NET 1.1 and comma for later versions). - /// - /// - /// - /// For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. - /// - /// - /// For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. - /// - /// - /// - /// - /// For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. - /// - /// - /// For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. - /// - /// - public string Cc - { - get { return m_cc; } - set { m_cc = MaybeTrimSeparators(value); } - } - - /// - /// Gets or sets a semicolon-delimited list of recipient e-mail addresses - /// that will be blind carbon copied. - /// - /// - /// A semicolon-delimited list of e-mail addresses. - /// - /// - /// - /// A semicolon-delimited list of recipient e-mail addresses. - /// - /// - public string Bcc - { - get { return m_bcc; } - set { m_bcc = MaybeTrimSeparators(value); } - } + /// + /// Gets or sets a comma- or semicolon-delimited list of recipient e-mail addresses + /// that will be carbon copied (use semicolon on .NET 1.1 and comma for later versions). + /// + /// + /// + /// For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + /// + /// + /// For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + /// + /// + /// + /// + /// For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + /// + /// + /// For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + /// + /// + public string Cc + { + get { return m_cc; } + set { m_cc = MaybeTrimSeparators(value); } + } + + /// + /// Gets or sets a semicolon-delimited list of recipient e-mail addresses + /// that will be blind carbon copied. + /// + /// + /// A semicolon-delimited list of e-mail addresses. + /// + /// + /// + /// A semicolon-delimited list of recipient e-mail addresses. + /// + /// + public string Bcc + { + get { return m_bcc; } + set { m_bcc = MaybeTrimSeparators(value); } + } /// /// Gets or sets the e-mail address of the sender. @@ -324,29 +324,29 @@ public MailPriority Priority } #if NET_2_0 || MONO_2_0 || NETSTANDARD2_0 - /// - /// Enable or disable use of SSL when sending e-mail message - /// - /// - /// This is available on MS .NET 2.0 runtime and higher - /// - public bool EnableSsl - { - get { return m_enableSsl; } - set { m_enableSsl = value; } - } - - /// - /// Gets or sets the reply-to e-mail address. - /// - /// - /// This is available on MS .NET 2.0 runtime and higher - /// - public string ReplyTo - { - get { return m_replyTo; } - set { m_replyTo = value; } - } + /// + /// Enable or disable use of SSL when sending e-mail message + /// + /// + /// This is available on MS .NET 2.0 runtime and higher + /// + public bool EnableSsl + { + get { return m_enableSsl; } + set { m_enableSsl = value; } + } + + /// + /// Gets or sets the reply-to e-mail address. + /// + /// + /// This is available on MS .NET 2.0 runtime and higher + /// + public string ReplyTo + { + get { return m_replyTo; } + set { m_replyTo = value; } + } #endif /// @@ -387,7 +387,7 @@ override protected void SendBuffer(LoggingEvent[] events) // appender. This frees us from needing to synchronize again. try { - StringWriter writer = new StringWriter(System.Globalization.CultureInfo.InvariantCulture); + using StringWriter writer = new StringWriter(System.Globalization.CultureInfo.InvariantCulture); string t = Layout.Header; if (t != null) @@ -449,14 +449,18 @@ virtual protected void SendEmail(string messageBody) // The old API is deprecated. // Create and configure the smtp client +#if NET_4_0 || MONO_4_0 || NETSTANDARD2_0 + using SmtpClient smtpClient = new SmtpClient(); +#else SmtpClient smtpClient = new SmtpClient(); +#endif if (!String.IsNullOrEmpty(m_smtpHost)) { smtpClient.Host = m_smtpHost; } smtpClient.Port = m_port; smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; - smtpClient.EnableSsl = m_enableSsl; + smtpClient.EnableSsl = m_enableSsl; if (m_authentication == SmtpAuthentication.Basic) { @@ -469,38 +473,38 @@ virtual protected void SendEmail(string messageBody) smtpClient.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials; } - using (MailMessage mailMessage = new MailMessage()) - { - mailMessage.Body = messageBody; + using (MailMessage mailMessage = new MailMessage()) + { + mailMessage.Body = messageBody; mailMessage.BodyEncoding = m_bodyEncoding; - mailMessage.From = new MailAddress(m_from); - mailMessage.To.Add(m_to); - if (!String.IsNullOrEmpty(m_cc)) - { - mailMessage.CC.Add(m_cc); - } - if (!String.IsNullOrEmpty(m_bcc)) - { - mailMessage.Bcc.Add(m_bcc); - } - if (!String.IsNullOrEmpty(m_replyTo)) - { - // .NET 4.0 warning CS0618: 'System.Net.Mail.MailMessage.ReplyTo' is obsolete: - // 'ReplyTo is obsoleted for this type. Please use ReplyToList instead which can accept multiple addresses. http://go.microsoft.com/fwlink/?linkid=14202' + mailMessage.From = new MailAddress(m_from); + mailMessage.To.Add(m_to); + if (!String.IsNullOrEmpty(m_cc)) + { + mailMessage.CC.Add(m_cc); + } + if (!String.IsNullOrEmpty(m_bcc)) + { + mailMessage.Bcc.Add(m_bcc); + } + if (!String.IsNullOrEmpty(m_replyTo)) + { + // .NET 4.0 warning CS0618: 'System.Net.Mail.MailMessage.ReplyTo' is obsolete: + // 'ReplyTo is obsoleted for this type. Please use ReplyToList instead which can accept multiple addresses. http://go.microsoft.com/fwlink/?linkid=14202' #if !NET_4_0 && !MONO_4_0 && !NETSTANDARD2_0 - mailMessage.ReplyTo = new MailAddress(m_replyTo); + mailMessage.ReplyTo = new MailAddress(m_replyTo); #else - mailMessage.ReplyToList.Add(new MailAddress(m_replyTo)); + mailMessage.ReplyToList.Add(new MailAddress(m_replyTo)); #endif - } - mailMessage.Subject = m_subject; + } + mailMessage.Subject = m_subject; mailMessage.SubjectEncoding = m_subjectEncoding; - mailMessage.Priority = m_mailPriority; + mailMessage.Priority = m_mailPriority; - // TODO: Consider using SendAsync to send the message without blocking. This would be a change in - // behaviour compared to .NET 1.x. We would need a SendCompletedCallback to log errors. - smtpClient.Send(mailMessage); - } + // TODO: Consider using SendAsync to send the message without blocking. This would be a change in + // behaviour compared to .NET 1.x. We would need a SendCompletedCallback to log errors. + smtpClient.Send(mailMessage); + } #else // .NET 1.x uses the System.Web.Mail API for sending Mail @@ -509,14 +513,14 @@ virtual protected void SendEmail(string messageBody) mailMessage.BodyEncoding = m_bodyEncoding; mailMessage.From = m_from; mailMessage.To = m_to; - if (m_cc != null && m_cc.Length > 0) - { - mailMessage.Cc = m_cc; - } - if (m_bcc != null && m_bcc.Length > 0) - { - mailMessage.Bcc = m_bcc; - } + if (m_cc != null && m_cc.Length > 0) + { + mailMessage.Cc = m_cc; + } + if (m_bcc != null && m_bcc.Length > 0) + { + mailMessage.Bcc = m_bcc; + } mailMessage.Subject = m_subject; #if !MONO && !NET_1_0 && !NET_1_1 && !CLI_1_0 mailMessage.SubjectEncoding = m_subjectEncoding; @@ -585,8 +589,8 @@ virtual protected void SendEmail(string messageBody) #region Private Instance Fields private string m_to; - private string m_cc; - private string m_bcc; + private string m_cc; + private string m_bcc; private string m_from; private string m_subject; private string m_smtpHost; @@ -604,8 +608,8 @@ virtual protected void SendEmail(string messageBody) private MailPriority m_mailPriority = MailPriority.Normal; #if NET_2_0 || MONO_2_0 || NETSTANDARD2_0 - private bool m_enableSsl = false; - private string m_replyTo; + private bool m_enableSsl = false; + private string m_replyTo; #endif #endregion // Private Instance Fields @@ -646,19 +650,19 @@ public enum SmtpAuthentication #endregion // SmtpAuthentication Enum - private static readonly char[] ADDRESS_DELIMITERS = new char[] { ',', ';' }; - - /// - /// trims leading and trailing commas or semicolons - /// - private static string MaybeTrimSeparators(string s) { + private static readonly char[] ADDRESS_DELIMITERS = new char[] { ',', ';' }; + + /// + /// trims leading and trailing commas or semicolons + /// + private static string MaybeTrimSeparators(string s) { #if NET_2_0 || MONO_2_0 || NETSTANDARD2_0 - return string.IsNullOrEmpty(s) ? s : s.Trim(ADDRESS_DELIMITERS); + return string.IsNullOrEmpty(s) ? s : s.Trim(ADDRESS_DELIMITERS); #else - return s != null && s.Length > 0 ? s : s.Trim(ADDRESS_DELIMITERS); + return s != null && s.Length > 0 ? s : s.Trim(ADDRESS_DELIMITERS); #endif - } - } + } + } } #endif // !NETCF && !SSCLI diff --git a/src/log4net/Config/XmlConfigurator.cs b/src/log4net/Config/XmlConfigurator.cs index 02795fd15..cd9ebfea9 100644 --- a/src/log4net/Config/XmlConfigurator.cs +++ b/src/log4net/Config/XmlConfigurator.cs @@ -49,8 +49,8 @@ public sealed class XmlConfigurator /// /// Private constructor /// - private XmlConfigurator() - { + private XmlConfigurator() + { } #endregion Protected Instance Constructors @@ -58,26 +58,26 @@ private XmlConfigurator() #region Configure static methods #if !NETCF - /// - /// Automatically configures the using settings - /// stored in the application's configuration file. - /// - /// - /// - /// Each application has a configuration file. This has the - /// same name as the application with '.config' appended. - /// This file is XML and calling this function prompts the - /// configurator to look in that file for a section called - /// log4net that contains the configuration data. - /// - /// - /// To use this method to configure log4net you must specify - /// the section - /// handler for the log4net configuration section. See the - /// for an example. - /// - /// - /// The repository to configure. + /// + /// Automatically configures the using settings + /// stored in the application's configuration file. + /// + /// + /// + /// Each application has a configuration file. This has the + /// same name as the application with '.config' appended. + /// This file is XML and calling this function prompts the + /// configurator to look in that file for a section called + /// log4net that contains the configuration data. + /// + /// + /// To use this method to configure log4net you must specify + /// the section + /// handler for the log4net configuration section. See the + /// for an example. + /// + /// + /// The repository to configure. #else /// /// Automatically configures the using settings @@ -94,21 +94,21 @@ private XmlConfigurator() /// /// The repository to configure. #endif - static public ICollection Configure(ILoggerRepository repository) - { - ArrayList configurationMessages = new ArrayList(); + static public ICollection Configure(ILoggerRepository repository) + { + ArrayList configurationMessages = new ArrayList(); - using (new LogLog.LogReceivedAdapter(configurationMessages)) - { - InternalConfigure(repository); - } + using (new LogLog.LogReceivedAdapter(configurationMessages)) + { + InternalConfigure(repository); + } - repository.ConfigurationMessages = configurationMessages; + repository.ConfigurationMessages = configurationMessages; - return configurationMessages; - } + return configurationMessages; + } - static private void InternalConfigure(ILoggerRepository repository) + static private void InternalConfigure(ILoggerRepository repository) { LogLog.Debug(declaringType, "configuring repository [" + repository.Name + "] using .config file section"); @@ -194,10 +194,10 @@ static private void InternalConfigure(ILoggerRepository repository) /// /// #endif - static public ICollection Configure() - { - return Configure(LogManager.GetRepository(Assembly.GetCallingAssembly())); - } + static public ICollection Configure() + { + return Configure(LogManager.GetRepository(Assembly.GetCallingAssembly())); + } /// /// Configures log4net using a log4net element @@ -209,20 +209,20 @@ static public ICollection Configure() /// /// /// The element to parse. - static public ICollection Configure(XmlElement element) + static public ICollection Configure(XmlElement element) { - ArrayList configurationMessages = new ArrayList(); + ArrayList configurationMessages = new ArrayList(); - ILoggerRepository repository = LogManager.GetRepository(Assembly.GetCallingAssembly()); + ILoggerRepository repository = LogManager.GetRepository(Assembly.GetCallingAssembly()); - using (new LogLog.LogReceivedAdapter(configurationMessages)) - { - InternalConfigureFromXml(repository, element); - } + using (new LogLog.LogReceivedAdapter(configurationMessages)) + { + InternalConfigureFromXml(repository, element); + } - repository.ConfigurationMessages = configurationMessages; + repository.ConfigurationMessages = configurationMessages; - return configurationMessages; + return configurationMessages; } #if !NETCF @@ -314,14 +314,14 @@ static public ICollection Configure(XmlElement element) #endif static public ICollection Configure(FileInfo configFile) { - ArrayList configurationMessages = new ArrayList(); + ArrayList configurationMessages = new ArrayList(); - using (new LogLog.LogReceivedAdapter(configurationMessages)) - { - InternalConfigure(LogManager.GetRepository(Assembly.GetCallingAssembly()), configFile); - } + using (new LogLog.LogReceivedAdapter(configurationMessages)) + { + InternalConfigure(LogManager.GetRepository(Assembly.GetCallingAssembly()), configFile); + } - return configurationMessages; + return configurationMessages; } /// @@ -340,17 +340,17 @@ static public ICollection Configure(FileInfo configFile) /// static public ICollection Configure(Uri configUri) { - ArrayList configurationMessages = new ArrayList(); + ArrayList configurationMessages = new ArrayList(); - ILoggerRepository repository = LogManager.GetRepository(Assembly.GetCallingAssembly()); - using (new LogLog.LogReceivedAdapter(configurationMessages)) - { - InternalConfigure(repository, configUri); - } + ILoggerRepository repository = LogManager.GetRepository(Assembly.GetCallingAssembly()); + using (new LogLog.LogReceivedAdapter(configurationMessages)) + { + InternalConfigure(repository, configUri); + } - repository.ConfigurationMessages = configurationMessages; + repository.ConfigurationMessages = configurationMessages; - return configurationMessages; + return configurationMessages; } /// @@ -369,99 +369,99 @@ static public ICollection Configure(Uri configUri) /// static public ICollection Configure(Stream configStream) { - ArrayList configurationMessages = new ArrayList(); + ArrayList configurationMessages = new ArrayList(); - ILoggerRepository repository = LogManager.GetRepository(Assembly.GetCallingAssembly()); - using (new LogLog.LogReceivedAdapter(configurationMessages)) - { - InternalConfigure(repository, configStream); - } + ILoggerRepository repository = LogManager.GetRepository(Assembly.GetCallingAssembly()); + using (new LogLog.LogReceivedAdapter(configurationMessages)) + { + InternalConfigure(repository, configStream); + } - repository.ConfigurationMessages = configurationMessages; + repository.ConfigurationMessages = configurationMessages; - return configurationMessages; + return configurationMessages; } #endif // !NETSTANDARD1_3 - /// - /// Configures the using the specified XML - /// element. - /// - /// - /// Loads the log4net configuration from the XML element - /// supplied as . - /// - /// The repository to configure. - /// The element to parse. - static public ICollection Configure(ILoggerRepository repository, XmlElement element) - { - ArrayList configurationMessages = new ArrayList(); + /// + /// Configures the using the specified XML + /// element. + /// + /// + /// Loads the log4net configuration from the XML element + /// supplied as . + /// + /// The repository to configure. + /// The element to parse. + static public ICollection Configure(ILoggerRepository repository, XmlElement element) + { + ArrayList configurationMessages = new ArrayList(); - using (new LogLog.LogReceivedAdapter(configurationMessages)) - { - LogLog.Debug(declaringType, "configuring repository [" + repository.Name + "] using XML element"); + using (new LogLog.LogReceivedAdapter(configurationMessages)) + { + LogLog.Debug(declaringType, "configuring repository [" + repository.Name + "] using XML element"); - InternalConfigureFromXml(repository, element); - } + InternalConfigureFromXml(repository, element); + } - repository.ConfigurationMessages = configurationMessages; + repository.ConfigurationMessages = configurationMessages; - return configurationMessages; - } + return configurationMessages; + } #if !NETCF - /// - /// Configures the using the specified configuration - /// file. - /// - /// The repository to configure. - /// The XML file to load the configuration from. - /// - /// - /// The configuration file must be valid XML. It must contain - /// at least one element called log4net that holds - /// the configuration data. - /// - /// - /// The log4net configuration file can possible be specified in the application's - /// configuration file (either MyAppName.exe.config for a - /// normal application on Web.config for an ASP.NET application). - /// - /// - /// The first element matching <configuration> will be read as the - /// configuration. If this file is also a .NET .config file then you must specify - /// a configuration section for the log4net element otherwise .NET will - /// complain. Set the type for the section handler to , for example: - /// - /// - ///
- /// - /// - /// - /// - /// The following example configures log4net using a configuration file, of which the - /// location is stored in the application's configuration file : - /// - /// - /// using log4net.Config; - /// using System.IO; - /// using System.Configuration; - /// - /// ... - /// - /// XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); - /// - /// - /// In the .config file, the path to the log4net can be specified like this : - /// - /// - /// - /// - /// - /// - /// - /// - /// + /// + /// Configures the using the specified configuration + /// file. + /// + /// The repository to configure. + /// The XML file to load the configuration from. + /// + /// + /// The configuration file must be valid XML. It must contain + /// at least one element called log4net that holds + /// the configuration data. + /// + /// + /// The log4net configuration file can possible be specified in the application's + /// configuration file (either MyAppName.exe.config for a + /// normal application on Web.config for an ASP.NET application). + /// + /// + /// The first element matching <configuration> will be read as the + /// configuration. If this file is also a .NET .config file then you must specify + /// a configuration section for the log4net element otherwise .NET will + /// complain. Set the type for the section handler to , for example: + /// + /// + ///
+ /// + /// + /// + /// + /// The following example configures log4net using a configuration file, of which the + /// location is stored in the application's configuration file : + /// + /// + /// using log4net.Config; + /// using System.IO; + /// using System.Configuration; + /// + /// ... + /// + /// XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + /// + /// + /// In the .config file, the path to the log4net can be specified like this : + /// + /// + /// + /// + /// + /// + /// + /// + /// #else /// /// Configures the using the specified configuration @@ -500,20 +500,20 @@ static public ICollection Configure(ILoggerRepository repository, XmlElement ele /// /// #endif - static public ICollection Configure(ILoggerRepository repository, FileInfo configFile) - { - ArrayList configurationMessages = new ArrayList(); + static public ICollection Configure(ILoggerRepository repository, FileInfo configFile) + { + ArrayList configurationMessages = new ArrayList(); - using (new LogLog.LogReceivedAdapter(configurationMessages)) - { - InternalConfigure(repository, configFile); - } + using (new LogLog.LogReceivedAdapter(configurationMessages)) + { + InternalConfigure(repository, configFile); + } - repository.ConfigurationMessages = configurationMessages; + repository.ConfigurationMessages = configurationMessages; + + return configurationMessages; + } - return configurationMessages; - } - static private void InternalConfigure(ILoggerRepository repository, FileInfo configFile) { LogLog.Debug(declaringType, "configuring repository [" + repository.Name + "] using file [" + configFile + "]"); @@ -530,7 +530,7 @@ static private void InternalConfigure(ILoggerRepository repository, FileInfo con { // Open the file for reading FileStream fs = null; - + // Try hard to open the file for(int retry = 5; --retry >= 0; ) { @@ -573,36 +573,36 @@ static private void InternalConfigure(ILoggerRepository repository, FileInfo con } } - /// - /// Configures the using the specified configuration - /// URI. - /// - /// The repository to configure. - /// A URI to load the XML configuration from. - /// - /// - /// The configuration data must be valid XML. It must contain - /// at least one element called log4net that holds - /// the configuration data. - /// - /// - /// The must support the URI scheme specified. - /// - /// - static public ICollection Configure(ILoggerRepository repository, Uri configUri) - { - ArrayList configurationMessages = new ArrayList(); - - using (new LogLog.LogReceivedAdapter(configurationMessages)) - { - InternalConfigure(repository, configUri); - } - - repository.ConfigurationMessages = configurationMessages; - - return configurationMessages; - } - + /// + /// Configures the using the specified configuration + /// URI. + /// + /// The repository to configure. + /// A URI to load the XML configuration from. + /// + /// + /// The configuration data must be valid XML. It must contain + /// at least one element called log4net that holds + /// the configuration data. + /// + /// + /// The must support the URI scheme specified. + /// + /// + static public ICollection Configure(ILoggerRepository repository, Uri configUri) + { + ArrayList configurationMessages = new ArrayList(); + + using (new LogLog.LogReceivedAdapter(configurationMessages)) + { + InternalConfigure(repository, configUri); + } + + repository.ConfigurationMessages = configurationMessages; + + return configurationMessages; + } + static private void InternalConfigure(ILoggerRepository repository, Uri configUri) { LogLog.Debug(declaringType, "configuring repository [" + repository.Name + "] using URI ["+configUri+"]"); @@ -667,36 +667,36 @@ static private void InternalConfigure(ILoggerRepository repository, Uri configUr } } - /// - /// Configures the using the specified configuration - /// file. - /// - /// The repository to configure. - /// The stream to load the XML configuration from. - /// - /// - /// The configuration data must be valid XML. It must contain - /// at least one element called log4net that holds - /// the configuration data. - /// - /// - /// Note that this method will NOT close the stream parameter. - /// - /// - static public ICollection Configure(ILoggerRepository repository, Stream configStream) - { - ArrayList configurationMessages = new ArrayList(); - - using (new LogLog.LogReceivedAdapter(configurationMessages)) - { - InternalConfigure(repository, configStream); - } - - repository.ConfigurationMessages = configurationMessages; - - return configurationMessages; - } - + /// + /// Configures the using the specified configuration + /// file. + /// + /// The repository to configure. + /// The stream to load the XML configuration from. + /// + /// + /// The configuration data must be valid XML. It must contain + /// at least one element called log4net that holds + /// the configuration data. + /// + /// + /// Note that this method will NOT close the stream parameter. + /// + /// + static public ICollection Configure(ILoggerRepository repository, Stream configStream) + { + ArrayList configurationMessages = new ArrayList(); + + using (new LogLog.LogReceivedAdapter(configurationMessages)) + { + InternalConfigure(repository, configStream); + } + + repository.ConfigurationMessages = configurationMessages; + + return configurationMessages; + } + static private void InternalConfigure(ILoggerRepository repository, Stream configStream) { LogLog.Debug(declaringType, "configuring repository [" + repository.Name + "] using stream"); @@ -708,7 +708,11 @@ static private void InternalConfigure(ILoggerRepository repository, Stream confi else { // Load the config file into a document +#if NETSTANDARD1_3 XmlDocument doc = new XmlDocument(); +#else + XmlDocument doc = new XmlDocument { XmlResolver = null }; +#endif try { #if (NETCF) @@ -717,8 +721,8 @@ static private void InternalConfigure(ILoggerRepository repository, Stream confi #elif NET_2_0 || NETSTANDARD // Allow the DTD to specify entity includes XmlReaderSettings settings = new XmlReaderSettings(); - // .NET 4.0 warning CS0618: 'System.Xml.XmlReaderSettings.ProhibitDtd' - // is obsolete: 'Use XmlReaderSettings.DtdProcessing property instead.' + // .NET 4.0 warning CS0618: 'System.Xml.XmlReaderSettings.ProhibitDtd' + // is obsolete: 'Use XmlReaderSettings.DtdProcessing property instead.' #if NETSTANDARD1_3 // TODO DtdProcessing.Parse not yet available (https://github.com/dotnet/corefx/issues/4376) settings.DtdProcessing = DtdProcessing.Ignore; #elif !NET_4_0 && !MONO_4_0 && !NETSTANDARD2_0 @@ -728,17 +732,17 @@ static private void InternalConfigure(ILoggerRepository repository, Stream confi #endif // Create a reader over the input stream - XmlReader xmlReader = XmlReader.Create(configStream, settings); + using XmlReader xmlReader = XmlReader.Create(configStream, settings); #else // Create a validating reader around a text reader for the file stream - XmlValidatingReader xmlReader = new XmlValidatingReader(new XmlTextReader(configStream)); + using XmlValidatingReader xmlReader = new XmlValidatingReader(new XmlTextReader(configStream)); // Specify that the reader should not perform validation, but that it should // expand entity refs. xmlReader.ValidationType = ValidationType.None; xmlReader.EntityHandling = EntityHandling.ExpandEntities; #endif - + // load the data into the document doc.Load(xmlReader); } @@ -801,58 +805,58 @@ static private void InternalConfigure(ILoggerRepository repository, Stream confi /// static public ICollection ConfigureAndWatch(FileInfo configFile) { - ArrayList configurationMessages = new ArrayList(); + ArrayList configurationMessages = new ArrayList(); - ILoggerRepository repository = LogManager.GetRepository(Assembly.GetCallingAssembly()); + ILoggerRepository repository = LogManager.GetRepository(Assembly.GetCallingAssembly()); - using (new LogLog.LogReceivedAdapter(configurationMessages)) - { - InternalConfigureAndWatch(repository, configFile); - } + using (new LogLog.LogReceivedAdapter(configurationMessages)) + { + InternalConfigureAndWatch(repository, configFile); + } - repository.ConfigurationMessages = configurationMessages; + repository.ConfigurationMessages = configurationMessages; - return configurationMessages; + return configurationMessages; } #endif // !NETSTANDARD1_3 - /// - /// Configures the using the file specified, - /// monitors the file for changes and reloads the configuration if a change - /// is detected. - /// - /// The repository to configure. - /// The XML file to load the configuration from. - /// - /// - /// The configuration file must be valid XML. It must contain - /// at least one element called log4net that holds - /// the configuration data. - /// - /// - /// The configuration file will be monitored using a - /// and depends on the behavior of that class. - /// - /// - /// For more information on how to configure log4net using - /// a separate configuration file, see . - /// - /// - /// - static public ICollection ConfigureAndWatch(ILoggerRepository repository, FileInfo configFile) - { - ArrayList configurationMessages = new ArrayList(); - - using (new LogLog.LogReceivedAdapter(configurationMessages)) - { - InternalConfigureAndWatch(repository, configFile); - } - - repository.ConfigurationMessages = configurationMessages; - - return configurationMessages; - } - + /// + /// Configures the using the file specified, + /// monitors the file for changes and reloads the configuration if a change + /// is detected. + /// + /// The repository to configure. + /// The XML file to load the configuration from. + /// + /// + /// The configuration file must be valid XML. It must contain + /// at least one element called log4net that holds + /// the configuration data. + /// + /// + /// The configuration file will be monitored using a + /// and depends on the behavior of that class. + /// + /// + /// For more information on how to configure log4net using + /// a separate configuration file, see . + /// + /// + /// + static public ICollection ConfigureAndWatch(ILoggerRepository repository, FileInfo configFile) + { + ArrayList configurationMessages = new ArrayList(); + + using (new LogLog.LogReceivedAdapter(configurationMessages)) + { + InternalConfigureAndWatch(repository, configFile); + } + + repository.ConfigurationMessages = configurationMessages; + + return configurationMessages; + } + static private void InternalConfigureAndWatch(ILoggerRepository repository, FileInfo configFile) { LogLog.Debug(declaringType, "configuring repository [" + repository.Name + "] using file [" + configFile + "] watching for file updates"); @@ -868,23 +872,23 @@ static private void InternalConfigureAndWatch(ILoggerRepository repository, File try { - lock (m_repositoryName2ConfigAndWatchHandler) - { - // support multiple repositories each having their own watcher - ConfigureAndWatchHandler handler = + lock (m_repositoryName2ConfigAndWatchHandler) + { + // support multiple repositories each having their own watcher + ConfigureAndWatchHandler handler = (ConfigureAndWatchHandler)m_repositoryName2ConfigAndWatchHandler[configFile.FullName]; - if (handler != null) - { + if (handler != null) + { m_repositoryName2ConfigAndWatchHandler.Remove(configFile.FullName); - handler.Dispose(); - } + handler.Dispose(); + } - // Create and start a watch handler that will reload the - // configuration whenever the config file is modified. - handler = new ConfigureAndWatchHandler(repository, configFile); + // Create and start a watch handler that will reload the + // configuration whenever the config file is modified. + handler = new ConfigureAndWatchHandler(repository, configFile); m_repositoryName2ConfigAndWatchHandler[configFile.FullName] = handler; - } + } } catch(Exception ex) { @@ -938,15 +942,15 @@ private sealed class ConfigureAndWatchHandler : IDisposable /// private const int TimeoutMillis = 500; - /// - /// Watches file for changes. This object should be disposed when no longer - /// needed to free system handles on the watched resources. - /// - private FileSystemWatcher m_watcher; + /// + /// Watches file for changes. This object should be disposed when no longer + /// needed to free system handles on the watched resources. + /// + private FileSystemWatcher m_watcher; /// /// Initializes a new instance of the class to - /// watch a specified config file used to configure a repository. + /// watch a specified config file used to configure a repository. /// /// The repository to configure. /// The configuration file to watch. @@ -956,9 +960,9 @@ private sealed class ConfigureAndWatchHandler : IDisposable /// /// #if NET_4_0 || MONO_4_0 || NETSTANDARD - [System.Security.SecuritySafeCritical] + [System.Security.SecuritySafeCritical] #endif - public ConfigureAndWatchHandler(ILoggerRepository repository, FileInfo configFile) + public ConfigureAndWatchHandler(ILoggerRepository repository, FileInfo configFile) { m_repository = repository; m_configFile = configFile; @@ -982,7 +986,7 @@ public ConfigureAndWatchHandler(ILoggerRepository repository, FileInfo configFil m_watcher.EnableRaisingEvents = true; // Create the timer that will be used to deliver events. Set as disabled - m_timer = new Timer(new TimerCallback(OnWatchedFileChange), null, Timeout.Infinite, Timeout.Infinite); + m_timer = new Timer(new TimerCallback(OnWatchedFileChange), null, Timeout.Infinite, Timeout.Infinite); } /// @@ -1032,18 +1036,18 @@ private void OnWatchedFileChange(object state) XmlConfigurator.InternalConfigure(m_repository, m_configFile); } - /// - /// Release the handles held by the watcher and timer. - /// + /// + /// Release the handles held by the watcher and timer. + /// #if NET_4_0 || MONO_4_0 || NETSTANDARD - [System.Security.SecuritySafeCritical] + [System.Security.SecuritySafeCritical] #endif - public void Dispose() - { - m_watcher.EnableRaisingEvents = false; - m_watcher.Dispose(); - m_timer.Dispose(); - } + public void Dispose() + { + m_watcher.EnableRaisingEvents = false; + m_watcher.Dispose(); + m_timer.Dispose(); + } } #endif @@ -1066,7 +1070,7 @@ public void Dispose() /// to load the configuration from an . /// /// - static private void InternalConfigureFromXml(ILoggerRepository repository, XmlElement element) + static private void InternalConfigureFromXml(ILoggerRepository repository, XmlElement element) { if (element == null) { @@ -1090,36 +1094,40 @@ static private void InternalConfigureFromXml(ILoggerRepository repository, XmlEl // Copy the xml data into the root of a new document // this isolates the xml config data from the rest of // the document +#if NETSTANDARD1_3 XmlDocument newDoc = new XmlDocument(); +#else + XmlDocument newDoc = new XmlDocument { XmlResolver = null }; +#endif XmlElement newElement = (XmlElement)newDoc.AppendChild(newDoc.ImportNode(element, true)); // Pass the configurator the config element configurableRepository.Configure(newElement); - } + } } } #endregion Private Static Methods - #region Private Static Fields - - /// - /// Maps repository names to ConfigAndWatchHandler instances to allow a particular - /// ConfigAndWatchHandler to dispose of its FileSystemWatcher when a repository is - /// reconfigured. - /// - private readonly static Hashtable m_repositoryName2ConfigAndWatchHandler = new Hashtable(); - - /// - /// The fully qualified type of the XmlConfigurator class. - /// - /// - /// Used by the internal logger to record the Type of the - /// log message. - /// - private readonly static Type declaringType = typeof(XmlConfigurator); - - #endregion Private Static Fields + #region Private Static Fields + + /// + /// Maps repository names to ConfigAndWatchHandler instances to allow a particular + /// ConfigAndWatchHandler to dispose of its FileSystemWatcher when a repository is + /// reconfigured. + /// + private readonly static Hashtable m_repositoryName2ConfigAndWatchHandler = new Hashtable(); + + /// + /// The fully qualified type of the XmlConfigurator class. + /// + /// + /// Used by the internal logger to record the Type of the + /// log message. + /// + private readonly static Type declaringType = typeof(XmlConfigurator); + + #endregion Private Static Fields } } diff --git a/src/log4net/Layout/Layout2RawLayoutAdapter.cs b/src/log4net/Layout/Layout2RawLayoutAdapter.cs index 5b3707c22..494578418 100644 --- a/src/log4net/Layout/Layout2RawLayoutAdapter.cs +++ b/src/log4net/Layout/Layout2RawLayoutAdapter.cs @@ -83,7 +83,7 @@ public Layout2RawLayoutAdapter(ILayout layout) /// virtual public object Format(LoggingEvent loggingEvent) { - StringWriter writer = new StringWriter(System.Globalization.CultureInfo.InvariantCulture); + using StringWriter writer = new StringWriter(System.Globalization.CultureInfo.InvariantCulture); m_layout.Format(writer, loggingEvent); return writer.ToString(); } diff --git a/src/log4net/Layout/LayoutSkeleton.cs b/src/log4net/Layout/LayoutSkeleton.cs index b373ee144..afae60e7b 100644 --- a/src/log4net/Layout/LayoutSkeleton.cs +++ b/src/log4net/Layout/LayoutSkeleton.cs @@ -117,9 +117,9 @@ protected LayoutSkeleton() /// If any of the configuration properties are modified then /// must be called again. /// - /// - /// This method must be implemented by the subclass. - /// + /// + /// This method must be implemented by the subclass. + /// /// abstract public void ActivateOptions(); @@ -140,93 +140,93 @@ protected LayoutSkeleton() /// abstract public void Format(TextWriter writer, LoggingEvent loggingEvent); - /// - /// Convenience method for easily formatting the logging event into a string variable. - /// - /// - /// - /// Creates a new StringWriter instance to store the formatted logging event. - /// - public string Format(LoggingEvent loggingEvent) - { - StringWriter writer = new StringWriter(System.Globalization.CultureInfo.InvariantCulture); - Format(writer, loggingEvent); - return writer.ToString(); - } - - /// - /// The content type output by this layout. - /// - /// The content type is "text/plain" - /// - /// - /// The content type output by this layout. - /// - /// - /// This base class uses the value "text/plain". - /// To change this value a subclass must override this - /// property. - /// - /// - virtual public string ContentType - { - get { return "text/plain"; } - } - - /// - /// The header for the layout format. - /// - /// the layout header - /// - /// - /// The Header text will be appended before any logging events - /// are formatted and appended. - /// - /// - virtual public string Header - { - get { return m_header; } - set { m_header = value; } - } - - /// - /// The footer for the layout format. - /// - /// the layout footer - /// - /// - /// The Footer text will be appended after all the logging events - /// have been formatted and appended. - /// - /// - virtual public string Footer - { - get { return m_footer; } - set { m_footer = value; } - } - - /// - /// Flag indicating if this layout handles exceptions - /// - /// false if this layout handles exceptions - /// - /// - /// If this layout handles the exception object contained within - /// , then the layout should return - /// false. Otherwise, if the layout ignores the exception - /// object, then the layout should return true. - /// - /// - /// Set this value to override a this default setting. The default - /// value is true, this layout does not handle the exception. - /// - /// - virtual public bool IgnoresException - { - get { return m_ignoresException; } - set { m_ignoresException = value; } - } - - #endregion + /// + /// Convenience method for easily formatting the logging event into a string variable. + /// + /// + /// + /// Creates a new StringWriter instance to store the formatted logging event. + /// + public string Format(LoggingEvent loggingEvent) + { + using StringWriter writer = new StringWriter(System.Globalization.CultureInfo.InvariantCulture); + Format(writer, loggingEvent); + return writer.ToString(); + } + + /// + /// The content type output by this layout. + /// + /// The content type is "text/plain" + /// + /// + /// The content type output by this layout. + /// + /// + /// This base class uses the value "text/plain". + /// To change this value a subclass must override this + /// property. + /// + /// + virtual public string ContentType + { + get { return "text/plain"; } + } + + /// + /// The header for the layout format. + /// + /// the layout header + /// + /// + /// The Header text will be appended before any logging events + /// are formatted and appended. + /// + /// + virtual public string Header + { + get { return m_header; } + set { m_header = value; } + } + + /// + /// The footer for the layout format. + /// + /// the layout footer + /// + /// + /// The Footer text will be appended after all the logging events + /// have been formatted and appended. + /// + /// + virtual public string Footer + { + get { return m_footer; } + set { m_footer = value; } + } + + /// + /// Flag indicating if this layout handles exceptions + /// + /// false if this layout handles exceptions + /// + /// + /// If this layout handles the exception object contained within + /// , then the layout should return + /// false. Otherwise, if the layout ignores the exception + /// object, then the layout should return true. + /// + /// + /// Set this value to override a this default setting. The default + /// value is true, this layout does not handle the exception. + /// + /// + virtual public bool IgnoresException + { + get { return m_ignoresException; } + set { m_ignoresException = value; } + } + + #endregion } } diff --git a/src/log4net/ObjectRenderer/RendererMap.cs b/src/log4net/ObjectRenderer/RendererMap.cs index 7f4db96ce..666dfda46 100644 --- a/src/log4net/ObjectRenderer/RendererMap.cs +++ b/src/log4net/ObjectRenderer/RendererMap.cs @@ -45,7 +45,7 @@ namespace log4net.ObjectRenderer /// Gert Driesen public class RendererMap { - private readonly static Type declaringType = typeof(RendererMap); + private readonly static Type declaringType = typeof(RendererMap); #region Member Variables @@ -94,7 +94,7 @@ public string FindAndRender(object obj) return strData; } - StringWriter stringWriter = new StringWriter(System.Globalization.CultureInfo.InvariantCulture); + using StringWriter stringWriter = new StringWriter(System.Globalization.CultureInfo.InvariantCulture); FindAndRender(obj, stringWriter); return stringWriter.ToString(); } diff --git a/src/log4net/Util/PatternString.cs b/src/log4net/Util/PatternString.cs index 4a840eda8..72d9ba921 100644 --- a/src/log4net/Util/PatternString.cs +++ b/src/log4net/Util/PatternString.cs @@ -467,7 +467,7 @@ public void Format(TextWriter writer) /// public string Format() { - StringWriter writer = new StringWriter(System.Globalization.CultureInfo.InvariantCulture); + using StringWriter writer = new StringWriter(System.Globalization.CultureInfo.InvariantCulture); Format(writer); return writer.ToString(); } From 67fd5a1fab758910e73c648f036708131df44d86 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Fri, 18 Sep 2020 13:34:32 +0200 Subject: [PATCH 006/122] :wrench: add automagic to synchronise assembly version info with csproj --- local-tasks/update-version-info.js | 51 +++++++++++++++++++++++++++++ package-lock.json | 34 ++++++++++++++++--- package.json | 6 ++-- src/log4net/AssemblyInfo.cs | 46 +++++++++++++------------- src/log4net/AssemblyVersionInfo.cpp | 48 --------------------------- src/log4net/AssemblyVersionInfo.js | 49 --------------------------- src/log4net/AssemblyVersionInfo.vb | 46 -------------------------- src/log4net/log4net.csproj | 2 +- 8 files changed, 109 insertions(+), 173 deletions(-) create mode 100644 local-tasks/update-version-info.js delete mode 100644 src/log4net/AssemblyVersionInfo.cpp delete mode 100644 src/log4net/AssemblyVersionInfo.js delete mode 100644 src/log4net/AssemblyVersionInfo.vb diff --git a/local-tasks/update-version-info.js b/local-tasks/update-version-info.js new file mode 100644 index 000000000..314bf5cc3 --- /dev/null +++ b/local-tasks/update-version-info.js @@ -0,0 +1,51 @@ +const + gulp = requireModule("gulp"); + +gulp.task("update-version-info", async () => { + // the version as per the .csproj is the correct version, but there + // are other places where the version string is set via [assembly] + // attributes, so we need to re-align them all + const + Git = require("simple-git/promise"), + readTextFile = requireModule("read-text-file"), + writeTextFile = requireModule("write-text-file"), + readCsProjVersion = requireModule("read-csproj-version"), + currentVersion = await readCsProjVersion("src/log4net/log4net.csproj"), + assemblyInfo = "src/log4net/AssemblyInfo.cs", + assemblyVersionInfo = "src/log4net/AssemblyVersionInfo.cs", + versionString = sanitiseVersion(currentVersion); + + await updateVersionsIn(assemblyInfo, versionString); + await updateVersionsIn(assemblyVersionInfo, versionString); + + const git = new Git("."); + await git.add([ + assemblyInfo, + assemblyVersionInfo + ]); + await git.commit(`:bookmark: update versioning to ${versionString}`); + + async function updateVersionsIn( + filePath, + newVersion + ) { + const + contents = await readTextFile(filePath), + updated = contents + // specific matches for "x.x.x.x" + .replace(/"\d+\.\d+\.\d+\.\d+"/g, `"${newVersion}"`) + // matches for "x.x.x.x- as found in AssemblyVersionInfo.cs + .replace(/"\d+\.\d+\.\d+\.\d+-/g, `"${newVersion}-`); + await writeTextFile(filePath, updated); + } + + function sanitiseVersion(version) { + const parts = version.split("."); + while (parts.length < 4) { + parts.push("0"); + } + return parts.slice(0, 4).join("."); + } +}); + + diff --git a/package-lock.json b/package-lock.json index 68573e0c6..5368c2fd6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,21 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "dev": true, + "requires": { + "debug": "^4.1.1" + } + }, + "@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", + "dev": true + }, "@nodelib/fs.scandir": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", @@ -5010,12 +5025,14 @@ "dev": true }, "simple-git": { - "version": "1.132.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.132.0.tgz", - "integrity": "sha512-xauHm1YqCTom1sC9eOjfq3/9RKiUA9iPnxBbrY2DdL8l4ADMu0jjM5l5lphQP5YWNqAL2aXC/OeuQ76vHtW5fg==", + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-2.20.1.tgz", + "integrity": "sha512-aa9s2ZLjXlHCVGbDXQLInMLvLkxKEclqMU9X5HMXi3tLWLxbWObz1UgtyZha6ocHarQtFp0OjQW9KHVR1g6wbA==", "dev": true, "requires": { - "debug": "^4.0.1" + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.1.1" } }, "slash": { @@ -6242,6 +6259,15 @@ "xml2js": "^0.4.23" }, "dependencies": { + "simple-git": { + "version": "1.132.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.132.0.tgz", + "integrity": "sha512-xauHm1YqCTom1sC9eOjfq3/9RKiUA9iPnxBbrY2DdL8l4ADMu0jjM5l5lphQP5YWNqAL2aXC/OeuQ76vHtW5fg==", + "dev": true, + "requires": { + "debug": "^4.0.1" + } + }, "through2": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", diff --git a/package.json b/package.json index b4999d831..09ab351c6 100644 --- a/package.json +++ b/package.json @@ -11,8 +11,9 @@ "build-site": "run-s \"zarro build-site\"", "prepare-build-artifacts": "run-s \"zarro prepare-build-artifacts\"", "dump-env": "node -e \"console.log(process.env);\"", - "release": "run-s build-release prepare-build-artifacts build-site", - "zarro": "cross-env BUILD_INCLUDE=src/log4net.sln zarro" + "release": "run-s update-version-info build-release prepare-build-artifacts build-site", + "zarro": "cross-env BUILD_INCLUDE=src/log4net.sln zarro", + "update-version-info": "run-s \"zarro update-version-info\"" }, "repository": { "type": "git", @@ -29,6 +30,7 @@ "gulp-zip": "^5.0.1", "npm-run-all": "^4.1.5", "rimraf": "^3.0.2", + "simple-git": "^2.20.1", "which": "^2.0.2", "yafs": "^1.5.0", "zarro": "^1.78.0" diff --git a/src/log4net/AssemblyInfo.cs b/src/log4net/AssemblyInfo.cs index 2e33cb7b5..5264ed2a1 100644 --- a/src/log4net/AssemblyInfo.cs +++ b/src/log4net/AssemblyInfo.cs @@ -54,77 +54,77 @@ // #if (CLI_1_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.9.0-.CLI 1.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-.CLI 1.0")] [assembly: AssemblyTitle("Apache log4net for CLI 1.0 Compatible Frameworks")] #elif (NET_1_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.9.0-.NET 1.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-.NET 1.0")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 1.0")] #elif (NET_1_1) -[assembly: AssemblyInformationalVersionAttribute("2.0.9.0-.NET 1.1")] +[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-.NET 1.1")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 1.1")] #elif (NET_4_5) -[assembly: AssemblyInformationalVersionAttribute("2.0.9.0-.NET 4.5")] +[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-.NET 4.5")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 4.5")] #elif (NET_4_0) #if CLIENT_PROFILE -[assembly: AssemblyInformationalVersionAttribute("2.0.9.0-.NET 4.0 CP")] +[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-.NET 4.0 CP")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 4.0 Client Profile")] #else -[assembly: AssemblyInformationalVersionAttribute("2.0.9.0-.NET 4.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-.NET 4.0")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 4.0")] #endif // Client Profile #elif (NET_3_5) #if CLIENT_PROFILE -[assembly: AssemblyInformationalVersionAttribute("2.0.9.0-.NET 3.5 CP")] +[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-.NET 3.5 CP")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 3.5 Client Profile")] #else -[assembly: AssemblyInformationalVersionAttribute("2.0.9.0-.NET 3.5")] +[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-.NET 3.5")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 3.5")] #endif // Client Profile #elif (NET_2_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.9.0-.NET 2.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-.NET 2.0")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 2.0")] #elif (NETCF_1_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.9.0-.NETCF 1.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-.NETCF 1.0")] [assembly: AssemblyTitle("Apache log4net for .NET Compact Framework 1.0")] #elif (NETCF_2_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.9.0-.NETCF 2.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-.NETCF 2.0")] [assembly: AssemblyTitle("Apache log4net for .NET Compact Framework 2.0")] #elif (MONO_1_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.9.0-Mono 1.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-Mono 1.0")] [assembly: AssemblyTitle("Apache log4net for Mono 1.0")] #elif (MONO_2_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.9.0-Mono 2.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-Mono 2.0")] [assembly: AssemblyTitle("Apache log4net for Mono 2.0")] #elif (MONO_3_5) -[assembly: AssemblyInformationalVersionAttribute("2.0.9.0-Mono 3.5")] +[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-Mono 3.5")] [assembly: AssemblyTitle("Apache log4net for Mono 3.5")] #elif (MONO_4_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.9.0-Mono 4.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-Mono 4.0")] [assembly: AssemblyTitle("Apache log4net for Mono 4.0")] #elif (SSCLI_1_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.9.0-SSCLI 1.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-SSCLI 1.0")] [assembly: AssemblyTitle("Apache log4net for Shared Source CLI 1.0")] #elif (NET) -[assembly: AssemblyInformationalVersionAttribute("2.0.9.0-.NET")] +[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-.NET")] [assembly: AssemblyTitle("Apache log4net for .NET Framework")] #elif (NETSTANDARD1_3) -[assembly: AssemblyInformationalVersionAttribute("2.0.9.0-.NET Standard 1.3")] +[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-.NET Standard 1.3")] [assembly: AssemblyTitle("Apache log4net for .NET Standard 1.3")] #elif (NETSTANDARD2_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.9.0-.NET Standard 2.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-.NET Standard 2.0")] [assembly: AssemblyTitle("Apache log4net for .NET Standard 2.0")] #elif (NETCF) -[assembly: AssemblyInformationalVersionAttribute("2.0.9.0-.NETCF")] +[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-.NETCF")] [assembly: AssemblyTitle("Apache log4net for .NET Compact Framework")] #elif (MONO) -[assembly: AssemblyInformationalVersionAttribute("2.0.9.0-Mono")] +[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-Mono")] [assembly: AssemblyTitle("Apache log4net for Mono")] #elif (SSCLI) -[assembly: AssemblyInformationalVersionAttribute("2.0.9.0-SSCLI")] +[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-SSCLI")] [assembly: AssemblyTitle("Apache log4net for Shared Source CLI")] #else -[assembly: AssemblyInformationalVersionAttribute("2.0.9.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.11.0")] [assembly: AssemblyTitle("Apache log4net")] #endif diff --git a/src/log4net/AssemblyVersionInfo.cpp b/src/log4net/AssemblyVersionInfo.cpp deleted file mode 100644 index 8e1dedee9..000000000 --- a/src/log4net/AssemblyVersionInfo.cpp +++ /dev/null @@ -1,48 +0,0 @@ -// -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to you under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#using - -using namespace System::Reflection; -using namespace System::Runtime::CompilerServices; - -// -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the value or you can default the Revision and Build Numbers -// by using the '*' as shown below: - -[assembly: AssemblyVersionAttribute("2.0.9.0")]; - -#if !NETCF -#if !SSCLI -[assembly: AssemblyFileVersionAttribute("2.0.9.0")] -#endif -#endif - -// -// Shared assembly settings -// - -[assembly: AssemblyCompany("The Apache Software Foundation")]; -[assembly: AssemblyCopyright("Copyright 2004-2017 The Apache Software Foundation.")]; -[assembly: AssemblyTrademark("Apache and Apache log4net are trademarks of The Apache Software Foundation")]; diff --git a/src/log4net/AssemblyVersionInfo.js b/src/log4net/AssemblyVersionInfo.js deleted file mode 100644 index ed8178565..000000000 --- a/src/log4net/AssemblyVersionInfo.js +++ /dev/null @@ -1,49 +0,0 @@ -// -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to you under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - - -// -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: - -// JScript.NET doesn't handle files with only custom attributes very well, adding -// an import functions as a workaround for this issue. -import System.Reflection; - -[assembly: AssemblyVersion("2.0.9.0")] -[assembly: AssemblyInformationalVersionAttribute("1.2")] - -@if (!@NETCF) -@if (!@SSCLI) -[assembly: AssemblyFileVersion("2.0.9.0")] -@end -@end - -// -// Shared assembly settings -// - -[assembly: AssemblyCompany("The Apache Software Foundation")] -[assembly: AssemblyCopyright("Copyright 2004-2017 The Apache Software Foundation.")] -[assembly: AssemblyTrademark("Apache and Apache log4net are trademarks of The Apache Software Foundation")] diff --git a/src/log4net/AssemblyVersionInfo.vb b/src/log4net/AssemblyVersionInfo.vb deleted file mode 100644 index 8e6709ec3..000000000 --- a/src/log4net/AssemblyVersionInfo.vb +++ /dev/null @@ -1,46 +0,0 @@ -#Region "Apache License" -' -' Licensed to the Apache Software Foundation (ASF) under one or more -' contributor license agreements. See the NOTICE file distributed with -' this work for additional information regarding copyright ownership. -' The ASF licenses this file to you under the Apache License, Version 2.0 -' (the "License"); you may not use this file except in compliance with -' the License. You may obtain a copy of the License at -' -' http://www.apache.org/licenses/LICENSE-2.0 -' -' Unless required by applicable law or agreed to in writing, software -' distributed under the License is distributed on an "AS IS" BASIS, -' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -' See the License for the specific language governing permissions and -' limitations under the License. -' -#End Region - -' -' Version information for an assembly consists of the following four values: -' -' Major Version -' Minor Version -' Build Number -' Revision -' -' You can specify all the values or you can default the Revision and Build Numbers -' by using the '*' as shown below: - - - - -#If NOT NETCF Then -#If NOT SSCLI Then - -#End If -#End If - -' -' Shared assembly settings -' - - - - diff --git a/src/log4net/log4net.csproj b/src/log4net/log4net.csproj index 309039c4d..5b8999169 100644 --- a/src/log4net/log4net.csproj +++ b/src/log4net/log4net.csproj @@ -1,7 +1,7 @@  log4net - 2.0.10 + 2.0.11 Codestin Search App Apache log4net From d8808ec5acab2cfe294f38b6891d5f6f29bd9095 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Fri, 18 Sep 2020 13:43:40 +0200 Subject: [PATCH 007/122] :bookmark: update versioning to 2.0.11.0 --- src/log4net/AssemblyVersionInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/log4net/AssemblyVersionInfo.cs b/src/log4net/AssemblyVersionInfo.cs index 668df06b0..0b62aa9cf 100644 --- a/src/log4net/AssemblyVersionInfo.cs +++ b/src/log4net/AssemblyVersionInfo.cs @@ -28,11 +28,11 @@ // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: System.Reflection.AssemblyVersion("2.0.9.0")] +[assembly: System.Reflection.AssemblyVersion("2.0.11.0")] #if !NETCF #if !SSCLI -[assembly: System.Reflection.AssemblyFileVersion("2.0.9.0")] +[assembly: System.Reflection.AssemblyFileVersion("2.0.11.0")] #endif #endif From d5cb2074691c5da552450ba0e83667a054f7fe70 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Fri, 18 Sep 2020 13:47:05 +0200 Subject: [PATCH 008/122] :memo: add documentation about proposed 2.0.11 release --- src/site/xdoc/download_log4net.xml | 20 ++++++++++---------- src/site/xdoc/release/release-notes.xml | 5 +++++ 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/site/xdoc/download_log4net.xml b/src/site/xdoc/download_log4net.xml index 5aa7ac5fa..71c6679f2 100644 --- a/src/site/xdoc/download_log4net.xml +++ b/src/site/xdoc/download_log4net.xml @@ -36,14 +36,14 @@ limitations under the License.
-
+
- - - + + +
apache-log4net-source-2.0.10.zipsha512pgpapache-log4net-source-2.0.11.zipsha512pgp
@@ -52,14 +52,14 @@ limitations under the License.

Binaries are available in a zip file or nupkg, which is also available from nuget.org

- - - + + + - - - + + +
log4net-binaries-2.0.10.zipsha512pgplog4net-binaries-2.0.11.zipsha512pgp
log4net-2.0.10.nupkgsha512pgplog4net-2.0.11.nupkgsha512pgp
diff --git a/src/site/xdoc/release/release-notes.xml b/src/site/xdoc/release/release-notes.xml index 58f3707d8..fac995aee 100644 --- a/src/site/xdoc/release/release-notes.xml +++ b/src/site/xdoc/release/release-notes.xml @@ -27,6 +27,11 @@ limitations under the License.
+
+ Apachhe log4net 2.0.11 fixes incorrect version strings within the released + binaries and contains some minor fixes to correctly dispose of StreamWriters + used during log flushing, thanks to community member @NicholasNoise +

Apache log4net 2.0.10 improves netstandard2.0 support From 525526b982d42db0b97b9e6fe7834da46e0e00e8 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Wed, 30 Sep 2020 08:13:06 +0200 Subject: [PATCH 009/122] :art: sort modifiers with default .net style sorting --- .../LoggerRepository/ConfigurationMessages.cs | 2 +- src/log4net/Appender/AdoNetAppender.cs | 22 ++--- .../Appender/AnsiColorTerminalAppender.cs | 6 +- src/log4net/Appender/AppenderCollection.cs | 4 +- src/log4net/Appender/AppenderSkeleton.cs | 28 +++---- src/log4net/Appender/AspNetTraceAppender.cs | 4 +- .../Appender/BufferingAppenderSkeleton.cs | 14 ++-- .../Appender/BufferingForwardingAppender.cs | 16 ++-- .../Appender/ColoredConsoleAppender.cs | 6 +- src/log4net/Appender/ConsoleAppender.cs | 6 +- src/log4net/Appender/DebugAppender.cs | 4 +- src/log4net/Appender/EventLogAppender.cs | 16 ++-- src/log4net/Appender/FileAppender.cs | 24 +++--- src/log4net/Appender/ForwardingAppender.cs | 18 ++-- src/log4net/Appender/LocalSyslogAppender.cs | 4 +- .../Appender/ManagedColoredConsoleAppender.cs | 6 +- src/log4net/Appender/MemoryAppender.cs | 12 +-- src/log4net/Appender/NetSendAppender.cs | 2 +- .../Appender/OutputDebugStringAppender.cs | 4 +- src/log4net/Appender/RemoteSyslogAppender.cs | 2 +- src/log4net/Appender/RemotingAppender.cs | 6 +- src/log4net/Appender/RollingFileAppender.cs | 14 ++-- src/log4net/Appender/SmtpAppender.cs | 6 +- src/log4net/Appender/SmtpPickupDirAppender.cs | 6 +- src/log4net/Appender/TelnetAppender.cs | 2 +- src/log4net/Appender/TextWriterAppender.cs | 28 +++---- src/log4net/Appender/TraceAppender.cs | 4 +- src/log4net/Appender/UdpAppender.cs | 4 +- src/log4net/Config/BasicConfigurator.cs | 16 ++-- src/log4net/Config/DOMConfigurator.cs | 20 ++--- src/log4net/Config/PluginAttribute.cs | 2 +- .../SecurityContextProviderAttribute.cs | 4 +- src/log4net/Config/XmlConfigurator.cs | 40 ++++----- .../Config/XmlConfiguratorAttribute.cs | 4 +- src/log4net/Core/CompactRepositorySelector.cs | 2 +- src/log4net/Core/DefaultRepositorySelector.cs | 2 +- src/log4net/Core/Level.cs | 44 +++++----- src/log4net/Core/LocationInfo.cs | 2 +- src/log4net/Core/LogImpl.cs | 82 +++++++++---------- src/log4net/Core/LoggerManager.cs | 2 +- src/log4net/Core/LoggerWrapperImpl.cs | 2 +- src/log4net/Core/LoggingEvent.cs | 2 +- src/log4net/Core/MethodItem.cs | 2 +- src/log4net/Core/StackFrameItem.cs | 2 +- src/log4net/Core/WrapperMap.cs | 6 +- .../AbsoluteTimeDateFormatter.cs | 4 +- .../DateFormatter/DateTimeDateFormatter.cs | 2 +- .../DateFormatter/Iso8601DateFormatter.cs | 2 +- .../DateFormatter/SimpleDateFormatter.cs | 2 +- src/log4net/Filter/DenyAllFilter.cs | 2 +- src/log4net/Filter/FilterSkeleton.cs | 4 +- src/log4net/Filter/LevelMatchFilter.cs | 2 +- src/log4net/Filter/LevelRangeFilter.cs | 2 +- src/log4net/Filter/LoggerMatchFilter.cs | 2 +- src/log4net/Filter/PropertyFilter.cs | 2 +- src/log4net/Filter/StringMatchFilter.cs | 4 +- src/log4net/GlobalContext.cs | 2 +- src/log4net/Layout/ExceptionLayout.cs | 4 +- src/log4net/Layout/Layout2RawLayoutAdapter.cs | 2 +- src/log4net/Layout/LayoutSkeleton.cs | 12 +-- .../Pattern/AppDomainPatternConverter.cs | 2 +- .../Layout/Pattern/DatePatternConverter.cs | 4 +- .../Pattern/ExceptionPatternConverter.cs | 2 +- .../Pattern/FileLocationPatternConverter.cs | 2 +- .../Pattern/FullLocationPatternConverter.cs | 2 +- .../Pattern/IdentityPatternConverter.cs | 2 +- .../Layout/Pattern/LevelPatternConverter.cs | 2 +- .../Pattern/LineLocationPatternConverter.cs | 2 +- .../Layout/Pattern/LoggerPatternConverter.cs | 2 +- .../Layout/Pattern/MessagePatternConverter.cs | 2 +- .../Pattern/MethodLocationPatternConverter.cs | 2 +- .../Layout/Pattern/NamedPatternConverter.cs | 6 +- .../Layout/Pattern/NdcPatternConverter.cs | 2 +- .../Layout/Pattern/PatternLayoutConverter.cs | 6 +- .../Pattern/PropertyPatternConverter.cs | 2 +- .../Pattern/RelativeTimePatternConverter.cs | 2 +- .../StackTraceDetailPatternConverter.cs | 2 +- .../Pattern/StackTracePatternConverter.cs | 4 +- .../Layout/Pattern/ThreadPatternConverter.cs | 2 +- .../Pattern/TypeNamePatternConverter.cs | 2 +- .../Pattern/UserNamePatternConverter.cs | 2 +- .../Layout/Pattern/UtcDatePatternConverter.cs | 4 +- src/log4net/Layout/PatternLayout.cs | 6 +- src/log4net/Layout/SimpleLayout.cs | 4 +- src/log4net/Layout/XmlLayout.cs | 4 +- src/log4net/Layout/XmlLayoutBase.cs | 10 +-- src/log4net/Layout/XmlLayoutSchemaLog4j.cs | 2 +- src/log4net/LogicalThreadContext.cs | 4 +- src/log4net/ObjectRenderer/RendererMap.cs | 2 +- .../Plugin/RemoteLoggingServerPlugin.cs | 6 +- src/log4net/Repository/Hierarchy/Hierarchy.cs | 16 ++-- src/log4net/Repository/Hierarchy/Logger.cs | 42 +++++----- src/log4net/Repository/Hierarchy/LoggerKey.cs | 4 +- .../Repository/Hierarchy/RootLogger.cs | 6 +- .../Hierarchy/XmlHierarchyConfigurator.cs | 2 +- .../Repository/LoggerRepositorySkeleton.cs | 32 ++++---- src/log4net/ThreadContext.cs | 4 +- src/log4net/Util/AppenderAttachedImpl.cs | 2 +- src/log4net/Util/CountingQuietTextWriter.cs | 2 +- src/log4net/Util/EmptyCollection.cs | 2 +- src/log4net/Util/EmptyDictionary.cs | 2 +- src/log4net/Util/GlobalContextProperties.cs | 2 +- src/log4net/Util/ILogExtensions.cs | 2 +- src/log4net/Util/LevelMappingEntry.cs | 2 +- .../Util/LogicalThreadContextProperties.cs | 4 +- .../Util/LogicalThreadContextStacks.cs | 2 +- src/log4net/Util/NullDictionaryEnumerator.cs | 2 +- src/log4net/Util/NullEnumerator.cs | 2 +- src/log4net/Util/OnlyOnceErrorHandler.cs | 2 +- src/log4net/Util/OptionConverter.cs | 2 +- src/log4net/Util/PatternConverter.cs | 4 +- src/log4net/Util/PatternParser.cs | 2 +- src/log4net/Util/PatternString.cs | 2 +- .../AppDomainPatternConverter.cs | 2 +- .../AppSettingPatternConverter.cs | 2 +- .../DatePatternConverter.cs | 4 +- .../EnvironmentFolderPathPatternConverter.cs | 4 +- .../EnvironmentPatternConverter.cs | 4 +- .../IdentityPatternConverter.cs | 4 +- .../LiteralPatternConverter.cs | 4 +- .../ProcessIdPatternConverter.cs | 4 +- .../PropertyPatternConverter.cs | 2 +- .../RandomStringPatternConverter.cs | 4 +- .../UserNamePatternConverter.cs | 4 +- .../UtcDatePatternConverter.cs | 4 +- src/log4net/Util/PropertiesDictionary.cs | 2 +- src/log4net/Util/ProtectCloseTextWriter.cs | 2 +- src/log4net/Util/QuietTextWriter.cs | 4 +- src/log4net/Util/SystemInfo.cs | 2 +- src/log4net/Util/SystemStringFormat.cs | 2 +- src/log4net/Util/TextWriterAdapter.cs | 16 ++-- src/log4net/Util/ThreadContextProperties.cs | 2 +- src/log4net/Util/ThreadContextStacks.cs | 2 +- .../Util/TypeConverters/ConverterRegistry.cs | 2 +- src/log4net/Util/WindowsSecurityContext.cs | 4 +- 135 files changed, 435 insertions(+), 435 deletions(-) diff --git a/src/log4net.Tests/LoggerRepository/ConfigurationMessages.cs b/src/log4net.Tests/LoggerRepository/ConfigurationMessages.cs index e9a887785..daa26724f 100644 --- a/src/log4net.Tests/LoggerRepository/ConfigurationMessages.cs +++ b/src/log4net.Tests/LoggerRepository/ConfigurationMessages.cs @@ -80,7 +80,7 @@ static void rep_ConfigurationChanged(object sender, EventArgs e) public class LogLogAppender : AppenderSkeleton { - private readonly static Type declaringType = typeof(LogLogAppender); + private static readonly Type declaringType = typeof(LogLogAppender); public override void ActivateOptions() { diff --git a/src/log4net/Appender/AdoNetAppender.cs b/src/log4net/Appender/AdoNetAppender.cs index 72a5a7620..dd9939ba9 100644 --- a/src/log4net/Appender/AdoNetAppender.cs +++ b/src/log4net/Appender/AdoNetAppender.cs @@ -407,7 +407,7 @@ protected IDbConnection Connection /// must be called again. /// /// - override public void ActivateOptions() + public override void ActivateOptions() { base.ActivateOptions(); @@ -431,7 +431,7 @@ override public void ActivateOptions() /// Closes the database command and database connection. /// /// - override protected void OnClose() + protected override void OnClose() { base.OnClose(); DiposeConnection(); @@ -451,7 +451,7 @@ override protected void OnClose() /// array into the database. /// /// - override protected void SendBuffer(LoggingEvent[] events) + protected override void SendBuffer(LoggingEvent[] events) { if (ReconnectOnError && (Connection == null || Connection.State != ConnectionState.Open)) { @@ -536,7 +536,7 @@ public void AddParameter(AdoNetAppenderParameter parameter) /// property for more information. /// /// - virtual protected void SendBuffer(IDbTransaction dbTran, LoggingEvent[] events) + protected virtual void SendBuffer(IDbTransaction dbTran, LoggingEvent[] events) { // string.IsNotNullOrWhiteSpace() does not exist in ancient .NET frameworks if (CommandText != null && CommandText.Trim() != "") @@ -608,7 +608,7 @@ virtual protected void SendBuffer(IDbTransaction dbTran, LoggingEvent[] events) /// /// Text that can be passed to a . /// - virtual protected string GetLogStatement(LoggingEvent logEvent) + protected virtual string GetLogStatement(LoggingEvent logEvent) { if (Layout == null) { @@ -632,7 +632,7 @@ virtual protected string GetLogStatement(LoggingEvent logEvent) /// The of the object. /// The connectionString output from the ResolveConnectionString method. /// An instance with a valid connection string. - virtual protected IDbConnection CreateConnection(Type connectionType, string connectionString) + protected virtual IDbConnection CreateConnection(Type connectionType, string connectionString) { IDbConnection connection = (IDbConnection)Activator.CreateInstance(connectionType); connection.ConnectionString = connectionString; @@ -648,7 +648,7 @@ virtual protected IDbConnection CreateConnection(Type connectionType, string con /// /// Additional information describing the connection string. /// A connection string used to connect to the database. - virtual protected string ResolveConnectionString(out string connectionStringContext) + protected virtual string ResolveConnectionString(out string connectionStringContext) { if (ConnectionString != null && ConnectionString.Length > 0) { @@ -702,7 +702,7 @@ virtual protected string ResolveConnectionString(out string connectionStringCont /// /// /// The of the ADO.NET provider - virtual protected Type ResolveConnectionType() + protected virtual Type ResolveConnectionType() { try { @@ -858,7 +858,7 @@ private void DiposeConnection() /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(AdoNetAppender); + private static readonly Type declaringType = typeof(AdoNetAppender); #endregion Private Static Fields } @@ -1053,7 +1053,7 @@ public IRawLayout Layout /// this parameter to its collection of parameters. /// /// - virtual public void Prepare(IDbCommand command) + public virtual void Prepare(IDbCommand command) { // Create a new parameter IDbDataParameter param = command.CreateParameter(); @@ -1093,7 +1093,7 @@ virtual public void Prepare(IDbCommand command) /// object. Sets the value of the parameter on the command object. /// /// - virtual public void FormatValue(IDbCommand command, LoggingEvent loggingEvent) + public virtual void FormatValue(IDbCommand command, LoggingEvent loggingEvent) { // Lookup the parameter IDbDataParameter param = (IDbDataParameter)command.Parameters[ParameterName]; diff --git a/src/log4net/Appender/AnsiColorTerminalAppender.cs b/src/log4net/Appender/AnsiColorTerminalAppender.cs index 2f074766a..50a6875c6 100644 --- a/src/log4net/Appender/AnsiColorTerminalAppender.cs +++ b/src/log4net/Appender/AnsiColorTerminalAppender.cs @@ -246,7 +246,7 @@ public AnsiColorTerminalAppender() /// This is either "Console.Out" or "Console.Error". /// /// - virtual public string Target + public virtual string Target { get { return m_writeToErrorStream ? ConsoleError : ConsoleOut; } set @@ -296,7 +296,7 @@ public void AddMapping(LevelColors mapping) /// The format of the output will depend on the appender's layout. /// /// - override protected void Append(log4net.Core.LoggingEvent loggingEvent) + protected override void Append(log4net.Core.LoggingEvent loggingEvent) { string loggingMessage = RenderLoggingEvent(loggingEvent); @@ -366,7 +366,7 @@ override protected void Append(log4net.Core.LoggingEvent loggingEvent) /// This appender requires a to be set. /// /// - override protected bool RequiresLayout + protected override bool RequiresLayout { get { return true; } } diff --git a/src/log4net/Appender/AppenderCollection.cs b/src/log4net/Appender/AppenderCollection.cs index 21987b846..14f2304bb 100644 --- a/src/log4net/Appender/AppenderCollection.cs +++ b/src/log4net/Appender/AppenderCollection.cs @@ -160,7 +160,7 @@ public AppenderCollection(ICollection col) /// Used to access protected constructor ///

/// - internal protected enum Tag + protected internal enum Tag { /// /// A value @@ -173,7 +173,7 @@ internal protected enum Tag /// /// /// - internal protected AppenderCollection(Tag tag) + protected internal AppenderCollection(Tag tag) { m_array = null; } diff --git a/src/log4net/Appender/AppenderSkeleton.cs b/src/log4net/Appender/AppenderSkeleton.cs index 44fb69047..44b68c755 100644 --- a/src/log4net/Appender/AppenderSkeleton.cs +++ b/src/log4net/Appender/AppenderSkeleton.cs @@ -121,7 +121,7 @@ public Level Threshold /// implementation for the property. /// /// - virtual public IErrorHandler ErrorHandler + public virtual IErrorHandler ErrorHandler { get { return this.m_errorHandler; } set @@ -152,7 +152,7 @@ virtual public IErrorHandler ErrorHandler /// and so all Filters on this Appender are available through the result. /// /// - virtual public IFilter FilterHead + public virtual IFilter FilterHead { get { return m_headFilter; } } @@ -167,7 +167,7 @@ virtual public IFilter FilterHead /// /// /// - virtual public ILayout Layout + public virtual ILayout Layout { get { return m_layout; } set { m_layout = value; } @@ -193,7 +193,7 @@ virtual public ILayout Layout /// must be called again. /// /// - virtual public void ActivateOptions() + public virtual void ActivateOptions() { } @@ -479,7 +479,7 @@ public void DoAppend(LoggingEvent[] loggingEvents) /// /// /// - virtual protected bool FilterEvent(LoggingEvent loggingEvent) + protected virtual bool FilterEvent(LoggingEvent loggingEvent) { if (!IsAsSevereAsThreshold(loggingEvent.Level)) { @@ -523,7 +523,7 @@ virtual protected bool FilterEvent(LoggingEvent loggingEvent) /// back of the filter chain. /// /// - virtual public void AddFilter(IFilter filter) + public virtual void AddFilter(IFilter filter) { if (filter == null) { @@ -549,7 +549,7 @@ virtual public void AddFilter(IFilter filter) /// Clears the filter list for this appender. /// /// - virtual public void ClearFilters() + public virtual void ClearFilters() { m_headFilter = m_tailFilter = null; } @@ -571,7 +571,7 @@ virtual public void ClearFilters() /// true if the meets the /// requirements of this appender. /// - virtual protected bool IsAsSevereAsThreshold(Level level) + protected virtual bool IsAsSevereAsThreshold(Level level) { return ((m_threshold == null) || level >= m_threshold); } @@ -589,7 +589,7 @@ virtual protected bool IsAsSevereAsThreshold(Level level) /// It is a programming error to append to a closed appender. /// /// - virtual protected void OnClose() + protected virtual void OnClose() { // Do nothing by default } @@ -612,7 +612,7 @@ virtual protected void OnClose() /// override the method. /// /// - abstract protected void Append(LoggingEvent loggingEvent); + protected abstract void Append(LoggingEvent loggingEvent); /// /// Append a bulk array of logging events. @@ -628,7 +628,7 @@ virtual protected void OnClose() /// override this method in addition to . /// /// - virtual protected void Append(LoggingEvent[] loggingEvents) + protected virtual void Append(LoggingEvent[] loggingEvents) { foreach(LoggingEvent loggingEvent in loggingEvents) { @@ -654,7 +654,7 @@ virtual protected void Append(LoggingEvent[] loggingEvents) /// /// /// true if the call to should proceed. - virtual protected bool PreAppendCheck() + protected virtual bool PreAppendCheck() { if ((m_layout == null) && RequiresLayout) { @@ -775,7 +775,7 @@ protected void RenderLoggingEvent(TextWriter writer, LoggingEvent loggingEvent) /// /// true if the appender requires a layout object, otherwise false. /// - virtual protected bool RequiresLayout + protected virtual bool RequiresLayout { get { return false; } } @@ -902,7 +902,7 @@ public virtual bool Flush(int millisecondsTimeout) /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(AppenderSkeleton); + private static readonly Type declaringType = typeof(AppenderSkeleton); #endregion Private Static Fields } diff --git a/src/log4net/Appender/AspNetTraceAppender.cs b/src/log4net/Appender/AspNetTraceAppender.cs index a8e3f5229..bffa0459e 100644 --- a/src/log4net/Appender/AspNetTraceAppender.cs +++ b/src/log4net/Appender/AspNetTraceAppender.cs @@ -85,7 +85,7 @@ public AspNetTraceAppender() /// (). /// /// - override protected void Append(LoggingEvent loggingEvent) + protected override void Append(LoggingEvent loggingEvent) { // check if log4net is running in the context of an ASP.NET application if (HttpContext.Current != null) @@ -114,7 +114,7 @@ override protected void Append(LoggingEvent loggingEvent) /// This appender requires a to be set. /// /// - override protected bool RequiresLayout + protected override bool RequiresLayout { get { return true; } } diff --git a/src/log4net/Appender/BufferingAppenderSkeleton.cs b/src/log4net/Appender/BufferingAppenderSkeleton.cs index 91b49f451..c49d83823 100644 --- a/src/log4net/Appender/BufferingAppenderSkeleton.cs +++ b/src/log4net/Appender/BufferingAppenderSkeleton.cs @@ -222,7 +222,7 @@ public ITriggeringEventEvaluator LossyEvaluator /// /// [Obsolete("Use Fix property")] - virtual public bool OnlyFixPartialEventData + public virtual bool OnlyFixPartialEventData { get { return (Fix == FixFlags.Partial); } set @@ -252,7 +252,7 @@ virtual public bool OnlyFixPartialEventData /// /// /// - virtual public FixFlags Fix + public virtual FixFlags Fix { get { return m_fixFlags; } set { m_fixFlags = value; } @@ -381,7 +381,7 @@ public virtual void Flush(bool flushLossyBuffer) /// must be called again. /// /// - override public void ActivateOptions() + public override void ActivateOptions() { base.ActivateOptions(); @@ -417,7 +417,7 @@ override public void ActivateOptions() /// the buffer must be sent when the appender is closed. /// /// - override protected void OnClose() + protected override void OnClose() { // Flush the buffer on close Flush(true); @@ -453,7 +453,7 @@ override protected void OnClose() /// is processed. /// /// - override protected void Append(LoggingEvent loggingEvent) + protected override void Append(LoggingEvent loggingEvent) { // If the buffer size is set to 1 or less then the buffer will be // sent immediately because there is not enough space in the buffer @@ -542,7 +542,7 @@ override protected void Append(LoggingEvent loggingEvent) /// The subclass must override . /// /// - virtual protected void SendFromBuffer(LoggingEvent firstLoggingEvent, CyclicBuffer buffer) + protected virtual void SendFromBuffer(LoggingEvent firstLoggingEvent, CyclicBuffer buffer) { LoggingEvent[] bufferEvents = buffer.PopAll(); @@ -576,7 +576,7 @@ virtual protected void SendFromBuffer(LoggingEvent firstLoggingEvent, CyclicBuff /// The subclass must override this method to process the buffered events. /// /// - abstract protected void SendBuffer(LoggingEvent[] events); + protected abstract void SendBuffer(LoggingEvent[] events); #region Private Static Fields diff --git a/src/log4net/Appender/BufferingForwardingAppender.cs b/src/log4net/Appender/BufferingForwardingAppender.cs index 17d02b894..20c362411 100644 --- a/src/log4net/Appender/BufferingForwardingAppender.cs +++ b/src/log4net/Appender/BufferingForwardingAppender.cs @@ -74,7 +74,7 @@ public BufferingForwardingAppender() /// It is a programming error to append to a closed appender. /// /// - override protected void OnClose() + protected override void OnClose() { // Remove all the attached appenders lock(this) @@ -102,7 +102,7 @@ override protected void OnClose() /// Forwards the events to the attached appenders. /// /// - override protected void SendBuffer(LoggingEvent[] events) + protected override void SendBuffer(LoggingEvent[] events) { // Pass the logging event on to the attached appenders if (m_appenderAttachedImpl != null) @@ -126,7 +126,7 @@ override protected void SendBuffer(LoggingEvent[] events) /// appenders, then it won't be added again. /// /// - virtual public void AddAppender(IAppender newAppender) + public virtual void AddAppender(IAppender newAppender) { if (newAppender == null) { @@ -153,7 +153,7 @@ virtual public void AddAppender(IAppender newAppender) /// /// A collection of the appenders in this appender. /// - virtual public AppenderCollection Appenders + public virtual AppenderCollection Appenders { get { @@ -183,7 +183,7 @@ virtual public AppenderCollection Appenders /// Get the named appender attached to this buffering appender. /// /// - virtual public IAppender GetAppender(string name) + public virtual IAppender GetAppender(string name) { lock(this) { @@ -204,7 +204,7 @@ virtual public IAppender GetAppender(string name) /// This is useful when re-reading configuration information. /// /// - virtual public void RemoveAllAppenders() + public virtual void RemoveAllAppenders() { lock(this) { @@ -226,7 +226,7 @@ virtual public void RemoveAllAppenders() /// If you are discarding the appender you must call /// on the appender removed. /// - virtual public IAppender RemoveAppender(IAppender appender) + public virtual IAppender RemoveAppender(IAppender appender) { lock(this) { @@ -248,7 +248,7 @@ virtual public IAppender RemoveAppender(IAppender appender) /// If you are discarding the appender you must call /// on the appender removed. /// - virtual public IAppender RemoveAppender(string name) + public virtual IAppender RemoveAppender(string name) { lock(this) { diff --git a/src/log4net/Appender/ColoredConsoleAppender.cs b/src/log4net/Appender/ColoredConsoleAppender.cs index d3949708e..cbcc8757f 100644 --- a/src/log4net/Appender/ColoredConsoleAppender.cs +++ b/src/log4net/Appender/ColoredConsoleAppender.cs @@ -216,7 +216,7 @@ public ColoredConsoleAppender(ILayout layout, bool writeToErrorStream) /// This is either "Console.Out" or "Console.Error". /// /// - virtual public string Target + public virtual string Target { get { return m_writeToErrorStream ? ConsoleError : ConsoleOut; } set @@ -270,7 +270,7 @@ public void AddMapping(LevelColors mapping) [System.Security.SecuritySafeCritical] #endif [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand, UnmanagedCode = true)] - override protected void Append(log4net.Core.LoggingEvent loggingEvent) + protected override void Append(log4net.Core.LoggingEvent loggingEvent) { if (m_consoleOutputWriter != null) { @@ -422,7 +422,7 @@ override protected void Append(log4net.Core.LoggingEvent loggingEvent) /// This appender requires a to be set. /// /// - override protected bool RequiresLayout + protected override bool RequiresLayout { get { return true; } } diff --git a/src/log4net/Appender/ConsoleAppender.cs b/src/log4net/Appender/ConsoleAppender.cs index d5d6a7027..760aace42 100644 --- a/src/log4net/Appender/ConsoleAppender.cs +++ b/src/log4net/Appender/ConsoleAppender.cs @@ -115,7 +115,7 @@ public ConsoleAppender(ILayout layout, bool writeToErrorStream) /// This is either "Console.Out" or "Console.Error". /// /// - virtual public string Target + public virtual string Target { get { return m_writeToErrorStream ? ConsoleError : ConsoleOut; } set @@ -149,7 +149,7 @@ virtual public string Target /// The format of the output will depend on the appender's layout. /// /// - override protected void Append(LoggingEvent loggingEvent) + protected override void Append(LoggingEvent loggingEvent) { #if NETCF_1_0 // Write to the output stream @@ -177,7 +177,7 @@ override protected void Append(LoggingEvent loggingEvent) /// This appender requires a to be set. /// /// - override protected bool RequiresLayout + protected override bool RequiresLayout { get { return true; } } diff --git a/src/log4net/Appender/DebugAppender.cs b/src/log4net/Appender/DebugAppender.cs index b4f329579..c1eda997b 100644 --- a/src/log4net/Appender/DebugAppender.cs +++ b/src/log4net/Appender/DebugAppender.cs @@ -164,7 +164,7 @@ public override bool Flush(int millisecondsTimeout) /// /// #endif - override protected void Append(LoggingEvent loggingEvent) + protected override void Append(LoggingEvent loggingEvent) { // // Write the string to the Debug system @@ -205,7 +205,7 @@ override protected void Append(LoggingEvent loggingEvent) /// This appender requires a to be set. /// /// - override protected bool RequiresLayout + protected override bool RequiresLayout { get { return true; } } diff --git a/src/log4net/Appender/EventLogAppender.cs b/src/log4net/Appender/EventLogAppender.cs index 0784cbff6..0d1f3c89c 100644 --- a/src/log4net/Appender/EventLogAppender.cs +++ b/src/log4net/Appender/EventLogAppender.cs @@ -275,7 +275,7 @@ public short Category /// must be called again. /// /// - override public void ActivateOptions() + public override void ActivateOptions() { try { @@ -381,7 +381,7 @@ private static void CreateEventSource(string source, string logName, string mach /// There is a limit of 32K characters for an event log message /// /// - override protected void Append(LoggingEvent loggingEvent) + protected override void Append(LoggingEvent loggingEvent) { // // Write the resulting string to the event log system @@ -484,7 +484,7 @@ override protected void Append(LoggingEvent loggingEvent) /// This appender requires a to be set. /// /// - override protected bool RequiresLayout + protected override bool RequiresLayout { get { return true; } } @@ -504,7 +504,7 @@ override protected bool RequiresLayout /// this is a one way mapping. There is /// a loss of information during the conversion. /// - virtual protected EventLogEntryType GetEntryType(Level level) + protected virtual EventLogEntryType GetEntryType(Level level) { // see if there is a specified lookup. Level2EventLogEntryType entryType = m_levelMapping.Lookup(level) as Level2EventLogEntryType; @@ -614,7 +614,7 @@ public EventLogEntryType EventLogEntryType /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(EventLogAppender); + private static readonly Type declaringType = typeof(EventLogAppender); /// /// The maximum size supported by default. @@ -628,7 +628,7 @@ public EventLogEntryType EventLogEntryType /// the event log! See: System.Diagnostics.EventLogInternal.InternalWriteEvent() /// for the use of the 32766 max size. /// - private readonly static int MAX_EVENTLOG_MESSAGE_SIZE_DEFAULT = 32766; + private static readonly int MAX_EVENTLOG_MESSAGE_SIZE_DEFAULT = 32766; /// /// The maximum size supported by a windows operating system that is vista @@ -659,7 +659,7 @@ public EventLogEntryType EventLogEntryType /// terminator of #0#0, as we cannot see the source of ReportEvent (though we could use an API monitor to examine the /// buffer, given enough time). /// - private readonly static int MAX_EVENTLOG_MESSAGE_SIZE_VISTA_OR_NEWER = 31839 - 2; + private static readonly int MAX_EVENTLOG_MESSAGE_SIZE_VISTA_OR_NEWER = 31839 - 2; /// /// The maximum size that the operating system supports for @@ -670,7 +670,7 @@ public EventLogEntryType EventLogEntryType /// to the operating system event log and eventually truncate a string /// that exceeds the limits. /// - private readonly static int MAX_EVENTLOG_MESSAGE_SIZE = GetMaxEventLogMessageSize(); + private static readonly int MAX_EVENTLOG_MESSAGE_SIZE = GetMaxEventLogMessageSize(); /// /// This method determines the maximum event log message size allowed for diff --git a/src/log4net/Appender/FileAppender.cs b/src/log4net/Appender/FileAppender.cs index f0c2bc1f8..dbade37f7 100644 --- a/src/log4net/Appender/FileAppender.cs +++ b/src/log4net/Appender/FileAppender.cs @@ -965,7 +965,7 @@ public FileAppender(ILayout layout, string filename) /// the application base directory. /// /// - virtual public string File + public virtual string File { get { return m_fileName; } set { m_fileName = value; } @@ -1101,7 +1101,7 @@ public FileAppender.LockingModelBase LockingModel /// This will cause the file to be opened. /// /// - override public void ActivateOptions() + public override void ActivateOptions() { base.ActivateOptions(); @@ -1145,7 +1145,7 @@ override public void ActivateOptions() /// Resets the filename and the file stream. /// /// - override protected void Reset() + protected override void Reset() { base.Reset(); m_fileName = null; @@ -1154,7 +1154,7 @@ override protected void Reset() /// /// Close this appender instance. The underlying stream or writer is also closed. /// - override protected void OnClose() + protected override void OnClose() { base.OnClose(); m_lockingModel.OnClose(); @@ -1169,7 +1169,7 @@ override protected void OnClose() /// successfully opened. /// /// - override protected void PrepareWriter() + protected override void PrepareWriter() { SafeOpenFile(m_fileName, m_appendToFile); } @@ -1188,7 +1188,7 @@ override protected void PrepareWriter() /// The format of the output will depend on the appender's layout. /// /// - override protected void Append(LoggingEvent loggingEvent) + protected override void Append(LoggingEvent loggingEvent) { if (m_stream.AcquireLock()) { @@ -1214,7 +1214,7 @@ override protected void Append(LoggingEvent loggingEvent) /// the stream. /// /// - override protected void Append(LoggingEvent[] loggingEvents) + protected override void Append(LoggingEvent[] loggingEvents) { if (m_stream.AcquireLock()) { @@ -1337,7 +1337,7 @@ protected void CloseFile() /// Errors are passed to the . /// /// - virtual protected void SafeOpenFile(string fileName, bool append) + protected virtual void SafeOpenFile(string fileName, bool append) { try { @@ -1364,7 +1364,7 @@ virtual protected void SafeOpenFile(string fileName, bool append) /// for the specified exists. /// /// - virtual protected void OpenFile(string fileName, bool append) + protected virtual void OpenFile(string fileName, bool append) { if (LogLog.IsErrorEnabled) { @@ -1427,7 +1427,7 @@ virtual protected void OpenFile(string fileName, bool append) /// data using a System.Security.Cryptography.CryptoStream. /// /// - virtual protected void SetQWForFiles(Stream fileStream) + protected virtual void SetQWForFiles(Stream fileStream) { #pragma warning disable CA2000 // Dispose objects before losing scope StreamWriter writer = new StreamWriter(fileStream, m_encoding); @@ -1445,7 +1445,7 @@ virtual protected void SetQWForFiles(Stream fileStream) /// wrap the in some way. /// /// - virtual protected void SetQWForFiles(TextWriter writer) + protected virtual void SetQWForFiles(TextWriter writer) { QuietWriter = new QuietTextWriter(writer, ErrorHandler); } @@ -1518,7 +1518,7 @@ protected static string ConvertToFullPath(string path) /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(FileAppender); + private static readonly Type declaringType = typeof(FileAppender); #endregion Private Static Fields } diff --git a/src/log4net/Appender/ForwardingAppender.cs b/src/log4net/Appender/ForwardingAppender.cs index 681f81253..20a99ccc6 100644 --- a/src/log4net/Appender/ForwardingAppender.cs +++ b/src/log4net/Appender/ForwardingAppender.cs @@ -68,7 +68,7 @@ public ForwardingAppender() /// It is a programming error to append to a closed appender. /// /// - override protected void OnClose() + protected override void OnClose() { // Remove all the attached appenders lock(this) @@ -89,7 +89,7 @@ override protected void OnClose() /// Delivers the logging event to all the attached appenders. /// /// - override protected void Append(LoggingEvent loggingEvent) + protected override void Append(LoggingEvent loggingEvent) { // Pass the logging event on the the attached appenders if (m_appenderAttachedImpl != null) @@ -107,7 +107,7 @@ override protected void Append(LoggingEvent loggingEvent) /// Delivers the logging events to all the attached appenders. /// /// - override protected void Append(LoggingEvent[] loggingEvents) + protected override void Append(LoggingEvent[] loggingEvents) { // Pass the logging event on the the attached appenders if (m_appenderAttachedImpl != null) @@ -131,7 +131,7 @@ override protected void Append(LoggingEvent[] loggingEvents) /// appenders, then it won't be added again. /// /// - virtual public void AddAppender(IAppender newAppender) + public virtual void AddAppender(IAppender newAppender) { if (newAppender == null) { @@ -158,7 +158,7 @@ virtual public void AddAppender(IAppender newAppender) /// /// A collection of the appenders in this appender. /// - virtual public AppenderCollection Appenders + public virtual AppenderCollection Appenders { get { @@ -188,7 +188,7 @@ virtual public AppenderCollection Appenders /// Get the named appender attached to this appender. /// /// - virtual public IAppender GetAppender(string name) + public virtual IAppender GetAppender(string name) { lock(this) { @@ -209,7 +209,7 @@ virtual public IAppender GetAppender(string name) /// This is useful when re-reading configuration information. /// /// - virtual public void RemoveAllAppenders() + public virtual void RemoveAllAppenders() { lock(this) { @@ -231,7 +231,7 @@ virtual public void RemoveAllAppenders() /// If you are discarding the appender you must call /// on the appender removed. /// - virtual public IAppender RemoveAppender(IAppender appender) + public virtual IAppender RemoveAppender(IAppender appender) { lock(this) { @@ -253,7 +253,7 @@ virtual public IAppender RemoveAppender(IAppender appender) /// If you are discarding the appender you must call /// on the appender removed. /// - virtual public IAppender RemoveAppender(string name) + public virtual IAppender RemoveAppender(string name) { lock(this) { diff --git a/src/log4net/Appender/LocalSyslogAppender.cs b/src/log4net/Appender/LocalSyslogAppender.cs index 13efc54f6..ad31b5dfe 100644 --- a/src/log4net/Appender/LocalSyslogAppender.cs +++ b/src/log4net/Appender/LocalSyslogAppender.cs @@ -433,7 +433,7 @@ protected override void OnClose() /// This appender requires a to be set. /// /// - override protected bool RequiresLayout + protected override bool RequiresLayout { get { return true; } } @@ -452,7 +452,7 @@ override protected bool RequiresLayout /// Translates a log4net level to a syslog severity. /// /// - virtual protected SyslogSeverity GetSeverity(Level level) + protected virtual SyslogSeverity GetSeverity(Level level) { LevelSeverity levelSeverity = m_levelMapping.Lookup(level) as LevelSeverity; if (levelSeverity != null) diff --git a/src/log4net/Appender/ManagedColoredConsoleAppender.cs b/src/log4net/Appender/ManagedColoredConsoleAppender.cs index 9efe65d0b..9edfce509 100644 --- a/src/log4net/Appender/ManagedColoredConsoleAppender.cs +++ b/src/log4net/Appender/ManagedColoredConsoleAppender.cs @@ -126,7 +126,7 @@ public ManagedColoredConsoleAppender() /// This is either "Console.Out" or "Console.Error". /// /// - virtual public string Target + public virtual string Target { get { return m_writeToErrorStream ? ConsoleError : ConsoleOut; } set @@ -174,7 +174,7 @@ public void AddMapping(LevelColors mapping) /// The format of the output will depend on the appender's layout. /// /// - override protected void Append(log4net.Core.LoggingEvent loggingEvent) + protected override void Append(log4net.Core.LoggingEvent loggingEvent) { System.IO.TextWriter writer; @@ -216,7 +216,7 @@ override protected void Append(log4net.Core.LoggingEvent loggingEvent) /// This appender requires a to be set. /// /// - override protected bool RequiresLayout + protected override bool RequiresLayout { get { return true; } } diff --git a/src/log4net/Appender/MemoryAppender.cs b/src/log4net/Appender/MemoryAppender.cs index e0ec74132..441569ce2 100644 --- a/src/log4net/Appender/MemoryAppender.cs +++ b/src/log4net/Appender/MemoryAppender.cs @@ -84,7 +84,7 @@ public MemoryAppender() : base() /// Gets the events that have been logged. /// /// - virtual public LoggingEvent[] GetEvents() + public virtual LoggingEvent[] GetEvents() { lock (m_eventsList.SyncRoot) { @@ -110,7 +110,7 @@ virtual public LoggingEvent[] GetEvents() /// /// [Obsolete("Use Fix property")] - virtual public bool OnlyFixPartialEventData + public virtual bool OnlyFixPartialEventData { get { return (Fix == FixFlags.Partial); } set @@ -136,7 +136,7 @@ virtual public bool OnlyFixPartialEventData /// for details. /// /// - virtual public FixFlags Fix + public virtual FixFlags Fix { get { return m_fixFlags; } set { m_fixFlags = value; } @@ -153,7 +153,7 @@ virtual public FixFlags Fix /// /// Stores the in the events list. /// - override protected void Append(LoggingEvent loggingEvent) + protected override void Append(LoggingEvent loggingEvent) { // Because we are caching the LoggingEvent beyond the // lifetime of the Append() method we must fix any @@ -176,7 +176,7 @@ override protected void Append(LoggingEvent loggingEvent) /// /// Clear the list of events /// - virtual public void Clear() + public virtual void Clear() { lock (m_eventsList.SyncRoot) { @@ -193,7 +193,7 @@ virtual public void Clear() /// Gets the events that have been logged and clears the list of events. /// /// - virtual public LoggingEvent[] PopAllEvents() + public virtual LoggingEvent[] PopAllEvents() { lock (m_eventsList.SyncRoot) { diff --git a/src/log4net/Appender/NetSendAppender.cs b/src/log4net/Appender/NetSendAppender.cs index a72076f00..b03d21d66 100644 --- a/src/log4net/Appender/NetSendAppender.cs +++ b/src/log4net/Appender/NetSendAppender.cs @@ -344,7 +344,7 @@ protected override void Append(LoggingEvent loggingEvent) /// This appender requires a to be set. /// /// - override protected bool RequiresLayout + protected override bool RequiresLayout { get { return true; } } diff --git a/src/log4net/Appender/OutputDebugStringAppender.cs b/src/log4net/Appender/OutputDebugStringAppender.cs index f010fd586..1a13512b0 100644 --- a/src/log4net/Appender/OutputDebugStringAppender.cs +++ b/src/log4net/Appender/OutputDebugStringAppender.cs @@ -80,7 +80,7 @@ public OutputDebugStringAppender() #if !NETCF && !NETSTANDARD1_3 [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand, UnmanagedCode = true)] #endif - override protected void Append(LoggingEvent loggingEvent) + protected override void Append(LoggingEvent loggingEvent) { #if NETSTANDARD if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) @@ -101,7 +101,7 @@ override protected void Append(LoggingEvent loggingEvent) /// This appender requires a to be set. /// /// - override protected bool RequiresLayout + protected override bool RequiresLayout { get { return true; } } diff --git a/src/log4net/Appender/RemoteSyslogAppender.cs b/src/log4net/Appender/RemoteSyslogAppender.cs index a70bb5648..675d6f970 100644 --- a/src/log4net/Appender/RemoteSyslogAppender.cs +++ b/src/log4net/Appender/RemoteSyslogAppender.cs @@ -456,7 +456,7 @@ public override void ActivateOptions() /// Translates a log4net level to a syslog severity. /// /// - virtual protected SyslogSeverity GetSeverity(Level level) + protected virtual SyslogSeverity GetSeverity(Level level) { LevelSeverity levelSeverity = m_levelMapping.Lookup(level) as LevelSeverity; if (levelSeverity != null) diff --git a/src/log4net/Appender/RemotingAppender.cs b/src/log4net/Appender/RemotingAppender.cs index f4fa6f1fd..7c095f89c 100644 --- a/src/log4net/Appender/RemotingAppender.cs +++ b/src/log4net/Appender/RemotingAppender.cs @@ -141,7 +141,7 @@ public string Sink #if NET_4_0 || MONO_4_0 [System.Security.SecuritySafeCritical] #endif - override public void ActivateOptions() + public override void ActivateOptions() { base.ActivateOptions(); @@ -173,7 +173,7 @@ override public void ActivateOptions() /// the events will block in the thread pool manager until a thread is available. /// /// The events to send. - override protected void SendBuffer(LoggingEvent[] events) + protected override void SendBuffer(LoggingEvent[] events) { // Setup for an async send BeginAsyncSend(); @@ -207,7 +207,7 @@ override protected void SendBuffer(LoggingEvent[] events) /// exit the runtime limits the time that a /// event handler is allowed to run for. /// - override protected void OnClose() + protected override void OnClose() { base.OnClose(); diff --git a/src/log4net/Appender/RollingFileAppender.cs b/src/log4net/Appender/RollingFileAppender.cs index 9da3fb85e..b5bf2532e 100644 --- a/src/log4net/Appender/RollingFileAppender.cs +++ b/src/log4net/Appender/RollingFileAppender.cs @@ -547,7 +547,7 @@ public bool StaticLogFileName /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(RollingFileAppender); + private static readonly Type declaringType = typeof(RollingFileAppender); #endregion Private Static Fields @@ -560,7 +560,7 @@ public bool StaticLogFileName /// This method can be overridden by sub classes. /// /// the writer to set - override protected void SetQWForFiles(TextWriter writer) + protected override void SetQWForFiles(TextWriter writer) { QuietWriter = new CountingQuietTextWriter(writer, ErrorHandler); } @@ -576,7 +576,7 @@ override protected void SetQWForFiles(TextWriter writer) /// is need and then appends to the file last. /// /// - override protected void Append(LoggingEvent loggingEvent) + protected override void Append(LoggingEvent loggingEvent) { AdjustFileBeforeAppend(); base.Append(loggingEvent); @@ -593,7 +593,7 @@ override protected void Append(LoggingEvent loggingEvent) /// is need and then appends to the file last. /// /// - override protected void Append(LoggingEvent[] loggingEvents) + protected override void Append(LoggingEvent[] loggingEvents) { AdjustFileBeforeAppend(); base.Append(loggingEvents); @@ -609,7 +609,7 @@ override protected void Append(LoggingEvent[] loggingEvents) /// is need and then appends to the file last. /// /// - virtual protected void AdjustFileBeforeAppend() + protected virtual void AdjustFileBeforeAppend() { // reuse the file appenders locking model to lock the rolling #if !NETCF @@ -663,7 +663,7 @@ virtual protected void AdjustFileBeforeAppend() /// This method will ensure that the directory structure /// for the specified exists. /// - override protected void OpenFile(string fileName, bool append) + protected override void OpenFile(string fileName, bool append) { lock(this) { @@ -1114,7 +1114,7 @@ private RollPoint ComputeCheckPeriod(string datePattern) /// the current number of backups. /// /// - override public void ActivateOptions() + public override void ActivateOptions() { if (m_dateTime == null) { diff --git a/src/log4net/Appender/SmtpAppender.cs b/src/log4net/Appender/SmtpAppender.cs index bbe8bd51a..98b6bb617 100644 --- a/src/log4net/Appender/SmtpAppender.cs +++ b/src/log4net/Appender/SmtpAppender.cs @@ -381,7 +381,7 @@ public Encoding BodyEncoding /// Sends the contents of the cyclic buffer as an e-mail message. /// /// The logging events to send. - override protected void SendBuffer(LoggingEvent[] events) + protected override void SendBuffer(LoggingEvent[] events) { // Note: this code already owns the monitor for this // appender. This frees us from needing to synchronize again. @@ -428,7 +428,7 @@ override protected void SendBuffer(LoggingEvent[] events) /// This appender requires a to be set. /// /// - override protected bool RequiresLayout + protected override bool RequiresLayout { get { return true; } } @@ -441,7 +441,7 @@ override protected bool RequiresLayout /// Send the email message /// /// the body text to include in the mail - virtual protected void SendEmail(string messageBody) + protected virtual void SendEmail(string messageBody) { #if NET_2_0 || MONO_2_0 || NETSTANDARD2_0 // .NET 2.0 has a new API for SMTP email System.Net.Mail diff --git a/src/log4net/Appender/SmtpPickupDirAppender.cs b/src/log4net/Appender/SmtpPickupDirAppender.cs index b9a97ef9d..17a6af4ee 100644 --- a/src/log4net/Appender/SmtpPickupDirAppender.cs +++ b/src/log4net/Appender/SmtpPickupDirAppender.cs @@ -201,7 +201,7 @@ public SecurityContext SecurityContext /// Sends the contents of the cyclic buffer as an e-mail message. /// /// - override protected void SendBuffer(LoggingEvent[] events) + protected override void SendBuffer(LoggingEvent[] events) { // Note: this code already owns the monitor for this // appender. This frees us from needing to synchronize again. @@ -280,7 +280,7 @@ override protected void SendBuffer(LoggingEvent[] events) /// must be called again. /// /// - override public void ActivateOptions() + public override void ActivateOptions() { base.ActivateOptions(); @@ -304,7 +304,7 @@ override public void ActivateOptions() /// This appender requires a to be set. /// /// - override protected bool RequiresLayout + protected override bool RequiresLayout { get { return true; } } diff --git a/src/log4net/Appender/TelnetAppender.cs b/src/log4net/Appender/TelnetAppender.cs index b117ca03a..0d61a002c 100644 --- a/src/log4net/Appender/TelnetAppender.cs +++ b/src/log4net/Appender/TelnetAppender.cs @@ -79,7 +79,7 @@ public TelnetAppender() /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(TelnetAppender); + private static readonly Type declaringType = typeof(TelnetAppender); #endregion Private Static Fields diff --git a/src/log4net/Appender/TextWriterAppender.cs b/src/log4net/Appender/TextWriterAppender.cs index 94826073b..6eb943ccd 100644 --- a/src/log4net/Appender/TextWriterAppender.cs +++ b/src/log4net/Appender/TextWriterAppender.cs @@ -144,7 +144,7 @@ public bool ImmediateFlush /// Note: Logging to an unopened will fail. /// /// - virtual public TextWriter Writer + public virtual TextWriter Writer { get { return m_qtw; } set @@ -175,7 +175,7 @@ virtual public TextWriter Writer /// /// /// false if any of the preconditions fail. - override protected bool PreAppendCheck() + protected override bool PreAppendCheck() { if (!base.PreAppendCheck()) { @@ -216,7 +216,7 @@ override protected bool PreAppendCheck() /// The format of the output will depend on the appender's layout. /// /// - override protected void Append(LoggingEvent loggingEvent) + protected override void Append(LoggingEvent loggingEvent) { RenderLoggingEvent(m_qtw, loggingEvent); @@ -237,7 +237,7 @@ override protected void Append(LoggingEvent loggingEvent) /// before flushing the stream. /// /// - override protected void Append(LoggingEvent[] loggingEvents) + protected override void Append(LoggingEvent[] loggingEvents) { foreach(LoggingEvent loggingEvent in loggingEvents) { @@ -256,7 +256,7 @@ override protected void Append(LoggingEvent[] loggingEvents) /// /// Closed appenders cannot be reused. /// - override protected void OnClose() + protected override void OnClose() { lock(this) { @@ -271,7 +271,7 @@ override protected void OnClose() /// /// The for this appender. /// - override public IErrorHandler ErrorHandler + public override IErrorHandler ErrorHandler { get { return base.ErrorHandler; } set @@ -303,7 +303,7 @@ override public IErrorHandler ErrorHandler /// This appender requires a to be set. /// /// - override protected bool RequiresLayout + protected override bool RequiresLayout { get { return true; } } @@ -320,7 +320,7 @@ override protected bool RequiresLayout /// Writes the footer and closes the underlying . /// /// - virtual protected void WriteFooterAndCloseWriter() + protected virtual void WriteFooterAndCloseWriter() { WriteFooter(); CloseWriter(); @@ -334,7 +334,7 @@ virtual protected void WriteFooterAndCloseWriter() /// Closes the underlying . /// /// - virtual protected void CloseWriter() + protected virtual void CloseWriter() { if (m_qtw != null) { @@ -360,7 +360,7 @@ virtual protected void CloseWriter() /// Subclasses can override this method for an alternate closing behavior. /// /// - virtual protected void Reset() + protected virtual void Reset() { WriteFooterAndCloseWriter(); m_qtw = null; @@ -374,7 +374,7 @@ virtual protected void Reset() /// Writes a footer as produced by the embedded layout's property. /// /// - virtual protected void WriteFooter() + protected virtual void WriteFooter() { if (Layout != null && m_qtw != null && !m_qtw.Closed) { @@ -394,7 +394,7 @@ virtual protected void WriteFooter() /// Writes a header produced by the embedded layout's property. /// /// - virtual protected void WriteHeader() + protected virtual void WriteHeader() { if (Layout != null && m_qtw != null && !m_qtw.Closed) { @@ -416,7 +416,7 @@ virtual protected void WriteHeader() /// attempt to initialize the writer multiple times. /// /// - virtual protected void PrepareWriter() + protected virtual void PrepareWriter() { } @@ -478,7 +478,7 @@ protected QuietTextWriter QuietWriter /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(TextWriterAppender); + private static readonly Type declaringType = typeof(TextWriterAppender); #endregion Private Static Fields diff --git a/src/log4net/Appender/TraceAppender.cs b/src/log4net/Appender/TraceAppender.cs index 18dd480bf..8e6cb7f3c 100644 --- a/src/log4net/Appender/TraceAppender.cs +++ b/src/log4net/Appender/TraceAppender.cs @@ -141,7 +141,7 @@ public PatternLayout Category /// Writes the logging event to the system. /// /// - override protected void Append(LoggingEvent loggingEvent) + protected override void Append(LoggingEvent loggingEvent) { // // Write the string to the Trace system @@ -174,7 +174,7 @@ override protected void Append(LoggingEvent loggingEvent) /// This appender requires a to be set. /// /// - override protected bool RequiresLayout + protected override bool RequiresLayout { get { return true; } } diff --git a/src/log4net/Appender/UdpAppender.cs b/src/log4net/Appender/UdpAppender.cs index 99a6a8c6b..e2cafe49c 100644 --- a/src/log4net/Appender/UdpAppender.cs +++ b/src/log4net/Appender/UdpAppender.cs @@ -428,7 +428,7 @@ protected override void Append(LoggingEvent loggingEvent) /// This appender requires a to be set. /// /// - override protected bool RequiresLayout + protected override bool RequiresLayout { get { return true; } } @@ -443,7 +443,7 @@ override protected bool RequiresLayout /// and unmanaged resources associated with the . /// /// - override protected void OnClose() + protected override void OnClose() { base.OnClose(); diff --git a/src/log4net/Config/BasicConfigurator.cs b/src/log4net/Config/BasicConfigurator.cs index 4f0ee650e..374cf72bf 100644 --- a/src/log4net/Config/BasicConfigurator.cs +++ b/src/log4net/Config/BasicConfigurator.cs @@ -62,7 +62,7 @@ public sealed class BasicConfigurator /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(BasicConfigurator); + private static readonly Type declaringType = typeof(BasicConfigurator); #endregion Private Static Fields @@ -97,7 +97,7 @@ private BasicConfigurator() /// layout style. /// /// - static public ICollection Configure() + public static ICollection Configure() { return BasicConfigurator.Configure(LogManager.GetRepository(Assembly.GetCallingAssembly())); } @@ -111,7 +111,7 @@ static public ICollection Configure() /// Initializes the log4net system using the specified appenders. /// /// - static public ICollection Configure(params IAppender[] appenders) + public static ICollection Configure(params IAppender[] appenders) { ArrayList configurationMessages = new ArrayList(); @@ -136,7 +136,7 @@ static public ICollection Configure(params IAppender[] appenders) /// Initializes the log4net system using the specified appender. /// /// - static public ICollection Configure(IAppender appender) + public static ICollection Configure(IAppender appender) { return Configure(new IAppender[] { appender }); } @@ -155,7 +155,7 @@ static public ICollection Configure(IAppender appender) /// layout style. /// /// - static public ICollection Configure(ILoggerRepository repository) + public static ICollection Configure(ILoggerRepository repository) { ArrayList configurationMessages = new ArrayList(); @@ -189,7 +189,7 @@ static public ICollection Configure(ILoggerRepository repository) /// Initializes the using the specified appender. /// /// - static public ICollection Configure(ILoggerRepository repository, IAppender appender) + public static ICollection Configure(ILoggerRepository repository, IAppender appender) { return Configure(repository, new IAppender[] { appender }); } @@ -204,7 +204,7 @@ static public ICollection Configure(ILoggerRepository repository, IAppender appe /// Initializes the using the specified appender. /// /// - static public ICollection Configure(ILoggerRepository repository, params IAppender[] appenders) + public static ICollection Configure(ILoggerRepository repository, params IAppender[] appenders) { ArrayList configurationMessages = new ArrayList(); @@ -218,7 +218,7 @@ static public ICollection Configure(ILoggerRepository repository, params IAppend return configurationMessages; } - static private void InternalConfigure(ILoggerRepository repository, params IAppender[] appenders) + private static void InternalConfigure(ILoggerRepository repository, params IAppender[] appenders) { IBasicRepositoryConfigurator configurableRepository = repository as IBasicRepositoryConfigurator; if (configurableRepository != null) diff --git a/src/log4net/Config/DOMConfigurator.cs b/src/log4net/Config/DOMConfigurator.cs index fd8eeb448..2dd16d84c 100644 --- a/src/log4net/Config/DOMConfigurator.cs +++ b/src/log4net/Config/DOMConfigurator.cs @@ -75,7 +75,7 @@ private DOMConfigurator() /// log4net that contains the configuration data. /// [Obsolete("Use XmlConfigurator.Configure instead of DOMConfigurator.Configure")] - static public void Configure() + public static void Configure() { XmlConfigurator.Configure(LogManager.GetRepository(Assembly.GetCallingAssembly())); } @@ -96,7 +96,7 @@ static public void Configure() /// /// The repository to configure. [Obsolete("Use XmlConfigurator.Configure instead of DOMConfigurator.Configure")] - static public void Configure(ILoggerRepository repository) + public static void Configure(ILoggerRepository repository) { XmlConfigurator.Configure(repository); } @@ -113,7 +113,7 @@ static public void Configure(ILoggerRepository repository) /// /// The element to parse. [Obsolete("Use XmlConfigurator.Configure instead of DOMConfigurator.Configure")] - static public void Configure(XmlElement element) + public static void Configure(XmlElement element) { XmlConfigurator.Configure(LogManager.GetRepository(Assembly.GetCallingAssembly()), element); } @@ -132,7 +132,7 @@ static public void Configure(XmlElement element) /// The repository to configure. /// The element to parse. [Obsolete("Use XmlConfigurator.Configure instead of DOMConfigurator.Configure")] - static public void Configure(ILoggerRepository repository, XmlElement element) + public static void Configure(ILoggerRepository repository, XmlElement element) { XmlConfigurator.Configure(repository, element); } @@ -180,7 +180,7 @@ static public void Configure(ILoggerRepository repository, XmlElement element) /// /// [Obsolete("Use XmlConfigurator.Configure instead of DOMConfigurator.Configure")] - static public void Configure(FileInfo configFile) + public static void Configure(FileInfo configFile) { XmlConfigurator.Configure(LogManager.GetRepository(Assembly.GetCallingAssembly()), configFile); } @@ -203,7 +203,7 @@ static public void Configure(FileInfo configFile) /// /// [Obsolete("Use XmlConfigurator.Configure instead of DOMConfigurator.Configure")] - static public void Configure(Stream configStream) + public static void Configure(Stream configStream) { XmlConfigurator.Configure(LogManager.GetRepository(Assembly.GetCallingAssembly()), configStream); } @@ -253,7 +253,7 @@ static public void Configure(Stream configStream) /// /// [Obsolete("Use XmlConfigurator.Configure instead of DOMConfigurator.Configure")] - static public void Configure(ILoggerRepository repository, FileInfo configFile) + public static void Configure(ILoggerRepository repository, FileInfo configFile) { XmlConfigurator.Configure(repository, configFile); } @@ -279,7 +279,7 @@ static public void Configure(ILoggerRepository repository, FileInfo configFile) /// /// [Obsolete("Use XmlConfigurator.Configure instead of DOMConfigurator.Configure")] - static public void Configure(ILoggerRepository repository, Stream configStream) + public static void Configure(ILoggerRepository repository, Stream configStream) { XmlConfigurator.Configure(repository, configStream); } @@ -315,7 +315,7 @@ static public void Configure(ILoggerRepository repository, Stream configStream) /// /// [Obsolete("Use XmlConfigurator.ConfigureAndWatch instead of DOMConfigurator.ConfigureAndWatch")] - static public void ConfigureAndWatch(FileInfo configFile) + public static void ConfigureAndWatch(FileInfo configFile) { XmlConfigurator.ConfigureAndWatch(LogManager.GetRepository(Assembly.GetCallingAssembly()), configFile); } @@ -347,7 +347,7 @@ static public void ConfigureAndWatch(FileInfo configFile) /// /// [Obsolete("Use XmlConfigurator.ConfigureAndWatch instead of DOMConfigurator.ConfigureAndWatch")] - static public void ConfigureAndWatch(ILoggerRepository repository, FileInfo configFile) + public static void ConfigureAndWatch(ILoggerRepository repository, FileInfo configFile) { XmlConfigurator.ConfigureAndWatch(repository, configFile); } diff --git a/src/log4net/Config/PluginAttribute.cs b/src/log4net/Config/PluginAttribute.cs index 67bbc08b2..b66297254 100644 --- a/src/log4net/Config/PluginAttribute.cs +++ b/src/log4net/Config/PluginAttribute.cs @@ -175,7 +175,7 @@ public IPlugin CreatePlugin() /// /// /// A representation of the properties of this object - override public string ToString() + public override string ToString() { if (m_type != null) { diff --git a/src/log4net/Config/SecurityContextProviderAttribute.cs b/src/log4net/Config/SecurityContextProviderAttribute.cs index c6f85572f..7698c1be5 100644 --- a/src/log4net/Config/SecurityContextProviderAttribute.cs +++ b/src/log4net/Config/SecurityContextProviderAttribute.cs @@ -102,7 +102,7 @@ public Type ProviderType /// Sets this as the default security context provider . /// /// - override public void Configure(Assembly sourceAssembly, ILoggerRepository targetRepository) + public override void Configure(Assembly sourceAssembly, ILoggerRepository targetRepository) { if (m_providerType == null) { @@ -142,7 +142,7 @@ override public void Configure(Assembly sourceAssembly, ILoggerRepository target /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(SecurityContextProviderAttribute); + private static readonly Type declaringType = typeof(SecurityContextProviderAttribute); #endregion Private Static Fields } diff --git a/src/log4net/Config/XmlConfigurator.cs b/src/log4net/Config/XmlConfigurator.cs index cd9ebfea9..ce37d2d39 100644 --- a/src/log4net/Config/XmlConfigurator.cs +++ b/src/log4net/Config/XmlConfigurator.cs @@ -94,7 +94,7 @@ private XmlConfigurator() /// /// The repository to configure. #endif - static public ICollection Configure(ILoggerRepository repository) + public static ICollection Configure(ILoggerRepository repository) { ArrayList configurationMessages = new ArrayList(); @@ -108,7 +108,7 @@ static public ICollection Configure(ILoggerRepository repository) return configurationMessages; } - static private void InternalConfigure(ILoggerRepository repository) + private static void InternalConfigure(ILoggerRepository repository) { LogLog.Debug(declaringType, "configuring repository [" + repository.Name + "] using .config file section"); @@ -194,7 +194,7 @@ static private void InternalConfigure(ILoggerRepository repository) /// /// #endif - static public ICollection Configure() + public static ICollection Configure() { return Configure(LogManager.GetRepository(Assembly.GetCallingAssembly())); } @@ -209,7 +209,7 @@ static public ICollection Configure() /// /// /// The element to parse. - static public ICollection Configure(XmlElement element) + public static ICollection Configure(XmlElement element) { ArrayList configurationMessages = new ArrayList(); @@ -312,7 +312,7 @@ static public ICollection Configure(XmlElement element) /// /// #endif - static public ICollection Configure(FileInfo configFile) + public static ICollection Configure(FileInfo configFile) { ArrayList configurationMessages = new ArrayList(); @@ -338,7 +338,7 @@ static public ICollection Configure(FileInfo configFile) /// The must support the URI scheme specified. /// /// - static public ICollection Configure(Uri configUri) + public static ICollection Configure(Uri configUri) { ArrayList configurationMessages = new ArrayList(); @@ -367,7 +367,7 @@ static public ICollection Configure(Uri configUri) /// Note that this method will NOT close the stream parameter. /// /// - static public ICollection Configure(Stream configStream) + public static ICollection Configure(Stream configStream) { ArrayList configurationMessages = new ArrayList(); @@ -393,7 +393,7 @@ static public ICollection Configure(Stream configStream) /// /// The repository to configure. /// The element to parse. - static public ICollection Configure(ILoggerRepository repository, XmlElement element) + public static ICollection Configure(ILoggerRepository repository, XmlElement element) { ArrayList configurationMessages = new ArrayList(); @@ -500,7 +500,7 @@ static public ICollection Configure(ILoggerRepository repository, XmlElement ele /// /// #endif - static public ICollection Configure(ILoggerRepository repository, FileInfo configFile) + public static ICollection Configure(ILoggerRepository repository, FileInfo configFile) { ArrayList configurationMessages = new ArrayList(); @@ -514,7 +514,7 @@ static public ICollection Configure(ILoggerRepository repository, FileInfo confi return configurationMessages; } - static private void InternalConfigure(ILoggerRepository repository, FileInfo configFile) + private static void InternalConfigure(ILoggerRepository repository, FileInfo configFile) { LogLog.Debug(declaringType, "configuring repository [" + repository.Name + "] using file [" + configFile + "]"); @@ -589,7 +589,7 @@ static private void InternalConfigure(ILoggerRepository repository, FileInfo con /// The must support the URI scheme specified. /// /// - static public ICollection Configure(ILoggerRepository repository, Uri configUri) + public static ICollection Configure(ILoggerRepository repository, Uri configUri) { ArrayList configurationMessages = new ArrayList(); @@ -603,7 +603,7 @@ static public ICollection Configure(ILoggerRepository repository, Uri configUri) return configurationMessages; } - static private void InternalConfigure(ILoggerRepository repository, Uri configUri) + private static void InternalConfigure(ILoggerRepository repository, Uri configUri) { LogLog.Debug(declaringType, "configuring repository [" + repository.Name + "] using URI ["+configUri+"]"); @@ -683,7 +683,7 @@ static private void InternalConfigure(ILoggerRepository repository, Uri configUr /// Note that this method will NOT close the stream parameter. /// /// - static public ICollection Configure(ILoggerRepository repository, Stream configStream) + public static ICollection Configure(ILoggerRepository repository, Stream configStream) { ArrayList configurationMessages = new ArrayList(); @@ -697,7 +697,7 @@ static public ICollection Configure(ILoggerRepository repository, Stream configS return configurationMessages; } - static private void InternalConfigure(ILoggerRepository repository, Stream configStream) + private static void InternalConfigure(ILoggerRepository repository, Stream configStream) { LogLog.Debug(declaringType, "configuring repository [" + repository.Name + "] using stream"); @@ -803,7 +803,7 @@ static private void InternalConfigure(ILoggerRepository repository, Stream confi /// /// /// - static public ICollection ConfigureAndWatch(FileInfo configFile) + public static ICollection ConfigureAndWatch(FileInfo configFile) { ArrayList configurationMessages = new ArrayList(); @@ -843,7 +843,7 @@ static public ICollection ConfigureAndWatch(FileInfo configFile) /// /// /// - static public ICollection ConfigureAndWatch(ILoggerRepository repository, FileInfo configFile) + public static ICollection ConfigureAndWatch(ILoggerRepository repository, FileInfo configFile) { ArrayList configurationMessages = new ArrayList(); @@ -857,7 +857,7 @@ static public ICollection ConfigureAndWatch(ILoggerRepository repository, FileIn return configurationMessages; } - static private void InternalConfigureAndWatch(ILoggerRepository repository, FileInfo configFile) + private static void InternalConfigureAndWatch(ILoggerRepository repository, FileInfo configFile) { LogLog.Debug(declaringType, "configuring repository [" + repository.Name + "] using file [" + configFile + "] watching for file updates"); @@ -1070,7 +1070,7 @@ public void Dispose() /// to load the configuration from an . /// /// - static private void InternalConfigureFromXml(ILoggerRepository repository, XmlElement element) + private static void InternalConfigureFromXml(ILoggerRepository repository, XmlElement element) { if (element == null) { @@ -1116,7 +1116,7 @@ static private void InternalConfigureFromXml(ILoggerRepository repository, XmlEl /// ConfigAndWatchHandler to dispose of its FileSystemWatcher when a repository is /// reconfigured. /// - private readonly static Hashtable m_repositoryName2ConfigAndWatchHandler = new Hashtable(); + private static readonly Hashtable m_repositoryName2ConfigAndWatchHandler = new Hashtable(); /// /// The fully qualified type of the XmlConfigurator class. @@ -1125,7 +1125,7 @@ static private void InternalConfigureFromXml(ILoggerRepository repository, XmlEl /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(XmlConfigurator); + private static readonly Type declaringType = typeof(XmlConfigurator); #endregion Private Static Fields } diff --git a/src/log4net/Config/XmlConfiguratorAttribute.cs b/src/log4net/Config/XmlConfiguratorAttribute.cs index 6c3ea3e36..b5cc702fc 100644 --- a/src/log4net/Config/XmlConfiguratorAttribute.cs +++ b/src/log4net/Config/XmlConfiguratorAttribute.cs @@ -196,7 +196,7 @@ public bool Watch /// /// /// The does not extend . - override public void Configure(Assembly sourceAssembly, ILoggerRepository targetRepository) + public override void Configure(Assembly sourceAssembly, ILoggerRepository targetRepository) { IList configurationMessages = new ArrayList(); @@ -460,7 +460,7 @@ private void ConfigureFromUri(Assembly sourceAssembly, ILoggerRepository targetR /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(XmlConfiguratorAttribute); + private static readonly Type declaringType = typeof(XmlConfiguratorAttribute); #endregion Private Static Fields } diff --git a/src/log4net/Core/CompactRepositorySelector.cs b/src/log4net/Core/CompactRepositorySelector.cs index dd46f6d59..b1b2805d1 100644 --- a/src/log4net/Core/CompactRepositorySelector.cs +++ b/src/log4net/Core/CompactRepositorySelector.cs @@ -311,7 +311,7 @@ public ILoggerRepository[] GetAllRepositories() /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(CompactRepositorySelector); + private static readonly Type declaringType = typeof(CompactRepositorySelector); #endregion Private Static Fields diff --git a/src/log4net/Core/DefaultRepositorySelector.cs b/src/log4net/Core/DefaultRepositorySelector.cs index ce399217b..2cc84d267 100644 --- a/src/log4net/Core/DefaultRepositorySelector.cs +++ b/src/log4net/Core/DefaultRepositorySelector.cs @@ -891,7 +891,7 @@ private void LoadAliases(Assembly assembly, ILoggerRepository repository) /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(DefaultRepositorySelector); + private static readonly Type declaringType = typeof(DefaultRepositorySelector); private const string DefaultRepositoryName = "log4net-default-repository"; diff --git a/src/log4net/Core/Level.cs b/src/log4net/Core/Level.cs index 713918dd0..767d03eee 100644 --- a/src/log4net/Core/Level.cs +++ b/src/log4net/Core/Level.cs @@ -83,7 +83,7 @@ namespace log4net.Core #if !NETCF [Serializable] #endif - sealed public class Level : IComparable + public sealed class Level : IComparable { #region Public Instance Constructors @@ -202,7 +202,7 @@ public string DisplayName /// Returns the level . /// /// - override public string ToString() + public override string ToString() { return m_levelName; } @@ -219,7 +219,7 @@ override public string ToString() /// instance. /// /// - override public bool Equals(object o) + public override bool Equals(object o) { Level otherLevel = o as Level; if (otherLevel != null) @@ -245,7 +245,7 @@ override public bool Equals(object o) /// Returns the hash code of the level . /// /// - override public int GetHashCode() + public override int GetHashCode() { return m_levelValue; } @@ -500,107 +500,107 @@ public static int Compare(Level l, Level r) /// /// The level designates a higher level than all the rest. /// - public readonly static Level Off = new Level(int.MaxValue, "OFF"); + public static readonly Level Off = new Level(int.MaxValue, "OFF"); /// /// The level designates very severe error events. /// System unusable, emergencies. /// - public readonly static Level Log4Net_Debug = new Level(120000, "log4net:DEBUG"); + public static readonly Level Log4Net_Debug = new Level(120000, "log4net:DEBUG"); /// /// The level designates very severe error events. /// System unusable, emergencies. /// - public readonly static Level Emergency = new Level(120000, "EMERGENCY"); + public static readonly Level Emergency = new Level(120000, "EMERGENCY"); /// /// The level designates very severe error events /// that will presumably lead the application to abort. /// - public readonly static Level Fatal = new Level(110000, "FATAL"); + public static readonly Level Fatal = new Level(110000, "FATAL"); /// /// The level designates very severe error events. /// Take immediate action, alerts. /// - public readonly static Level Alert = new Level(100000, "ALERT"); + public static readonly Level Alert = new Level(100000, "ALERT"); /// /// The level designates very severe error events. /// Critical condition, critical. /// - public readonly static Level Critical = new Level(90000, "CRITICAL"); + public static readonly Level Critical = new Level(90000, "CRITICAL"); /// /// The level designates very severe error events. /// - public readonly static Level Severe = new Level(80000, "SEVERE"); + public static readonly Level Severe = new Level(80000, "SEVERE"); /// /// The level designates error events that might /// still allow the application to continue running. /// - public readonly static Level Error = new Level(70000, "ERROR"); + public static readonly Level Error = new Level(70000, "ERROR"); /// /// The level designates potentially harmful /// situations. /// - public readonly static Level Warn = new Level(60000, "WARN"); + public static readonly Level Warn = new Level(60000, "WARN"); /// /// The level designates informational messages /// that highlight the progress of the application at the highest level. /// - public readonly static Level Notice = new Level(50000, "NOTICE"); + public static readonly Level Notice = new Level(50000, "NOTICE"); /// /// The level designates informational messages that /// highlight the progress of the application at coarse-grained level. /// - public readonly static Level Info = new Level(40000, "INFO"); + public static readonly Level Info = new Level(40000, "INFO"); /// /// The level designates fine-grained informational /// events that are most useful to debug an application. /// - public readonly static Level Debug = new Level(30000, "DEBUG"); + public static readonly Level Debug = new Level(30000, "DEBUG"); /// /// The level designates fine-grained informational /// events that are most useful to debug an application. /// - public readonly static Level Fine = new Level(30000, "FINE"); + public static readonly Level Fine = new Level(30000, "FINE"); /// /// The level designates fine-grained informational /// events that are most useful to debug an application. /// - public readonly static Level Trace = new Level(20000, "TRACE"); + public static readonly Level Trace = new Level(20000, "TRACE"); /// /// The level designates fine-grained informational /// events that are most useful to debug an application. /// - public readonly static Level Finer = new Level(20000, "FINER"); + public static readonly Level Finer = new Level(20000, "FINER"); /// /// The level designates fine-grained informational /// events that are most useful to debug an application. /// - public readonly static Level Verbose = new Level(10000, "VERBOSE"); + public static readonly Level Verbose = new Level(10000, "VERBOSE"); /// /// The level designates fine-grained informational /// events that are most useful to debug an application. /// - public readonly static Level Finest = new Level(10000, "FINEST"); + public static readonly Level Finest = new Level(10000, "FINEST"); /// /// The level designates the lowest level possible. /// - public readonly static Level All = new Level(int.MinValue, "ALL"); + public static readonly Level All = new Level(int.MinValue, "ALL"); #endregion Public Static Fields diff --git a/src/log4net/Core/LocationInfo.cs b/src/log4net/Core/LocationInfo.cs index d8ae92bd1..d364f9dc4 100644 --- a/src/log4net/Core/LocationInfo.cs +++ b/src/log4net/Core/LocationInfo.cs @@ -307,7 +307,7 @@ public StackFrameItem[] StackFrames /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(LocationInfo); + private static readonly Type declaringType = typeof(LocationInfo); /// /// When location information is not available the constant diff --git a/src/log4net/Core/LogImpl.cs b/src/log4net/Core/LogImpl.cs index 64c2edf98..f997ac36a 100644 --- a/src/log4net/Core/LogImpl.cs +++ b/src/log4net/Core/LogImpl.cs @@ -165,7 +165,7 @@ protected virtual void ReloadLevels(ILoggerRepository repository) /// form instead. /// /// - virtual public void Debug(object message) + public virtual void Debug(object message) { Logger.Log(ThisDeclaringType, m_levelDebug, message, null); } @@ -186,7 +186,7 @@ virtual public void Debug(object message) /// /// /// - virtual public void Debug(object message, Exception exception) + public virtual void Debug(object message, Exception exception) { Logger.Log(ThisDeclaringType, m_levelDebug, message, exception); } @@ -213,7 +213,7 @@ virtual public void Debug(object message, Exception exception) /// methods instead. /// /// - virtual public void DebugFormat(string format, params object[] args) + public virtual void DebugFormat(string format, params object[] args) { if (IsDebugEnabled) { @@ -243,7 +243,7 @@ virtual public void DebugFormat(string format, params object[] args) /// methods instead. /// /// - virtual public void DebugFormat(string format, object arg0) + public virtual void DebugFormat(string format, object arg0) { if (IsDebugEnabled) { @@ -274,7 +274,7 @@ virtual public void DebugFormat(string format, object arg0) /// methods instead. /// /// - virtual public void DebugFormat(string format, object arg0, object arg1) + public virtual void DebugFormat(string format, object arg0, object arg1) { if (IsDebugEnabled) { @@ -306,7 +306,7 @@ virtual public void DebugFormat(string format, object arg0, object arg1) /// methods instead. /// /// - virtual public void DebugFormat(string format, object arg0, object arg1, object arg2) + public virtual void DebugFormat(string format, object arg0, object arg1, object arg2) { if (IsDebugEnabled) { @@ -332,7 +332,7 @@ virtual public void DebugFormat(string format, object arg0, object arg1, object /// methods instead. /// /// - virtual public void DebugFormat(IFormatProvider provider, string format, params object[] args) + public virtual void DebugFormat(IFormatProvider provider, string format, params object[] args) { if (IsDebugEnabled) { @@ -363,7 +363,7 @@ virtual public void DebugFormat(IFormatProvider provider, string format, params /// form instead. /// /// - virtual public void Info(object message) + public virtual void Info(object message) { Logger.Log(ThisDeclaringType, m_levelInfo, message, null); } @@ -384,7 +384,7 @@ virtual public void Info(object message) /// /// /// - virtual public void Info(object message, Exception exception) + public virtual void Info(object message, Exception exception) { Logger.Log(ThisDeclaringType, m_levelInfo, message, exception); } @@ -411,7 +411,7 @@ virtual public void Info(object message, Exception exception) /// methods instead. /// /// - virtual public void InfoFormat(string format, params object[] args) + public virtual void InfoFormat(string format, params object[] args) { if (IsInfoEnabled) { @@ -441,7 +441,7 @@ virtual public void InfoFormat(string format, params object[] args) /// methods instead. /// /// - virtual public void InfoFormat(string format, object arg0) + public virtual void InfoFormat(string format, object arg0) { if (IsInfoEnabled) { @@ -472,7 +472,7 @@ virtual public void InfoFormat(string format, object arg0) /// methods instead. /// /// - virtual public void InfoFormat(string format, object arg0, object arg1) + public virtual void InfoFormat(string format, object arg0, object arg1) { if (IsInfoEnabled) { @@ -504,7 +504,7 @@ virtual public void InfoFormat(string format, object arg0, object arg1) /// methods instead. /// /// - virtual public void InfoFormat(string format, object arg0, object arg1, object arg2) + public virtual void InfoFormat(string format, object arg0, object arg1, object arg2) { if (IsInfoEnabled) { @@ -530,7 +530,7 @@ virtual public void InfoFormat(string format, object arg0, object arg1, object a /// methods instead. /// /// - virtual public void InfoFormat(IFormatProvider provider, string format, params object[] args) + public virtual void InfoFormat(IFormatProvider provider, string format, params object[] args) { if (IsInfoEnabled) { @@ -561,7 +561,7 @@ virtual public void InfoFormat(IFormatProvider provider, string format, params o /// form instead. /// /// - virtual public void Warn(object message) + public virtual void Warn(object message) { Logger.Log(ThisDeclaringType, m_levelWarn, message, null); } @@ -582,7 +582,7 @@ virtual public void Warn(object message) /// /// /// - virtual public void Warn(object message, Exception exception) + public virtual void Warn(object message, Exception exception) { Logger.Log(ThisDeclaringType, m_levelWarn, message, exception); } @@ -609,7 +609,7 @@ virtual public void Warn(object message, Exception exception) /// methods instead. /// /// - virtual public void WarnFormat(string format, params object[] args) + public virtual void WarnFormat(string format, params object[] args) { if (IsWarnEnabled) { @@ -639,7 +639,7 @@ virtual public void WarnFormat(string format, params object[] args) /// methods instead. /// /// - virtual public void WarnFormat(string format, object arg0) + public virtual void WarnFormat(string format, object arg0) { if (IsWarnEnabled) { @@ -670,7 +670,7 @@ virtual public void WarnFormat(string format, object arg0) /// methods instead. /// /// - virtual public void WarnFormat(string format, object arg0, object arg1) + public virtual void WarnFormat(string format, object arg0, object arg1) { if (IsWarnEnabled) { @@ -702,7 +702,7 @@ virtual public void WarnFormat(string format, object arg0, object arg1) /// methods instead. /// /// - virtual public void WarnFormat(string format, object arg0, object arg1, object arg2) + public virtual void WarnFormat(string format, object arg0, object arg1, object arg2) { if (IsWarnEnabled) { @@ -728,7 +728,7 @@ virtual public void WarnFormat(string format, object arg0, object arg1, object a /// methods instead. /// /// - virtual public void WarnFormat(IFormatProvider provider, string format, params object[] args) + public virtual void WarnFormat(IFormatProvider provider, string format, params object[] args) { if (IsWarnEnabled) { @@ -759,7 +759,7 @@ virtual public void WarnFormat(IFormatProvider provider, string format, params o /// form instead. /// /// - virtual public void Error(object message) + public virtual void Error(object message) { Logger.Log(ThisDeclaringType, m_levelError, message, null); } @@ -780,7 +780,7 @@ virtual public void Error(object message) /// /// /// - virtual public void Error(object message, Exception exception) + public virtual void Error(object message, Exception exception) { Logger.Log(ThisDeclaringType, m_levelError, message, exception); } @@ -807,7 +807,7 @@ virtual public void Error(object message, Exception exception) /// methods instead. /// /// - virtual public void ErrorFormat(string format, params object[] args) + public virtual void ErrorFormat(string format, params object[] args) { if (IsErrorEnabled) { @@ -837,7 +837,7 @@ virtual public void ErrorFormat(string format, params object[] args) /// methods instead. /// /// - virtual public void ErrorFormat(string format, object arg0) + public virtual void ErrorFormat(string format, object arg0) { if (IsErrorEnabled) { @@ -868,7 +868,7 @@ virtual public void ErrorFormat(string format, object arg0) /// methods instead. /// /// - virtual public void ErrorFormat(string format, object arg0, object arg1) + public virtual void ErrorFormat(string format, object arg0, object arg1) { if (IsErrorEnabled) { @@ -900,7 +900,7 @@ virtual public void ErrorFormat(string format, object arg0, object arg1) /// methods instead. /// /// - virtual public void ErrorFormat(string format, object arg0, object arg1, object arg2) + public virtual void ErrorFormat(string format, object arg0, object arg1, object arg2) { if (IsErrorEnabled) { @@ -926,7 +926,7 @@ virtual public void ErrorFormat(string format, object arg0, object arg1, object /// methods instead. /// /// - virtual public void ErrorFormat(IFormatProvider provider, string format, params object[] args) + public virtual void ErrorFormat(IFormatProvider provider, string format, params object[] args) { if (IsErrorEnabled) { @@ -957,7 +957,7 @@ virtual public void ErrorFormat(IFormatProvider provider, string format, params /// form instead. /// /// - virtual public void Fatal(object message) + public virtual void Fatal(object message) { Logger.Log(ThisDeclaringType, m_levelFatal, message, null); } @@ -978,7 +978,7 @@ virtual public void Fatal(object message) /// /// /// - virtual public void Fatal(object message, Exception exception) + public virtual void Fatal(object message, Exception exception) { Logger.Log(ThisDeclaringType, m_levelFatal, message, exception); } @@ -1005,7 +1005,7 @@ virtual public void Fatal(object message, Exception exception) /// methods instead. /// /// - virtual public void FatalFormat(string format, params object[] args) + public virtual void FatalFormat(string format, params object[] args) { if (IsFatalEnabled) { @@ -1035,7 +1035,7 @@ virtual public void FatalFormat(string format, params object[] args) /// methods instead. /// /// - virtual public void FatalFormat(string format, object arg0) + public virtual void FatalFormat(string format, object arg0) { if (IsFatalEnabled) { @@ -1066,7 +1066,7 @@ virtual public void FatalFormat(string format, object arg0) /// methods instead. /// /// - virtual public void FatalFormat(string format, object arg0, object arg1) + public virtual void FatalFormat(string format, object arg0, object arg1) { if (IsFatalEnabled) { @@ -1098,7 +1098,7 @@ virtual public void FatalFormat(string format, object arg0, object arg1) /// methods instead. /// /// - virtual public void FatalFormat(string format, object arg0, object arg1, object arg2) + public virtual void FatalFormat(string format, object arg0, object arg1, object arg2) { if (IsFatalEnabled) { @@ -1124,7 +1124,7 @@ virtual public void FatalFormat(string format, object arg0, object arg1, object /// methods instead. /// /// - virtual public void FatalFormat(IFormatProvider provider, string format, params object[] args) + public virtual void FatalFormat(IFormatProvider provider, string format, params object[] args) { if (IsFatalEnabled) { @@ -1175,7 +1175,7 @@ virtual public void FatalFormat(IFormatProvider provider, string format, params /// takes to actually log. /// /// - virtual public bool IsDebugEnabled + public virtual bool IsDebugEnabled { get { return Logger.IsEnabledFor(m_levelDebug); } } @@ -1194,7 +1194,7 @@ virtual public bool IsDebugEnabled /// /// /// - virtual public bool IsInfoEnabled + public virtual bool IsInfoEnabled { get { return Logger.IsEnabledFor(m_levelInfo); } } @@ -1213,7 +1213,7 @@ virtual public bool IsInfoEnabled /// /// /// - virtual public bool IsWarnEnabled + public virtual bool IsWarnEnabled { get { return Logger.IsEnabledFor(m_levelWarn); } } @@ -1231,7 +1231,7 @@ virtual public bool IsWarnEnabled /// /// /// - virtual public bool IsErrorEnabled + public virtual bool IsErrorEnabled { get { return Logger.IsEnabledFor(m_levelError); } } @@ -1249,7 +1249,7 @@ virtual public bool IsErrorEnabled /// /// /// - virtual public bool IsFatalEnabled + public virtual bool IsFatalEnabled { get { return Logger.IsEnabledFor(m_levelFatal); } } @@ -1279,7 +1279,7 @@ private void LoggerRepositoryConfigurationChanged(object sender, EventArgs e) /// /// The fully qualified name of this declaring type not the type of any subclass. /// - private readonly static Type ThisDeclaringType = typeof(LogImpl); + private static readonly Type ThisDeclaringType = typeof(LogImpl); #endregion Private Static Instance Fields diff --git a/src/log4net/Core/LoggerManager.cs b/src/log4net/Core/LoggerManager.cs index 52b6c7b29..98a2fe8ea 100644 --- a/src/log4net/Core/LoggerManager.cs +++ b/src/log4net/Core/LoggerManager.cs @@ -866,7 +866,7 @@ private static void OnProcessExit(object sender, EventArgs e) /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(LoggerManager); + private static readonly Type declaringType = typeof(LoggerManager); /// /// Initialize the default repository selector diff --git a/src/log4net/Core/LoggerWrapperImpl.cs b/src/log4net/Core/LoggerWrapperImpl.cs index fff496d0b..26f016dfc 100644 --- a/src/log4net/Core/LoggerWrapperImpl.cs +++ b/src/log4net/Core/LoggerWrapperImpl.cs @@ -67,7 +67,7 @@ protected LoggerWrapperImpl(ILogger logger) /// the log events. /// /// - virtual public ILogger Logger + public virtual ILogger Logger { get { return m_logger; } } diff --git a/src/log4net/Core/LoggingEvent.cs b/src/log4net/Core/LoggingEvent.cs index 0c733006c..c09937a31 100644 --- a/src/log4net/Core/LoggingEvent.cs +++ b/src/log4net/Core/LoggingEvent.cs @@ -328,7 +328,7 @@ public class LoggingEvent : ISerializable #endif { - private readonly static Type declaringType = typeof(LoggingEvent); + private static readonly Type declaringType = typeof(LoggingEvent); #region Public Instance Constructors diff --git a/src/log4net/Core/MethodItem.cs b/src/log4net/Core/MethodItem.cs index e2ff3c392..6d3ca1984 100644 --- a/src/log4net/Core/MethodItem.cs +++ b/src/log4net/Core/MethodItem.cs @@ -156,7 +156,7 @@ public string[] Parameters /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(MethodItem); + private static readonly Type declaringType = typeof(MethodItem); /// /// When location information is not available the constant diff --git a/src/log4net/Core/StackFrameItem.cs b/src/log4net/Core/StackFrameItem.cs index 83f035146..17193260d 100644 --- a/src/log4net/Core/StackFrameItem.cs +++ b/src/log4net/Core/StackFrameItem.cs @@ -180,7 +180,7 @@ public string FullInfo /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(StackFrameItem); + private static readonly Type declaringType = typeof(StackFrameItem); /// /// When location information is not available the constant diff --git a/src/log4net/Core/WrapperMap.cs b/src/log4net/Core/WrapperMap.cs index a43a8b8db..d4f5b257f 100644 --- a/src/log4net/Core/WrapperMap.cs +++ b/src/log4net/Core/WrapperMap.cs @@ -105,7 +105,7 @@ public WrapperMap(WrapperCreationHandler createWrapperHandler) /// called. /// /// - virtual public ILoggerWrapper GetWrapper(ILogger logger) + public virtual ILoggerWrapper GetWrapper(ILogger logger) { // If the logger is null then the corresponding wrapper is null if (logger == null) @@ -186,7 +186,7 @@ protected Hashtable Repositories /// can be overridden in a subclass. /// /// - virtual protected ILoggerWrapper CreateNewWrapperObject(ILogger logger) + protected virtual ILoggerWrapper CreateNewWrapperObject(ILogger logger) { if (m_createWrapperHandler != null) { @@ -208,7 +208,7 @@ virtual protected ILoggerWrapper CreateNewWrapperObject(ILogger logger) /// and their wrappers generated for this repository. /// /// - virtual protected void RepositoryShutdown(ILoggerRepository repository) + protected virtual void RepositoryShutdown(ILoggerRepository repository) { lock(this) { diff --git a/src/log4net/DateFormatter/AbsoluteTimeDateFormatter.cs b/src/log4net/DateFormatter/AbsoluteTimeDateFormatter.cs index 11741073f..c6333038d 100644 --- a/src/log4net/DateFormatter/AbsoluteTimeDateFormatter.cs +++ b/src/log4net/DateFormatter/AbsoluteTimeDateFormatter.cs @@ -51,7 +51,7 @@ public class AbsoluteTimeDateFormatter : IDateFormatter /// reused if it is needed again during the same second. /// /// - virtual protected void FormatDateWithoutMillis(DateTime dateToFormat, StringBuilder buffer) + protected virtual void FormatDateWithoutMillis(DateTime dateToFormat, StringBuilder buffer) { int hour = dateToFormat.Hour; if (hour < 10) @@ -99,7 +99,7 @@ virtual protected void FormatDateWithoutMillis(DateTime dateToFormat, StringBuil /// rather than . /// /// - virtual public void FormatDate(DateTime dateToFormat, TextWriter writer) + public virtual void FormatDate(DateTime dateToFormat, TextWriter writer) { lock (s_lastTimeStrings) { diff --git a/src/log4net/DateFormatter/DateTimeDateFormatter.cs b/src/log4net/DateFormatter/DateTimeDateFormatter.cs index 03dcca954..7411206c4 100644 --- a/src/log4net/DateFormatter/DateTimeDateFormatter.cs +++ b/src/log4net/DateFormatter/DateTimeDateFormatter.cs @@ -72,7 +72,7 @@ public DateTimeDateFormatter() /// This method will only be called at most once per second. /// /// - override protected void FormatDateWithoutMillis(DateTime dateToFormat, StringBuilder buffer) + protected override void FormatDateWithoutMillis(DateTime dateToFormat, StringBuilder buffer) { int day = dateToFormat.Day; if (day < 10) diff --git a/src/log4net/DateFormatter/Iso8601DateFormatter.cs b/src/log4net/DateFormatter/Iso8601DateFormatter.cs index a7e88d551..524c8a796 100644 --- a/src/log4net/DateFormatter/Iso8601DateFormatter.cs +++ b/src/log4net/DateFormatter/Iso8601DateFormatter.cs @@ -66,7 +66,7 @@ public Iso8601DateFormatter() /// This method will only be called at most once per second. /// /// - override protected void FormatDateWithoutMillis(DateTime dateToFormat, StringBuilder buffer) + protected override void FormatDateWithoutMillis(DateTime dateToFormat, StringBuilder buffer) { buffer.Append(dateToFormat.Year); diff --git a/src/log4net/DateFormatter/SimpleDateFormatter.cs b/src/log4net/DateFormatter/SimpleDateFormatter.cs index c112ca1ab..3efb1643d 100644 --- a/src/log4net/DateFormatter/SimpleDateFormatter.cs +++ b/src/log4net/DateFormatter/SimpleDateFormatter.cs @@ -70,7 +70,7 @@ public SimpleDateFormatter(string format) /// the method to format the date. /// /// - virtual public void FormatDate(DateTime dateToFormat, TextWriter writer) + public virtual void FormatDate(DateTime dateToFormat, TextWriter writer) { writer.Write(dateToFormat.ToString(m_formatString, System.Globalization.DateTimeFormatInfo.InvariantInfo)); } diff --git a/src/log4net/Filter/DenyAllFilter.cs b/src/log4net/Filter/DenyAllFilter.cs index e17a16fff..ab377f1eb 100644 --- a/src/log4net/Filter/DenyAllFilter.cs +++ b/src/log4net/Filter/DenyAllFilter.cs @@ -65,7 +65,7 @@ public DenyAllFilter() /// as any further filters will be ignored! /// /// - override public FilterDecision Decide(LoggingEvent loggingEvent) + public override FilterDecision Decide(LoggingEvent loggingEvent) { return FilterDecision.Deny; } diff --git a/src/log4net/Filter/FilterSkeleton.cs b/src/log4net/Filter/FilterSkeleton.cs index 9cc24d807..293d3ca5d 100644 --- a/src/log4net/Filter/FilterSkeleton.cs +++ b/src/log4net/Filter/FilterSkeleton.cs @@ -104,7 +104,7 @@ public abstract class FilterSkeleton : IFilter /// however this method must still be called. /// /// - virtual public void ActivateOptions() + public virtual void ActivateOptions() { } @@ -130,7 +130,7 @@ virtual public void ActivateOptions() /// in a subclass. /// /// - abstract public FilterDecision Decide(LoggingEvent loggingEvent); + public abstract FilterDecision Decide(LoggingEvent loggingEvent); /// /// Property to get and set the next filter diff --git a/src/log4net/Filter/LevelMatchFilter.cs b/src/log4net/Filter/LevelMatchFilter.cs index 2d3465a2a..34a21b3fb 100644 --- a/src/log4net/Filter/LevelMatchFilter.cs +++ b/src/log4net/Filter/LevelMatchFilter.cs @@ -122,7 +122,7 @@ public Level LevelToMatch /// the result will be . /// /// - override public FilterDecision Decide(LoggingEvent loggingEvent) + public override FilterDecision Decide(LoggingEvent loggingEvent) { if (loggingEvent == null) { diff --git a/src/log4net/Filter/LevelRangeFilter.cs b/src/log4net/Filter/LevelRangeFilter.cs index 9afc03a15..f6e0be00c 100644 --- a/src/log4net/Filter/LevelRangeFilter.cs +++ b/src/log4net/Filter/LevelRangeFilter.cs @@ -142,7 +142,7 @@ public Level LevelMax /// is returned. /// /// - override public FilterDecision Decide(LoggingEvent loggingEvent) + public override FilterDecision Decide(LoggingEvent loggingEvent) { if (loggingEvent == null) { diff --git a/src/log4net/Filter/LoggerMatchFilter.cs b/src/log4net/Filter/LoggerMatchFilter.cs index 828a304e3..28264ec13 100644 --- a/src/log4net/Filter/LoggerMatchFilter.cs +++ b/src/log4net/Filter/LoggerMatchFilter.cs @@ -129,7 +129,7 @@ public string LoggerToMatch /// is returned. /// /// - override public FilterDecision Decide(LoggingEvent loggingEvent) + public override FilterDecision Decide(LoggingEvent loggingEvent) { if (loggingEvent == null) { diff --git a/src/log4net/Filter/PropertyFilter.cs b/src/log4net/Filter/PropertyFilter.cs index 8c35c7fed..a74a03b0a 100644 --- a/src/log4net/Filter/PropertyFilter.cs +++ b/src/log4net/Filter/PropertyFilter.cs @@ -94,7 +94,7 @@ public string Key /// is returned. /// /// - override public FilterDecision Decide(LoggingEvent loggingEvent) + public override FilterDecision Decide(LoggingEvent loggingEvent) { if (loggingEvent == null) { diff --git a/src/log4net/Filter/StringMatchFilter.cs b/src/log4net/Filter/StringMatchFilter.cs index 38fa49d40..840a95d0e 100644 --- a/src/log4net/Filter/StringMatchFilter.cs +++ b/src/log4net/Filter/StringMatchFilter.cs @@ -91,7 +91,7 @@ public StringMatchFilter() /// must be called again. /// /// - override public void ActivateOptions() + public override void ActivateOptions() { if (m_stringRegexToMatch != null) { @@ -186,7 +186,7 @@ public string RegexToMatch /// is returned. /// /// - override public FilterDecision Decide(LoggingEvent loggingEvent) + public override FilterDecision Decide(LoggingEvent loggingEvent) { if (loggingEvent == null) { diff --git a/src/log4net/GlobalContext.cs b/src/log4net/GlobalContext.cs index dd02a90cf..222b90c8e 100644 --- a/src/log4net/GlobalContext.cs +++ b/src/log4net/GlobalContext.cs @@ -95,7 +95,7 @@ public static GlobalContextProperties Properties /// /// The global context properties instance /// - private readonly static GlobalContextProperties s_properties = new GlobalContextProperties(); + private static readonly GlobalContextProperties s_properties = new GlobalContextProperties(); #endregion Private Static Fields } diff --git a/src/log4net/Layout/ExceptionLayout.cs b/src/log4net/Layout/ExceptionLayout.cs index 06c4509bc..90217077f 100644 --- a/src/log4net/Layout/ExceptionLayout.cs +++ b/src/log4net/Layout/ExceptionLayout.cs @@ -73,7 +73,7 @@ public ExceptionLayout() /// This method does nothing as options become effective immediately. /// /// - override public void ActivateOptions() + public override void ActivateOptions() { // nothing to do. } @@ -93,7 +93,7 @@ override public void ActivateOptions() /// The exception string is retrieved from . /// /// - override public void Format(TextWriter writer, LoggingEvent loggingEvent) + public override void Format(TextWriter writer, LoggingEvent loggingEvent) { if (loggingEvent == null) { diff --git a/src/log4net/Layout/Layout2RawLayoutAdapter.cs b/src/log4net/Layout/Layout2RawLayoutAdapter.cs index 494578418..9b92bf46a 100644 --- a/src/log4net/Layout/Layout2RawLayoutAdapter.cs +++ b/src/log4net/Layout/Layout2RawLayoutAdapter.cs @@ -81,7 +81,7 @@ public Layout2RawLayoutAdapter(ILayout layout) /// the constructor to perform the formatting. /// /// - virtual public object Format(LoggingEvent loggingEvent) + public virtual object Format(LoggingEvent loggingEvent) { using StringWriter writer = new StringWriter(System.Globalization.CultureInfo.InvariantCulture); m_layout.Format(writer, loggingEvent); diff --git a/src/log4net/Layout/LayoutSkeleton.cs b/src/log4net/Layout/LayoutSkeleton.cs index afae60e7b..1f26c8e61 100644 --- a/src/log4net/Layout/LayoutSkeleton.cs +++ b/src/log4net/Layout/LayoutSkeleton.cs @@ -121,7 +121,7 @@ protected LayoutSkeleton() /// This method must be implemented by the subclass. /// /// - abstract public void ActivateOptions(); + public abstract void ActivateOptions(); #endregion @@ -138,7 +138,7 @@ protected LayoutSkeleton() /// the as text. /// /// - abstract public void Format(TextWriter writer, LoggingEvent loggingEvent); + public abstract void Format(TextWriter writer, LoggingEvent loggingEvent); /// /// Convenience method for easily formatting the logging event into a string variable. @@ -168,7 +168,7 @@ public string Format(LoggingEvent loggingEvent) /// property. /// /// - virtual public string ContentType + public virtual string ContentType { get { return "text/plain"; } } @@ -183,7 +183,7 @@ virtual public string ContentType /// are formatted and appended. /// /// - virtual public string Header + public virtual string Header { get { return m_header; } set { m_header = value; } @@ -199,7 +199,7 @@ virtual public string Header /// have been formatted and appended. /// /// - virtual public string Footer + public virtual string Footer { get { return m_footer; } set { m_footer = value; } @@ -221,7 +221,7 @@ virtual public string Footer /// value is true, this layout does not handle the exception. /// /// - virtual public bool IgnoresException + public virtual bool IgnoresException { get { return m_ignoresException; } set { m_ignoresException = value; } diff --git a/src/log4net/Layout/Pattern/AppDomainPatternConverter.cs b/src/log4net/Layout/Pattern/AppDomainPatternConverter.cs index 37369c4f6..30b7f0968 100644 --- a/src/log4net/Layout/Pattern/AppDomainPatternConverter.cs +++ b/src/log4net/Layout/Pattern/AppDomainPatternConverter.cs @@ -47,7 +47,7 @@ internal sealed class AppDomainPatternConverter : PatternLayoutConverter /// Writes the to the output . /// /// - override protected void Convert(TextWriter writer, LoggingEvent loggingEvent) + protected override void Convert(TextWriter writer, LoggingEvent loggingEvent) { writer.Write(loggingEvent.Domain); } diff --git a/src/log4net/Layout/Pattern/DatePatternConverter.cs b/src/log4net/Layout/Pattern/DatePatternConverter.cs index 72d3df1ab..c283ba1f0 100644 --- a/src/log4net/Layout/Pattern/DatePatternConverter.cs +++ b/src/log4net/Layout/Pattern/DatePatternConverter.cs @@ -161,7 +161,7 @@ public void ActivateOptions() /// The passed is in the local time zone. /// /// - override protected void Convert(TextWriter writer, LoggingEvent loggingEvent) + protected override void Convert(TextWriter writer, LoggingEvent loggingEvent) { try { @@ -182,7 +182,7 @@ override protected void Convert(TextWriter writer, LoggingEvent loggingEvent) /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(DatePatternConverter); + private static readonly Type declaringType = typeof(DatePatternConverter); #endregion Private Static Fields } diff --git a/src/log4net/Layout/Pattern/ExceptionPatternConverter.cs b/src/log4net/Layout/Pattern/ExceptionPatternConverter.cs index 7ab88d00e..009130496 100644 --- a/src/log4net/Layout/Pattern/ExceptionPatternConverter.cs +++ b/src/log4net/Layout/Pattern/ExceptionPatternConverter.cs @@ -90,7 +90,7 @@ public ExceptionPatternConverter() /// /// /// - override protected void Convert(TextWriter writer, LoggingEvent loggingEvent) + protected override void Convert(TextWriter writer, LoggingEvent loggingEvent) { if (loggingEvent.ExceptionObject != null && Option != null && Option.Length > 0) { diff --git a/src/log4net/Layout/Pattern/FileLocationPatternConverter.cs b/src/log4net/Layout/Pattern/FileLocationPatternConverter.cs index bcec221e6..d555c61cd 100644 --- a/src/log4net/Layout/Pattern/FileLocationPatternConverter.cs +++ b/src/log4net/Layout/Pattern/FileLocationPatternConverter.cs @@ -48,7 +48,7 @@ internal sealed class FileLocationPatternConverter : PatternLayoutConverter /// the to the output . /// /// - override protected void Convert(TextWriter writer, LoggingEvent loggingEvent) + protected override void Convert(TextWriter writer, LoggingEvent loggingEvent) { writer.Write(loggingEvent.LocationInformation.FileName); } diff --git a/src/log4net/Layout/Pattern/FullLocationPatternConverter.cs b/src/log4net/Layout/Pattern/FullLocationPatternConverter.cs index 2a3bedab7..ac5dab668 100644 --- a/src/log4net/Layout/Pattern/FullLocationPatternConverter.cs +++ b/src/log4net/Layout/Pattern/FullLocationPatternConverter.cs @@ -46,7 +46,7 @@ internal sealed class FullLocationPatternConverter : PatternLayoutConverter /// Writes the to the output writer. /// /// - override protected void Convert(TextWriter writer, LoggingEvent loggingEvent) + protected override void Convert(TextWriter writer, LoggingEvent loggingEvent) { writer.Write( loggingEvent.LocationInformation.FullInfo ); } diff --git a/src/log4net/Layout/Pattern/IdentityPatternConverter.cs b/src/log4net/Layout/Pattern/IdentityPatternConverter.cs index fd84299e0..0ef245c09 100644 --- a/src/log4net/Layout/Pattern/IdentityPatternConverter.cs +++ b/src/log4net/Layout/Pattern/IdentityPatternConverter.cs @@ -50,7 +50,7 @@ internal sealed class IdentityPatternConverter : PatternLayoutConverter /// the output . /// /// - override protected void Convert(TextWriter writer, LoggingEvent loggingEvent) + protected override void Convert(TextWriter writer, LoggingEvent loggingEvent) { writer.Write(loggingEvent.Identity); } diff --git a/src/log4net/Layout/Pattern/LevelPatternConverter.cs b/src/log4net/Layout/Pattern/LevelPatternConverter.cs index 35227e061..21af92b1e 100644 --- a/src/log4net/Layout/Pattern/LevelPatternConverter.cs +++ b/src/log4net/Layout/Pattern/LevelPatternConverter.cs @@ -48,7 +48,7 @@ internal sealed class LevelPatternConverter : PatternLayoutConverter /// to the . /// /// - override protected void Convert(TextWriter writer, LoggingEvent loggingEvent) + protected override void Convert(TextWriter writer, LoggingEvent loggingEvent) { writer.Write( loggingEvent.Level.DisplayName ); } diff --git a/src/log4net/Layout/Pattern/LineLocationPatternConverter.cs b/src/log4net/Layout/Pattern/LineLocationPatternConverter.cs index 2e54dfaef..07c91e8a2 100644 --- a/src/log4net/Layout/Pattern/LineLocationPatternConverter.cs +++ b/src/log4net/Layout/Pattern/LineLocationPatternConverter.cs @@ -48,7 +48,7 @@ internal sealed class LineLocationPatternConverter : PatternLayoutConverter /// the to the output . /// /// - override protected void Convert(TextWriter writer, LoggingEvent loggingEvent) + protected override void Convert(TextWriter writer, LoggingEvent loggingEvent) { writer.Write(loggingEvent.LocationInformation.LineNumber); } diff --git a/src/log4net/Layout/Pattern/LoggerPatternConverter.cs b/src/log4net/Layout/Pattern/LoggerPatternConverter.cs index b56f7c9de..471b4aa25 100644 --- a/src/log4net/Layout/Pattern/LoggerPatternConverter.cs +++ b/src/log4net/Layout/Pattern/LoggerPatternConverter.cs @@ -46,7 +46,7 @@ internal sealed class LoggerPatternConverter : NamedPatternConverter /// Returns the of the . /// /// - override protected string GetFullyQualifiedName(LoggingEvent loggingEvent) + protected override string GetFullyQualifiedName(LoggingEvent loggingEvent) { return loggingEvent.LoggerName; } diff --git a/src/log4net/Layout/Pattern/MessagePatternConverter.cs b/src/log4net/Layout/Pattern/MessagePatternConverter.cs index 43d13fe75..cf0f5afc7 100644 --- a/src/log4net/Layout/Pattern/MessagePatternConverter.cs +++ b/src/log4net/Layout/Pattern/MessagePatternConverter.cs @@ -48,7 +48,7 @@ internal sealed class MessagePatternConverter : PatternLayoutConverter /// to write out the event message. /// /// - override protected void Convert(TextWriter writer, LoggingEvent loggingEvent) + protected override void Convert(TextWriter writer, LoggingEvent loggingEvent) { loggingEvent.WriteRenderedMessage(writer); } diff --git a/src/log4net/Layout/Pattern/MethodLocationPatternConverter.cs b/src/log4net/Layout/Pattern/MethodLocationPatternConverter.cs index a0537adfe..90fa7559c 100644 --- a/src/log4net/Layout/Pattern/MethodLocationPatternConverter.cs +++ b/src/log4net/Layout/Pattern/MethodLocationPatternConverter.cs @@ -48,7 +48,7 @@ internal sealed class MethodLocationPatternConverter : PatternLayoutConverter /// the output. /// /// - override protected void Convert(TextWriter writer, LoggingEvent loggingEvent) + protected override void Convert(TextWriter writer, LoggingEvent loggingEvent) { writer.Write(loggingEvent.LocationInformation.MethodName); } diff --git a/src/log4net/Layout/Pattern/NamedPatternConverter.cs b/src/log4net/Layout/Pattern/NamedPatternConverter.cs index 8338706e1..d94a9c810 100644 --- a/src/log4net/Layout/Pattern/NamedPatternConverter.cs +++ b/src/log4net/Layout/Pattern/NamedPatternConverter.cs @@ -109,7 +109,7 @@ public void ActivateOptions() /// Return the fully qualified '.' (dot/period) separated string. /// /// - abstract protected string GetFullyQualifiedName(LoggingEvent loggingEvent); + protected abstract string GetFullyQualifiedName(LoggingEvent loggingEvent); /// /// Convert the pattern to the rendered message @@ -120,7 +120,7 @@ public void ActivateOptions() /// Render the to the precision /// specified by the property. /// - sealed override protected void Convert(TextWriter writer, LoggingEvent loggingEvent) + protected sealed override void Convert(TextWriter writer, LoggingEvent loggingEvent) { string name = GetFullyQualifiedName(loggingEvent); if (m_precision <= 0 || name == null || name.Length < 2) @@ -163,7 +163,7 @@ sealed override protected void Convert(TextWriter writer, LoggingEvent loggingEv /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(NamedPatternConverter); + private static readonly Type declaringType = typeof(NamedPatternConverter); private const string DOT = "."; #endregion Private Static Fields diff --git a/src/log4net/Layout/Pattern/NdcPatternConverter.cs b/src/log4net/Layout/Pattern/NdcPatternConverter.cs index 947fb129e..572168145 100644 --- a/src/log4net/Layout/Pattern/NdcPatternConverter.cs +++ b/src/log4net/Layout/Pattern/NdcPatternConverter.cs @@ -53,7 +53,7 @@ internal sealed class NdcPatternConverter : PatternLayoutConverter /// The should be used instead. /// /// - override protected void Convert(TextWriter writer, LoggingEvent loggingEvent) + protected override void Convert(TextWriter writer, LoggingEvent loggingEvent) { // Write the value for the specified key WriteObject(writer, loggingEvent.Repository, loggingEvent.LookupProperty("NDC")); diff --git a/src/log4net/Layout/Pattern/PatternLayoutConverter.cs b/src/log4net/Layout/Pattern/PatternLayoutConverter.cs index f0ed36f35..b805b395d 100644 --- a/src/log4net/Layout/Pattern/PatternLayoutConverter.cs +++ b/src/log4net/Layout/Pattern/PatternLayoutConverter.cs @@ -69,7 +69,7 @@ protected PatternLayoutConverter() /// value is true, this converter does not handle the exception. /// /// - virtual public bool IgnoresException + public virtual bool IgnoresException { get { return m_ignoresException; } set { m_ignoresException = value; } @@ -85,7 +85,7 @@ virtual public bool IgnoresException /// /// that will receive the formatted result. /// The on which the pattern converter should be executed. - abstract protected void Convert(TextWriter writer, LoggingEvent loggingEvent); + protected abstract void Convert(TextWriter writer, LoggingEvent loggingEvent); #endregion Protected Abstract Methods @@ -97,7 +97,7 @@ virtual public bool IgnoresException /// /// that will receive the formatted result. /// The state object on which the pattern converter should be executed. - override protected void Convert(TextWriter writer, object state) + protected override void Convert(TextWriter writer, object state) { LoggingEvent loggingEvent = state as LoggingEvent; if (loggingEvent != null) diff --git a/src/log4net/Layout/Pattern/PropertyPatternConverter.cs b/src/log4net/Layout/Pattern/PropertyPatternConverter.cs index f2d9e3724..44a096b92 100644 --- a/src/log4net/Layout/Pattern/PropertyPatternConverter.cs +++ b/src/log4net/Layout/Pattern/PropertyPatternConverter.cs @@ -60,7 +60,7 @@ internal sealed class PropertyPatternConverter : PatternLayoutConverter /// then all the properties are written as key value pairs. /// /// - override protected void Convert(TextWriter writer, LoggingEvent loggingEvent) + protected override void Convert(TextWriter writer, LoggingEvent loggingEvent) { if (Option != null) { diff --git a/src/log4net/Layout/Pattern/RelativeTimePatternConverter.cs b/src/log4net/Layout/Pattern/RelativeTimePatternConverter.cs index a5d3495b3..01b9ae2b8 100644 --- a/src/log4net/Layout/Pattern/RelativeTimePatternConverter.cs +++ b/src/log4net/Layout/Pattern/RelativeTimePatternConverter.cs @@ -48,7 +48,7 @@ internal sealed class RelativeTimePatternConverter : PatternLayoutConverter /// and the . /// /// - override protected void Convert(TextWriter writer, LoggingEvent loggingEvent) + protected override void Convert(TextWriter writer, LoggingEvent loggingEvent) { writer.Write( TimeDifferenceInMillis(LoggingEvent.StartTimeUtc, loggingEvent.TimeStampUtc).ToString(System.Globalization.NumberFormatInfo.InvariantInfo) ); } diff --git a/src/log4net/Layout/Pattern/StackTraceDetailPatternConverter.cs b/src/log4net/Layout/Pattern/StackTraceDetailPatternConverter.cs index 47be2dcdd..9e020cb38 100644 --- a/src/log4net/Layout/Pattern/StackTraceDetailPatternConverter.cs +++ b/src/log4net/Layout/Pattern/StackTraceDetailPatternConverter.cs @@ -82,7 +82,7 @@ internal override string GetMethodInformation(MethodItem method) /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(StackTracePatternConverter); + private static readonly Type declaringType = typeof(StackTracePatternConverter); #endregion Private Static Fields } diff --git a/src/log4net/Layout/Pattern/StackTracePatternConverter.cs b/src/log4net/Layout/Pattern/StackTracePatternConverter.cs index de67e63ca..7773868d2 100644 --- a/src/log4net/Layout/Pattern/StackTracePatternConverter.cs +++ b/src/log4net/Layout/Pattern/StackTracePatternConverter.cs @@ -92,7 +92,7 @@ public void ActivateOptions() /// Writes the to the output writer. /// /// - override protected void Convert(TextWriter writer, LoggingEvent loggingEvent) + protected override void Convert(TextWriter writer, LoggingEvent loggingEvent) { StackFrameItem[] stackframes = loggingEvent.LocationInformation.StackFrames; if ((stackframes == null) || (stackframes.Length <= 0)) @@ -141,7 +141,7 @@ internal virtual string GetMethodInformation(MethodItem method) /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(StackTracePatternConverter); + private static readonly Type declaringType = typeof(StackTracePatternConverter); #endregion Private Static Fields } diff --git a/src/log4net/Layout/Pattern/ThreadPatternConverter.cs b/src/log4net/Layout/Pattern/ThreadPatternConverter.cs index c306a3733..122c361e6 100644 --- a/src/log4net/Layout/Pattern/ThreadPatternConverter.cs +++ b/src/log4net/Layout/Pattern/ThreadPatternConverter.cs @@ -46,7 +46,7 @@ internal sealed class ThreadPatternConverter : PatternLayoutConverter /// Writes the to the . /// /// - override protected void Convert(TextWriter writer, LoggingEvent loggingEvent) + protected override void Convert(TextWriter writer, LoggingEvent loggingEvent) { writer.Write(loggingEvent.ThreadName); } diff --git a/src/log4net/Layout/Pattern/TypeNamePatternConverter.cs b/src/log4net/Layout/Pattern/TypeNamePatternConverter.cs index acca1cb34..8b5fce81a 100644 --- a/src/log4net/Layout/Pattern/TypeNamePatternConverter.cs +++ b/src/log4net/Layout/Pattern/TypeNamePatternConverter.cs @@ -46,7 +46,7 @@ internal sealed class TypeNamePatternConverter : NamedPatternConverter /// Returns the of the . /// /// - override protected string GetFullyQualifiedName(LoggingEvent loggingEvent) + protected override string GetFullyQualifiedName(LoggingEvent loggingEvent) { if (loggingEvent == null) { diff --git a/src/log4net/Layout/Pattern/UserNamePatternConverter.cs b/src/log4net/Layout/Pattern/UserNamePatternConverter.cs index 8c0518f52..1f64c0cbd 100644 --- a/src/log4net/Layout/Pattern/UserNamePatternConverter.cs +++ b/src/log4net/Layout/Pattern/UserNamePatternConverter.cs @@ -37,7 +37,7 @@ internal sealed class UserNamePatternConverter : PatternLayoutConverter /// /// that will receive the formatted result. /// the event being logged - override protected void Convert(TextWriter writer, LoggingEvent loggingEvent) + protected override void Convert(TextWriter writer, LoggingEvent loggingEvent) { writer.Write( loggingEvent.UserName ); } diff --git a/src/log4net/Layout/Pattern/UtcDatePatternConverter.cs b/src/log4net/Layout/Pattern/UtcDatePatternConverter.cs index 41caf288b..95227f75d 100644 --- a/src/log4net/Layout/Pattern/UtcDatePatternConverter.cs +++ b/src/log4net/Layout/Pattern/UtcDatePatternConverter.cs @@ -63,7 +63,7 @@ internal class UtcDatePatternConverter : DatePatternConverter /// /// /// - override protected void Convert(TextWriter writer, LoggingEvent loggingEvent) + protected override void Convert(TextWriter writer, LoggingEvent loggingEvent) { try { @@ -84,7 +84,7 @@ override protected void Convert(TextWriter writer, LoggingEvent loggingEvent) /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(UtcDatePatternConverter); + private static readonly Type declaringType = typeof(UtcDatePatternConverter); #endregion Private Static Fields } diff --git a/src/log4net/Layout/PatternLayout.cs b/src/log4net/Layout/PatternLayout.cs index 6e49bfddb..49cad595d 100644 --- a/src/log4net/Layout/PatternLayout.cs +++ b/src/log4net/Layout/PatternLayout.cs @@ -1019,7 +1019,7 @@ public string ConversionPattern /// global and instance rules on the . /// /// - virtual protected PatternParser CreatePatternParser(string pattern) + protected virtual PatternParser CreatePatternParser(string pattern) { PatternParser patternParser = new PatternParser(pattern); @@ -1058,7 +1058,7 @@ virtual protected PatternParser CreatePatternParser(string pattern) /// must be called again. /// /// - override public void ActivateOptions() + public override void ActivateOptions() { m_head = CreatePatternParser(m_pattern).Parse(); @@ -1095,7 +1095,7 @@ override public void ActivateOptions() /// specified in the property. /// /// - override public void Format(TextWriter writer, LoggingEvent loggingEvent) + public override void Format(TextWriter writer, LoggingEvent loggingEvent) { if (writer == null) { diff --git a/src/log4net/Layout/SimpleLayout.cs b/src/log4net/Layout/SimpleLayout.cs index b330ee7a5..5efe0d08d 100644 --- a/src/log4net/Layout/SimpleLayout.cs +++ b/src/log4net/Layout/SimpleLayout.cs @@ -72,7 +72,7 @@ public SimpleLayout() /// must be called again. /// /// - override public void ActivateOptions() + public override void ActivateOptions() { // nothing to do. } @@ -93,7 +93,7 @@ override public void ActivateOptions() /// output is terminated by a newline. /// /// - override public void Format(TextWriter writer, LoggingEvent loggingEvent) + public override void Format(TextWriter writer, LoggingEvent loggingEvent) { if (loggingEvent == null) { diff --git a/src/log4net/Layout/XmlLayout.cs b/src/log4net/Layout/XmlLayout.cs index 61e366edf..66b7dcf8f 100644 --- a/src/log4net/Layout/XmlLayout.cs +++ b/src/log4net/Layout/XmlLayout.cs @@ -184,7 +184,7 @@ public bool Base64EncodeProperties /// Builds a cache of the element names /// /// - override public void ActivateOptions() + public override void ActivateOptions() { base.ActivateOptions(); @@ -215,7 +215,7 @@ override public void ActivateOptions() /// to write the to the . /// /// - override protected void FormatXml(XmlWriter writer, LoggingEvent loggingEvent) + protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent) { writer.WriteStartElement(m_elmEvent); writer.WriteAttributeString(ATTR_LOGGER, loggingEvent.LoggerName); diff --git a/src/log4net/Layout/XmlLayoutBase.cs b/src/log4net/Layout/XmlLayoutBase.cs index c046bc013..2f35f8b75 100644 --- a/src/log4net/Layout/XmlLayoutBase.cs +++ b/src/log4net/Layout/XmlLayoutBase.cs @@ -41,7 +41,7 @@ namespace log4net.Layout /// /// Nicko Cadell /// Gert Driesen - abstract public class XmlLayoutBase : LayoutSkeleton + public abstract class XmlLayoutBase : LayoutSkeleton { #region Protected Instance Constructors @@ -149,7 +149,7 @@ public string InvalidCharReplacement /// must be called again. /// /// - override public void ActivateOptions() + public override void ActivateOptions() { // nothing to do } @@ -169,7 +169,7 @@ override public void ActivateOptions() /// As this is the XML layout, the value is always "text/xml". /// /// - override public string ContentType + public override string ContentType { get { return "text/xml"; } } @@ -190,7 +190,7 @@ override public string ContentType /// method rather than this method. /// /// - override public void Format(TextWriter writer, LoggingEvent loggingEvent) + public override void Format(TextWriter writer, LoggingEvent loggingEvent) { if (loggingEvent == null) { @@ -233,7 +233,7 @@ override public void Format(TextWriter writer, LoggingEvent loggingEvent) /// the as XML. /// /// - abstract protected void FormatXml(XmlWriter writer, LoggingEvent loggingEvent); + protected abstract void FormatXml(XmlWriter writer, LoggingEvent loggingEvent); #endregion Protected Instance Methods diff --git a/src/log4net/Layout/XmlLayoutSchemaLog4j.cs b/src/log4net/Layout/XmlLayoutSchemaLog4j.cs index b47910225..fe66d5974 100644 --- a/src/log4net/Layout/XmlLayoutSchemaLog4j.cs +++ b/src/log4net/Layout/XmlLayoutSchemaLog4j.cs @@ -136,7 +136,7 @@ at org.apache.log4j.chainsaw.Generator.run(Generator.java:94) /// Generate XML that is compatible with the log4j schema. /// /// - override protected void FormatXml(XmlWriter writer, LoggingEvent loggingEvent) + protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent) { // Translate logging events for log4j diff --git a/src/log4net/LogicalThreadContext.cs b/src/log4net/LogicalThreadContext.cs index da99eb1dc..937f952c8 100644 --- a/src/log4net/LogicalThreadContext.cs +++ b/src/log4net/LogicalThreadContext.cs @@ -139,12 +139,12 @@ public static LogicalThreadContextStacks Stacks /// /// The thread context properties instance /// - private readonly static LogicalThreadContextProperties s_properties = new LogicalThreadContextProperties(); + private static readonly LogicalThreadContextProperties s_properties = new LogicalThreadContextProperties(); /// /// The thread context stacks instance /// - private readonly static LogicalThreadContextStacks s_stacks = new LogicalThreadContextStacks(s_properties); + private static readonly LogicalThreadContextStacks s_stacks = new LogicalThreadContextStacks(s_properties); #endregion Private Static Fields } diff --git a/src/log4net/ObjectRenderer/RendererMap.cs b/src/log4net/ObjectRenderer/RendererMap.cs index 666dfda46..c785e27ee 100644 --- a/src/log4net/ObjectRenderer/RendererMap.cs +++ b/src/log4net/ObjectRenderer/RendererMap.cs @@ -45,7 +45,7 @@ namespace log4net.ObjectRenderer /// Gert Driesen public class RendererMap { - private readonly static Type declaringType = typeof(RendererMap); + private static readonly Type declaringType = typeof(RendererMap); #region Member Variables diff --git a/src/log4net/Plugin/RemoteLoggingServerPlugin.cs b/src/log4net/Plugin/RemoteLoggingServerPlugin.cs index 7305ef5db..ff5824bb2 100644 --- a/src/log4net/Plugin/RemoteLoggingServerPlugin.cs +++ b/src/log4net/Plugin/RemoteLoggingServerPlugin.cs @@ -123,7 +123,7 @@ public virtual string SinkUri #if NET_4_0 || MONO_4_0 [System.Security.SecuritySafeCritical] #endif - override public void Attach(ILoggerRepository repository) + public override void Attach(ILoggerRepository repository) { base.Attach(repository); @@ -152,7 +152,7 @@ override public void Attach(ILoggerRepository repository) #if NET_4_0 || MONO_4_0 [System.Security.SecuritySafeCritical] #endif - override public void Shutdown() + public override void Shutdown() { // Stops the sink from receiving messages RemotingServices.Disconnect(m_sink); @@ -179,7 +179,7 @@ override public void Shutdown() /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(RemoteLoggingServerPlugin); + private static readonly Type declaringType = typeof(RemoteLoggingServerPlugin); #endregion Private Static Fields diff --git a/src/log4net/Repository/Hierarchy/Hierarchy.cs b/src/log4net/Repository/Hierarchy/Hierarchy.cs index 0f4138f15..c21d09af4 100644 --- a/src/log4net/Repository/Hierarchy/Hierarchy.cs +++ b/src/log4net/Repository/Hierarchy/Hierarchy.cs @@ -290,7 +290,7 @@ public ILoggerFactory LoggerFactory /// its reference, otherwise returns null. /// /// - override public ILogger Exists(string name) + public override ILogger Exists(string name) { if (name == null) { @@ -314,7 +314,7 @@ override public ILogger Exists(string name) /// enumeration. /// /// - override public ILogger[] GetCurrentLoggers() + public override ILogger[] GetCurrentLoggers() { // The accumulation in loggers is necessary because not all elements in // ht are Logger objects as there might be some ProvisionNodes @@ -352,7 +352,7 @@ override public ILogger[] GetCurrentLoggers() /// /// The name of the logger to retrieve /// The logger object with the name specified - override public ILogger GetLogger(string name) + public override ILogger GetLogger(string name) { if (name == null) { @@ -383,7 +383,7 @@ override public ILogger GetLogger(string name) /// and again to a nested appender. /// /// - override public void Shutdown() + public override void Shutdown() { LogLog.Debug(declaringType, "Shutdown called on Hierarchy ["+this.Name+"]"); @@ -431,7 +431,7 @@ override public void Shutdown() /// block all logging until it is completed. /// /// - override public void ResetConfiguration() + public override void ResetConfiguration() { Root.Level = LevelMap.LookupWithDefault(Level.Debug); Threshold = LevelMap.LookupWithDefault(Level.All); @@ -470,7 +470,7 @@ override public void ResetConfiguration() /// that logger is then responsible for logging the event. /// /// - override public void Log(LoggingEvent logEvent) + public override void Log(LoggingEvent logEvent) { if (logEvent == null) { @@ -494,7 +494,7 @@ override public void Log(LoggingEvent logEvent) /// The list returned is unordered but does not contain duplicates. /// /// - override public Appender.IAppender[] GetAppenders() + public override Appender.IAppender[] GetAppenders() { System.Collections.ArrayList appenderList = new System.Collections.ArrayList(); @@ -1079,7 +1079,7 @@ internal void AddProperty(PropertyEntry propertyEntry) /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(Hierarchy); + private static readonly Type declaringType = typeof(Hierarchy); #endregion Private Static Fields } diff --git a/src/log4net/Repository/Hierarchy/Logger.cs b/src/log4net/Repository/Hierarchy/Logger.cs index c7a081dc7..839e688de 100644 --- a/src/log4net/Repository/Hierarchy/Logger.cs +++ b/src/log4net/Repository/Hierarchy/Logger.cs @@ -96,7 +96,7 @@ protected Logger(string name) /// The hierarchy is parent linked rather than child linked. /// /// - virtual public Logger Parent + public virtual Logger Parent { get { return m_parent; } set { m_parent = value; } @@ -119,7 +119,7 @@ virtual public Logger Parent /// the user manual for more details. /// /// - virtual public bool Additivity + public virtual bool Additivity { get { return m_additive; } set { m_additive = value; } @@ -138,7 +138,7 @@ virtual public bool Additivity /// The Logger class is designed so that this method executes as /// quickly as possible. /// - virtual public Level EffectiveLevel + public virtual Level EffectiveLevel { get { @@ -166,7 +166,7 @@ virtual public Level EffectiveLevel /// This logger must be attached to a single . /// /// - virtual public Hierarchy Hierarchy + public virtual Hierarchy Hierarchy { get { return m_hierarchy; } set { m_hierarchy = value; } @@ -183,7 +183,7 @@ virtual public Hierarchy Hierarchy /// The assigned can be null. /// /// - virtual public Level Level + public virtual Level Level { get { return m_level; } set { m_level = value; } @@ -208,7 +208,7 @@ virtual public Level Level /// appenders, then it won't be added again. /// /// - virtual public void AddAppender(IAppender newAppender) + public virtual void AddAppender(IAppender newAppender) { if (newAppender == null) { @@ -242,7 +242,7 @@ virtual public void AddAppender(IAppender newAppender) /// can be found, then a is returned. /// /// - virtual public AppenderCollection Appenders + public virtual AppenderCollection Appenders { get { @@ -275,7 +275,7 @@ virtual public AppenderCollection Appenders /// Returns the named appender, or null if the appender is not found. /// /// - virtual public IAppender GetAppender(string name) + public virtual IAppender GetAppender(string name) { m_appenderLock.AcquireReaderLock(); try @@ -304,7 +304,7 @@ virtual public IAppender GetAppender(string name) /// This is useful when re-reading configuration information. /// /// - virtual public void RemoveAllAppenders() + public virtual void RemoveAllAppenders() { m_appenderLock.AcquireWriterLock(); try @@ -334,7 +334,7 @@ virtual public void RemoveAllAppenders() /// on the appender removed. /// /// - virtual public IAppender RemoveAppender(IAppender appender) + public virtual IAppender RemoveAppender(IAppender appender) { m_appenderLock.AcquireWriterLock(); try @@ -364,7 +364,7 @@ virtual public IAppender RemoveAppender(IAppender appender) /// on the appender removed. /// /// - virtual public IAppender RemoveAppender(string name) + public virtual IAppender RemoveAppender(string name) { m_appenderLock.AcquireWriterLock(); try @@ -396,7 +396,7 @@ virtual public IAppender RemoveAppender(string name) /// The name of this logger /// /// - virtual public string Name + public virtual string Name { get { return m_name; } } @@ -418,7 +418,7 @@ virtual public string Name /// This method must not throw any exception to the caller. /// /// - virtual public void Log(Type callerStackBoundaryDeclaringType, Level level, object message, Exception exception) + public virtual void Log(Type callerStackBoundaryDeclaringType, Level level, object message, Exception exception) { try { @@ -452,7 +452,7 @@ virtual public void Log(Type callerStackBoundaryDeclaringType, Level level, obje /// This method must not throw any exception to the caller. /// /// - virtual public void Log(LoggingEvent logEvent) + public virtual void Log(LoggingEvent logEvent) { try { @@ -491,7 +491,7 @@ virtual public void Log(LoggingEvent logEvent) /// This method must not throw any exception to the caller. /// /// - virtual public bool IsEnabledFor(Level level) + public virtual bool IsEnabledFor(Level level) { try { @@ -553,7 +553,7 @@ public ILoggerRepository Repository /// to log the particular log request. /// /// - virtual protected void CallAppenders(LoggingEvent loggingEvent) + protected virtual void CallAppenders(LoggingEvent loggingEvent) { if (loggingEvent == null) { @@ -625,7 +625,7 @@ virtual protected void CallAppenders(LoggingEvent loggingEvent) /// Used to ensure that the appenders are correctly shutdown. /// /// - virtual public void CloseNestedAppenders() + public virtual void CloseNestedAppenders() { m_appenderLock.AcquireWriterLock(); try @@ -660,7 +660,7 @@ virtual public void CloseNestedAppenders() /// the . /// /// - virtual public void Log(Level level, object message, Exception exception) + public virtual void Log(Level level, object message, Exception exception) { if (IsEnabledFor(level)) { @@ -682,7 +682,7 @@ virtual public void Log(Level level, object message, Exception exception) /// appenders. /// /// - virtual protected void ForcedLog(Type callerStackBoundaryDeclaringType, Level level, object message, Exception exception) + protected virtual void ForcedLog(Type callerStackBoundaryDeclaringType, Level level, object message, Exception exception) { CallAppenders(new LoggingEvent(callerStackBoundaryDeclaringType, this.Hierarchy, this.Name, level, message, exception)); } @@ -696,7 +696,7 @@ virtual protected void ForcedLog(Type callerStackBoundaryDeclaringType, Level le /// Delivers the logging event to the attached appenders. /// /// - virtual protected void ForcedLog(LoggingEvent logEvent) + protected virtual void ForcedLog(LoggingEvent logEvent) { // The logging event may not have been created by this logger // the Repository may not be correctly set on the event. This @@ -711,7 +711,7 @@ virtual protected void ForcedLog(LoggingEvent logEvent) /// /// The fully qualified type of the Logger class. /// - private readonly static Type declaringType = typeof(Logger); + private static readonly Type declaringType = typeof(Logger); #endregion Private Static Fields diff --git a/src/log4net/Repository/Hierarchy/LoggerKey.cs b/src/log4net/Repository/Hierarchy/LoggerKey.cs index ccc566b1b..14854172f 100644 --- a/src/log4net/Repository/Hierarchy/LoggerKey.cs +++ b/src/log4net/Repository/Hierarchy/LoggerKey.cs @@ -86,7 +86,7 @@ internal LoggerKey(string name) /// Returns the cached hashcode. /// /// - override public int GetHashCode() + public override int GetHashCode() { return m_hashCache; } @@ -104,7 +104,7 @@ override public int GetHashCode() /// Compares the references of the interned strings. /// /// - override public bool Equals(object obj) + public override bool Equals(object obj) { // Compare reference type of this against argument if (((object)this) == obj) diff --git a/src/log4net/Repository/Hierarchy/RootLogger.cs b/src/log4net/Repository/Hierarchy/RootLogger.cs index e178bb718..8184e3f0d 100644 --- a/src/log4net/Repository/Hierarchy/RootLogger.cs +++ b/src/log4net/Repository/Hierarchy/RootLogger.cs @@ -79,7 +79,7 @@ public RootLogger(Level level) : base("root") /// value of . /// /// - override public Level EffectiveLevel + public override Level EffectiveLevel { get { @@ -99,7 +99,7 @@ override public Level EffectiveLevel /// may have catastrophic results. We prevent this here. /// /// - override public Level Level + public override Level Level { get { return base.Level; } set @@ -126,7 +126,7 @@ override public Level Level /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(RootLogger); + private static readonly Type declaringType = typeof(RootLogger); #endregion Private Static Fields } diff --git a/src/log4net/Repository/Hierarchy/XmlHierarchyConfigurator.cs b/src/log4net/Repository/Hierarchy/XmlHierarchyConfigurator.cs index d2e53eeeb..bc2561d5c 100644 --- a/src/log4net/Repository/Hierarchy/XmlHierarchyConfigurator.cs +++ b/src/log4net/Repository/Hierarchy/XmlHierarchyConfigurator.cs @@ -1156,7 +1156,7 @@ private IDictionary CreateCaseInsensitiveWrapper(IDictionary dict) /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(XmlHierarchyConfigurator); + private static readonly Type declaringType = typeof(XmlHierarchyConfigurator); #endregion Private Static Fields } diff --git a/src/log4net/Repository/LoggerRepositorySkeleton.cs b/src/log4net/Repository/LoggerRepositorySkeleton.cs index e4f06f85d..9a2a69c1d 100644 --- a/src/log4net/Repository/LoggerRepositorySkeleton.cs +++ b/src/log4net/Repository/LoggerRepositorySkeleton.cs @@ -114,7 +114,7 @@ protected LoggerRepositorySkeleton(PropertiesDictionary properties) /// stored by the . /// /// - virtual public string Name + public virtual string Name { get { return m_name; } set { m_name = value; } @@ -131,7 +131,7 @@ virtual public string Name /// The threshold for all events in this repository /// /// - virtual public Level Threshold + public virtual Level Threshold { get { return m_threshold; } set @@ -164,7 +164,7 @@ virtual public Level Threshold /// objects. /// /// - virtual public RendererMap RendererMap + public virtual RendererMap RendererMap { get { return m_rendererMap; } } @@ -181,7 +181,7 @@ virtual public RendererMap RendererMap /// that have been attached to this repository. /// /// - virtual public PluginMap PluginMap + public virtual PluginMap PluginMap { get { return m_pluginMap; } } @@ -199,7 +199,7 @@ virtual public PluginMap PluginMap /// this repository. /// /// - virtual public LevelMap LevelMap + public virtual LevelMap LevelMap { get { return m_levelMap; } } @@ -215,7 +215,7 @@ virtual public LevelMap LevelMap /// its reference, otherwise returns null. /// /// - abstract public ILogger Exists(string name); + public abstract ILogger Exists(string name); /// /// Returns all the currently defined loggers in the repository @@ -226,7 +226,7 @@ virtual public LevelMap LevelMap /// Returns all the currently defined loggers in the repository as an Array. /// /// - abstract public ILogger[] GetCurrentLoggers(); + public abstract ILogger[] GetCurrentLoggers(); /// /// Return a new logger instance @@ -243,7 +243,7 @@ virtual public LevelMap LevelMap /// then linked with its existing ancestors as well as children. /// /// - abstract public ILogger GetLogger(string name); + public abstract ILogger GetLogger(string name); /// /// Shutdown the repository @@ -255,7 +255,7 @@ virtual public LevelMap LevelMap /// listeners and all attached plugins of the shutdown event. /// /// - virtual public void Shutdown() + public virtual void Shutdown() { // Shutdown attached plugins foreach(IPlugin plugin in PluginMap.AllPlugins) @@ -283,7 +283,7 @@ virtual public void Shutdown() /// block all logging until it is completed. /// /// - virtual public void ResetConfiguration() + public virtual void ResetConfiguration() { // Clear internal data structures m_rendererMap.Clear(); @@ -315,7 +315,7 @@ virtual public void ResetConfiguration() /// that logger is then responsible for logging the event. /// /// - abstract public void Log(LoggingEvent logEvent); + public abstract void Log(LoggingEvent logEvent); /// /// Flag indicates if this repository has been configured. @@ -328,7 +328,7 @@ virtual public void ResetConfiguration() /// Flag indicates if this repository has been configured. /// /// - virtual public bool Configured + public virtual bool Configured { get { return m_configured; } set { m_configured = value; } @@ -338,7 +338,7 @@ virtual public bool Configured /// Contains a list of internal messages captures during the /// last configuration. /// - virtual public ICollection ConfigurationMessages + public virtual ICollection ConfigurationMessages { get { return m_configurationMessages; } set { m_configurationMessages = value; } @@ -419,7 +419,7 @@ public PropertiesDictionary Properties /// Returns all the Appenders that are configured as an Array. /// /// - abstract public log4net.Appender.IAppender[] GetAppenders(); + public abstract log4net.Appender.IAppender[] GetAppenders(); #endregion @@ -432,7 +432,7 @@ public PropertiesDictionary Properties /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(LoggerRepositorySkeleton); + private static readonly Type declaringType = typeof(LoggerRepositorySkeleton); #endregion Private Static Fields @@ -477,7 +477,7 @@ private void AddBuiltinLevels() /// Adds an object renderer for a specific class. /// /// - virtual public void AddRenderer(Type typeToRender, IObjectRenderer rendererInstance) + public virtual void AddRenderer(Type typeToRender, IObjectRenderer rendererInstance) { if (typeToRender == null) { diff --git a/src/log4net/ThreadContext.cs b/src/log4net/ThreadContext.cs index 9d668f7f6..4da972ca5 100644 --- a/src/log4net/ThreadContext.cs +++ b/src/log4net/ThreadContext.cs @@ -127,12 +127,12 @@ public static ThreadContextStacks Stacks /// /// The thread context properties instance /// - private readonly static ThreadContextProperties s_properties = new ThreadContextProperties(); + private static readonly ThreadContextProperties s_properties = new ThreadContextProperties(); /// /// The thread context stacks instance /// - private readonly static ThreadContextStacks s_stacks = new ThreadContextStacks(s_properties); + private static readonly ThreadContextStacks s_stacks = new ThreadContextStacks(s_properties); #endregion Private Static Fields } diff --git a/src/log4net/Util/AppenderAttachedImpl.cs b/src/log4net/Util/AppenderAttachedImpl.cs index fafb0b8f2..35080487f 100644 --- a/src/log4net/Util/AppenderAttachedImpl.cs +++ b/src/log4net/Util/AppenderAttachedImpl.cs @@ -369,7 +369,7 @@ public IAppender RemoveAppender(string name) /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(AppenderAttachedImpl); + private static readonly Type declaringType = typeof(AppenderAttachedImpl); #endregion Private Static Fields } diff --git a/src/log4net/Util/CountingQuietTextWriter.cs b/src/log4net/Util/CountingQuietTextWriter.cs index aa2947ab8..e0c2925ba 100644 --- a/src/log4net/Util/CountingQuietTextWriter.cs +++ b/src/log4net/Util/CountingQuietTextWriter.cs @@ -126,7 +126,7 @@ public override void Write(char[] buffer, int index, int count) /// the number of bytes written. /// /// - override public void Write(string str) + public override void Write(string str) { if (str != null && str.Length > 0) { diff --git a/src/log4net/Util/EmptyCollection.cs b/src/log4net/Util/EmptyCollection.cs index ad5f1d87f..122258770 100644 --- a/src/log4net/Util/EmptyCollection.cs +++ b/src/log4net/Util/EmptyCollection.cs @@ -171,7 +171,7 @@ public IEnumerator GetEnumerator() /// /// The singleton instance of the empty collection. /// - private readonly static EmptyCollection s_instance = new EmptyCollection(); + private static readonly EmptyCollection s_instance = new EmptyCollection(); #endregion Private Static Fields } diff --git a/src/log4net/Util/EmptyDictionary.cs b/src/log4net/Util/EmptyDictionary.cs index 2c9192da9..792a781c7 100644 --- a/src/log4net/Util/EmptyDictionary.cs +++ b/src/log4net/Util/EmptyDictionary.cs @@ -332,7 +332,7 @@ public object this[object key] /// /// The singleton instance of the empty dictionary. /// - private readonly static EmptyDictionary s_instance = new EmptyDictionary(); + private static readonly EmptyDictionary s_instance = new EmptyDictionary(); #endregion Private Static Fields } diff --git a/src/log4net/Util/GlobalContextProperties.cs b/src/log4net/Util/GlobalContextProperties.cs index b6431077c..0c1999599 100644 --- a/src/log4net/Util/GlobalContextProperties.cs +++ b/src/log4net/Util/GlobalContextProperties.cs @@ -93,7 +93,7 @@ internal GlobalContextProperties() /// the properties is created. /// /// - override public object this[string key] + public override object this[string key] { get { diff --git a/src/log4net/Util/ILogExtensions.cs b/src/log4net/Util/ILogExtensions.cs index 9aa6a612d..fa52c28eb 100644 --- a/src/log4net/Util/ILogExtensions.cs +++ b/src/log4net/Util/ILogExtensions.cs @@ -53,7 +53,7 @@ public static class ILogExtensions /// /// The fully qualified type of the Logger class. /// - private readonly static Type declaringType = typeof(ILogExtensions); + private static readonly Type declaringType = typeof(ILogExtensions); #endregion //Private Static Fields diff --git a/src/log4net/Util/LevelMappingEntry.cs b/src/log4net/Util/LevelMappingEntry.cs index bfed35b93..1a3975bef 100644 --- a/src/log4net/Util/LevelMappingEntry.cs +++ b/src/log4net/Util/LevelMappingEntry.cs @@ -84,7 +84,7 @@ public Level Level /// Should be overridden by any classes that need to initialise based on their options /// /// - virtual public void ActivateOptions() + public virtual void ActivateOptions() { // default implementation is to do nothing } diff --git a/src/log4net/Util/LogicalThreadContextProperties.cs b/src/log4net/Util/LogicalThreadContextProperties.cs index 519efe437..179c22b8d 100644 --- a/src/log4net/Util/LogicalThreadContextProperties.cs +++ b/src/log4net/Util/LogicalThreadContextProperties.cs @@ -99,7 +99,7 @@ internal LogicalThreadContextProperties() /// Get or set the property value for the specified. /// /// - override public object this[string key] + public override object this[string key] { get { @@ -273,7 +273,7 @@ private static void SetLogicalProperties(PropertiesDictionary properties) /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(LogicalThreadContextProperties); + private static readonly Type declaringType = typeof(LogicalThreadContextProperties); #endregion Private Static Fields } diff --git a/src/log4net/Util/LogicalThreadContextStacks.cs b/src/log4net/Util/LogicalThreadContextStacks.cs index 3eccfca27..7d4a22534 100644 --- a/src/log4net/Util/LogicalThreadContextStacks.cs +++ b/src/log4net/Util/LogicalThreadContextStacks.cs @@ -133,7 +133,7 @@ private void registerNew(string stackName, LogicalThreadContextStack stack) /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(LogicalThreadContextStacks); + private static readonly Type declaringType = typeof(LogicalThreadContextStacks); #endregion Private Static Fields } diff --git a/src/log4net/Util/NullDictionaryEnumerator.cs b/src/log4net/Util/NullDictionaryEnumerator.cs index e4564c8a3..48af424e8 100644 --- a/src/log4net/Util/NullDictionaryEnumerator.cs +++ b/src/log4net/Util/NullDictionaryEnumerator.cs @@ -195,7 +195,7 @@ public DictionaryEntry Entry /// /// The singleton instance of the . /// - private readonly static NullDictionaryEnumerator s_instance = new NullDictionaryEnumerator(); + private static readonly NullDictionaryEnumerator s_instance = new NullDictionaryEnumerator(); #endregion Private Static Fields } diff --git a/src/log4net/Util/NullEnumerator.cs b/src/log4net/Util/NullEnumerator.cs index 614d616be..4cb78060f 100644 --- a/src/log4net/Util/NullEnumerator.cs +++ b/src/log4net/Util/NullEnumerator.cs @@ -127,7 +127,7 @@ public void Reset() /// /// The singleton instance of the . /// - private readonly static NullEnumerator s_instance = new NullEnumerator(); + private static readonly NullEnumerator s_instance = new NullEnumerator(); #endregion Private Static Fields } diff --git a/src/log4net/Util/OnlyOnceErrorHandler.cs b/src/log4net/Util/OnlyOnceErrorHandler.cs index 806296298..5f03d9290 100644 --- a/src/log4net/Util/OnlyOnceErrorHandler.cs +++ b/src/log4net/Util/OnlyOnceErrorHandler.cs @@ -276,7 +276,7 @@ public ErrorCode ErrorCode /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(OnlyOnceErrorHandler); + private static readonly Type declaringType = typeof(OnlyOnceErrorHandler); #endregion } diff --git a/src/log4net/Util/OptionConverter.cs b/src/log4net/Util/OptionConverter.cs index c304f18eb..776bcc252 100644 --- a/src/log4net/Util/OptionConverter.cs +++ b/src/log4net/Util/OptionConverter.cs @@ -659,7 +659,7 @@ private static object ParseEnum(System.Type enumType, string value, bool ignoreC /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(OptionConverter); + private static readonly Type declaringType = typeof(OptionConverter); private const string DELIM_START = "${"; private const char DELIM_STOP = '}'; diff --git a/src/log4net/Util/PatternConverter.cs b/src/log4net/Util/PatternConverter.cs index 7b3339576..9f9067b10 100644 --- a/src/log4net/Util/PatternConverter.cs +++ b/src/log4net/Util/PatternConverter.cs @@ -129,7 +129,7 @@ public virtual string Option /// convert conversion specifiers in the appropriate way. /// /// - abstract protected void Convert(TextWriter writer, object state); + protected abstract void Convert(TextWriter writer, object state); #endregion Protected Abstract Methods @@ -165,7 +165,7 @@ public virtual PatternConverter SetNext(PatternConverter patternConverter) /// apply those formattings before writing the output. /// /// - virtual public void Format(TextWriter writer, object state) + public virtual void Format(TextWriter writer, object state) { if (m_min < 0 && m_max == int.MaxValue) { diff --git a/src/log4net/Util/PatternParser.cs b/src/log4net/Util/PatternParser.cs index bfe44526b..7dfbb326b 100644 --- a/src/log4net/Util/PatternParser.cs +++ b/src/log4net/Util/PatternParser.cs @@ -428,7 +428,7 @@ private void AddConverter(PatternConverter pc) /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(PatternParser); + private static readonly Type declaringType = typeof(PatternParser); #endregion Private Static Fields } diff --git a/src/log4net/Util/PatternString.cs b/src/log4net/Util/PatternString.cs index 72d9ba921..c7d924b98 100644 --- a/src/log4net/Util/PatternString.cs +++ b/src/log4net/Util/PatternString.cs @@ -390,7 +390,7 @@ public string ConversionPattern /// must be called again. /// /// - virtual public void ActivateOptions() + public virtual void ActivateOptions() { m_head = CreatePatternParser(m_pattern).Parse(); } diff --git a/src/log4net/Util/PatternStringConverters/AppDomainPatternConverter.cs b/src/log4net/Util/PatternStringConverters/AppDomainPatternConverter.cs index 9b110022b..9a20d652c 100644 --- a/src/log4net/Util/PatternStringConverters/AppDomainPatternConverter.cs +++ b/src/log4net/Util/PatternStringConverters/AppDomainPatternConverter.cs @@ -46,7 +46,7 @@ internal sealed class AppDomainPatternConverter : PatternConverter /// Writes name of the current AppDomain to the output . /// /// - override protected void Convert(TextWriter writer, object state) + protected override void Convert(TextWriter writer, object state) { writer.Write( SystemInfo.ApplicationFriendlyName ); } diff --git a/src/log4net/Util/PatternStringConverters/AppSettingPatternConverter.cs b/src/log4net/Util/PatternStringConverters/AppSettingPatternConverter.cs index dad04c6ed..75d5fb023 100644 --- a/src/log4net/Util/PatternStringConverters/AppSettingPatternConverter.cs +++ b/src/log4net/Util/PatternStringConverters/AppSettingPatternConverter.cs @@ -89,7 +89,7 @@ private static IDictionary AppSettingsDictionary /// then all the properties are written as key value pairs. /// /// - override protected void Convert(TextWriter writer, object state) + protected override void Convert(TextWriter writer, object state) { if (Option != null) diff --git a/src/log4net/Util/PatternStringConverters/DatePatternConverter.cs b/src/log4net/Util/PatternStringConverters/DatePatternConverter.cs index 6def66f29..40ffd779e 100644 --- a/src/log4net/Util/PatternStringConverters/DatePatternConverter.cs +++ b/src/log4net/Util/PatternStringConverters/DatePatternConverter.cs @@ -161,7 +161,7 @@ public void ActivateOptions() /// The date and time passed is in the local time zone. /// /// - override protected void Convert(TextWriter writer, object state) + protected override void Convert(TextWriter writer, object state) { try { @@ -182,7 +182,7 @@ override protected void Convert(TextWriter writer, object state) /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(DatePatternConverter); + private static readonly Type declaringType = typeof(DatePatternConverter); #endregion Private Static Fields } diff --git a/src/log4net/Util/PatternStringConverters/EnvironmentFolderPathPatternConverter.cs b/src/log4net/Util/PatternStringConverters/EnvironmentFolderPathPatternConverter.cs index 93028a02e..bd8d4b59f 100644 --- a/src/log4net/Util/PatternStringConverters/EnvironmentFolderPathPatternConverter.cs +++ b/src/log4net/Util/PatternStringConverters/EnvironmentFolderPathPatternConverter.cs @@ -51,7 +51,7 @@ internal sealed class EnvironmentFolderPathPatternConverter : PatternConverter /// property. /// /// - override protected void Convert(TextWriter writer, object state) + protected override void Convert(TextWriter writer, object state) { try { @@ -89,7 +89,7 @@ override protected void Convert(TextWriter writer, object state) /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(EnvironmentFolderPathPatternConverter); + private static readonly Type declaringType = typeof(EnvironmentFolderPathPatternConverter); #endregion Private Static Fields } diff --git a/src/log4net/Util/PatternStringConverters/EnvironmentPatternConverter.cs b/src/log4net/Util/PatternStringConverters/EnvironmentPatternConverter.cs index 7361f9925..70851298d 100644 --- a/src/log4net/Util/PatternStringConverters/EnvironmentPatternConverter.cs +++ b/src/log4net/Util/PatternStringConverters/EnvironmentPatternConverter.cs @@ -51,7 +51,7 @@ internal sealed class EnvironmentPatternConverter : PatternConverter /// property. /// /// - override protected void Convert(TextWriter writer, object state) + protected override void Convert(TextWriter writer, object state) { try { @@ -102,7 +102,7 @@ override protected void Convert(TextWriter writer, object state) /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(EnvironmentPatternConverter); + private static readonly Type declaringType = typeof(EnvironmentPatternConverter); #endregion Private Static Fields } diff --git a/src/log4net/Util/PatternStringConverters/IdentityPatternConverter.cs b/src/log4net/Util/PatternStringConverters/IdentityPatternConverter.cs index d92a292b2..f3ee86053 100644 --- a/src/log4net/Util/PatternStringConverters/IdentityPatternConverter.cs +++ b/src/log4net/Util/PatternStringConverters/IdentityPatternConverter.cs @@ -46,7 +46,7 @@ internal sealed class IdentityPatternConverter : PatternConverter /// Writes the current thread identity to the output . /// /// - override protected void Convert(TextWriter writer, object state) + protected override void Convert(TextWriter writer, object state) { #if (NETCF || SSCLI || NETSTANDARD1_3) // On compact framework there's no notion of current thread principals @@ -81,7 +81,7 @@ override protected void Convert(TextWriter writer, object state) /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(IdentityPatternConverter); + private static readonly Type declaringType = typeof(IdentityPatternConverter); #endregion Private Static Fields } diff --git a/src/log4net/Util/PatternStringConverters/LiteralPatternConverter.cs b/src/log4net/Util/PatternStringConverters/LiteralPatternConverter.cs index b40925a06..3f3e24208 100644 --- a/src/log4net/Util/PatternStringConverters/LiteralPatternConverter.cs +++ b/src/log4net/Util/PatternStringConverters/LiteralPatternConverter.cs @@ -84,7 +84,7 @@ public override PatternConverter SetNext(PatternConverter pc) /// to the output . /// /// - override public void Format(TextWriter writer, object state) + public override void Format(TextWriter writer, object state) { writer.Write(Option); } @@ -99,7 +99,7 @@ override public void Format(TextWriter writer, object state) /// This method is not used. /// /// - override protected void Convert(TextWriter writer, object state) + protected override void Convert(TextWriter writer, object state) { throw new InvalidOperationException("Should never get here because of the overridden Format method"); } diff --git a/src/log4net/Util/PatternStringConverters/ProcessIdPatternConverter.cs b/src/log4net/Util/PatternStringConverters/ProcessIdPatternConverter.cs index 2dfd0cbc0..fbb796d86 100644 --- a/src/log4net/Util/PatternStringConverters/ProcessIdPatternConverter.cs +++ b/src/log4net/Util/PatternStringConverters/ProcessIdPatternConverter.cs @@ -46,7 +46,7 @@ internal sealed class ProcessIdPatternConverter : PatternConverter #if NET_4_0 || MONO_4_0 || NETSTANDARD [System.Security.SecuritySafeCritical] #endif - override protected void Convert(TextWriter writer, object state) + protected override void Convert(TextWriter writer, object state) { #if (NETCF || SSCLI) // On compact framework there is no System.Diagnostics.Process class @@ -76,7 +76,7 @@ override protected void Convert(TextWriter writer, object state) /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(ProcessIdPatternConverter); + private static readonly Type declaringType = typeof(ProcessIdPatternConverter); #endregion Private Static Fields } diff --git a/src/log4net/Util/PatternStringConverters/PropertyPatternConverter.cs b/src/log4net/Util/PatternStringConverters/PropertyPatternConverter.cs index e78611b09..bf81f2aa5 100644 --- a/src/log4net/Util/PatternStringConverters/PropertyPatternConverter.cs +++ b/src/log4net/Util/PatternStringConverters/PropertyPatternConverter.cs @@ -57,7 +57,7 @@ internal sealed class PropertyPatternConverter : PatternConverter /// then all the properties are written as key value pairs. /// /// - override protected void Convert(TextWriter writer, object state) + protected override void Convert(TextWriter writer, object state) { CompositeProperties compositeProperties = new CompositeProperties(); diff --git a/src/log4net/Util/PatternStringConverters/RandomStringPatternConverter.cs b/src/log4net/Util/PatternStringConverters/RandomStringPatternConverter.cs index dc11de952..015cfd7fc 100644 --- a/src/log4net/Util/PatternStringConverters/RandomStringPatternConverter.cs +++ b/src/log4net/Util/PatternStringConverters/RandomStringPatternConverter.cs @@ -104,7 +104,7 @@ public void ActivateOptions() /// Write a randoim string to the output . /// /// - override protected void Convert(TextWriter writer, object state) + protected override void Convert(TextWriter writer, object state) { try { @@ -149,7 +149,7 @@ override protected void Convert(TextWriter writer, object state) /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(RandomStringPatternConverter); + private static readonly Type declaringType = typeof(RandomStringPatternConverter); #endregion Private Static Fields } diff --git a/src/log4net/Util/PatternStringConverters/UserNamePatternConverter.cs b/src/log4net/Util/PatternStringConverters/UserNamePatternConverter.cs index 68aad1a9a..9cc69fd93 100644 --- a/src/log4net/Util/PatternStringConverters/UserNamePatternConverter.cs +++ b/src/log4net/Util/PatternStringConverters/UserNamePatternConverter.cs @@ -43,7 +43,7 @@ internal sealed class UserNamePatternConverter : PatternConverter /// Write the current threads username to the output . /// /// - override protected void Convert(TextWriter writer, object state) + protected override void Convert(TextWriter writer, object state) { #if (NETCF || SSCLI || NETSTANDARD1_3) // On compact framework there's no notion of current Windows user @@ -78,7 +78,7 @@ override protected void Convert(TextWriter writer, object state) /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(UserNamePatternConverter); + private static readonly Type declaringType = typeof(UserNamePatternConverter); #endregion Private Static Fields } diff --git a/src/log4net/Util/PatternStringConverters/UtcDatePatternConverter.cs b/src/log4net/Util/PatternStringConverters/UtcDatePatternConverter.cs index a2bf590d6..31d5f7f1a 100644 --- a/src/log4net/Util/PatternStringConverters/UtcDatePatternConverter.cs +++ b/src/log4net/Util/PatternStringConverters/UtcDatePatternConverter.cs @@ -58,7 +58,7 @@ internal class UtcDatePatternConverter : DatePatternConverter /// /// /// - override protected void Convert(TextWriter writer, object state) + protected override void Convert(TextWriter writer, object state) { try { @@ -79,7 +79,7 @@ override protected void Convert(TextWriter writer, object state) /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(UtcDatePatternConverter); + private static readonly Type declaringType = typeof(UtcDatePatternConverter); #endregion Private Static Fields } diff --git a/src/log4net/Util/PropertiesDictionary.cs b/src/log4net/Util/PropertiesDictionary.cs index a4dc6c46c..e70fb2039 100644 --- a/src/log4net/Util/PropertiesDictionary.cs +++ b/src/log4net/Util/PropertiesDictionary.cs @@ -108,7 +108,7 @@ private PropertiesDictionary(SerializationInfo info, StreamingContext context) : /// a serialization operation is performed. /// /// - override public object this[string key] + public override object this[string key] { get { return InnerHashtable[key]; } set { InnerHashtable[key] = value; } diff --git a/src/log4net/Util/ProtectCloseTextWriter.cs b/src/log4net/Util/ProtectCloseTextWriter.cs index cd610e2e3..a90f283ff 100644 --- a/src/log4net/Util/ProtectCloseTextWriter.cs +++ b/src/log4net/Util/ProtectCloseTextWriter.cs @@ -83,7 +83,7 @@ public void Attach(TextWriter writer) /// This method does nothing. /// /// - override public void Close() + public override void Close() { // do nothing } diff --git a/src/log4net/Util/QuietTextWriter.cs b/src/log4net/Util/QuietTextWriter.cs index 81629b792..6f3c757bf 100644 --- a/src/log4net/Util/QuietTextWriter.cs +++ b/src/log4net/Util/QuietTextWriter.cs @@ -160,7 +160,7 @@ public override void Write(char[] buffer, int index, int count) /// Writes a string to the output. /// /// - override public void Write(string value) + public override void Write(string value) { try { @@ -180,7 +180,7 @@ override public void Write(string value) /// Closes the underlying output writer. /// /// - override public void Close() + public override void Close() { m_closed = true; base.Close(); diff --git a/src/log4net/Util/SystemInfo.cs b/src/log4net/Util/SystemInfo.cs index 051c1b208..92e2c60cd 100644 --- a/src/log4net/Util/SystemInfo.cs +++ b/src/log4net/Util/SystemInfo.cs @@ -1176,7 +1176,7 @@ private static extern Int32 GetModuleFileName( /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(SystemInfo); + private static readonly Type declaringType = typeof(SystemInfo); /// /// Cache the host name for the current machine diff --git a/src/log4net/Util/SystemStringFormat.cs b/src/log4net/Util/SystemStringFormat.cs index 21860bda7..cd71c03b9 100644 --- a/src/log4net/Util/SystemStringFormat.cs +++ b/src/log4net/Util/SystemStringFormat.cs @@ -230,7 +230,7 @@ private static void RenderObject(Object obj, StringBuilder buffer) /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(SystemStringFormat); + private static readonly Type declaringType = typeof(SystemStringFormat); #endregion Private Static Fields } diff --git a/src/log4net/Util/TextWriterAdapter.cs b/src/log4net/Util/TextWriterAdapter.cs index e098dad6d..851eac487 100644 --- a/src/log4net/Util/TextWriterAdapter.cs +++ b/src/log4net/Util/TextWriterAdapter.cs @@ -100,7 +100,7 @@ protected TextWriter Writer /// The Encoding in which the output is written /// /// - override public Encoding Encoding + public override Encoding Encoding { get { return m_writer.Encoding; } } @@ -116,7 +116,7 @@ override public Encoding Encoding /// Gets an object that controls formatting /// /// - override public IFormatProvider FormatProvider + public override IFormatProvider FormatProvider { get { return m_writer.FormatProvider; } } @@ -132,7 +132,7 @@ override public IFormatProvider FormatProvider /// Gets or sets the line terminator string used by the TextWriter /// /// - override public String NewLine + public override String NewLine { get { return m_writer.NewLine; } set { m_writer.NewLine = value; } @@ -168,7 +168,7 @@ public void Close() /// Dispose this writer /// /// - override protected void Dispose(bool disposing) + protected override void Dispose(bool disposing) { if (disposing) { @@ -185,7 +185,7 @@ override protected void Dispose(bool disposing) /// to the underlying device /// /// - override public void Flush() + public override void Flush() { m_writer.Flush(); } @@ -199,7 +199,7 @@ override public void Flush() /// Writes a character to the wrapped TextWriter /// /// - override public void Write(char value) + public override void Write(char value) { m_writer.Write(value); } @@ -215,7 +215,7 @@ override public void Write(char value) /// Writes a character buffer to the wrapped TextWriter /// /// - override public void Write(char[] buffer, int index, int count) + public override void Write(char[] buffer, int index, int count) { m_writer.Write(buffer, index, count); } @@ -229,7 +229,7 @@ override public void Write(char[] buffer, int index, int count) /// Writes a string to the wrapped TextWriter /// /// - override public void Write(String value) + public override void Write(String value) { m_writer.Write(value); } diff --git a/src/log4net/Util/ThreadContextProperties.cs b/src/log4net/Util/ThreadContextProperties.cs index 170608522..e002c1be5 100644 --- a/src/log4net/Util/ThreadContextProperties.cs +++ b/src/log4net/Util/ThreadContextProperties.cs @@ -82,7 +82,7 @@ internal ThreadContextProperties() /// Gets or sets the value of a property /// /// - override public object this[string key] + public override object this[string key] { get { diff --git a/src/log4net/Util/ThreadContextStacks.cs b/src/log4net/Util/ThreadContextStacks.cs index 3fffb05a5..0e9c19805 100644 --- a/src/log4net/Util/ThreadContextStacks.cs +++ b/src/log4net/Util/ThreadContextStacks.cs @@ -116,7 +116,7 @@ public ThreadContextStack this[string key] /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(ThreadContextStacks); + private static readonly Type declaringType = typeof(ThreadContextStacks); #endregion Private Static Fields } diff --git a/src/log4net/Util/TypeConverters/ConverterRegistry.cs b/src/log4net/Util/TypeConverters/ConverterRegistry.cs index 597ae9fdf..e20bbd528 100644 --- a/src/log4net/Util/TypeConverters/ConverterRegistry.cs +++ b/src/log4net/Util/TypeConverters/ConverterRegistry.cs @@ -292,7 +292,7 @@ private static object CreateConverterInstance(Type converterType) /// Used by the internal logger to record the Type of the /// log message. /// - private readonly static Type declaringType = typeof(ConverterRegistry); + private static readonly Type declaringType = typeof(ConverterRegistry); /// /// Mapping from to type converter. diff --git a/src/log4net/Util/WindowsSecurityContext.cs b/src/log4net/Util/WindowsSecurityContext.cs index de98511e1..6fac8ccb0 100644 --- a/src/log4net/Util/WindowsSecurityContext.cs +++ b/src/log4net/Util/WindowsSecurityContext.cs @@ -327,10 +327,10 @@ private static WindowsIdentity LogonUser(string userName, string domainName, str private static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken); [DllImport("kernel32.dll", CharSet=CharSet.Auto)] - private extern static bool CloseHandle(IntPtr handle); + private static extern bool CloseHandle(IntPtr handle); [DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)] - private extern static bool DuplicateToken(IntPtr ExistingTokenHandle, int SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle); + private static extern bool DuplicateToken(IntPtr ExistingTokenHandle, int SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle); #endregion From 1a1f9fad9133177aae661e74730e1c602dc0e470 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Wed, 30 Sep 2020 08:50:23 +0200 Subject: [PATCH 010/122] :bug: should not fail when platform does not support fetching windows user name --- src/log4net/Core/LoggingEvent.cs | 3040 +++++++++++++++--------------- 1 file changed, 1538 insertions(+), 1502 deletions(-) diff --git a/src/log4net/Core/LoggingEvent.cs b/src/log4net/Core/LoggingEvent.cs index c09937a31..665700ef5 100644 --- a/src/log4net/Core/LoggingEvent.cs +++ b/src/log4net/Core/LoggingEvent.cs @@ -1,4 +1,5 @@ #region Apache License + // // Licensed to the Apache Software Foundation (ASF) under one or more // contributor license agreements. See the NOTICE file distributed with @@ -15,85 +16,87 @@ // See the License for the specific language governing permissions and // limitations under the License. // + #endregion using System; using System.Collections; using System.IO; using System.Runtime.Serialization; +using System.Security; #if !NETCF && !NETSTANDARD1_3 using System.Security.Principal; #endif - using log4net.Util; using log4net.Repository; namespace log4net.Core { - /// - /// Portable data structure used by - /// - /// - /// - /// Portable data structure used by - /// - /// - /// Nicko Cadell - public struct LoggingEventData - { - #region Public Instance Fields - - /// - /// The logger name. - /// - /// - /// - /// The logger name. - /// - /// - public string LoggerName; - - /// - /// Level of logging event. - /// - /// - /// - /// Level of logging event. Level cannot be Serializable - /// because it is a flyweight. Due to its special serialization it - /// cannot be declared final either. - /// - /// - public Level Level; - - /// - /// The application supplied message. - /// - /// - /// - /// The application supplied message of logging event. - /// - /// - public string Message; - - /// - /// The name of thread - /// - /// - /// - /// The name of thread in which this logging event was generated - /// - /// - public string ThreadName; - - /// - /// Gets or sets the local time the event was logged - /// - /// + /// + /// Portable data structure used by + /// + /// + /// + /// Portable data structure used by + /// + /// + /// Nicko Cadell + public struct LoggingEventData + { + #region Public Instance Fields + + /// + /// The logger name. + /// + /// + /// + /// The logger name. + /// + /// + public string LoggerName; + + /// + /// Level of logging event. + /// + /// + /// + /// Level of logging event. Level cannot be Serializable + /// because it is a flyweight. Due to its special serialization it + /// cannot be declared final either. + /// + /// + public Level Level; + + /// + /// The application supplied message. + /// + /// + /// + /// The application supplied message of logging event. + /// + /// + public string Message; + + /// + /// The name of thread + /// + /// + /// + /// The name of thread in which this logging event was generated + /// + /// + public string ThreadName; + + /// + /// Gets or sets the local time the event was logged + /// + /// /// /// Prefer using the setter, since local time can be ambiguous. - /// - /// - [Obsolete("Prefer using TimeStampUtc, since local time can be ambiguous in time zones with daylight savings time.")] + /// + /// + [Obsolete( + "Prefer using TimeStampUtc, since local time can be ambiguous in time zones with daylight savings time.")] public DateTime TimeStamp; /// @@ -109,13 +112,14 @@ public DateTime TimeStampUtc { get { - if (TimeStamp != default(DateTime) && + if (TimeStamp != default(DateTime) && _timeStampUtc == default(DateTime)) { // TimeStamp field has been set explicitly but TimeStampUtc hasn't // => use TimeStamp return TimeStamp.ToUniversalTime(); } + return _timeStampUtc; } set @@ -125,410 +129,422 @@ public DateTime TimeStampUtc TimeStamp = _timeStampUtc.ToLocalTime(); } } + private DateTime _timeStampUtc; #pragma warning restore 618 /// - /// Location information for the caller. - /// - /// - /// - /// Location information for the caller. - /// - /// - public LocationInfo LocationInfo; - - /// - /// String representation of the user - /// - /// - /// - /// String representation of the user's windows name, - /// like DOMAIN\username - /// - /// - public string UserName; - - /// - /// String representation of the identity. - /// - /// - /// - /// String representation of the current thread's principal identity. - /// - /// - public string Identity; - - /// - /// The string representation of the exception - /// - /// - /// - /// The string representation of the exception - /// - /// - public string ExceptionString; - - /// - /// String representation of the AppDomain. - /// - /// - /// - /// String representation of the AppDomain. - /// - /// - public string Domain; - - /// - /// Additional event specific properties - /// - /// - /// - /// A logger or an appender may attach additional - /// properties to specific events. These properties - /// have a string key and an object value. - /// - /// - public PropertiesDictionary Properties; - - #endregion Public Instance Fields - } - - /// - /// Flags passed to the property - /// - /// - /// - /// Flags passed to the property - /// - /// - /// Nicko Cadell - [Flags] public enum FixFlags - { - /// - /// Fix the MDC - /// - [Obsolete("Replaced by composite Properties")] - Mdc = 0x01, - - /// - /// Fix the NDC - /// - Ndc = 0x02, - - /// - /// Fix the rendered message - /// - Message = 0x04, - - /// - /// Fix the thread name - /// - ThreadName = 0x08, - - /// - /// Fix the callers location information - /// - /// - /// CAUTION: Very slow to generate - /// - LocationInfo = 0x10, - - /// - /// Fix the callers windows user name - /// - /// - /// CAUTION: Slow to generate - /// - UserName = 0x20, - - /// - /// Fix the domain friendly name - /// - Domain = 0x40, - - /// - /// Fix the callers principal name - /// - /// - /// CAUTION: May be slow to generate - /// - Identity = 0x80, - - /// - /// Fix the exception text - /// - Exception = 0x100, - - /// - /// Fix the event properties. Active properties must implement in order to be eligible for fixing. - /// - Properties = 0x200, - - /// - /// No fields fixed - /// - None = 0x0, - - /// - /// All fields fixed - /// - All = 0xFFFFFFF, - - /// - /// Partial fields fixed - /// - /// - /// - /// This set of partial fields gives good performance. The following fields are fixed: - /// - /// - /// - /// - /// - /// - /// - /// - /// - Partial = Message | ThreadName | Exception | Domain | Properties, - } - - /// - /// The internal representation of logging events. - /// - /// - /// - /// When an affirmative decision is made to log then a - /// instance is created. This instance - /// is passed around to the different log4net components. - /// - /// - /// This class is of concern to those wishing to extend log4net. - /// - /// - /// Some of the values in instances of - /// are considered volatile, that is the values are correct at the - /// time the event is delivered to appenders, but will not be consistent - /// at any time afterwards. If an event is to be stored and then processed - /// at a later time these volatile values must be fixed by calling - /// . There is a performance penalty - /// for incurred by calling but it - /// is essential to maintaining data consistency. - /// - /// - /// Nicko Cadell - /// Gert Driesen - /// Douglas de la Torre - /// Daniel Cazzulino + /// Location information for the caller. + /// + /// + /// + /// Location information for the caller. + /// + /// + public LocationInfo LocationInfo; + + /// + /// String representation of the user + /// + /// + /// + /// String representation of the user's windows name, + /// like DOMAIN\username + /// + /// + public string UserName; + + /// + /// String representation of the identity. + /// + /// + /// + /// String representation of the current thread's principal identity. + /// + /// + public string Identity; + + /// + /// The string representation of the exception + /// + /// + /// + /// The string representation of the exception + /// + /// + public string ExceptionString; + + /// + /// String representation of the AppDomain. + /// + /// + /// + /// String representation of the AppDomain. + /// + /// + public string Domain; + + /// + /// Additional event specific properties + /// + /// + /// + /// A logger or an appender may attach additional + /// properties to specific events. These properties + /// have a string key and an object value. + /// + /// + public PropertiesDictionary Properties; + + #endregion Public Instance Fields + } + + /// + /// Flags passed to the property + /// + /// + /// + /// Flags passed to the property + /// + /// + /// Nicko Cadell + [Flags] + public enum FixFlags + { + /// + /// Fix the MDC + /// + [Obsolete("Replaced by composite Properties")] + Mdc = 0x01, + + /// + /// Fix the NDC + /// + Ndc = 0x02, + + /// + /// Fix the rendered message + /// + Message = 0x04, + + /// + /// Fix the thread name + /// + ThreadName = 0x08, + + /// + /// Fix the callers location information + /// + /// + /// CAUTION: Very slow to generate + /// + LocationInfo = 0x10, + + /// + /// Fix the callers windows user name + /// + /// + /// CAUTION: Slow to generate + /// + UserName = 0x20, + + /// + /// Fix the domain friendly name + /// + Domain = 0x40, + + /// + /// Fix the callers principal name + /// + /// + /// CAUTION: May be slow to generate + /// + Identity = 0x80, + + /// + /// Fix the exception text + /// + Exception = 0x100, + + /// + /// Fix the event properties. Active properties must implement in order to be eligible for fixing. + /// + Properties = 0x200, + + /// + /// No fields fixed + /// + None = 0x0, + + /// + /// All fields fixed + /// + All = 0xFFFFFFF, + + /// + /// Partial fields fixed + /// + /// + /// + /// This set of partial fields gives good performance. The following fields are fixed: + /// + /// + /// + /// + /// + /// + /// + /// + /// + Partial = Message | ThreadName | Exception | Domain | Properties, + } + + /// + /// The internal representation of logging events. + /// + /// + /// + /// When an affirmative decision is made to log then a + /// instance is created. This instance + /// is passed around to the different log4net components. + /// + /// + /// This class is of concern to those wishing to extend log4net. + /// + /// + /// Some of the values in instances of + /// are considered volatile, that is the values are correct at the + /// time the event is delivered to appenders, but will not be consistent + /// at any time afterwards. If an event is to be stored and then processed + /// at a later time these volatile values must be fixed by calling + /// . There is a performance penalty + /// for incurred by calling but it + /// is essential to maintaining data consistency. + /// + /// + /// Nicko Cadell + /// Gert Driesen + /// Douglas de la Torre + /// Daniel Cazzulino #if !NETCF - [Serializable] + [Serializable] #endif - public class LoggingEvent + public class LoggingEvent #if !NETCF - : ISerializable + : ISerializable #endif - { - private static readonly Type declaringType = typeof(LoggingEvent); - - #region Public Instance Constructors - - /// - /// Initializes a new instance of the class - /// from the supplied parameters. - /// - /// The declaring type of the method that is - /// the stack boundary into the logging system for this call. - /// The repository this event is logged in. - /// The name of the logger of this event. - /// The level of this event. - /// The message of this event. - /// The exception for this event. - /// - /// - /// Except , and , - /// all fields of LoggingEvent are filled when actually needed. Call - /// to cache all data locally - /// to prevent inconsistencies. - /// - /// This method is called by the log4net framework - /// to create a logging event. - /// - /// - public LoggingEvent(Type callerStackBoundaryDeclaringType, log4net.Repository.ILoggerRepository repository, string loggerName, Level level, object message, Exception exception) - { - m_callerStackBoundaryDeclaringType = callerStackBoundaryDeclaringType; - m_message = message; - m_repository = repository; - m_thrownException = exception; - - m_data.LoggerName = loggerName; - m_data.Level = level; - - // Store the event creation time - m_data.TimeStampUtc = DateTime.UtcNow; - } - - /// - /// Initializes a new instance of the class - /// using specific data. - /// - /// The declaring type of the method that is - /// the stack boundary into the logging system for this call. - /// The repository this event is logged in. - /// Data used to initialize the logging event. - /// The fields in the struct that have already been fixed. - /// - /// - /// This constructor is provided to allow a - /// to be created independently of the log4net framework. This can - /// be useful if you require a custom serialization scheme. - /// - /// - /// Use the method to obtain an - /// instance of the class. - /// - /// - /// The parameter should be used to specify which fields in the - /// struct have been preset. Fields not specified in the - /// will be captured from the environment if requested or fixed. - /// - /// - public LoggingEvent(Type callerStackBoundaryDeclaringType, log4net.Repository.ILoggerRepository repository, LoggingEventData data, FixFlags fixedData) - { - m_callerStackBoundaryDeclaringType = callerStackBoundaryDeclaringType; - m_repository = repository; - - m_data = data; - m_fixFlags = fixedData; - } - - /// - /// Initializes a new instance of the class - /// using specific data. - /// - /// The declaring type of the method that is - /// the stack boundary into the logging system for this call. - /// The repository this event is logged in. - /// Data used to initialize the logging event. - /// - /// - /// This constructor is provided to allow a - /// to be created independently of the log4net framework. This can - /// be useful if you require a custom serialization scheme. - /// - /// - /// Use the method to obtain an - /// instance of the class. - /// - /// - /// This constructor sets this objects flags to , - /// this assumes that all the data relating to this event is passed in via the - /// parameter and no other data should be captured from the environment. - /// - /// - public LoggingEvent(Type callerStackBoundaryDeclaringType, log4net.Repository.ILoggerRepository repository, LoggingEventData data) : this(callerStackBoundaryDeclaringType, repository, data, FixFlags.All) - { - } - - /// - /// Initializes a new instance of the class - /// using specific data. - /// - /// Data used to initialize the logging event. - /// - /// - /// This constructor is provided to allow a - /// to be created independently of the log4net framework. This can - /// be useful if you require a custom serialization scheme. - /// - /// - /// Use the method to obtain an - /// instance of the class. - /// - /// - /// This constructor sets this objects flags to , - /// this assumes that all the data relating to this event is passed in via the - /// parameter and no other data should be captured from the environment. - /// - /// - public LoggingEvent(LoggingEventData data) : this(null, null, data) - { - } - - #endregion Public Instance Constructors - - #region Protected Instance Constructors + { + private static readonly Type declaringType = typeof(LoggingEvent); + + #region Public Instance Constructors + + /// + /// Initializes a new instance of the class + /// from the supplied parameters. + /// + /// The declaring type of the method that is + /// the stack boundary into the logging system for this call. + /// The repository this event is logged in. + /// The name of the logger of this event. + /// The level of this event. + /// The message of this event. + /// The exception for this event. + /// + /// + /// Except , and , + /// all fields of LoggingEvent are filled when actually needed. Call + /// to cache all data locally + /// to prevent inconsistencies. + /// + /// This method is called by the log4net framework + /// to create a logging event. + /// + /// + public LoggingEvent(Type callerStackBoundaryDeclaringType, + log4net.Repository.ILoggerRepository repository, + string loggerName, + Level level, + object message, + Exception exception) + { + m_callerStackBoundaryDeclaringType = callerStackBoundaryDeclaringType; + m_message = message; + m_repository = repository; + m_thrownException = exception; + + m_data.LoggerName = loggerName; + m_data.Level = level; + + // Store the event creation time + m_data.TimeStampUtc = DateTime.UtcNow; + } + + /// + /// Initializes a new instance of the class + /// using specific data. + /// + /// The declaring type of the method that is + /// the stack boundary into the logging system for this call. + /// The repository this event is logged in. + /// Data used to initialize the logging event. + /// The fields in the struct that have already been fixed. + /// + /// + /// This constructor is provided to allow a + /// to be created independently of the log4net framework. This can + /// be useful if you require a custom serialization scheme. + /// + /// + /// Use the method to obtain an + /// instance of the class. + /// + /// + /// The parameter should be used to specify which fields in the + /// struct have been preset. Fields not specified in the + /// will be captured from the environment if requested or fixed. + /// + /// + public LoggingEvent(Type callerStackBoundaryDeclaringType, + log4net.Repository.ILoggerRepository repository, + LoggingEventData data, + FixFlags fixedData) + { + m_callerStackBoundaryDeclaringType = callerStackBoundaryDeclaringType; + m_repository = repository; + + m_data = data; + m_fixFlags = fixedData; + } + + /// + /// Initializes a new instance of the class + /// using specific data. + /// + /// The declaring type of the method that is + /// the stack boundary into the logging system for this call. + /// The repository this event is logged in. + /// Data used to initialize the logging event. + /// + /// + /// This constructor is provided to allow a + /// to be created independently of the log4net framework. This can + /// be useful if you require a custom serialization scheme. + /// + /// + /// Use the method to obtain an + /// instance of the class. + /// + /// + /// This constructor sets this objects flags to , + /// this assumes that all the data relating to this event is passed in via the + /// parameter and no other data should be captured from the environment. + /// + /// + public LoggingEvent(Type callerStackBoundaryDeclaringType, + log4net.Repository.ILoggerRepository repository, + LoggingEventData data) : this(callerStackBoundaryDeclaringType, repository, data, FixFlags.All) + { + } + + /// + /// Initializes a new instance of the class + /// using specific data. + /// + /// Data used to initialize the logging event. + /// + /// + /// This constructor is provided to allow a + /// to be created independently of the log4net framework. This can + /// be useful if you require a custom serialization scheme. + /// + /// + /// Use the method to obtain an + /// instance of the class. + /// + /// + /// This constructor sets this objects flags to , + /// this assumes that all the data relating to this event is passed in via the + /// parameter and no other data should be captured from the environment. + /// + /// + public LoggingEvent(LoggingEventData data) : this(null, null, data) + { + } + + #endregion Public Instance Constructors + + #region Protected Instance Constructors #if !NETCF - /// - /// Serialization constructor - /// - /// The that holds the serialized object data. - /// The that contains contextual information about the source or destination. - /// - /// - /// Initializes a new instance of the class - /// with serialized data. - /// - /// - protected LoggingEvent(SerializationInfo info, StreamingContext context) - { - m_data.LoggerName = info.GetString("LoggerName"); - - // Note we are deserializing the whole level object. That is the - // name and the value. This value is correct for the source - // hierarchy but may not be for the target hierarchy that this - // event may be re-logged into. If it is to be re-logged it may - // be necessary to re-lookup the level based only on the name. - m_data.Level = (Level)info.GetValue("Level", typeof(Level)); - - m_data.Message = info.GetString("Message"); - m_data.ThreadName = info.GetString("ThreadName"); - m_data.TimeStampUtc = info.GetDateTime("TimeStamp").ToUniversalTime(); - m_data.LocationInfo = (LocationInfo) info.GetValue("LocationInfo", typeof(LocationInfo)); - m_data.UserName = info.GetString("UserName"); - m_data.ExceptionString = info.GetString("ExceptionString"); - m_data.Properties = (PropertiesDictionary) info.GetValue("Properties", typeof(PropertiesDictionary)); - m_data.Domain = info.GetString("Domain"); - m_data.Identity = info.GetString("Identity"); - - // We have restored all the values of this instance, i.e. all the values are fixed - // Set the fix flags otherwise the data values may be overwritten from the current environment. - m_fixFlags = FixFlags.All; - } + /// + /// Serialization constructor + /// + /// The that holds the serialized object data. + /// The that contains contextual information about the source or destination. + /// + /// + /// Initializes a new instance of the class + /// with serialized data. + /// + /// + protected LoggingEvent(SerializationInfo info, StreamingContext context) + { + m_data.LoggerName = info.GetString("LoggerName"); + + // Note we are deserializing the whole level object. That is the + // name and the value. This value is correct for the source + // hierarchy but may not be for the target hierarchy that this + // event may be re-logged into. If it is to be re-logged it may + // be necessary to re-lookup the level based only on the name. + m_data.Level = (Level) info.GetValue("Level", typeof(Level)); + + m_data.Message = info.GetString("Message"); + m_data.ThreadName = info.GetString("ThreadName"); + m_data.TimeStampUtc = info.GetDateTime("TimeStamp").ToUniversalTime(); + m_data.LocationInfo = (LocationInfo) info.GetValue("LocationInfo", typeof(LocationInfo)); + m_data.UserName = info.GetString("UserName"); + m_data.ExceptionString = info.GetString("ExceptionString"); + m_data.Properties = (PropertiesDictionary) info.GetValue("Properties", typeof(PropertiesDictionary)); + m_data.Domain = info.GetString("Domain"); + m_data.Identity = info.GetString("Identity"); + + // We have restored all the values of this instance, i.e. all the values are fixed + // Set the fix flags otherwise the data values may be overwritten from the current environment. + m_fixFlags = FixFlags.All; + } #endif - #endregion Protected Instance Constructors - - #region Public Instance Properties - - /// - /// Gets the time when the current process started. - /// - /// - /// This is the time when this process started. - /// - /// - /// - /// The TimeStamp is stored internally in UTC and converted to the local time zone for this computer. - /// - /// - /// Tries to get the start time for the current process. - /// Failing that it returns the time of the first call to - /// this property. - /// - /// - /// Note that AppDomains may be loaded and unloaded within the - /// same process without the process terminating and therefore - /// without the process start time being reset. - /// - /// - public static DateTime StartTime - { - get { return SystemInfo.ProcessStartTimeUtc.ToLocalTime(); } - } + #endregion Protected Instance Constructors + + #region Public Instance Properties + + /// + /// Gets the time when the current process started. + /// + /// + /// This is the time when this process started. + /// + /// + /// + /// The TimeStamp is stored internally in UTC and converted to the local time zone for this computer. + /// + /// + /// Tries to get the start time for the current process. + /// Failing that it returns the time of the first call to + /// this property. + /// + /// + /// Note that AppDomains may be loaded and unloaded within the + /// same process without the process terminating and therefore + /// without the process start time being reset. + /// + /// + public static DateTime StartTime + { + get { return SystemInfo.ProcessStartTimeUtc.ToLocalTime(); } + } /// /// Gets the UTC time when the current process started. @@ -551,39 +567,39 @@ public static DateTime StartTime public static DateTime StartTimeUtc { get { return SystemInfo.ProcessStartTimeUtc; } - } - - /// - /// Gets the of the logging event. - /// - /// - /// The of the logging event. - /// - /// - /// - /// Gets the of the logging event. - /// - /// - public Level Level - { - get { return m_data.Level; } - } - - /// - /// Gets the time of the logging event. - /// - /// - /// The time of the logging event. - /// - /// - /// - /// The TimeStamp is stored in UTC and converted to the local time zone for this computer. - /// - /// - public DateTime TimeStamp - { - get { return m_data.TimeStampUtc.ToLocalTime(); } - } + } + + /// + /// Gets the of the logging event. + /// + /// + /// The of the logging event. + /// + /// + /// + /// Gets the of the logging event. + /// + /// + public Level Level + { + get { return m_data.Level; } + } + + /// + /// Gets the time of the logging event. + /// + /// + /// The time of the logging event. + /// + /// + /// + /// The TimeStamp is stored in UTC and converted to the local time zone for this computer. + /// + /// + public DateTime TimeStamp + { + get { return m_data.TimeStampUtc.ToLocalTime(); } + } /// /// Gets UTC the time of the logging event. @@ -594,1029 +610,1049 @@ public DateTime TimeStamp public DateTime TimeStampUtc { get { return m_data.TimeStampUtc; } - } - - /// - /// Gets the name of the logger that logged the event. - /// - /// - /// The name of the logger that logged the event. - /// - /// - /// - /// Gets the name of the logger that logged the event. - /// - /// - public string LoggerName - { - get { return m_data.LoggerName; } - } - - /// - /// Gets the location information for this logging event. - /// - /// - /// The location information for this logging event. - /// - /// - /// - /// The collected information is cached for future use. - /// - /// - /// See the class for more information on - /// supported frameworks and the different behavior in Debug and - /// Release builds. - /// - /// - public LocationInfo LocationInformation - { - get - { - if (m_data.LocationInfo == null && this.m_cacheUpdatable) - { - m_data.LocationInfo = new LocationInfo(m_callerStackBoundaryDeclaringType); - } - return m_data.LocationInfo; - } - } - - /// - /// Gets the message object used to initialize this event. - /// - /// - /// The message object used to initialize this event. - /// - /// - /// - /// Gets the message object used to initialize this event. - /// Note that this event may not have a valid message object. - /// If the event is serialized the message object will not - /// be transferred. To get the text of the message the - /// property must be used - /// not this property. - /// - /// - /// If there is no defined message object for this event then - /// null will be returned. - /// - /// - public object MessageObject - { - get { return m_message; } - } - - /// - /// Gets the exception object used to initialize this event. - /// - /// - /// The exception object used to initialize this event. - /// - /// - /// - /// Gets the exception object used to initialize this event. - /// Note that this event may not have a valid exception object. - /// If the event is serialized the exception object will not - /// be transferred. To get the text of the exception the - /// method must be used - /// not this property. - /// - /// - /// If there is no defined exception object for this event then - /// null will be returned. - /// - /// - public Exception ExceptionObject - { - get { return m_thrownException; } - } - - /// - /// The that this event was created in. - /// - /// - /// - /// The that this event was created in. - /// - /// - public ILoggerRepository Repository - { - get { return m_repository; } - } - - /// - /// Ensure that the repository is set. - /// - /// the value for the repository - internal void EnsureRepository(ILoggerRepository repository) - { - if (repository != null) - { - m_repository = repository; - } - } - - /// - /// Gets the message, rendered through the . - /// - /// - /// The message rendered through the . - /// - /// - /// - /// The collected information is cached for future use. - /// - /// - public string RenderedMessage - { - get - { - if (m_data.Message == null && this.m_cacheUpdatable) - { - if (m_message == null) - { - m_data.Message = ""; - } - else if (m_message is string) - { - m_data.Message = (m_message as string); - } - else if (m_repository != null) - { - m_data.Message = m_repository.RendererMap.FindAndRender(m_message); - } - else - { - // Very last resort - m_data.Message = m_message.ToString(); - } - } - return m_data.Message; - } - } - - /// - /// Write the rendered message to a TextWriter - /// - /// the writer to write the message to - /// - /// - /// Unlike the property this method - /// does store the message data in the internal cache. Therefore - /// if called only once this method should be faster than the - /// property, however if the message is - /// to be accessed multiple times then the property will be more efficient. - /// - /// - public void WriteRenderedMessage(TextWriter writer) - { - if (m_data.Message != null) - { - writer.Write(m_data.Message); - } - else - { - if (m_message != null) - { - if (m_message is string) - { - writer.Write(m_message as string); - } - else if (m_repository != null) - { - m_repository.RendererMap.FindAndRender(m_message, writer); - } - else - { - // Very last resort - writer.Write(m_message.ToString()); - } - } - } - } - - /// - /// Gets the name of the current thread. - /// - /// - /// The name of the current thread, or the thread ID when - /// the name is not available. - /// - /// - /// - /// The collected information is cached for future use. - /// - /// - public string ThreadName - { - get - { - if (m_data.ThreadName == null && this.m_cacheUpdatable) - { -#if NETCF - // Get thread ID only - m_data.ThreadName = SystemInfo.CurrentThreadId.ToString(System.Globalization.NumberFormatInfo.InvariantInfo); -#else - m_data.ThreadName = System.Threading.Thread.CurrentThread.Name; - if (m_data.ThreadName == null || m_data.ThreadName.Length == 0) - { - // The thread name is not available. Therefore we - // go the the AppDomain to get the ID of the - // current thread. (Why don't Threads know their own ID?) - try - { - m_data.ThreadName = SystemInfo.CurrentThreadId.ToString(System.Globalization.NumberFormatInfo.InvariantInfo); - } - catch(System.Security.SecurityException) - { - // This security exception will occur if the caller does not have - // some undefined set of SecurityPermission flags. - LogLog.Debug(declaringType, "Security exception while trying to get current thread ID. Error Ignored. Empty thread name."); - - // As a last resort use the hash code of the Thread object - m_data.ThreadName = System.Threading.Thread.CurrentThread.GetHashCode().ToString(System.Globalization.CultureInfo.InvariantCulture); - } - } -#endif - } - return m_data.ThreadName; - } - } - - /// - /// Gets the name of the current user. - /// - /// - /// The name of the current user, or NOT AVAILABLE when the - /// underlying runtime has no support for retrieving the name of the - /// current user. - /// - /// - /// - /// Calls WindowsIdentity.GetCurrent().Name to get the name of - /// the current windows user. - /// - /// - /// To improve performance, we could cache the string representation of - /// the name, and reuse that as long as the identity stayed constant. - /// Once the identity changed, we would need to re-assign and re-render - /// the string. - /// - /// - /// However, the WindowsIdentity.GetCurrent() call seems to - /// return different objects every time, so the current implementation - /// doesn't do this type of caching. - /// - /// - /// Timing for these operations: - /// - /// - /// - /// Method - /// Results - /// - /// - /// WindowsIdentity.GetCurrent() - /// 10000 loops, 00:00:00.2031250 seconds - /// - /// - /// WindowsIdentity.GetCurrent().Name - /// 10000 loops, 00:00:08.0468750 seconds - /// - /// - /// - /// This means we could speed things up almost 40 times by caching the - /// value of the WindowsIdentity.GetCurrent().Name property, since - /// this takes (8.04-0.20) = 7.84375 seconds. - /// - /// - public string UserName - { - get - { - if (m_data.UserName == null && this.m_cacheUpdatable) - { -#if (NETCF || SSCLI || NETSTANDARD1_3) // NETSTANDARD1_3 TODO requires platform-specific code - // On compact framework there's no notion of current Windows user - m_data.UserName = SystemInfo.NotAvailableText; -#else - try - { - WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent(); - if (windowsIdentity != null && windowsIdentity.Name != null) - { - m_data.UserName = windowsIdentity.Name; - } - else - { - m_data.UserName = ""; - } - } - catch(System.Security.SecurityException) - { - // This security exception will occur if the caller does not have - // some undefined set of SecurityPermission flags. - LogLog.Debug(declaringType, "Security exception while trying to get current windows identity. Error Ignored. Empty user name."); - - m_data.UserName = ""; - } -#endif - } - return m_data.UserName; - } - } - - /// - /// Gets the identity of the current thread principal. - /// - /// - /// The string name of the identity of the current thread principal. - /// - /// - /// - /// Calls System.Threading.Thread.CurrentPrincipal.Identity.Name to get - /// the name of the current thread principal. - /// - /// - public string Identity - { - get - { - if (m_data.Identity == null && this.m_cacheUpdatable) - { -#if (NETCF || SSCLI || NETSTANDARD1_3) - // On compact framework there's no notion of current thread principals - m_data.Identity = SystemInfo.NotAvailableText; -#else - try - { - if (System.Threading.Thread.CurrentPrincipal != null && - System.Threading.Thread.CurrentPrincipal.Identity != null && - System.Threading.Thread.CurrentPrincipal.Identity.Name != null) - { - m_data.Identity = System.Threading.Thread.CurrentPrincipal.Identity.Name; - } - else - { - m_data.Identity = ""; - } - } - catch (ObjectDisposedException) - { - // This exception will occur if System.Threading.Thread.CurrentPrincipal.Identity is not null but - // the getter of the property Name tries to access disposed objects. - // Seen to happen on IIS 7 or greater with windows authentication. - LogLog.Debug(declaringType, "Object disposed exception while trying to get current thread principal. Error Ignored. Empty identity name."); - - m_data.Identity = ""; - } - catch (System.Security.SecurityException) - { - // This security exception will occur if the caller does not have - // some undefined set of SecurityPermission flags. - LogLog.Debug(declaringType, "Security exception while trying to get current thread principal. Error Ignored. Empty identity name."); - - m_data.Identity = ""; - } -#endif - } - return m_data.Identity; - } - } - - /// - /// Gets the AppDomain friendly name. - /// - /// - /// The AppDomain friendly name. - /// - /// - /// - /// Gets the AppDomain friendly name. - /// - /// - public string Domain - { - get - { - if (m_data.Domain == null && this.m_cacheUpdatable) - { - m_data.Domain = SystemInfo.ApplicationFriendlyName; - } - return m_data.Domain; - } - } - - /// - /// Additional event specific properties. - /// - /// - /// Additional event specific properties. - /// - /// - /// - /// A logger or an appender may attach additional - /// properties to specific events. These properties - /// have a string key and an object value. - /// - /// - /// This property is for events that have been added directly to - /// this event. The aggregate properties (which include these - /// event properties) can be retrieved using - /// and . - /// - /// - /// Once the properties have been fixed this property - /// returns the combined cached properties. This ensures that updates to - /// this property are always reflected in the underlying storage. When - /// returning the combined properties there may be more keys in the - /// Dictionary than expected. - /// - /// - public PropertiesDictionary Properties - { - get - { - // If we have cached properties then return that otherwise changes will be lost - if (m_data.Properties != null) - { - return m_data.Properties; - } - - if (m_eventProperties == null) - { - m_eventProperties = new PropertiesDictionary(); - } - return m_eventProperties; - } - } - - /// - /// The fixed fields in this event - /// - /// - /// The set of fields that are fixed in this event - /// - /// - /// - /// Fields will not be fixed if they have previously been fixed. - /// It is not possible to 'unfix' a field. - /// - /// - public FixFlags Fix - { - get { return m_fixFlags; } - set { this.FixVolatileData(value); } - } - - #endregion Public Instance Properties - - #region Implementation of ISerializable - -#if !NETCF + } - /// - /// Serializes this object into the provided. - /// - /// The to populate with data. - /// The destination for this serialization. - /// - /// - /// The data in this event must be fixed before it can be serialized. - /// - /// - /// The method must be called during the - /// method call if this event - /// is to be used outside that method. - /// - /// -#if NET_4_0 || MONO_4_0 || NETSTANDARD - [System.Security.SecurityCritical] -#endif -#if !NETCF && !NETSTANDARD1_3 - [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand, SerializationFormatter = true)] -#endif - public virtual void GetObjectData(SerializationInfo info, StreamingContext context) - { - // The caller must call FixVolatileData before this object - // can be serialized. - - info.AddValue("LoggerName", m_data.LoggerName); - info.AddValue("Level", m_data.Level); - info.AddValue("Message", m_data.Message); - info.AddValue("ThreadName", m_data.ThreadName); - // TODO: consider serializing UTC rather than local time. Not implemented here because it + /// + /// Gets the name of the logger that logged the event. + /// + /// + /// The name of the logger that logged the event. + /// + /// + /// + /// Gets the name of the logger that logged the event. + /// + /// + public string LoggerName + { + get { return m_data.LoggerName; } + } + + /// + /// Gets the location information for this logging event. + /// + /// + /// The location information for this logging event. + /// + /// + /// + /// The collected information is cached for future use. + /// + /// + /// See the class for more information on + /// supported frameworks and the different behavior in Debug and + /// Release builds. + /// + /// + public LocationInfo LocationInformation + { + get + { + if (m_data.LocationInfo == null && this.m_cacheUpdatable) + { + m_data.LocationInfo = new LocationInfo(m_callerStackBoundaryDeclaringType); + } + + return m_data.LocationInfo; + } + } + + /// + /// Gets the message object used to initialize this event. + /// + /// + /// The message object used to initialize this event. + /// + /// + /// + /// Gets the message object used to initialize this event. + /// Note that this event may not have a valid message object. + /// If the event is serialized the message object will not + /// be transferred. To get the text of the message the + /// property must be used + /// not this property. + /// + /// + /// If there is no defined message object for this event then + /// null will be returned. + /// + /// + public object MessageObject + { + get { return m_message; } + } + + /// + /// Gets the exception object used to initialize this event. + /// + /// + /// The exception object used to initialize this event. + /// + /// + /// + /// Gets the exception object used to initialize this event. + /// Note that this event may not have a valid exception object. + /// If the event is serialized the exception object will not + /// be transferred. To get the text of the exception the + /// method must be used + /// not this property. + /// + /// + /// If there is no defined exception object for this event then + /// null will be returned. + /// + /// + public Exception ExceptionObject + { + get { return m_thrownException; } + } + + /// + /// The that this event was created in. + /// + /// + /// + /// The that this event was created in. + /// + /// + public ILoggerRepository Repository + { + get { return m_repository; } + } + + /// + /// Ensure that the repository is set. + /// + /// the value for the repository + internal void EnsureRepository(ILoggerRepository repository) + { + if (repository != null) + { + m_repository = repository; + } + } + + /// + /// Gets the message, rendered through the . + /// + /// + /// The message rendered through the . + /// + /// + /// + /// The collected information is cached for future use. + /// + /// + public string RenderedMessage + { + get + { + if (m_data.Message == null && this.m_cacheUpdatable) + { + if (m_message == null) + { + m_data.Message = ""; + } + else if (m_message is string) + { + m_data.Message = (m_message as string); + } + else if (m_repository != null) + { + m_data.Message = m_repository.RendererMap.FindAndRender(m_message); + } + else + { + // Very last resort + m_data.Message = m_message.ToString(); + } + } + + return m_data.Message; + } + } + + /// + /// Write the rendered message to a TextWriter + /// + /// the writer to write the message to + /// + /// + /// Unlike the property this method + /// does store the message data in the internal cache. Therefore + /// if called only once this method should be faster than the + /// property, however if the message is + /// to be accessed multiple times then the property will be more efficient. + /// + /// + public void WriteRenderedMessage(TextWriter writer) + { + if (m_data.Message != null) + { + writer.Write(m_data.Message); + } + else + { + if (m_message != null) + { + if (m_message is string) + { + writer.Write(m_message as string); + } + else if (m_repository != null) + { + m_repository.RendererMap.FindAndRender(m_message, writer); + } + else + { + // Very last resort + writer.Write(m_message.ToString()); + } + } + } + } + + /// + /// Gets the name of the current thread. + /// + /// + /// The name of the current thread, or the thread ID when + /// the name is not available. + /// + /// + /// + /// The collected information is cached for future use. + /// + /// + public string ThreadName + { + get + { + if (m_data.ThreadName == null && this.m_cacheUpdatable) + { +#if NETCF + // Get thread ID only + m_data.ThreadName = + SystemInfo.CurrentThreadId.ToString(System.Globalization.NumberFormatInfo.InvariantInfo); +#else + m_data.ThreadName = System.Threading.Thread.CurrentThread.Name; + if (m_data.ThreadName == null || m_data.ThreadName.Length == 0) + { + // The thread name is not available. Therefore we + // go the the AppDomain to get the ID of the + // current thread. (Why don't Threads know their own ID?) + try + { + m_data.ThreadName = + SystemInfo.CurrentThreadId.ToString(System.Globalization.NumberFormatInfo + .InvariantInfo); + } + catch (System.Security.SecurityException) + { + // This security exception will occur if the caller does not have + // some undefined set of SecurityPermission flags. + LogLog.Debug(declaringType, + "Security exception while trying to get current thread ID. Error Ignored. Empty thread name."); + + // As a last resort use the hash code of the Thread object + m_data.ThreadName = System.Threading.Thread.CurrentThread.GetHashCode() + .ToString(System.Globalization.CultureInfo.InvariantCulture); + } + } +#endif + } + + return m_data.ThreadName; + } + } + + /// + /// Gets the name of the current user. + /// + /// + /// The name of the current user, or NOT AVAILABLE when the + /// underlying runtime has no support for retrieving the name of the + /// current user. + /// + /// + /// + /// Calls WindowsIdentity.GetCurrent().Name to get the name of + /// the current windows user. + /// + /// + /// To improve performance, we could cache the string representation of + /// the name, and reuse that as long as the identity stayed constant. + /// Once the identity changed, we would need to re-assign and re-render + /// the string. + /// + /// + /// However, the WindowsIdentity.GetCurrent() call seems to + /// return different objects every time, so the current implementation + /// doesn't do this type of caching. + /// + /// + /// Timing for these operations: + /// + /// + /// + /// Method + /// Results + /// + /// + /// WindowsIdentity.GetCurrent() + /// 10000 loops, 00:00:00.2031250 seconds + /// + /// + /// WindowsIdentity.GetCurrent().Name + /// 10000 loops, 00:00:08.0468750 seconds + /// + /// + /// + /// This means we could speed things up almost 40 times by caching the + /// value of the WindowsIdentity.GetCurrent().Name property, since + /// this takes (8.04-0.20) = 7.84375 seconds. + /// + /// + public string UserName => + m_data.UserName ??= TryGetCurrentUserName(); + + private static string TryGetCurrentUserName() + { +#if (NETCF || SSCLI || NETSTANDARD1_3) + // On compact framework there's no notion of current Windows user + return SystemInfo.NotAvailableText; +#else + try + { + var windowsIdentity = WindowsIdentity.GetCurrent(); + return windowsIdentity?.Name ?? ""; + } + catch (PlatformNotSupportedException) + { + // TODO: on a platform which supports it, invoke `whoami` + return SystemInfo.NotAvailableText; + } + catch (SecurityException) + { + // This security exception will occur if the caller does not have + // some undefined set of SecurityPermission flags. + LogLog.Debug( + declaringType, + "Security exception while trying to get current windows identity. Error Ignored. Empty user name." + ); + + return SystemInfo.NotAvailableText; + } +#endif + } + + /// + /// Gets the identity of the current thread principal. + /// + /// + /// The string name of the identity of the current thread principal. + /// + /// + /// + /// Calls System.Threading.Thread.CurrentPrincipal.Identity.Name to get + /// the name of the current thread principal. + /// + /// + public string Identity + { + get + { + if (m_data.Identity == null && this.m_cacheUpdatable) + { +#if (NETCF || SSCLI || NETSTANDARD1_3) + // On compact framework there's no notion of current thread principals + m_data.Identity = SystemInfo.NotAvailableText; +#else + try + { + if (System.Threading.Thread.CurrentPrincipal != null && + System.Threading.Thread.CurrentPrincipal.Identity != null && + System.Threading.Thread.CurrentPrincipal.Identity.Name != null) + { + m_data.Identity = System.Threading.Thread.CurrentPrincipal.Identity.Name; + } + else + { + m_data.Identity = ""; + } + } + catch (ObjectDisposedException) + { + // This exception will occur if System.Threading.Thread.CurrentPrincipal.Identity is not null but + // the getter of the property Name tries to access disposed objects. + // Seen to happen on IIS 7 or greater with windows authentication. + LogLog.Debug(declaringType, + "Object disposed exception while trying to get current thread principal. Error Ignored. Empty identity name."); + + m_data.Identity = ""; + } + catch (System.Security.SecurityException) + { + // This security exception will occur if the caller does not have + // some undefined set of SecurityPermission flags. + LogLog.Debug(declaringType, + "Security exception while trying to get current thread principal. Error Ignored. Empty identity name."); + + m_data.Identity = ""; + } +#endif + } + + return m_data.Identity; + } + } + + /// + /// Gets the AppDomain friendly name. + /// + /// + /// The AppDomain friendly name. + /// + /// + /// + /// Gets the AppDomain friendly name. + /// + /// + public string Domain + { + get + { + if (m_data.Domain == null && this.m_cacheUpdatable) + { + m_data.Domain = SystemInfo.ApplicationFriendlyName; + } + + return m_data.Domain; + } + } + + /// + /// Additional event specific properties. + /// + /// + /// Additional event specific properties. + /// + /// + /// + /// A logger or an appender may attach additional + /// properties to specific events. These properties + /// have a string key and an object value. + /// + /// + /// This property is for events that have been added directly to + /// this event. The aggregate properties (which include these + /// event properties) can be retrieved using + /// and . + /// + /// + /// Once the properties have been fixed this property + /// returns the combined cached properties. This ensures that updates to + /// this property are always reflected in the underlying storage. When + /// returning the combined properties there may be more keys in the + /// Dictionary than expected. + /// + /// + public PropertiesDictionary Properties + { + get + { + // If we have cached properties then return that otherwise changes will be lost + if (m_data.Properties != null) + { + return m_data.Properties; + } + + if (m_eventProperties == null) + { + m_eventProperties = new PropertiesDictionary(); + } + + return m_eventProperties; + } + } + + /// + /// The fixed fields in this event + /// + /// + /// The set of fields that are fixed in this event + /// + /// + /// + /// Fields will not be fixed if they have previously been fixed. + /// It is not possible to 'unfix' a field. + /// + /// + public FixFlags Fix + { + get { return m_fixFlags; } + set { this.FixVolatileData(value); } + } + + #endregion Public Instance Properties + + #region Implementation of ISerializable + +#if !NETCF + + /// + /// Serializes this object into the provided. + /// + /// The to populate with data. + /// The destination for this serialization. + /// + /// + /// The data in this event must be fixed before it can be serialized. + /// + /// + /// The method must be called during the + /// method call if this event + /// is to be used outside that method. + /// + /// +#if NET_4_0 || MONO_4_0 || NETSTANDARD + [System.Security.SecurityCritical] +#endif +#if !NETCF && !NETSTANDARD1_3 + [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand, + SerializationFormatter = true)] +#endif + public virtual void GetObjectData(SerializationInfo info, StreamingContext context) + { + // The caller must call FixVolatileData before this object + // can be serialized. + + info.AddValue("LoggerName", m_data.LoggerName); + info.AddValue("Level", m_data.Level); + info.AddValue("Message", m_data.Message); + info.AddValue("ThreadName", m_data.ThreadName); + // TODO: consider serializing UTC rather than local time. Not implemented here because it // would give an unexpected result if client and server have different versions of this class. // info.AddValue("TimeStamp", m_data.TimeStampUtc); #pragma warning disable 618 - info.AddValue("TimeStamp", m_data.TimeStamp); + info.AddValue("TimeStamp", m_data.TimeStamp); #pragma warning restore 618 info.AddValue("LocationInfo", m_data.LocationInfo); - info.AddValue("UserName", m_data.UserName); - info.AddValue("ExceptionString", m_data.ExceptionString); - info.AddValue("Properties", m_data.Properties); - info.AddValue("Domain", m_data.Domain); - info.AddValue("Identity", m_data.Identity); - } + info.AddValue("UserName", m_data.UserName); + info.AddValue("ExceptionString", m_data.ExceptionString); + info.AddValue("Properties", m_data.Properties); + info.AddValue("Domain", m_data.Domain); + info.AddValue("Identity", m_data.Identity); + } #endif - #endregion Implementation of ISerializable - - #region Public Instance Methods - - /// - /// Gets the portable data for this . - /// - /// The for this event. - /// - /// - /// A new can be constructed using a - /// instance. - /// - /// - /// Does a fix of the data - /// in the logging event before returning the event data. - /// - /// - public LoggingEventData GetLoggingEventData() - { - return GetLoggingEventData(FixFlags.Partial); - } - - /// - /// Gets the portable data for this . - /// - /// The set of data to ensure is fixed in the LoggingEventData - /// The for this event. - /// - /// - /// A new can be constructed using a - /// instance. - /// - /// - public LoggingEventData GetLoggingEventData(FixFlags fixFlags) - { - Fix = fixFlags; - return m_data; - } - - /// - /// Returns this event's exception's rendered using the - /// . - /// - /// - /// This event's exception's rendered using the . - /// - /// - /// - /// Obsolete. Use instead. - /// - /// - [Obsolete("Use GetExceptionString instead")] - public string GetExceptionStrRep() - { - return GetExceptionString(); - } - - /// - /// Returns this event's exception's rendered using the - /// . - /// - /// - /// This event's exception's rendered using the . - /// - /// - /// - /// Returns this event's exception's rendered using the - /// . - /// - /// - public string GetExceptionString() - { - if (m_data.ExceptionString == null && this.m_cacheUpdatable) - { - if (m_thrownException != null) - { - if (m_repository != null) - { - // Render exception using the repositories renderer map - m_data.ExceptionString = m_repository.RendererMap.FindAndRender(m_thrownException); - } - else - { - // Very last resort - m_data.ExceptionString = m_thrownException.ToString(); - } - } - else - { - m_data.ExceptionString = ""; - } - } - return m_data.ExceptionString; - } - - /// - /// Fix instance fields that hold volatile data. - /// - /// - /// - /// Some of the values in instances of - /// are considered volatile, that is the values are correct at the - /// time the event is delivered to appenders, but will not be consistent - /// at any time afterwards. If an event is to be stored and then processed - /// at a later time these volatile values must be fixed by calling - /// . There is a performance penalty - /// incurred by calling but it - /// is essential to maintaining data consistency. - /// - /// - /// Calling is equivalent to - /// calling passing the parameter - /// false. - /// - /// - /// See for more - /// information. - /// - /// - [Obsolete("Use Fix property")] - public void FixVolatileData() - { - Fix = FixFlags.All; - } - - /// - /// Fixes instance fields that hold volatile data. - /// - /// Set to true to not fix data that takes a long time to fix. - /// - /// - /// Some of the values in instances of - /// are considered volatile, that is the values are correct at the - /// time the event is delivered to appenders, but will not be consistent - /// at any time afterwards. If an event is to be stored and then processed - /// at a later time these volatile values must be fixed by calling - /// . There is a performance penalty - /// for incurred by calling but it - /// is essential to maintaining data consistency. - /// - /// - /// The param controls the data that - /// is fixed. Some of the data that can be fixed takes a long time to - /// generate, therefore if you do not require those settings to be fixed - /// they can be ignored by setting the param - /// to true. This setting will ignore the - /// and settings. - /// - /// - /// Set to false to ensure that all - /// settings are fixed. - /// - /// - [Obsolete("Use Fix property")] - public void FixVolatileData(bool fastButLoose) - { - if (fastButLoose) - { - Fix = FixFlags.Partial; - } - else - { - Fix = FixFlags.All; - } - } - - /// - /// Fix the fields specified by the parameter - /// - /// the fields to fix - /// - /// - /// Only fields specified in the will be fixed. - /// Fields will not be fixed if they have previously been fixed. - /// It is not possible to 'unfix' a field. - /// - /// - protected void FixVolatileData(FixFlags flags) - { - object forceCreation = null; - - //Unlock the cache so that new values can be stored - //This may not be ideal if we are no longer in the correct context - //and someone calls fix. - m_cacheUpdatable=true; - - // determine the flags that we are actually fixing - FixFlags updateFlags = (FixFlags)((flags ^ m_fixFlags) & flags); - - if (updateFlags > 0) - { - if ((updateFlags & FixFlags.Message) != 0) - { - // Force the message to be rendered - forceCreation = this.RenderedMessage; - - m_fixFlags |= FixFlags.Message; - } - if ((updateFlags & FixFlags.ThreadName) != 0) - { - // Grab the thread name - forceCreation = this.ThreadName; - - m_fixFlags |= FixFlags.ThreadName; - } - - if ((updateFlags & FixFlags.LocationInfo) != 0) - { - // Force the location information to be loaded - forceCreation = this.LocationInformation; - - m_fixFlags |= FixFlags.LocationInfo; - } - if ((updateFlags & FixFlags.UserName) != 0) - { - // Grab the user name - forceCreation = this.UserName; - - m_fixFlags |= FixFlags.UserName; - } - if ((updateFlags & FixFlags.Domain) != 0) - { - // Grab the domain name - forceCreation = this.Domain; - - m_fixFlags |= FixFlags.Domain; - } - if ((updateFlags & FixFlags.Identity) != 0) - { - // Grab the identity - forceCreation = this.Identity; - - m_fixFlags |= FixFlags.Identity; - } - - if ((updateFlags & FixFlags.Exception) != 0) - { - // Force the exception text to be loaded - forceCreation = GetExceptionString(); - - m_fixFlags |= FixFlags.Exception; - } - - if ((updateFlags & FixFlags.Properties) != 0) - { - CacheProperties(); - - m_fixFlags |= FixFlags.Properties; - } - } - - // avoid warning CS0219 - if (forceCreation != null) - { - } - - //Finaly lock everything we've cached. - m_cacheUpdatable=false; - } - - #endregion Public Instance Methods - - #region Protected Instance Methods - - private void CreateCompositeProperties() - { - CompositeProperties compositeProperties = new CompositeProperties(); - - if (m_eventProperties != null) - { - compositeProperties.Add(m_eventProperties); - } + #endregion Implementation of ISerializable + + #region Public Instance Methods + + /// + /// Gets the portable data for this . + /// + /// The for this event. + /// + /// + /// A new can be constructed using a + /// instance. + /// + /// + /// Does a fix of the data + /// in the logging event before returning the event data. + /// + /// + public LoggingEventData GetLoggingEventData() + { + return GetLoggingEventData(FixFlags.Partial); + } + + /// + /// Gets the portable data for this . + /// + /// The set of data to ensure is fixed in the LoggingEventData + /// The for this event. + /// + /// + /// A new can be constructed using a + /// instance. + /// + /// + public LoggingEventData GetLoggingEventData(FixFlags fixFlags) + { + Fix = fixFlags; + return m_data; + } + + /// + /// Returns this event's exception's rendered using the + /// . + /// + /// + /// This event's exception's rendered using the . + /// + /// + /// + /// Obsolete. Use instead. + /// + /// + [Obsolete("Use GetExceptionString instead")] + public string GetExceptionStrRep() + { + return GetExceptionString(); + } + + /// + /// Returns this event's exception's rendered using the + /// . + /// + /// + /// This event's exception's rendered using the . + /// + /// + /// + /// Returns this event's exception's rendered using the + /// . + /// + /// + public string GetExceptionString() + { + if (m_data.ExceptionString == null && this.m_cacheUpdatable) + { + if (m_thrownException != null) + { + if (m_repository != null) + { + // Render exception using the repositories renderer map + m_data.ExceptionString = m_repository.RendererMap.FindAndRender(m_thrownException); + } + else + { + // Very last resort + m_data.ExceptionString = m_thrownException.ToString(); + } + } + else + { + m_data.ExceptionString = ""; + } + } + + return m_data.ExceptionString; + } + + /// + /// Fix instance fields that hold volatile data. + /// + /// + /// + /// Some of the values in instances of + /// are considered volatile, that is the values are correct at the + /// time the event is delivered to appenders, but will not be consistent + /// at any time afterwards. If an event is to be stored and then processed + /// at a later time these volatile values must be fixed by calling + /// . There is a performance penalty + /// incurred by calling but it + /// is essential to maintaining data consistency. + /// + /// + /// Calling is equivalent to + /// calling passing the parameter + /// false. + /// + /// + /// See for more + /// information. + /// + /// + [Obsolete("Use Fix property")] + public void FixVolatileData() + { + Fix = FixFlags.All; + } + + /// + /// Fixes instance fields that hold volatile data. + /// + /// Set to true to not fix data that takes a long time to fix. + /// + /// + /// Some of the values in instances of + /// are considered volatile, that is the values are correct at the + /// time the event is delivered to appenders, but will not be consistent + /// at any time afterwards. If an event is to be stored and then processed + /// at a later time these volatile values must be fixed by calling + /// . There is a performance penalty + /// for incurred by calling but it + /// is essential to maintaining data consistency. + /// + /// + /// The param controls the data that + /// is fixed. Some of the data that can be fixed takes a long time to + /// generate, therefore if you do not require those settings to be fixed + /// they can be ignored by setting the param + /// to true. This setting will ignore the + /// and settings. + /// + /// + /// Set to false to ensure that all + /// settings are fixed. + /// + /// + [Obsolete("Use Fix property")] + public void FixVolatileData(bool fastButLoose) + { + if (fastButLoose) + { + Fix = FixFlags.Partial; + } + else + { + Fix = FixFlags.All; + } + } + + /// + /// Fix the fields specified by the parameter + /// + /// the fields to fix + /// + /// + /// Only fields specified in the will be fixed. + /// Fields will not be fixed if they have previously been fixed. + /// It is not possible to 'unfix' a field. + /// + /// + protected void FixVolatileData(FixFlags flags) + { + object forceCreation = null; + + //Unlock the cache so that new values can be stored + //This may not be ideal if we are no longer in the correct context + //and someone calls fix. + m_cacheUpdatable = true; + + // determine the flags that we are actually fixing + var updateFlags = (FixFlags) ((flags ^ m_fixFlags) & flags); + + if (updateFlags > 0) + { + if ((updateFlags & FixFlags.Message) != 0) + { + // Force the message to be rendered + forceCreation = this.RenderedMessage; + + m_fixFlags |= FixFlags.Message; + } + + if ((updateFlags & FixFlags.ThreadName) != 0) + { + // Grab the thread name + forceCreation = this.ThreadName; + + m_fixFlags |= FixFlags.ThreadName; + } + + if ((updateFlags & FixFlags.LocationInfo) != 0) + { + // Force the location information to be loaded + forceCreation = this.LocationInformation; + + m_fixFlags |= FixFlags.LocationInfo; + } + + if ((updateFlags & FixFlags.UserName) != 0) + { + // Grab the user name + forceCreation = this.UserName; + + m_fixFlags |= FixFlags.UserName; + } + + if ((updateFlags & FixFlags.Domain) != 0) + { + // Grab the domain name + forceCreation = this.Domain; + + m_fixFlags |= FixFlags.Domain; + } + + if ((updateFlags & FixFlags.Identity) != 0) + { + // Grab the identity + forceCreation = this.Identity; + + m_fixFlags |= FixFlags.Identity; + } + + if ((updateFlags & FixFlags.Exception) != 0) + { + // Force the exception text to be loaded + forceCreation = GetExceptionString(); + + m_fixFlags |= FixFlags.Exception; + } + + if ((updateFlags & FixFlags.Properties) != 0) + { + CacheProperties(); + + m_fixFlags |= FixFlags.Properties; + } + } + + // avoid warning CS0219 + if (forceCreation != null) + { + } + + //Finaly lock everything we've cached. + m_cacheUpdatable = false; + } + + #endregion Public Instance Methods + + #region Protected Instance Methods + + private void CreateCompositeProperties() + { + var compositeProperties = new CompositeProperties(); + + if (m_eventProperties != null) + { + compositeProperties.Add(m_eventProperties); + } #if !NETCF - PropertiesDictionary logicalThreadProperties = LogicalThreadContext.Properties.GetProperties(false); - if (logicalThreadProperties != null) - { - compositeProperties.Add(logicalThreadProperties); - } + var logicalThreadProperties = LogicalThreadContext.Properties.GetProperties(false); + if (logicalThreadProperties != null) + { + compositeProperties.Add(logicalThreadProperties); + } #endif - PropertiesDictionary threadProperties = ThreadContext.Properties.GetProperties(false); - if (threadProperties != null) - { - compositeProperties.Add(threadProperties); - } - - // TODO: Add Repository Properties - - // event properties - PropertiesDictionary eventProperties = new PropertiesDictionary(); - eventProperties[UserNameProperty] = UserName; - eventProperties[IdentityProperty] = Identity; - compositeProperties.Add(eventProperties); - - compositeProperties.Add(GlobalContext.Properties.GetReadOnlyProperties()); - m_compositeProperties = compositeProperties; - } - - private void CacheProperties() - { - if (m_data.Properties == null && this.m_cacheUpdatable) - { - if (m_compositeProperties == null) - { - CreateCompositeProperties(); - } - - PropertiesDictionary flattenedProperties = m_compositeProperties.Flatten(); - - PropertiesDictionary fixedProperties = new PropertiesDictionary(); - - // Validate properties - foreach(DictionaryEntry entry in flattenedProperties) - { - string key = entry.Key as string; - - if (key != null) - { - object val = entry.Value; - - // Fix any IFixingRequired objects - IFixingRequired fixingRequired = val as IFixingRequired; - if (fixingRequired != null) - { - val = fixingRequired.GetFixedObject(); - } - - // Strip keys with null values - if (val != null) - { - fixedProperties[key] = val; - } - } - } - - m_data.Properties = fixedProperties; - } - } - - /// - /// Lookup a composite property in this event - /// - /// the key for the property to lookup - /// the value for the property - /// - /// - /// This event has composite properties that combine together properties from - /// several different contexts in the following order: - /// - /// - /// this events properties - /// - /// This event has that can be set. These - /// properties are specific to this event only. - /// - /// - /// - /// the thread properties - /// - /// The that are set on the current - /// thread. These properties are shared by all events logged on this thread. - /// - /// - /// - /// the global properties - /// - /// The that are set globally. These - /// properties are shared by all the threads in the AppDomain. - /// - /// - /// - /// - /// - public object LookupProperty(string key) - { - if (m_data.Properties != null) - { - return m_data.Properties[key]; - } - if (m_compositeProperties == null) - { - CreateCompositeProperties(); - } - return m_compositeProperties[key]; - } - - /// - /// Get all the composite properties in this event - /// - /// the containing all the properties - /// - /// - /// See for details of the composite properties - /// stored by the event. - /// - /// - /// This method returns a single containing all the - /// properties defined for this event. - /// - /// - public PropertiesDictionary GetProperties() - { - if (m_data.Properties != null) - { - return m_data.Properties; - } - if (m_compositeProperties == null) - { - CreateCompositeProperties(); - } - return m_compositeProperties.Flatten(); - } - - #endregion Public Instance Methods - - #region Private Instance Fields - - /// - /// The internal logging event data. - /// - private LoggingEventData m_data; - - /// - /// The internal logging event data. - /// - private CompositeProperties m_compositeProperties; - - /// - /// The internal logging event data. - /// - private PropertiesDictionary m_eventProperties; - - /// - /// The fully qualified Type of the calling - /// logger class in the stack frame (i.e. the declaring type of the method). - /// - private readonly Type m_callerStackBoundaryDeclaringType; - - /// - /// The application supplied message of logging event. - /// - private readonly object m_message; - - /// - /// The exception that was thrown. - /// - /// - /// This is not serialized. The string representation - /// is serialized instead. - /// - private readonly Exception m_thrownException; - - /// - /// The repository that generated the logging event - /// - /// - /// This is not serialized. - /// - private ILoggerRepository m_repository = null; - - /// - /// The fix state for this event - /// - /// - /// These flags indicate which fields have been fixed. - /// Not serialized. - /// - private FixFlags m_fixFlags = FixFlags.None; - - /// - /// Indicated that the internal cache is updateable (ie not fixed) - /// - /// - /// This is a seperate flag to m_fixFlags as it allows incrementel fixing and simpler - /// changes in the caching strategy. - /// - private bool m_cacheUpdatable = true; - - #endregion Private Instance Fields - - #region Constants - - /// - /// The key into the Properties map for the host name value. - /// - public const string HostNameProperty = "log4net:HostName"; - - /// - /// The key into the Properties map for the thread identity value. - /// - public const string IdentityProperty = "log4net:Identity"; - - /// - /// The key into the Properties map for the user name value. - /// - public const string UserNameProperty = "log4net:UserName"; - - #endregion - } -} + var threadProperties = ThreadContext.Properties.GetProperties(false); + if (threadProperties != null) + { + compositeProperties.Add(threadProperties); + } + + // TODO: Add Repository Properties + + // event properties + var eventProperties = new PropertiesDictionary(); + eventProperties[UserNameProperty] = UserName; + eventProperties[IdentityProperty] = Identity; + compositeProperties.Add(eventProperties); + + compositeProperties.Add(GlobalContext.Properties.GetReadOnlyProperties()); + m_compositeProperties = compositeProperties; + } + + private void CacheProperties() + { + if (m_data.Properties == null && this.m_cacheUpdatable) + { + if (m_compositeProperties == null) + { + CreateCompositeProperties(); + } + + var flattenedProperties = m_compositeProperties.Flatten(); + + var fixedProperties = new PropertiesDictionary(); + + // Validate properties + foreach (DictionaryEntry entry in flattenedProperties) + { + var key = entry.Key as string; + + if (key != null) + { + var val = entry.Value; + + // Fix any IFixingRequired objects + var fixingRequired = val as IFixingRequired; + if (fixingRequired != null) + { + val = fixingRequired.GetFixedObject(); + } + + // Strip keys with null values + if (val != null) + { + fixedProperties[key] = val; + } + } + } + + m_data.Properties = fixedProperties; + } + } + + /// + /// Lookup a composite property in this event + /// + /// the key for the property to lookup + /// the value for the property + /// + /// + /// This event has composite properties that combine together properties from + /// several different contexts in the following order: + /// + /// + /// this events properties + /// + /// This event has that can be set. These + /// properties are specific to this event only. + /// + /// + /// + /// the thread properties + /// + /// The that are set on the current + /// thread. These properties are shared by all events logged on this thread. + /// + /// + /// + /// the global properties + /// + /// The that are set globally. These + /// properties are shared by all the threads in the AppDomain. + /// + /// + /// + /// + /// + public object LookupProperty(string key) + { + if (m_data.Properties != null) + { + return m_data.Properties[key]; + } + + if (m_compositeProperties == null) + { + CreateCompositeProperties(); + } + + return m_compositeProperties[key]; + } + + /// + /// Get all the composite properties in this event + /// + /// the containing all the properties + /// + /// + /// See for details of the composite properties + /// stored by the event. + /// + /// + /// This method returns a single containing all the + /// properties defined for this event. + /// + /// + public PropertiesDictionary GetProperties() + { + if (m_data.Properties != null) + { + return m_data.Properties; + } + + if (m_compositeProperties == null) + { + CreateCompositeProperties(); + } + + return m_compositeProperties.Flatten(); + } + + #endregion Public Instance Methods + + #region Private Instance Fields + + /// + /// The internal logging event data. + /// + private LoggingEventData m_data; + + /// + /// The internal logging event data. + /// + private CompositeProperties m_compositeProperties; + + /// + /// The internal logging event data. + /// + private PropertiesDictionary m_eventProperties; + + /// + /// The fully qualified Type of the calling + /// logger class in the stack frame (i.e. the declaring type of the method). + /// + private readonly Type m_callerStackBoundaryDeclaringType; + + /// + /// The application supplied message of logging event. + /// + private readonly object m_message; + + /// + /// The exception that was thrown. + /// + /// + /// This is not serialized. The string representation + /// is serialized instead. + /// + private readonly Exception m_thrownException; + + /// + /// The repository that generated the logging event + /// + /// + /// This is not serialized. + /// + private ILoggerRepository m_repository = null; + + /// + /// The fix state for this event + /// + /// + /// These flags indicate which fields have been fixed. + /// Not serialized. + /// + private FixFlags m_fixFlags = FixFlags.None; + + /// + /// Indicated that the internal cache is updateable (ie not fixed) + /// + /// + /// This is a seperate flag to m_fixFlags as it allows incrementel fixing and simpler + /// changes in the caching strategy. + /// + private bool m_cacheUpdatable = true; + + #endregion Private Instance Fields + + #region Constants + + /// + /// The key into the Properties map for the host name value. + /// + public const string HostNameProperty = "log4net:HostName"; + + /// + /// The key into the Properties map for the thread identity value. + /// + public const string IdentityProperty = "log4net:Identity"; + + /// + /// The key into the Properties map for the user name value. + /// + public const string UserNameProperty = "log4net:UserName"; + + #endregion + } +} \ No newline at end of file From fa0cd5b7005edde6e6e1932c9d5c3b7955dbd27f Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Wed, 30 Sep 2020 08:50:43 +0200 Subject: [PATCH 011/122] :construction: let's get this building a subset x-platform so we can test x-platform --- package.json | 1 + src/Directory.Build.props | 5 +++++ src/MonoForFramework.targets | 28 ++++++++++++++++++++++++++ src/log4net.Tests/log4net.Tests.csproj | 6 ++++++ src/log4net.sln | 5 +++++ src/log4net/log4net.csproj | 16 +++++++++++++-- 6 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 src/Directory.Build.props create mode 100644 src/MonoForFramework.targets diff --git a/package.json b/package.json index 09ab351c6..2a41426be 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "description": "Log4Net is a logging framework for .NET", "scripts": { "test": "cross-env NUNIT_PROCESS=Single MAX_CONCURRENCY=1 run-s clean-build \"zarro test-dotnet\" run-dotnet-core-tests", + "test-xplatform": "cross-env DOTNET_CORE=1 BUILD_CONFIGURATION=CrossPlatform run-s build run-dotnet-core-tests", "run-dotnet-core-tests": "cross-env DOTNET_CORE=1 run-s \"zarro quick-test-dotnet\"", "clean-build": "rimraf build", "build": "run-s clean-build \"zarro build\"", diff --git a/src/Directory.Build.props b/src/Directory.Build.props new file mode 100644 index 000000000..41fa9c90a --- /dev/null +++ b/src/Directory.Build.props @@ -0,0 +1,5 @@ + + + true + + diff --git a/src/MonoForFramework.targets b/src/MonoForFramework.targets new file mode 100644 index 000000000..4209d58f0 --- /dev/null +++ b/src/MonoForFramework.targets @@ -0,0 +1,28 @@ + + + + + + /Library/Frameworks/Mono.framework/Versions/Current/lib/mono + /usr/lib/mono + /usr/local/lib/mono + + $(BaseFrameworkPathOverrideForMono)/2.0-api + $(BaseFrameworkPathOverrideForMono)/3.5-api + $(BaseFrameworkPathOverrideForMono)/4.0-api + $(BaseFrameworkPathOverrideForMono)/4.5-api + $(BaseFrameworkPathOverrideForMono)/4.5.1-api + $(BaseFrameworkPathOverrideForMono)/4.5.2-api + $(BaseFrameworkPathOverrideForMono)/4.6-api + $(BaseFrameworkPathOverrideForMono)/4.6.1-api + $(BaseFrameworkPathOverrideForMono)/4.6.2-api + $(BaseFrameworkPathOverrideForMono)/4.7-api + $(BaseFrameworkPathOverrideForMono)/4.7.1-api + $(BaseFrameworkPathOverrideForMono)/4.7.2-api + $(BaseFrameworkPathOverrideForMono)/4.8-api + true + + $(FrameworkPathOverride)/Facades;$(AssemblySearchPaths) + + + diff --git a/src/log4net.Tests/log4net.Tests.csproj b/src/log4net.Tests/log4net.Tests.csproj index 6af4bf905..a15acca10 100644 --- a/src/log4net.Tests/log4net.Tests.csproj +++ b/src/log4net.Tests/log4net.Tests.csproj @@ -27,6 +27,8 @@ true ..\..\log4net.snk bin\$(Configuration) + Debug;Release;CrossPlatform + AnyCPU 285212672 @@ -60,6 +62,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/src/log4net.sln b/src/log4net.sln index e6e792800..c08c55c2d 100644 --- a/src/log4net.sln +++ b/src/log4net.sln @@ -28,16 +28,21 @@ Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU + CrossPlatform|Any CPU = CrossPlatform|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {181FE707-E161-4722-9F38-6AAAB6FAA106}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {181FE707-E161-4722-9F38-6AAAB6FAA106}.Debug|Any CPU.Build.0 = Debug|Any CPU {181FE707-E161-4722-9F38-6AAAB6FAA106}.Release|Any CPU.ActiveCfg = Release|Any CPU {181FE707-E161-4722-9F38-6AAAB6FAA106}.Release|Any CPU.Build.0 = Release|Any CPU + {181FE707-E161-4722-9F38-6AAAB6FAA106}.CrossPlatform|Any CPU.ActiveCfg = CrossPlatform|Any CPU + {181FE707-E161-4722-9F38-6AAAB6FAA106}.CrossPlatform|Any CPU.Build.0 = CrossPlatform|Any CPU {B0530F10-0238-49A9-93B0-8EF412E90BCF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B0530F10-0238-49A9-93B0-8EF412E90BCF}.Debug|Any CPU.Build.0 = Debug|Any CPU {B0530F10-0238-49A9-93B0-8EF412E90BCF}.Release|Any CPU.ActiveCfg = Release|Any CPU {B0530F10-0238-49A9-93B0-8EF412E90BCF}.Release|Any CPU.Build.0 = Release|Any CPU + {B0530F10-0238-49A9-93B0-8EF412E90BCF}.CrossPlatform|Any CPU.ActiveCfg = CrossPlatform|Any CPU + {B0530F10-0238-49A9-93B0-8EF412E90BCF}.CrossPlatform|Any CPU.Build.0 = CrossPlatform|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/log4net/log4net.csproj b/src/log4net/log4net.csproj index 5b8999169..65a98283a 100644 --- a/src/log4net/log4net.csproj +++ b/src/log4net/log4net.csproj @@ -21,10 +21,16 @@ git https://github.com/apache/logging-log4net false + AnyCPU - + net20;net35;net35-client;net40;net40-client;net45;netstandard1.3;netstandard2.0 - Debug;Release + + + net20;net35;net40;net45;netstandard1.3;netstandard2.0 + + + Debug;Release;CrossPlatform latest log4net log4net @@ -184,5 +190,11 @@ package-icon.png + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + From 31c577e0077c29cc7ddeb540d03cfa09bf02b7c5 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Sat, 12 Sep 2020 18:18:27 +0200 Subject: [PATCH 012/122] :ambulance: retroactively fix up site source doap file --- src/site/resources/doap_log4net.rdf | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/site/resources/doap_log4net.rdf b/src/site/resources/doap_log4net.rdf index 7f38fdf6d..acdb96952 100644 --- a/src/site/resources/doap_log4net.rdf +++ b/src/site/resources/doap_log4net.rdf @@ -110,5 +110,19 @@ 2.0.8 + + + Apache log4net 2.0.9 + 2019-08-25 + 2.0.9 + + + + + Apache log4net 2.0.10 + 2019-09.12 + 2.0.10 + + From 9e3b1d182a53d8ff6e9f043416dd36119c73d0d2 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Wed, 30 Sep 2020 19:20:37 +0200 Subject: [PATCH 013/122] :memo: add documentation about building with docker --- BUILDING.md | 1 + 1 file changed, 1 insertion(+) diff --git a/BUILDING.md b/BUILDING.md index f8de5e2cf..2330e8cfb 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -32,6 +32,7 @@ Options: - `npm run build` - optionally `npm test` to run all tests - optionally `npm run release` to generate release artifacts +- build via docker for windows, using the `build-with-docker-for-windows.bat` script - build via the vs2019 Windows AppVeyer image. There is an appveyer.yml file included which (should) build if you set up AppVeyer to track your fork. AppVeyer is free for open-source projects. From 141b00bbf32f8e054d804fc5e61657ebef7464b3 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Wed, 30 Sep 2020 19:41:22 +0200 Subject: [PATCH 014/122] :tada: build-xplatform works; now to get tests running... --- package.json | 3 ++- src/log4net.Tests/log4net.Tests.csproj | 3 ++- src/log4net/log4net.csproj | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 2a41426be..0997123df 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,8 @@ "description": "Log4Net is a logging framework for .NET", "scripts": { "test": "cross-env NUNIT_PROCESS=Single MAX_CONCURRENCY=1 run-s clean-build \"zarro test-dotnet\" run-dotnet-core-tests", - "test-xplatform": "cross-env DOTNET_CORE=1 BUILD_CONFIGURATION=CrossPlatform run-s build run-dotnet-core-tests", + "test-xplatform": "run-s build-xplatform run-dotnet-core-tests", + "build-xplatform": "cross-env DOTNET_CORE=1 BUILD_CONFIGURATION=CrossPlatform run-s build", "run-dotnet-core-tests": "cross-env DOTNET_CORE=1 run-s \"zarro quick-test-dotnet\"", "clean-build": "rimraf build", "build": "run-s clean-build \"zarro build\"", diff --git a/src/log4net.Tests/log4net.Tests.csproj b/src/log4net.Tests/log4net.Tests.csproj index a15acca10..7da2aaf42 100644 --- a/src/log4net.Tests/log4net.Tests.csproj +++ b/src/log4net.Tests/log4net.Tests.csproj @@ -88,4 +88,5 @@ - \ No newline at end of file + + diff --git a/src/log4net/log4net.csproj b/src/log4net/log4net.csproj index 65a98283a..0063fce52 100644 --- a/src/log4net/log4net.csproj +++ b/src/log4net/log4net.csproj @@ -27,7 +27,7 @@ net20;net35;net35-client;net40;net40-client;net45;netstandard1.3;netstandard2.0 - net20;net35;net40;net45;netstandard1.3;netstandard2.0 + net40;net45;netstandard1.3;netstandard2.0 Debug;Release;CrossPlatform @@ -197,4 +197,5 @@ + From e137855bdca5ed1a361c361846381607a5568d60 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Sun, 18 Oct 2020 17:19:10 +0200 Subject: [PATCH 015/122] :bug: should fall back on Environment.UserName if !win32 --- src/log4net/Core/LoggingEvent.cs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/log4net/Core/LoggingEvent.cs b/src/log4net/Core/LoggingEvent.cs index 665700ef5..02eed28e9 100644 --- a/src/log4net/Core/LoggingEvent.cs +++ b/src/log4net/Core/LoggingEvent.cs @@ -914,7 +914,7 @@ public string ThreadName /// /// public string UserName => - m_data.UserName ??= TryGetCurrentUserName(); + m_data.UserName ??= TryGetCurrentUserName() ?? SystemInfo.NotAvailableText; private static string TryGetCurrentUserName() { @@ -929,8 +929,7 @@ private static string TryGetCurrentUserName() } catch (PlatformNotSupportedException) { - // TODO: on a platform which supports it, invoke `whoami` - return SystemInfo.NotAvailableText; + return Environment.UserName; } catch (SecurityException) { @@ -940,12 +939,15 @@ private static string TryGetCurrentUserName() declaringType, "Security exception while trying to get current windows identity. Error Ignored. Empty user name." ); - - return SystemInfo.NotAvailableText; + return null; + } + catch + { + return null; } #endif } - + /// /// Gets the identity of the current thread principal. /// From bf81ef2a3746585efa30582fe784a513c678e91a Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Sun, 18 Oct 2020 17:21:12 +0200 Subject: [PATCH 016/122] :bookmark: update versioning to 2.0.12.0 --- src/log4net/AssemblyInfo.cs | 46 +++++++++++++++--------------- src/log4net/AssemblyVersionInfo.cs | 4 +-- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/src/log4net/AssemblyInfo.cs b/src/log4net/AssemblyInfo.cs index 5264ed2a1..9539a78e7 100644 --- a/src/log4net/AssemblyInfo.cs +++ b/src/log4net/AssemblyInfo.cs @@ -54,77 +54,77 @@ // #if (CLI_1_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-.CLI 1.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-.CLI 1.0")] [assembly: AssemblyTitle("Apache log4net for CLI 1.0 Compatible Frameworks")] #elif (NET_1_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-.NET 1.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-.NET 1.0")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 1.0")] #elif (NET_1_1) -[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-.NET 1.1")] +[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-.NET 1.1")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 1.1")] #elif (NET_4_5) -[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-.NET 4.5")] +[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-.NET 4.5")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 4.5")] #elif (NET_4_0) #if CLIENT_PROFILE -[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-.NET 4.0 CP")] +[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-.NET 4.0 CP")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 4.0 Client Profile")] #else -[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-.NET 4.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-.NET 4.0")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 4.0")] #endif // Client Profile #elif (NET_3_5) #if CLIENT_PROFILE -[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-.NET 3.5 CP")] +[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-.NET 3.5 CP")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 3.5 Client Profile")] #else -[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-.NET 3.5")] +[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-.NET 3.5")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 3.5")] #endif // Client Profile #elif (NET_2_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-.NET 2.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-.NET 2.0")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 2.0")] #elif (NETCF_1_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-.NETCF 1.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-.NETCF 1.0")] [assembly: AssemblyTitle("Apache log4net for .NET Compact Framework 1.0")] #elif (NETCF_2_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-.NETCF 2.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-.NETCF 2.0")] [assembly: AssemblyTitle("Apache log4net for .NET Compact Framework 2.0")] #elif (MONO_1_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-Mono 1.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-Mono 1.0")] [assembly: AssemblyTitle("Apache log4net for Mono 1.0")] #elif (MONO_2_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-Mono 2.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-Mono 2.0")] [assembly: AssemblyTitle("Apache log4net for Mono 2.0")] #elif (MONO_3_5) -[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-Mono 3.5")] +[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-Mono 3.5")] [assembly: AssemblyTitle("Apache log4net for Mono 3.5")] #elif (MONO_4_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-Mono 4.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-Mono 4.0")] [assembly: AssemblyTitle("Apache log4net for Mono 4.0")] #elif (SSCLI_1_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-SSCLI 1.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-SSCLI 1.0")] [assembly: AssemblyTitle("Apache log4net for Shared Source CLI 1.0")] #elif (NET) -[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-.NET")] +[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-.NET")] [assembly: AssemblyTitle("Apache log4net for .NET Framework")] #elif (NETSTANDARD1_3) -[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-.NET Standard 1.3")] +[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-.NET Standard 1.3")] [assembly: AssemblyTitle("Apache log4net for .NET Standard 1.3")] #elif (NETSTANDARD2_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-.NET Standard 2.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-.NET Standard 2.0")] [assembly: AssemblyTitle("Apache log4net for .NET Standard 2.0")] #elif (NETCF) -[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-.NETCF")] +[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-.NETCF")] [assembly: AssemblyTitle("Apache log4net for .NET Compact Framework")] #elif (MONO) -[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-Mono")] +[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-Mono")] [assembly: AssemblyTitle("Apache log4net for Mono")] #elif (SSCLI) -[assembly: AssemblyInformationalVersionAttribute("2.0.11.0-SSCLI")] +[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-SSCLI")] [assembly: AssemblyTitle("Apache log4net for Shared Source CLI")] #else -[assembly: AssemblyInformationalVersionAttribute("2.0.11.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.12.0")] [assembly: AssemblyTitle("Apache log4net")] #endif diff --git a/src/log4net/AssemblyVersionInfo.cs b/src/log4net/AssemblyVersionInfo.cs index 0b62aa9cf..1bde4670e 100644 --- a/src/log4net/AssemblyVersionInfo.cs +++ b/src/log4net/AssemblyVersionInfo.cs @@ -28,11 +28,11 @@ // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: System.Reflection.AssemblyVersion("2.0.11.0")] +[assembly: System.Reflection.AssemblyVersion("2.0.12.0")] #if !NETCF #if !SSCLI -[assembly: System.Reflection.AssemblyFileVersion("2.0.11.0")] +[assembly: System.Reflection.AssemblyFileVersion("2.0.12.0")] #endif #endif From 47aaf46d5f031ea29d781bac4617bd1bb9446215 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Sun, 18 Oct 2020 17:23:48 +0200 Subject: [PATCH 017/122] :bookmark: bump version to 2.0.12, fixes LOG4NET-(652|653) --- package.json | 2 +- src/log4net/Core/LoggingEvent.cs | 4 ++-- src/log4net/log4net.csproj | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 0997123df..26b60ccda 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "log4net", - "version": "2.0.9", + "version": "2.0.12", "description": "Log4Net is a logging framework for .NET", "scripts": { "test": "cross-env NUNIT_PROCESS=Single MAX_CONCURRENCY=1 run-s clean-build \"zarro test-dotnet\" run-dotnet-core-tests", diff --git a/src/log4net/Core/LoggingEvent.cs b/src/log4net/Core/LoggingEvent.cs index 02eed28e9..878fbf7f7 100644 --- a/src/log4net/Core/LoggingEvent.cs +++ b/src/log4net/Core/LoggingEvent.cs @@ -937,9 +937,9 @@ private static string TryGetCurrentUserName() // some undefined set of SecurityPermission flags. LogLog.Debug( declaringType, - "Security exception while trying to get current windows identity. Error Ignored. Empty user name." + "Security exception while trying to get current windows identity. Error Ignored." ); - return null; + return Environment.UserName; } catch { diff --git a/src/log4net/log4net.csproj b/src/log4net/log4net.csproj index 0063fce52..263ed6505 100644 --- a/src/log4net/log4net.csproj +++ b/src/log4net/log4net.csproj @@ -1,7 +1,7 @@  log4net - 2.0.11 + 2.0.12 Codestin Search App Apache log4net From c306c28539e7b05c06d122b4cbea2c4dd385cf8d Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Sun, 18 Oct 2020 17:45:34 +0200 Subject: [PATCH 018/122] :memo: update docs for site --- src/site/xdoc/download_log4net.xml | 20 ++++++++++---------- src/site/xdoc/release/release-notes.xml | 18 +++++++++++++++++- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/site/xdoc/download_log4net.xml b/src/site/xdoc/download_log4net.xml index 71c6679f2..a669bda90 100644 --- a/src/site/xdoc/download_log4net.xml +++ b/src/site/xdoc/download_log4net.xml @@ -36,14 +36,14 @@ limitations under the License. -
+
- - - + + +
apache-log4net-source-2.0.11.zipsha512pgpapache-log4net-source-2.0.12.zipsha512pgp
@@ -52,14 +52,14 @@ limitations under the License.

Binaries are available in a zip file or nupkg, which is also available from nuget.org

- - - + + + - - - + + +
log4net-binaries-2.0.11.zipsha512pgplog4net-binaries-2.0.12.zipsha512pgp
log4net-2.0.11.nupkgsha512pgplog4net-2.0.12.nupkgsha512pgp
diff --git a/src/site/xdoc/release/release-notes.xml b/src/site/xdoc/release/release-notes.xml index fac995aee..87b199f5c 100644 --- a/src/site/xdoc/release/release-notes.xml +++ b/src/site/xdoc/release/release-notes.xml @@ -27,8 +27,24 @@ limitations under the License.
+
+

+ Apache log4net 2.0.12 is a minor fix release to address reported issues on + non-windows platforms. +

+
+
    +
  • Addresses the issues reported in LOG4NET-652 and LOG4NET-653 whereby + logging could throw a PlatformNotSupported exception when the username + is required within logs on non-Windows platforms. The implemented + behavior is to fall back, where possible, on Environment.UserName + or provide text that the facility is not supported. +
  • +
+
+
- Apachhe log4net 2.0.11 fixes incorrect version strings within the released + Apache log4net 2.0.11 fixes incorrect version strings within the released binaries and contains some minor fixes to correctly dispose of StreamWriters used during log flushing, thanks to community member @NicholasNoise
From ea3535a7fa31181a6d7bd74786ba03d9ac8ec7f8 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Sun, 18 Oct 2020 17:53:48 +0200 Subject: [PATCH 019/122] :memo: update references to jira issues to be links --- src/site/xdoc/release/release-notes.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/site/xdoc/release/release-notes.xml b/src/site/xdoc/release/release-notes.xml index 87b199f5c..f6e28e4de 100644 --- a/src/site/xdoc/release/release-notes.xml +++ b/src/site/xdoc/release/release-notes.xml @@ -34,7 +34,9 @@ limitations under the License.

    -
  • Addresses the issues reported in LOG4NET-652 and LOG4NET-653 whereby +
  • Addresses the issues reported in + [LOG4NET-652] + and [LOG4NET-653] whereby logging could throw a PlatformNotSupported exception when the username is required within logs on non-Windows platforms. The implemented behavior is to fall back, where possible, on Environment.UserName From dbad144815221ffe4ed85efa73134583253dc75b Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Mon, 19 Oct 2020 08:45:12 +0200 Subject: [PATCH 020/122] :arrow_up: upgrade gulp-zip so that generated zip artifacts are properly unzippable on !win32 --- package-lock.json | 21 +++++++++++---------- package.json | 2 +- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5368c2fd6..e02ddb9ee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "log4net", - "version": "2.0.9", + "version": "2.0.12", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -2623,9 +2623,9 @@ } }, "gulp-zip": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/gulp-zip/-/gulp-zip-5.0.1.tgz", - "integrity": "sha512-M/IWLh9RvOpuofDZkgDirtiyz9J3yIqnDOJ3muzk2D/XnZ1ruqPlPLRIpXnl/aZU+xXwKPdOIxjRzkUcVEQyZQ==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/gulp-zip/-/gulp-zip-5.0.2.tgz", + "integrity": "sha512-rZd0Ppuc8Bf7J2/WzcdNaeb+lcEXf1R8mV/PJ9Kdu7PmnInWVeLSmiXIka/2QSe6uhAsGVFAMffWSaMzAPGTBg==", "dev": true, "requires": { "get-stream": "^5.1.0", @@ -2636,9 +2636,9 @@ }, "dependencies": { "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "requires": { "pump": "^3.0.0" @@ -5488,11 +5488,12 @@ "dev": true }, "through2": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", - "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", "dev": true, "requires": { + "inherits": "^2.0.4", "readable-stream": "2 || 3" } }, diff --git a/package.json b/package.json index 26b60ccda..b535be677 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "homepage": "https://github.com/fluffynuts/logging-log4net#readme", "devDependencies": { "cross-env": "^7.0.2", - "gulp-zip": "^5.0.1", + "gulp-zip": "^5.0.2", "npm-run-all": "^4.1.5", "rimraf": "^3.0.2", "simple-git": "^2.20.1", From 634ffca956045cc25a8f072ca0fd05c49228a70a Mon Sep 17 00:00:00 2001 From: Tsar Nikolay Date: Mon, 7 Dec 2020 19:28:08 +0500 Subject: [PATCH 021/122] Fix AdoNetAppender using npgsql --- src/log4net/Appender/AdoNetAppender.cs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/log4net/Appender/AdoNetAppender.cs b/src/log4net/Appender/AdoNetAppender.cs index dd9939ba9..2f6edfbb0 100644 --- a/src/log4net/Appender/AdoNetAppender.cs +++ b/src/log4net/Appender/AdoNetAppender.cs @@ -553,8 +553,17 @@ protected virtual void SendBuffer(IDbTransaction dbTran, LoggingEvent[] events) { dbCmd.Transaction = dbTran; } - // prepare the command, which is significantly faster - dbCmd.Prepare(); + + try + { + // prepare the command, which is significantly faster + dbCmd.Prepare(); + } + catch (Exception) + { + // ignore prepare exceptions as they can happen without affecting actual logging, eg on npgsql + } + // run for all events foreach (LoggingEvent e in events) { From fb7096905b93b83590bac3e88bc0e806af94a093 Mon Sep 17 00:00:00 2001 From: David Schwartz Date: Wed, 18 Aug 2021 17:44:33 +0300 Subject: [PATCH 022/122] Update AssemblyInfo to allow net472 web projects use the netstandard2.0 library --- src/log4net/AssemblyInfo.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/log4net/AssemblyInfo.cs b/src/log4net/AssemblyInfo.cs index 9539a78e7..21b94e5bf 100644 --- a/src/log4net/AssemblyInfo.cs +++ b/src/log4net/AssemblyInfo.cs @@ -39,14 +39,13 @@ [assembly: System.Security.AllowPartiallyTrustedCallers] #endif -#if (NET_4_0) +#if (NET_4_0 || NETSTANDARD2_0) // // Allows partial trust applications (e.g. ASP.NET shared hosting) on .NET 4.0 to work // given our implementation of ISerializable. // [assembly: System.Security.SecurityRules(System.Security.SecurityRuleSet.Level1)] #endif - // // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information From 318448ef199412cb8f4ce6873b1b8e0eb67be490 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Mon, 25 Oct 2021 15:19:30 +0200 Subject: [PATCH 023/122] :zap: don't attempt to read WindowsIdentity after PlatformNotSupportedException is caught --- src/log4net/Core/LoggingEvent.cs | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/log4net/Core/LoggingEvent.cs b/src/log4net/Core/LoggingEvent.cs index 878fbf7f7..72d0c3c82 100644 --- a/src/log4net/Core/LoggingEvent.cs +++ b/src/log4net/Core/LoggingEvent.cs @@ -497,15 +497,15 @@ protected LoggingEvent(SerializationInfo info, StreamingContext context) // hierarchy but may not be for the target hierarchy that this // event may be re-logged into. If it is to be re-logged it may // be necessary to re-lookup the level based only on the name. - m_data.Level = (Level) info.GetValue("Level", typeof(Level)); + m_data.Level = (Level)info.GetValue("Level", typeof(Level)); m_data.Message = info.GetString("Message"); m_data.ThreadName = info.GetString("ThreadName"); m_data.TimeStampUtc = info.GetDateTime("TimeStamp").ToUniversalTime(); - m_data.LocationInfo = (LocationInfo) info.GetValue("LocationInfo", typeof(LocationInfo)); + m_data.LocationInfo = (LocationInfo)info.GetValue("LocationInfo", typeof(LocationInfo)); m_data.UserName = info.GetString("UserName"); m_data.ExceptionString = info.GetString("ExceptionString"); - m_data.Properties = (PropertiesDictionary) info.GetValue("Properties", typeof(PropertiesDictionary)); + m_data.Properties = (PropertiesDictionary)info.GetValue("Properties", typeof(PropertiesDictionary)); m_data.Domain = info.GetString("Domain"); m_data.Identity = info.GetString("Identity"); @@ -914,7 +914,7 @@ public string ThreadName /// /// public string UserName => - m_data.UserName ??= TryGetCurrentUserName() ?? SystemInfo.NotAvailableText; + m_data.UserName ??= TryGetCurrentUserName() ?? SystemInfo.NotAvailableText; private static string TryGetCurrentUserName() { @@ -922,6 +922,13 @@ private static string TryGetCurrentUserName() // On compact framework there's no notion of current Windows user return SystemInfo.NotAvailableText; #else + if (_platformDoesNotSupportWindowsIdentity) + { + // we've already received one PlatformNotSupportedException + // and it's highly unlikely that will change + return Environment.UserName; + } + try { var windowsIdentity = WindowsIdentity.GetCurrent(); @@ -929,6 +936,7 @@ private static string TryGetCurrentUserName() } catch (PlatformNotSupportedException) { + _platformDoesNotSupportWindowsIdentity = true; return Environment.UserName; } catch (SecurityException) @@ -947,7 +955,9 @@ private static string TryGetCurrentUserName() } #endif } - + + private static bool _platformDoesNotSupportWindowsIdentity; + /// /// Gets the identity of the current thread principal. /// @@ -1338,7 +1348,7 @@ protected void FixVolatileData(FixFlags flags) m_cacheUpdatable = true; // determine the flags that we are actually fixing - var updateFlags = (FixFlags) ((flags ^ m_fixFlags) & flags); + var updateFlags = (FixFlags)((flags ^ m_fixFlags) & flags); if (updateFlags > 0) { From 63dd5cb9eb2408e21c45ffb91180500e307999be Mon Sep 17 00:00:00 2001 From: Dariel Marlow Date: Mon, 16 Apr 2018 12:45:04 -0700 Subject: [PATCH 024/122] Update XmlLayoutSchemaLog4j.cs Use prefix and ns to play nice with XmlWriter --- src/log4net/Layout/XmlLayoutSchemaLog4j.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/log4net/Layout/XmlLayoutSchemaLog4j.cs b/src/log4net/Layout/XmlLayoutSchemaLog4j.cs index fe66d5974..19dde79db 100644 --- a/src/log4net/Layout/XmlLayoutSchemaLog4j.cs +++ b/src/log4net/Layout/XmlLayoutSchemaLog4j.cs @@ -172,7 +172,7 @@ protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent) } // Write the start element - writer.WriteStartElement("log4j:event"); + writer.WriteStartElement("log4j", "event", "log4net"); writer.WriteAttributeString("logger", loggingEvent.LoggerName); // Calculate the timestamp as the number of milliseconds since january 1970 @@ -187,7 +187,7 @@ protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent) writer.WriteAttributeString("thread", loggingEvent.ThreadName); // Append the message text - writer.WriteStartElement("log4j:message"); + writer.WriteStartElement("log4j", "message", "log4net"); Transform.WriteEscapedXmlString(writer, loggingEvent.RenderedMessage,this.InvalidCharReplacement); writer.WriteEndElement(); @@ -199,7 +199,7 @@ protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent) if (valueStr != null && valueStr.Length > 0) { // Append the NDC text - writer.WriteStartElement("log4j:NDC"); + writer.WriteStartElement("log4j", "NDC", "log4net"); Transform.WriteEscapedXmlString(writer, valueStr,this.InvalidCharReplacement); writer.WriteEndElement(); } @@ -209,10 +209,10 @@ protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent) PropertiesDictionary properties = loggingEvent.GetProperties(); if (properties.Count > 0) { - writer.WriteStartElement("log4j:properties"); + writer.WriteStartElement("log4j", "properties", "log4net"); foreach(System.Collections.DictionaryEntry entry in properties) { - writer.WriteStartElement("log4j:data"); + writer.WriteStartElement("log4j", "data", "log4net"); writer.WriteAttributeString("name", (string)entry.Key); // Use an ObjectRenderer to convert the object to a string @@ -228,7 +228,7 @@ protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent) if (exceptionStr != null && exceptionStr.Length > 0) { // Append the stack trace line - writer.WriteStartElement("log4j:throwable"); + writer.WriteStartElement("log4j", "throwable", "log4net"); Transform.WriteEscapedXmlString(writer, exceptionStr,this.InvalidCharReplacement); writer.WriteEndElement(); } @@ -237,7 +237,7 @@ protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent) { LocationInfo locationInfo = loggingEvent.LocationInformation; - writer.WriteStartElement("log4j:locationInfo"); + writer.WriteStartElement("log4j", "locationInfo", "log4net"); writer.WriteAttributeString("class", locationInfo.ClassName); writer.WriteAttributeString("method", locationInfo.MethodName); writer.WriteAttributeString("file", locationInfo.FileName); From afaa96819eba0f93038e5397b5a4529d19a7be17 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Mon, 25 Oct 2021 15:52:56 +0200 Subject: [PATCH 025/122] :wrench: provide different name for rolling mutex from file mutex (LOG4NET-583) --- src/log4net/Appender/RollingFileAppender.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/log4net/Appender/RollingFileAppender.cs b/src/log4net/Appender/RollingFileAppender.cs index b5bf2532e..f53dd7888 100644 --- a/src/log4net/Appender/RollingFileAppender.cs +++ b/src/log4net/Appender/RollingFileAppender.cs @@ -1160,7 +1160,11 @@ public override void ActivateOptions() #if !NETCF // initialize the mutex that is used to lock rolling - m_mutexForRolling = new Mutex(false, m_baseFileName.Replace("\\", "_").Replace(":", "_").Replace("/", "_")); + m_mutexForRolling = new Mutex(false, m_baseFileName + .Replace("\\", "_") + .Replace(":", "_") + .Replace("/", "_") + "_rolling" + ); #endif if (m_rollDate && File != null && m_scheduledFilename == null) From 26841fdd2c550a5202c38fdf02b75c7207401268 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Mon, 25 Oct 2021 16:00:46 +0200 Subject: [PATCH 026/122] :memo: add docs on 2.0.13 release --- src/site/xdoc/release/release-notes.xml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/site/xdoc/release/release-notes.xml b/src/site/xdoc/release/release-notes.xml index f6e28e4de..9b2a57ce5 100644 --- a/src/site/xdoc/release/release-notes.xml +++ b/src/site/xdoc/release/release-notes.xml @@ -27,6 +27,20 @@ limitations under the License.
    +
    + Apache log4net 2.0.13 is a minor release to address some reported issues + and accept some pull requests provided by community members: +
    +
      +
    • Addresses issue [LOG4NET-583] with proposed solution by Emmo Emminghaus, + namely to provide an unique mutex identifier for the file rolling logic.
    • +
    • Accepts pull request 76 by @dschwartzni + to allow the netstandard2.0 library to be used within net472 web services
    • +
    • Accepts pull request 18 by @dmarlow + to update the xml layout mimicking log4j
    • +
    +
    +

    Apache log4net 2.0.12 is a minor fix release to address reported issues on From 92267c9447a3bb6bb749253428294e2d655970ec Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Mon, 25 Oct 2021 16:05:46 +0200 Subject: [PATCH 027/122] :bookmark: update versioning to 2.0.13.0 --- src/log4net/AssemblyInfo.cs | 46 +++++++++++++++--------------- src/log4net/AssemblyVersionInfo.cs | 4 +-- src/log4net/Core/LoggingEvent.cs | 3 ++ src/log4net/log4net.csproj | 2 +- 4 files changed, 29 insertions(+), 26 deletions(-) diff --git a/src/log4net/AssemblyInfo.cs b/src/log4net/AssemblyInfo.cs index 21b94e5bf..f7f47aab0 100644 --- a/src/log4net/AssemblyInfo.cs +++ b/src/log4net/AssemblyInfo.cs @@ -53,77 +53,77 @@ // #if (CLI_1_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-.CLI 1.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-.CLI 1.0")] [assembly: AssemblyTitle("Apache log4net for CLI 1.0 Compatible Frameworks")] #elif (NET_1_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-.NET 1.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-.NET 1.0")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 1.0")] #elif (NET_1_1) -[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-.NET 1.1")] +[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-.NET 1.1")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 1.1")] #elif (NET_4_5) -[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-.NET 4.5")] +[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-.NET 4.5")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 4.5")] #elif (NET_4_0) #if CLIENT_PROFILE -[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-.NET 4.0 CP")] +[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-.NET 4.0 CP")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 4.0 Client Profile")] #else -[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-.NET 4.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-.NET 4.0")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 4.0")] #endif // Client Profile #elif (NET_3_5) #if CLIENT_PROFILE -[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-.NET 3.5 CP")] +[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-.NET 3.5 CP")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 3.5 Client Profile")] #else -[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-.NET 3.5")] +[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-.NET 3.5")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 3.5")] #endif // Client Profile #elif (NET_2_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-.NET 2.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-.NET 2.0")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 2.0")] #elif (NETCF_1_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-.NETCF 1.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-.NETCF 1.0")] [assembly: AssemblyTitle("Apache log4net for .NET Compact Framework 1.0")] #elif (NETCF_2_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-.NETCF 2.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-.NETCF 2.0")] [assembly: AssemblyTitle("Apache log4net for .NET Compact Framework 2.0")] #elif (MONO_1_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-Mono 1.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-Mono 1.0")] [assembly: AssemblyTitle("Apache log4net for Mono 1.0")] #elif (MONO_2_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-Mono 2.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-Mono 2.0")] [assembly: AssemblyTitle("Apache log4net for Mono 2.0")] #elif (MONO_3_5) -[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-Mono 3.5")] +[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-Mono 3.5")] [assembly: AssemblyTitle("Apache log4net for Mono 3.5")] #elif (MONO_4_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-Mono 4.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-Mono 4.0")] [assembly: AssemblyTitle("Apache log4net for Mono 4.0")] #elif (SSCLI_1_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-SSCLI 1.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-SSCLI 1.0")] [assembly: AssemblyTitle("Apache log4net for Shared Source CLI 1.0")] #elif (NET) -[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-.NET")] +[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-.NET")] [assembly: AssemblyTitle("Apache log4net for .NET Framework")] #elif (NETSTANDARD1_3) -[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-.NET Standard 1.3")] +[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-.NET Standard 1.3")] [assembly: AssemblyTitle("Apache log4net for .NET Standard 1.3")] #elif (NETSTANDARD2_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-.NET Standard 2.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-.NET Standard 2.0")] [assembly: AssemblyTitle("Apache log4net for .NET Standard 2.0")] #elif (NETCF) -[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-.NETCF")] +[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-.NETCF")] [assembly: AssemblyTitle("Apache log4net for .NET Compact Framework")] #elif (MONO) -[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-Mono")] +[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-Mono")] [assembly: AssemblyTitle("Apache log4net for Mono")] #elif (SSCLI) -[assembly: AssemblyInformationalVersionAttribute("2.0.12.0-SSCLI")] +[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-SSCLI")] [assembly: AssemblyTitle("Apache log4net for Shared Source CLI")] #else -[assembly: AssemblyInformationalVersionAttribute("2.0.12.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.13.0")] [assembly: AssemblyTitle("Apache log4net")] #endif diff --git a/src/log4net/AssemblyVersionInfo.cs b/src/log4net/AssemblyVersionInfo.cs index 1bde4670e..c10b79027 100644 --- a/src/log4net/AssemblyVersionInfo.cs +++ b/src/log4net/AssemblyVersionInfo.cs @@ -28,11 +28,11 @@ // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: System.Reflection.AssemblyVersion("2.0.12.0")] +[assembly: System.Reflection.AssemblyVersion("2.0.13.0")] #if !NETCF #if !SSCLI -[assembly: System.Reflection.AssemblyFileVersion("2.0.12.0")] +[assembly: System.Reflection.AssemblyFileVersion("2.0.13.0")] #endif #endif diff --git a/src/log4net/Core/LoggingEvent.cs b/src/log4net/Core/LoggingEvent.cs index 72d0c3c82..4ad16f147 100644 --- a/src/log4net/Core/LoggingEvent.cs +++ b/src/log4net/Core/LoggingEvent.cs @@ -956,7 +956,10 @@ private static string TryGetCurrentUserName() #endif } +#if (NETCF || SSCLI || NETSTANDARD1_3) +#else private static bool _platformDoesNotSupportWindowsIdentity; +#endif ///

    /// Gets the identity of the current thread principal. diff --git a/src/log4net/log4net.csproj b/src/log4net/log4net.csproj index 263ed6505..04bd9e2bd 100644 --- a/src/log4net/log4net.csproj +++ b/src/log4net/log4net.csproj @@ -1,7 +1,7 @@  log4net - 2.0.12 + 2.0.13 Codestin Search App Apache log4net From 2323519abdb9aba7f106e4ad11bba34cc6f18805 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Tue, 26 Oct 2021 09:33:20 +0200 Subject: [PATCH 028/122] :memo: update downloads page --- src/site/xdoc/download_log4net.xml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/site/xdoc/download_log4net.xml b/src/site/xdoc/download_log4net.xml index a669bda90..da0b91efe 100644 --- a/src/site/xdoc/download_log4net.xml +++ b/src/site/xdoc/download_log4net.xml @@ -36,14 +36,14 @@ limitations under the License.
    -
    +
    - - - + + +
    apache-log4net-source-2.0.12.zipsha512pgpapache-log4net-source-2.0.13.zipsha512pgp
    @@ -52,14 +52,14 @@ limitations under the License.

    Binaries are available in a zip file or nupkg, which is also available from nuget.org

    - - - + + + - - - + + +
    log4net-binaries-2.0.12.zipsha512pgplog4net-binaries-2.0.13.zipsha512pgp
    log4net-2.0.12.nupkgsha512pgplog4net-2.0.13.nupkgsha512pgp
    From 1cb560cc444e8685a270fe0a2b33c7be1f2947ed Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Tue, 26 Oct 2021 11:14:12 +0200 Subject: [PATCH 029/122] :memo: add release docs, move sub-docs to docs folder --- README.md | 6 ++- BUILDING.md => doc/BUILDING.md | 0 CONTRIBUTING.md => doc/CONTRIBUTING.md | 0 doc/RELEASING.md | 60 ++++++++++++++++++++++++++ doc/sign-log4net-libraries.sh | 13 ++++++ 5 files changed, 77 insertions(+), 2 deletions(-) rename BUILDING.md => doc/BUILDING.md (100%) rename CONTRIBUTING.md => doc/CONTRIBUTING.md (100%) create mode 100644 doc/RELEASING.md create mode 100644 doc/sign-log4net-libraries.sh diff --git a/README.md b/README.md index df840235c..85e2fdbfb 100644 --- a/README.md +++ b/README.md @@ -42,5 +42,7 @@ may be installed by using the bundled helper scripts: These scripts download the relevant installers from Microsoft servers, but you run them at your own risk. -Please see [CONTRIBUTING.md](CONTRIBUTING.md) and -[BUILDING.md](BUILDING.md) +Please see +- [CONTRIBUTING.md](doc/CONTRIBUTING.md) +- [BUILDING.md](doc/BUILDING.md) +- [RELEASING.md](doc/RELEASING.md) diff --git a/BUILDING.md b/doc/BUILDING.md similarity index 100% rename from BUILDING.md rename to doc/BUILDING.md diff --git a/CONTRIBUTING.md b/doc/CONTRIBUTING.md similarity index 100% rename from CONTRIBUTING.md rename to doc/CONTRIBUTING.md diff --git a/doc/RELEASING.md b/doc/RELEASING.md new file mode 100644 index 000000000..a38fd4786 --- /dev/null +++ b/doc/RELEASING.md @@ -0,0 +1,60 @@ +Log4Net Release procedure +--- + +This serves to document the release procedure for log4net, which is probably +more of interest to maintainers than anyone else, but I've found that there +are enough moving parts and time between releases to make the process more +difficult than it needs to be. Some parts are automated and others can be in +the future. + +Assuming the code is in a place where a release can be made, for the imagined +release version 2.0.123: + +1. Update the documentation under `src/site` + - minimally, this means at least: + - `src/site/xdoc/release/release-notes.xml` + - copy an existing release section & think about: + - what does this release change? + - bug fixes? + - enhancements + - don't forget to mention contributors + - people who reported issues + - people who created pull requests + - people who suggested code that was implemented + - `src/site/xdoc/download_log4net.xml` + - you should be able to search & replace on the prior version + for the new one you're about to create +2. Update the log4net.csproj file with this new version +3. Build release artifacts with `npm run release` + - if this doesn't work, you may need to `npm ci` first! + - currently, this _must_ happen on a windows machine because of older + .net framework requirements which cannot be met on a Linux machine + (or at least, I haven't figured out how - in particular CF) +4. Sign release artifacts (zips & nupkg) under `build/artifacts` + - eg `gpg --argmor --output log4net-2.0.123.nupkg.asc --detach-sig log4net-2.0.123.nupkg` + - there is an accompanying `sign-log4net-libraries.sh` which you could invoke if you cd + into the `build/artifacts` folder + - I build on Windows and sign on Linux as my build machine belongs to my company + and I don't want to store keys there. Always protect your keys fervently! +5. Clone out the log4net doc repo (https://github.com/apache/logging-log4net-site) + - check out the `asf-staging` branch + - create a folder which includes the version, eg `log4net-2.0.123` +6. Copy the contents of `target/site` from this repo into the folder created in (5) +7. Update the symlinks in the base of the docs repo, ie: + - 2.0.x -> 2.0.123 + - 2.x -> 2.0.123 +8. update the `doap_log4net.rdf` to point to the new release + - (copy-paste-modify an existing release) +9. update the `.htaccess` file + - the trailing RewriteRule should point to the new log4net-2.0.123 folder +10. push the `asf-staging` branch to github and wait a bit + - after a minute or two, check the updates at https://logging.staged.apache.org/log4net + - are you seeing the correct releases page? + - are you seeing the correct downloads page? + - download links should (at this point) not work +11. create an rc-releasd at GitHub with a tag like `rc/2.0.123` + - attach all the files from the build/artifacts folder, _including signatures_ +12. get the artifacts in build/artifacts up to https://downloads.apache.org/logging/log4net/ + - currently, I have to as another ASF member for help with this + - I also see release notes there - which are out of date (don't know how to update) + diff --git a/doc/sign-log4net-libraries.sh b/doc/sign-log4net-libraries.sh new file mode 100644 index 000000000..55d5767b0 --- /dev/null +++ b/doc/sign-log4net-libraries.sh @@ -0,0 +1,13 @@ +#!/bin/bash +# see https://infra.apache.org/release-signing#openpgp-ascii-detach-sig +DID_SOMETHING=0 +for f in log4net*.nupkg log4net*.zip; do + DID_SOMETHING=1 + echo "signing: $f" + gpg --armor --output $f.asc --detach-sig $f +done + +if test "$DID_SOMETHING" = "0"; then + echo "No log4net artifacts found - are you sure you're in the right directory?" + exit 2 +fi From 9d039a84e2bc6308771136e9530e7eba94083db6 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Thu, 28 Oct 2021 09:30:57 +0200 Subject: [PATCH 030/122] :package: build zip artifacts with containing folder --- local-tasks/zip.js | 25 +++++++++++++++++++------ package-lock.json | 6 ++++++ package.json | 2 ++ 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/local-tasks/zip.js b/local-tasks/zip.js index cbfce84d8..1225a21c1 100644 --- a/local-tasks/zip.js +++ b/local-tasks/zip.js @@ -3,21 +3,31 @@ const promisify = requireModule("promisify-stream"), readCsProjVersion = requireModule("read-csproj-version"), target = "build/artifacts", + debug = require("gulp-debug"), + rename = require("gulp-rename"), zip = require("gulp-zip"); -gulp.task("zip", [ "zip-binaries", "zip-source"], () => Promise.resolve()); +gulp.task("zip", ["zip-binaries", "zip-source"], () => Promise.resolve()); gulp.task("zip-binaries", async () => { - const version = await readVersion(); + const + version = await readVersion(), + baseDir = `apache-log4net-binaries-${version}`; return promisify( gulp.src(["build/Release/**/*", "LICENSE", "NOTICE"]) - .pipe(zip(`log4net-binaries-${version}.zip`)) + .pipe(rename(path => { + path.dirname = `${baseDir}/${path.dirname}` + })) + .pipe(zip(`${baseDir}.zip`)) .pipe(gulp.dest(target)) ); }); gulp.task("zip-source", async () => { - const version = await readVersion(); + const + version = await readVersion(), + baseDir = `apache-log4net-source-${version}`; + return promisify( gulp.src([ "**/*", @@ -32,8 +42,11 @@ gulp.task("zip-source", async () => { "!.idea", "!.idea/**/*" ]) - .pipe(zip(`log4net-source-${version}.zip`)) - .pipe(gulp.dest(target)) + .pipe(rename(path => { + path.dirname = `${baseDir}/${path.dirname}` + })) + .pipe(zip(`${baseDir}.zip`)) + .pipe(gulp.dest(target)) ); }); diff --git a/package-lock.json b/package-lock.json index e02ddb9ee..0062e1cbb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2622,6 +2622,12 @@ } } }, + "gulp-rename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-2.0.0.tgz", + "integrity": "sha512-97Vba4KBzbYmR5VBs9mWmK+HwIf5mj+/zioxfZhOKeXtx5ZjBk57KFlePf5nxq9QsTtFl0ejnHE3zTC9MHXqyQ==", + "dev": true + }, "gulp-zip": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/gulp-zip/-/gulp-zip-5.0.2.tgz", diff --git a/package.json b/package.json index b535be677..5523fe717 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,8 @@ "homepage": "https://github.com/fluffynuts/logging-log4net#readme", "devDependencies": { "cross-env": "^7.0.2", + "gulp-debug": "^4.0.0", + "gulp-rename": "^2.0.0", "gulp-zip": "^5.0.2", "npm-run-all": "^4.1.5", "rimraf": "^3.0.2", From d880d946f2c7a7350566f682576958e831c4eb83 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Fri, 5 Nov 2021 16:43:31 +0200 Subject: [PATCH 031/122] :memo: add reminders to release nupkg & update live docs --- doc/RELEASING.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/doc/RELEASING.md b/doc/RELEASING.md index a38fd4786..5a46eb5c1 100644 --- a/doc/RELEASING.md +++ b/doc/RELEASING.md @@ -57,4 +57,12 @@ release version 2.0.123: 12. get the artifacts in build/artifacts up to https://downloads.apache.org/logging/log4net/ - currently, I have to as another ASF member for help with this - I also see release notes there - which are out of date (don't know how to update) +13. raise a vote on the log4net mailing list (dev@logging.apache.org) +14. wait +15. when the vote has 3 or more +1's, it's time to go live! +16. push the .nupkg to nuget.org +17. don't forget to make the docs live: in the logging-log4net-site folder: + - `git checkout asf-site` + - `git pull --rebase` + - `git merge asf-staging` From 0c4e916693456d541b6ed327123d3a832419bfa5 Mon Sep 17 00:00:00 2001 From: Tsar Nikolay Date: Tue, 23 Nov 2021 12:58:31 +0500 Subject: [PATCH 032/122] Fix AdoNetAppender using npgsql once again. --- src/log4net/Appender/AdoNetAppender.cs | 28 +++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/src/log4net/Appender/AdoNetAppender.cs b/src/log4net/Appender/AdoNetAppender.cs index 2f6edfbb0..b5d05842d 100644 --- a/src/log4net/Appender/AdoNetAppender.cs +++ b/src/log4net/Appender/AdoNetAppender.cs @@ -557,23 +557,26 @@ protected virtual void SendBuffer(IDbTransaction dbTran, LoggingEvent[] events) try { // prepare the command, which is significantly faster - dbCmd.Prepare(); + Prepare(dbCmd); } catch (Exception) { + if (dbTran != null) + { + // rethrow exception in transaction mode, cuz now transaction is in failed state + throw; + } + // ignore prepare exceptions as they can happen without affecting actual logging, eg on npgsql } // run for all events foreach (LoggingEvent e in events) { - // clear parameters that have been set - dbCmd.Parameters.Clear(); - + // No need to clear dbCmd.Parameters, just use existing. // Set the parameter values foreach (AdoNetAppenderParameter param in m_parameters) { - param.Prepare(dbCmd); param.FormatValue(dbCmd, e); } @@ -606,6 +609,21 @@ protected virtual void SendBuffer(IDbTransaction dbTran, LoggingEvent[] events) } } + /// + /// Prepare entire database command object to be executed. + /// + /// The command to prepare. + protected virtual void Prepare(IDbCommand dbCmd) + { + // npgsql require parameters to prepare command + foreach (AdoNetAppenderParameter parameter in m_parameters) + { + parameter.Prepare(dbCmd); + } + + dbCmd.Prepare(); + } + /// /// Formats the log message into database statement text. /// From a17282a45509cd8d23695ded3938958cfe21ccd0 Mon Sep 17 00:00:00 2001 From: Erik Mavrinac Date: Wed, 1 Dec 2021 11:29:29 -0800 Subject: [PATCH 033/122] For %thread/%t, use the numeric thread ID for .NET worker pool threads --- src/log4net/Core/LoggingEvent.cs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/log4net/Core/LoggingEvent.cs b/src/log4net/Core/LoggingEvent.cs index 4ad16f147..678e62ece 100644 --- a/src/log4net/Core/LoggingEvent.cs +++ b/src/log4net/Core/LoggingEvent.cs @@ -835,10 +835,16 @@ public string ThreadName m_data.ThreadName = SystemInfo.CurrentThreadId.ToString(System.Globalization.NumberFormatInfo.InvariantInfo); #else - m_data.ThreadName = System.Threading.Thread.CurrentThread.Name; - if (m_data.ThreadName == null || m_data.ThreadName.Length == 0) + // '.NET ThreadPool Worker' appears as a default thread pool name in .NET 6+. + // Prefer the numeric thread ID instead. + string threadName = System.Threading.Thread.CurrentThread.Name; + if (!string.IsNullOrEmpty(threadName) && threadName != ".NET ThreadPool Worker") { - // The thread name is not available. Therefore we + m_data.ThreadName = threadName; + } + else + { + // The thread name is not available or unsuitable. Therefore we // go the the AppDomain to get the ID of the // current thread. (Why don't Threads know their own ID?) try @@ -847,7 +853,7 @@ public string ThreadName SystemInfo.CurrentThreadId.ToString(System.Globalization.NumberFormatInfo .InvariantInfo); } - catch (System.Security.SecurityException) + catch (SecurityException) { // This security exception will occur if the caller does not have // some undefined set of SecurityPermission flags. From 6ad127beb564d4381af634f495df2c14d55d7213 Mon Sep 17 00:00:00 2001 From: Erik Mavrinac Date: Wed, 1 Dec 2021 13:46:33 -0800 Subject: [PATCH 034/122] (LOG4NET-671) Dispose WindowsIdentity in TryGetCurrentUserName() --- src/log4net/Core/LoggingEvent.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/log4net/Core/LoggingEvent.cs b/src/log4net/Core/LoggingEvent.cs index 4ad16f147..d7fd3987a 100644 --- a/src/log4net/Core/LoggingEvent.cs +++ b/src/log4net/Core/LoggingEvent.cs @@ -931,8 +931,10 @@ private static string TryGetCurrentUserName() try { - var windowsIdentity = WindowsIdentity.GetCurrent(); - return windowsIdentity?.Name ?? ""; + using (WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent()) + { + return windowsIdentity?.Name ?? ""; + } } catch (PlatformNotSupportedException) { From 94103257c8909af4926ac3c732a6aba46e166351 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Wed, 15 Dec 2021 07:54:54 +0200 Subject: [PATCH 035/122] :memo: add doc about creating rel tag at release --- doc/RELEASING.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/RELEASING.md b/doc/RELEASING.md index 5a46eb5c1..584bf5cca 100644 --- a/doc/RELEASING.md +++ b/doc/RELEASING.md @@ -52,11 +52,11 @@ release version 2.0.123: - are you seeing the correct releases page? - are you seeing the correct downloads page? - download links should (at this point) not work -11. create an rc-releasd at GitHub with a tag like `rc/2.0.123` +11. create an rc-releasd at GitHub with a tag like `rc/2.0.123-rc1` - attach all the files from the build/artifacts folder, _including signatures_ 12. get the artifacts in build/artifacts up to https://downloads.apache.org/logging/log4net/ - currently, I have to as another ASF member for help with this - - I also see release notes there - which are out of date (don't know how to update) + - I also see release notes there - which are out of date (don't know how to update) 13. raise a vote on the log4net mailing list (dev@logging.apache.org) 14. wait 15. when the vote has 3 or more +1's, it's time to go live! @@ -65,4 +65,6 @@ release version 2.0.123: - `git checkout asf-site` - `git pull --rebase` - `git merge asf-staging` +18. rename the release at github, eg to `rel/2.0.123` + - double-check that the `rel` tag is created From 1a9c7579201cf5c0fec6725c9ee1fd8edc0c9819 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Wed, 24 Nov 2021 13:12:38 +0200 Subject: [PATCH 036/122] :bug: should not attempt to reference into null value to get type --- src/log4net.Tests/log4net.Tests.csproj | 3 +- .../Util/ReadOnlyPropertiesDictionary.cs | 35 ++++++++++++------- src/log4net/log4net.csproj | 2 +- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/src/log4net.Tests/log4net.Tests.csproj b/src/log4net.Tests/log4net.Tests.csproj index 7da2aaf42..58e1b90c4 100644 --- a/src/log4net.Tests/log4net.Tests.csproj +++ b/src/log4net.Tests/log4net.Tests.csproj @@ -1,6 +1,7 @@  net462;netcoreapp1.0;netcoreapp2.1;netcoreapp3.1 + NETSDK1138;CS1701 Local JScript Grid @@ -62,7 +63,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/log4net/Util/ReadOnlyPropertiesDictionary.cs b/src/log4net/Util/ReadOnlyPropertiesDictionary.cs index 0d51fc939..be37baf04 100644 --- a/src/log4net/Util/ReadOnlyPropertiesDictionary.cs +++ b/src/log4net/Util/ReadOnlyPropertiesDictionary.cs @@ -106,7 +106,7 @@ public ReadOnlyPropertiesDictionary(ReadOnlyPropertiesDictionary propertiesDicti /// protected ReadOnlyPropertiesDictionary(SerializationInfo info, StreamingContext context) { - foreach(SerializationEntry entry in info) + foreach(var entry in info) { // The keys are stored as Xml encoded names InnerHashtable[XmlConvert.DecodeName(entry.Name)] = entry.Value; @@ -129,7 +129,7 @@ protected ReadOnlyPropertiesDictionary(SerializationInfo info, StreamingContext /// public string[] GetKeys() { - string[] keys = new String[InnerHashtable.Count]; + var keys = new String[InnerHashtable.Count]; InnerHashtable.Keys.CopyTo(keys, 0); return keys; } @@ -214,22 +214,33 @@ public virtual void GetObjectData(SerializationInfo info, StreamingContext conte { foreach(DictionaryEntry entry in InnerHashtable.Clone() as IDictionary) { - string entryKey = entry.Key as string; - object entryValue = entry.Value; + var entryKey = entry.Key as string; + if (entryKey is null) + { + continue; + } + + var entryValue = entry.Value; // If value is serializable then we add it to the list #if NETSTANDARD1_3 - bool isSerializable = entryValue.GetType().GetTypeInfo().IsSerializable; + var isSerializable = entryValue?.GetType().GetTypeInfo().IsSerializable ?? false; #else - bool isSerializable = entryValue.GetType().IsSerializable; + var isSerializable = entryValue?.GetType().IsSerializable ?? false; #endif - if (entryKey != null && entryValue != null && isSerializable) + if (!isSerializable) + { + continue; + } + + // Store the keys as an Xml encoded local name as it may contain colons (':') + // which are NOT escaped by the Xml Serialization framework. + // This must be a bug in the serialization framework as we cannot be expected + // to know the implementation details of all the possible transport layers. + var localKeyName = XmlConvert.EncodeLocalName(entryKey); + if (localKeyName is not null) { - // Store the keys as an Xml encoded local name as it may contain colons (':') - // which are NOT escaped by the Xml Serialization framework. - // This must be a bug in the serialization framework as we cannot be expected - // to know the implementation details of all the possible transport layers. - info.AddValue(XmlConvert.EncodeLocalName(entryKey), entryValue); + info.AddValue(localKeyName, entryValue); } } } diff --git a/src/log4net/log4net.csproj b/src/log4net/log4net.csproj index 04bd9e2bd..4115607ec 100644 --- a/src/log4net/log4net.csproj +++ b/src/log4net/log4net.csproj @@ -191,7 +191,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive From 0cace90781ee3c648f6cbd88fe6140d1839f3351 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Thu, 16 Dec 2021 10:09:39 +0200 Subject: [PATCH 037/122] :construction: prepare for 2.0.14 release --- STATUS.txt | 4 +- doc/BUILDING.md | 3 + install-net-framework-sdk-3.5.ps1 | 27 +- package-lock.json | 1010 +++++++++++++++-------- package.json | 2 +- src/log4net/AssemblyInfo.cs | 46 +- src/log4net/log4net.csproj | 14 +- src/site/xdoc/download_log4net.xml | 18 +- src/site/xdoc/release/release-notes.xml | 14 + 9 files changed, 746 insertions(+), 392 deletions(-) diff --git a/STATUS.txt b/STATUS.txt index a4ba7b62d..f9e0e9d82 100644 --- a/STATUS.txt +++ b/STATUS.txt @@ -4,7 +4,7 @@ APACHE LOG4NET PROJECT STATUS Project Status ============== -Apache log4net is a dormant sub project of the Apache Logging Services project. +Apache log4net is a sub project of the Apache Logging Services project. Apache log4net graduated from the Apache Incubator in February 2007. @@ -21,7 +21,7 @@ Mailing Lists: Active Committers ================= -None +* Davyd McColl (davydm) Former Committers ================ diff --git a/doc/BUILDING.md b/doc/BUILDING.md index 2330e8cfb..597aafaf1 100644 --- a/doc/BUILDING.md +++ b/doc/BUILDING.md @@ -14,6 +14,9 @@ Options: - include desktop targets at least - include dotnet core targets or download and install the latest dotnet sdk (you will need at least v2.1) + - note that build is possible with VS2022 build tools, but I had to + install VS2019 build tools _as well_ to get msbuild to recognise + the legacy net35-profile target - Ensure you have .NET Framework 3.5 SP1 installed - on Win10+, this can only be installed via Add/Remove Windows Components - on other platforms, see https://dotnet.microsoft.com/download/dotnet-framework/net35-sp1 diff --git a/install-net-framework-sdk-3.5.ps1 b/install-net-framework-sdk-3.5.ps1 index f2b010819..e78fa37f2 100644 --- a/install-net-framework-sdk-3.5.ps1 +++ b/install-net-framework-sdk-3.5.ps1 @@ -1,6 +1,25 @@ -Write-Host "Downloading dotnetfx35.exe" -Invoke-WebRequest -Uri "https://download.microsoft.com/download/2/0/E/20E90413-712F-438C-988E-FDAA79A8AC3D/dotnetfx35.exe" -OutFile dotnetfx35.exe +if (-not (Test-Path dotnetfx35.exe)) { + Write-Host "Downloading dotnetfx35.exe" + Invoke-WebRequest -Uri "https://download.microsoft.com/download/2/0/E/20E90413-712F-438C-988E-FDAA79A8AC3D/dotnetfx35.exe" -OutFile dotnetfx35.exe +} + Write-Host "Running dotnetfx35.exe" -Start-Process -FilePath dotnetfx35.exe -ArgumentList "/wait","/passive" -Wait -Write-Host "dotnetfx35 installed" +$process = Start-Process -FilePath dotnetfx35.exe -ArgumentList "/wait","/passive" -Wait -PassThru +if ($process.ExitCode -eq 0) { + Write-Host "dotnetfx35 installed" +} else { + Write-Host "dotnetfx35 installer returned exit code ${process.ExitCode}" +} + +if (-not (Test-Path dotnetfx35client.exe)) { + Write-host "Downloading dotnetfx35client.exe" + Invoke-WebRequest -Uri "https://download.microsoft.com/download/c/d/c/cdc0f321-4f72-4a08-9bac-082f3692ecd9/DotNetFx35Client.exe" -OutFile dotnetfx35client.exe +} +Write-Host "Running dotnetfx35client.exe" +$process = Start-Process -FilePath dotnetfx35client.exe -ArgumentList "/quiet","/passive" -Wait -PassThru +if ($process.ExitCode -eq 0) { + Write-Host "dotnetfx35client installed" +} else { + Write-Host "dotnetfx35client installer returned exit code ${process.ExitCode}" +} diff --git a/package-lock.json b/package-lock.json index 0062e1cbb..0af47db34 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,28 +20,28 @@ "dev": true }, "@nodelib/fs.scandir": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", - "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "requires": { - "@nodelib/fs.stat": "2.0.3", + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "@nodelib/fs.stat": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", - "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true }, "@nodelib/fs.walk": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", - "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "requires": { - "@nodelib/fs.scandir": "2.1.3", + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, @@ -60,16 +60,10 @@ "defer-to-connect": "^1.0.1" } }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true - }, "@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, "requires": { "@types/minimatch": "*", @@ -77,21 +71,21 @@ } }, "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", "dev": true }, "@types/node": { - "version": "14.6.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.6.4.tgz", - "integrity": "sha512-Wk7nG1JSaMfMpoMJDKUsWYugliB2Vy55pdjLpmLixeyMi7HizW2I/9QoxsPCkXl3dO+ZOVqPumKaDUv5zJu2uQ==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.0.tgz", + "integrity": "sha512-eMhwJXc931Ihh4tkU+Y7GiLzT/y/DBNpNtr4yU9O2w3SYBsr9NaOPhQlLKRmoWtI54uNwuo0IOUFQjVOTZYRvw==", "dev": true }, "@types/xml2js": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.5.tgz", - "integrity": "sha512-yohU3zMn0fkhlape1nxXG2bLEGZRc1FeqF80RoHaYXJN7uibaauXfhzhOJr1Xh36sn+/tx21QAOf07b/xYVk1w==", + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.9.tgz", + "integrity": "sha512-CHiCKIihl1pychwR2RNX5mAYmJDACgFVCMT5OArMaO3erzwXVcBqPcusr+Vl8yeeXukxZqtF8mZioqX+mpjjdw==", "dev": true, "requires": { "@types/node": "*" @@ -114,9 +108,9 @@ } }, "ajv": { - "version": "6.12.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", - "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -126,44 +120,44 @@ } }, "ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "dev": true, "requires": { - "string-width": "^3.0.0" + "string-width": "^4.1.0" }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" } } } @@ -482,14 +476,104 @@ "dev": true }, "array.prototype.flatmap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz", - "integrity": "sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz", + "integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==", "dev": true, "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1" + "es-abstract": "^1.19.0" + }, + "dependencies": { + "es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "object-inspect": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.1.tgz", + "integrity": "sha512-If7BjFlpkzzBeV1cqgT3OSWT3azyoxDGajR+iGnFBfVV2EWyDyWaZZW2ERDjUaY2QM8i5jI3Sj7mhsM4DDAqWA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + } } }, "arrify": { @@ -499,9 +583,9 @@ "dev": true }, "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dev": true, "requires": { "safer-buffer": "~2.1.0" @@ -565,9 +649,9 @@ "dev": true }, "aws4": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", - "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, "bach": { @@ -674,47 +758,46 @@ } }, "boxen": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", - "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", "dev": true, "requires": { "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "cli-boxes": "^2.2.0", - "string-width": "^4.1.0", - "term-size": "^2.1.0", - "type-fest": "^0.8.1", - "widest-line": "^3.1.0" + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", + "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==", "dev": true }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -736,12 +819,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -755,23 +832,23 @@ "dev": true }, "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } }, "supports-color": { @@ -782,6 +859,17 @@ "requires": { "has-flag": "^4.0.0" } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } } } }, @@ -817,9 +905,9 @@ "dev": true }, "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, "cache-base": { @@ -881,6 +969,16 @@ } } }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "camelcase": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", @@ -1232,9 +1330,9 @@ } }, "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", "dev": true, "requires": { "safe-buffer": "~5.1.1" @@ -1247,13 +1345,21 @@ "dev": true }, "copy-props": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", - "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.5.tgz", + "integrity": "sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==", "dev": true, "requires": { - "each-props": "^1.3.0", - "is-plain-object": "^2.0.1" + "each-props": "^1.3.2", + "is-plain-object": "^5.0.0" + }, + "dependencies": { + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true + } } }, "core-util-is": { @@ -1451,9 +1557,9 @@ "dev": true }, "didyoumean": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.1.tgz", - "integrity": "sha1-6S7f2tplN9SE1zwBcv0eugxJdv8=", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", "dev": true }, "dir-glob": { @@ -1535,9 +1641,9 @@ } }, "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "end-of-stream": { @@ -1719,18 +1825,18 @@ } }, "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", + "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", "dev": true, "requires": { - "type": "^2.0.0" + "type": "^2.5.0" }, "dependencies": { "type": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", - "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==", "dev": true } } @@ -1852,17 +1958,16 @@ "dev": true }, "fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" } }, "fast-json-stable-stringify": { @@ -1878,9 +1983,9 @@ "dev": true }, "fastq": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", - "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -2156,6 +2261,17 @@ "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-own-enumerable-property-symbols": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", @@ -2183,6 +2299,16 @@ } } }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -2213,9 +2339,9 @@ } }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { "is-glob": "^4.0.1" @@ -2276,12 +2402,20 @@ } }, "global-dirs": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz", - "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", "dev": true, "requires": { - "ini": "^1.3.5" + "ini": "2.0.0" + }, + "dependencies": { + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true + } } }, "global-modules": { @@ -2543,9 +2677,9 @@ } }, "gulp-msbuild": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/gulp-msbuild/-/gulp-msbuild-0.8.0.tgz", - "integrity": "sha512-WL50GRrbD3BEJ8Hjhgpgv6iA4ST9swVFF4RZD5db0RYt0umlre0+FA8HBFo0Rpqze8/Opcn6A+kvpgx8125j1w==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/gulp-msbuild/-/gulp-msbuild-0.9.0.tgz", + "integrity": "sha512-N2kP0wkxBf5JXmgvjQhQAZiroPEqA7Y6I9mtVP5viRbuovSsvO+cJYS+lkNx5Zp8W1vTvEW7p1CUQ/YjicI4+w==", "dev": true, "requires": { "chalk": "^4.0.0", @@ -2561,19 +2695,18 @@ }, "dependencies": { "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -2705,6 +2838,12 @@ "ansi-regex": "^2.0.0" } }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -2717,6 +2856,23 @@ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", "dev": true }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + }, + "dependencies": { + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + } + } + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -2808,9 +2964,9 @@ } }, "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", + "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", "dev": true }, "ignore-by-default": { @@ -2854,11 +3010,22 @@ "dev": true }, "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, "interpret": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", @@ -2913,6 +3080,15 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, "is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", @@ -2922,6 +3098,16 @@ "binary-extensions": "^1.0.0" } }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", @@ -3010,22 +3196,22 @@ } }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { "is-extglob": "^2.1.1" } }, "is-installed-globally": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", - "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", "dev": true, "requires": { - "global-dirs": "^2.0.1", - "is-path-inside": "^3.0.1" + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" } }, "is-negated-glob": { @@ -3034,10 +3220,16 @@ "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", "dev": true }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true + }, "is-npm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", - "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", "dev": true }, "is-number": { @@ -3046,6 +3238,15 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", @@ -3059,9 +3260,9 @@ "dev": true }, "is-path-inside": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", - "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true }, "is-plain-object": { @@ -3097,6 +3298,21 @@ "is-unc-path": "^1.0.0" } }, + "is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "dev": true + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-symbol": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", @@ -3133,6 +3349,15 @@ "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", "dev": true }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -3188,9 +3413,9 @@ "dev": true }, "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true }, "json-schema-traverse": { @@ -3212,21 +3437,21 @@ "dev": true }, "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" } }, "just-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", - "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.1.0.tgz", + "integrity": "sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==", "dev": true }, "keyv": { @@ -3264,9 +3489,9 @@ } }, "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", "dev": true, "requires": { "readable-stream": "^2.0.5" @@ -3587,28 +3812,28 @@ "dev": true }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", "dev": true }, "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", "dev": true, "requires": { - "mime-db": "1.44.0" + "mime-db": "1.51.0" } }, "mimic-response": { @@ -3685,9 +3910,9 @@ "dev": true }, "nan": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", "dev": true, "optional": true }, @@ -3729,27 +3954,27 @@ "dev": true }, "nodemon": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.4.tgz", - "integrity": "sha512-Ltced+hIfTmaS28Zjv1BM552oQ3dbwPqI4+zI0SLgq+wpJhSyqgYude/aZa/3i31VCQWMfXJVxvu86abcam3uQ==", + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz", + "integrity": "sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==", "dev": true, "requires": { - "chokidar": "^3.2.2", - "debug": "^3.2.6", + "chokidar": "^3.5.2", + "debug": "^3.2.7", "ignore-by-default": "^1.0.1", "minimatch": "^3.0.4", - "pstree.remy": "^1.1.7", + "pstree.remy": "^1.1.8", "semver": "^5.7.1", "supports-color": "^5.5.0", "touch": "^3.1.0", - "undefsafe": "^2.0.2", - "update-notifier": "^4.0.0" + "undefsafe": "^2.0.5", + "update-notifier": "^5.1.0" }, "dependencies": { "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -3757,40 +3982,40 @@ } }, "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", "dev": true, "requires": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" + "readdirp": "~3.6.0" } }, "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" } }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, @@ -3804,9 +4029,9 @@ } }, "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "requires": { "picomatch": "^2.2.1" @@ -3842,9 +4067,9 @@ "dev": true }, "normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", "dev": true }, "now-and-later": { @@ -4215,9 +4440,9 @@ "dev": true }, "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", "dev": true }, "pidtree": { @@ -4355,9 +4580,9 @@ "dev": true }, "pupa": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz", - "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", "dev": true, "requires": { "escape-goat": "^2.0.0" @@ -4369,6 +4594,12 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, "rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -4620,9 +4851,9 @@ } }, "registry-auth-token": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz", - "integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", "dev": true, "requires": { "rc": "^1.2.8" @@ -4677,9 +4908,9 @@ "dev": true }, "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", "dev": true }, "repeat-string": { @@ -4822,10 +5053,13 @@ } }, "run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", - "dev": true + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } }, "run-sequence": { "version": "2.2.1", @@ -5024,10 +5258,29 @@ "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", "dev": true }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "dependencies": { + "object-inspect": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.1.tgz", + "integrity": "sha512-If7BjFlpkzzBeV1cqgT3OSWT3azyoxDGajR+iGnFBfVV2EWyDyWaZZW2ERDjUaY2QM8i5jI3Sj7mhsM4DDAqWA==", + "dev": true + } + } + }, "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", "dev": true }, "simple-git": { @@ -5189,9 +5442,9 @@ } }, "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", "dev": true }, "sparkles": { @@ -5462,14 +5715,24 @@ } }, "temp": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.1.tgz", - "integrity": "sha512-WMuOgiua1xb5R56lE0eH6ivpVmg/lq2OHm4+LtT/xtEtPQ+sz6N3bBM6WZ5FvO1lO4IKIOb43qnhoc4qxP5OeA==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", + "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", "dev": true, "requires": { + "mkdirp": "^0.5.1", "rimraf": "~2.6.2" }, "dependencies": { + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, "rimraf": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", @@ -5481,12 +5744,6 @@ } } }, - "term-size": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz", - "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==", - "dev": true - }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -5659,9 +5916,9 @@ "dev": true }, "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, "typedarray": { @@ -5679,38 +5936,38 @@ "is-typedarray": "^1.0.0" } }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, - "undefsafe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", - "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", "dev": true, "requires": { - "debug": "^2.2.0" + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "dev": true } } }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, "undertaker": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz", @@ -5822,40 +6079,40 @@ "dev": true }, "update-notifier": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.1.tgz", - "integrity": "sha512-9y+Kds0+LoLG6yN802wVXoIfxYEwh3FlZwzMwpCZp62S2i1/Jzeqb9Eeeju3NSHccGGasfGlK5/vEHbAifYRDg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", "dev": true, "requires": { - "boxen": "^4.2.0", - "chalk": "^3.0.0", + "boxen": "^5.0.0", + "chalk": "^4.1.0", "configstore": "^5.0.1", "has-yarn": "^2.1.0", "import-lazy": "^2.1.0", "is-ci": "^2.0.0", - "is-installed-globally": "^0.3.1", - "is-npm": "^4.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", "is-yarn-global": "^0.3.0", - "latest-version": "^5.0.0", - "pupa": "^2.0.1", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", "semver-diff": "^3.1.1", "xdg-basedir": "^4.0.0" }, "dependencies": { "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -5883,6 +6140,24 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -5891,13 +6166,19 @@ "requires": { "has-flag": "^4.0.0" } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, "uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "requires": { "punycode": "^2.1.0" @@ -6058,6 +6339,19 @@ "isexe": "^2.0.0" } }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, "which-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", @@ -6074,15 +6368,9 @@ }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "is-fullwidth-code-point": { @@ -6092,23 +6380,23 @@ "dev": true }, "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } } } @@ -6170,9 +6458,9 @@ "dev": true }, "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", "dev": true }, "yafs": { @@ -6188,9 +6476,9 @@ "dev": true }, "yargs": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.1.tgz", - "integrity": "sha512-huO4Fr1f9PmiJJdll5kwoS2e4GqzGSsMT3PPMpOwoVkOK8ckqAewMTZyA6LXVQWflleb/Z8oPBEvNsMft0XE+g==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.2.tgz", + "integrity": "sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==", "dev": true, "requires": { "camelcase": "^3.0.0", @@ -6205,13 +6493,13 @@ "string-width": "^1.0.2", "which-module": "^1.0.0", "y18n": "^3.2.1", - "yargs-parser": "5.0.0-security.0" + "yargs-parser": "^5.0.1" } }, "yargs-parser": { - "version": "5.0.0-security.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0-security.0.tgz", - "integrity": "sha512-T69y4Ps64LNesYxeYGYPvfoMTt/7y1XtfpIslUeK4um+9Hu7hlGoRtaDLvdXb7+/tfq4opVa2HRY5xGip022rQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", + "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", "dev": true, "requires": { "camelcase": "^3.0.0", @@ -6228,15 +6516,15 @@ } }, "zarro": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/zarro/-/zarro-1.78.0.tgz", - "integrity": "sha512-lDpbakbZYnh9TtunnkQqANSaY0v7anNSb3MJyYSAC4HlR/ZpG8NdxzrVdPkLEproM110EkLAdilip4tgtQ72Ww==", + "version": "1.95.0", + "resolved": "https://registry.npmjs.org/zarro/-/zarro-1.95.0.tgz", + "integrity": "sha512-AqRGXmFvQrIix3ZcLs881pEkaIwa89X1JYMtn47ne1Ni4n6BwCexuvLJOJseClfS/XQs6Boesyf0ayP/sOtQYQ==", "dev": true, "requires": { "ansi-colors": "^4.1.1", - "array.prototype.flatmap": "^1.2.3", - "cross-env": "^7.0.2", - "debug": "^4.1.1", + "array.prototype.flatmap": "^1.2.4", + "cross-env": "^7.0.3", + "debug": "^4.3.1", "del": "^5.1.0", "event-stream": "^4.0.1", "fancy-log": "^1.3.3", @@ -6245,9 +6533,9 @@ "gulp-dotnet-cli": "^1.1.0", "gulp-edit-xml": "^3.1.1", "gulp-filter": "^6.0.0", - "gulp-msbuild": "^0.8.0", + "gulp-msbuild": "^0.9.0", "mkdirp": "^1.0.4", - "nodemon": "^2.0.4", + "nodemon": "^2.0.7", "npm-run-all": "^4.1.5", "plugin-error": "^1.0.1", "readline": "^1.3.0", @@ -6258,14 +6546,32 @@ "run-sequence": "^2.2.1", "sax": "^1.2.4", "simple-git": "^1.132.0", - "temp": "^0.9.1", + "temp": "^0.9.4", "through2": "^3.0.2", "undertaker-forward-reference": "^1.0.2", - "vinyl": "^2.2.0", + "vinyl": "^2.2.1", "which": "^2.0.2", "xml2js": "^0.4.23" }, "dependencies": { + "cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.1" + } + }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, "simple-git": { "version": "1.132.0", "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.132.0.tgz", @@ -6275,14 +6581,18 @@ "debug": "^4.0.1" } }, - "through2": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", - "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", "dev": true, "requires": { - "inherits": "^2.0.4", - "readable-stream": "2 || 3" + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" } } } diff --git a/package.json b/package.json index 5523fe717..96a46e6e3 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,6 @@ "simple-git": "^2.20.1", "which": "^2.0.2", "yafs": "^1.5.0", - "zarro": "^1.78.0" + "zarro": "^1.95.0" } } diff --git a/src/log4net/AssemblyInfo.cs b/src/log4net/AssemblyInfo.cs index f7f47aab0..311d0c4ff 100644 --- a/src/log4net/AssemblyInfo.cs +++ b/src/log4net/AssemblyInfo.cs @@ -53,77 +53,77 @@ // #if (CLI_1_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-.CLI 1.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-.CLI 1.0")] [assembly: AssemblyTitle("Apache log4net for CLI 1.0 Compatible Frameworks")] #elif (NET_1_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-.NET 1.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-.NET 1.0")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 1.0")] #elif (NET_1_1) -[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-.NET 1.1")] +[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-.NET 1.1")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 1.1")] #elif (NET_4_5) -[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-.NET 4.5")] +[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-.NET 4.5")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 4.5")] #elif (NET_4_0) #if CLIENT_PROFILE -[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-.NET 4.0 CP")] +[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-.NET 4.0 CP")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 4.0 Client Profile")] #else -[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-.NET 4.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-.NET 4.0")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 4.0")] #endif // Client Profile #elif (NET_3_5) #if CLIENT_PROFILE -[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-.NET 3.5 CP")] +[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-.NET 3.5 CP")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 3.5 Client Profile")] #else -[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-.NET 3.5")] +[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-.NET 3.5")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 3.5")] #endif // Client Profile #elif (NET_2_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-.NET 2.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-.NET 2.0")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 2.0")] #elif (NETCF_1_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-.NETCF 1.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-.NETCF 1.0")] [assembly: AssemblyTitle("Apache log4net for .NET Compact Framework 1.0")] #elif (NETCF_2_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-.NETCF 2.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-.NETCF 2.0")] [assembly: AssemblyTitle("Apache log4net for .NET Compact Framework 2.0")] #elif (MONO_1_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-Mono 1.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-Mono 1.0")] [assembly: AssemblyTitle("Apache log4net for Mono 1.0")] #elif (MONO_2_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-Mono 2.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-Mono 2.0")] [assembly: AssemblyTitle("Apache log4net for Mono 2.0")] #elif (MONO_3_5) -[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-Mono 3.5")] +[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-Mono 3.5")] [assembly: AssemblyTitle("Apache log4net for Mono 3.5")] #elif (MONO_4_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-Mono 4.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-Mono 4.0")] [assembly: AssemblyTitle("Apache log4net for Mono 4.0")] #elif (SSCLI_1_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-SSCLI 1.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-SSCLI 1.0")] [assembly: AssemblyTitle("Apache log4net for Shared Source CLI 1.0")] #elif (NET) -[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-.NET")] +[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-.NET")] [assembly: AssemblyTitle("Apache log4net for .NET Framework")] #elif (NETSTANDARD1_3) -[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-.NET Standard 1.3")] +[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-.NET Standard 1.3")] [assembly: AssemblyTitle("Apache log4net for .NET Standard 1.3")] #elif (NETSTANDARD2_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-.NET Standard 2.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-.NET Standard 2.0")] [assembly: AssemblyTitle("Apache log4net for .NET Standard 2.0")] #elif (NETCF) -[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-.NETCF")] +[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-.NETCF")] [assembly: AssemblyTitle("Apache log4net for .NET Compact Framework")] #elif (MONO) -[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-Mono")] +[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-Mono")] [assembly: AssemblyTitle("Apache log4net for Mono")] #elif (SSCLI) -[assembly: AssemblyInformationalVersionAttribute("2.0.13.0-SSCLI")] +[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-SSCLI")] [assembly: AssemblyTitle("Apache log4net for Shared Source CLI")] #else -[assembly: AssemblyInformationalVersionAttribute("2.0.13.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.14.0")] [assembly: AssemblyTitle("Apache log4net")] #endif diff --git a/src/log4net/log4net.csproj b/src/log4net/log4net.csproj index 4115607ec..6de258f4d 100644 --- a/src/log4net/log4net.csproj +++ b/src/log4net/log4net.csproj @@ -1,13 +1,21 @@  log4net - 2.0.13 + 2.0.14 Codestin Search App Apache log4net - log4net is a tool to help the programmer output log statements to a variety of output targets. In case of problems with an application, it is helpful to enable logging so that the problem can be located. With log4net it is possible to enable logging at runtime without modifying the application binary. The log4net package is designed so that log statements can remain in shipped code without incurring a high performance cost. It follows that the speed of logging (or rather not logging) is crucial. + log4net is a tool to help the programmer output log statements to a variety of output targets. + In case of problems with an application, it is helpful to enable logging so that the problem + can be located. With log4net it is possible to enable logging at runtime without modifying the + application binary. The log4net package is designed so that log statements can remain in + shipped code without incurring a high performance cost. It follows that the speed of logging + (or rather not logging) is crucial. - At the same time, log output can be so voluminous that it quickly becomes overwhelming. One of the distinctive features of log4net is the notion of hierarchical loggers. Using these loggers it is possible to selectively control which log statements are output at arbitrary granularity. + At the same time, log output can be so voluminous that it quickly becomes overwhelming. + One of the distinctive features of log4net is the notion of hierarchical loggers. + Using these loggers it is possible to selectively control which log statements are output + at arbitrary granularity. log4net is designed with two distinct goals in mind: speed and flexibility diff --git a/src/site/xdoc/download_log4net.xml b/src/site/xdoc/download_log4net.xml index da0b91efe..ccc7f2fcf 100644 --- a/src/site/xdoc/download_log4net.xml +++ b/src/site/xdoc/download_log4net.xml @@ -41,9 +41,9 @@ limitations under the License. - - - + + +
    apache-log4net-source-2.0.13.zipsha512pgpapache-log4net-source-2.0.14.zipsha512pgp
    @@ -52,14 +52,14 @@ limitations under the License.

    Binaries are available in a zip file or nupkg, which is also available from nuget.org

    - - - + + + - - - + + +
    log4net-binaries-2.0.13.zipsha512pgplog4net-binaries-2.0.14.zipsha512pgp
    log4net-2.0.13.nupkgsha512pgplog4net-2.0.14.nupkgsha512pgp
    diff --git a/src/site/xdoc/release/release-notes.xml b/src/site/xdoc/release/release-notes.xml index 9b2a57ce5..fe410cef2 100644 --- a/src/site/xdoc/release/release-notes.xml +++ b/src/site/xdoc/release/release-notes.xml @@ -27,6 +27,20 @@ limitations under the License.
    +
    + Apache log4net 2.0.14 is a minor release to address some reported issues + and accept a pull request provided by a community member: +
    +
      +
    • Pull request by @NicholasNoise to address issues with logging via ado appender to PostgreSQL
    • +
    • Community request to correctly handle null data in ReadOnlyPropertiesDictionary
    • +
    • Pull request by @erikma to use the numeric thread id for .net worker pool threads + (LOG4NET-680)
    • +
    • Pull request by @erikma to dispose of WindowsIdentity retrieved in TryGetCurrentUserName() + (LOG4NET-671)
    • +
    +
    +
    Apache log4net 2.0.13 is a minor release to address some reported issues and accept some pull requests provided by community members: From a64d8848005efdff1de9ffaa8f7d0775b4371c1e Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Thu, 16 Dec 2021 10:09:48 +0200 Subject: [PATCH 038/122] :bookmark: update versioning to 2.0.14.0 --- src/log4net/AssemblyVersionInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/log4net/AssemblyVersionInfo.cs b/src/log4net/AssemblyVersionInfo.cs index c10b79027..fd0b3defd 100644 --- a/src/log4net/AssemblyVersionInfo.cs +++ b/src/log4net/AssemblyVersionInfo.cs @@ -28,11 +28,11 @@ // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: System.Reflection.AssemblyVersion("2.0.13.0")] +[assembly: System.Reflection.AssemblyVersion("2.0.14.0")] #if !NETCF #if !SSCLI -[assembly: System.Reflection.AssemblyFileVersion("2.0.13.0")] +[assembly: System.Reflection.AssemblyFileVersion("2.0.14.0")] #endif #endif From 107fbc0c8edb1d19b82d1cfe9deb37a84481133c Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Thu, 16 Dec 2021 10:23:25 +0200 Subject: [PATCH 039/122] :truck: move legacy release instructions; whilst perhaps outdated, there could still be usefulness in here --- ReleaseInstructions.txt => doc/ReleaseInstructions-legacy.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename ReleaseInstructions.txt => doc/ReleaseInstructions-legacy.txt (100%) diff --git a/ReleaseInstructions.txt b/doc/ReleaseInstructions-legacy.txt similarity index 100% rename from ReleaseInstructions.txt rename to doc/ReleaseInstructions-legacy.txt From dfe14c7c8dd344dae7e1136494fc51edba123ef2 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Thu, 16 Dec 2021 10:27:42 +0200 Subject: [PATCH 040/122] :wrench: should exclude executables from source zip --- local-tasks/zip.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/local-tasks/zip.js b/local-tasks/zip.js index 1225a21c1..3876fb864 100644 --- a/local-tasks/zip.js +++ b/local-tasks/zip.js @@ -40,7 +40,8 @@ gulp.task("zip-source", async () => { "!build", "!build/**/*", "!.idea", - "!.idea/**/*" + "!.idea/**/*", + "!*.exe" ]) .pipe(rename(path => { path.dirname = `${baseDir}/${path.dirname}` From 3862b3fb61514dea00d2bae2aae78d8e82777557 Mon Sep 17 00:00:00 2001 From: Matt Sicker Date: Sun, 19 Dec 2021 15:40:16 -0600 Subject: [PATCH 041/122] Update copyright year and https url --- NOTICE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NOTICE b/NOTICE index 86d4dfedd..35c2b634c 100644 --- a/NOTICE +++ b/NOTICE @@ -1,5 +1,5 @@ Apache log4net - Copyright 2004-2017 The Apache Software Foundation + Copyright 2004-2021 The Apache Software Foundation This product includes software developed at - The Apache Software Foundation (http://www.apache.org/). + The Apache Software Foundation (https://www.apache.org/). From b154a78d9f977dbc7234e8619cebcef75ba3c443 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Fri, 31 Dec 2021 15:39:54 +0200 Subject: [PATCH 042/122] :memo: update release docs for post-vote process --- doc/RELEASING.md | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/doc/RELEASING.md b/doc/RELEASING.md index 584bf5cca..4858d5217 100644 --- a/doc/RELEASING.md +++ b/doc/RELEASING.md @@ -55,11 +55,22 @@ release version 2.0.123: 11. create an rc-releasd at GitHub with a tag like `rc/2.0.123-rc1` - attach all the files from the build/artifacts folder, _including signatures_ 12. get the artifacts in build/artifacts up to https://downloads.apache.org/logging/log4net/ - - currently, I have to as another ASF member for help with this - - I also see release notes there - which are out of date (don't know how to update) + - `svn co https://dist.apache.org/repos/dist/dev/logging -N apache-dist-logging-dev` + - `cd apache-dist-logging-dev` + - `svn up log4net` + - copy in source & binary artifacts to respective locations + - `svn delete` old items + - `svn commit` 13. raise a vote on the log4net mailing list (dev@logging.apache.org) 14. wait 15. when the vote has 3 or more +1's, it's time to go live! +16. copy the apache artifacts (binary and source) to the release svn repo and commit + - `svn co https://dist.apache.org/repos/dist/release/logging -N apache-dist-logging-release` + - `cd apache-dist-logging-release` + - `svn up log4net` + - copy in source & binary artifacts to respective locations + - `svn delete` old items + - `svn commit` 16. push the .nupkg to nuget.org 17. don't forget to make the docs live: in the logging-log4net-site folder: - `git checkout asf-site` From e817e2a06ca8d7f738965b4804e22c2a7f874a31 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Fri, 31 Dec 2021 15:52:52 +0200 Subject: [PATCH 043/122] :bug: :memo: should mention 2.0.14, not 2.0.13 --- src/site/xdoc/download_log4net.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/site/xdoc/download_log4net.xml b/src/site/xdoc/download_log4net.xml index ccc7f2fcf..0ce385268 100644 --- a/src/site/xdoc/download_log4net.xml +++ b/src/site/xdoc/download_log4net.xml @@ -36,7 +36,7 @@ limitations under the License.
    -
    +
    From acc55ec1754824e385ad2812d936ecd43407e6e2 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Fri, 21 Jan 2022 15:18:23 +0200 Subject: [PATCH 044/122] :fire: remove dead commented code --- src/log4net/Util/OptionConverter.cs | 103 ---------------------------- 1 file changed, 103 deletions(-) diff --git a/src/log4net/Util/OptionConverter.cs b/src/log4net/Util/OptionConverter.cs index 776bcc252..21eabfe59 100644 --- a/src/log4net/Util/OptionConverter.cs +++ b/src/log4net/Util/OptionConverter.cs @@ -18,7 +18,6 @@ #endregion using System; -using System.Collections; using System.Globalization; using System.Reflection; using System.Text; @@ -58,79 +57,6 @@ private OptionConverter() #region Public Static Methods -// /// -// /// Concatenates two string arrays. -// /// -// /// Left array. -// /// Right array. -// /// Array containing both left and right arrays. -// public static string[] ConcatenateArrays(string[] l, string[] r) -// { -// return (string[])ConcatenateArrays(l, r); -// } - -// /// -// /// Concatenates two arrays. -// /// -// /// Left array -// /// Right array -// /// Array containing both left and right arrays. -// public static Array ConcatenateArrays(Array l, Array r) -// { -// if (l == null) -// { -// throw new ArgumentNullException("l"); -// } -// if (r == null) -// { -// throw new ArgumentNullException("r"); -// } -// -// int len = l.Length + r.Length; -// Array a = Array.CreateInstance(l.GetType(), len); -// -// Array.Copy(l, 0, a, 0, l.Length); -// Array.Copy(r, 0, a, l.Length, r.Length); -// -// return a; -// } - -// /// -// /// Converts string escape characters back to their correct values. -// /// -// /// String to convert. -// /// Converted result. -// public static string ConvertSpecialChars(string s) -// { -// if (s == null) -// { -// throw new ArgumentNullException("s"); -// } -// char c; -// int len = s.Length; -// StringBuilder buf = new StringBuilder(len); -// -// int i = 0; -// while(i < len) -// { -// c = s[i++]; -// if (c == '\\') -// { -// c = s[i++]; -// if (c == 'n') c = '\n'; -// else if (c == 'r') c = '\r'; -// else if (c == 't') c = '\t'; -// else if (c == 'f') c = '\f'; -// else if (c == '\b') c = '\b'; -// else if (c == '\"') c = '\"'; -// else if (c == '\'') c = '\''; -// else if (c == '\\') c = '\\'; -// } -// buf.Append(c); -// } -// return buf.ToString(); -// } - /// /// Converts a string to a value. /// @@ -160,35 +86,6 @@ public static bool ToBoolean(string argValue, bool defaultValue) return defaultValue; } -// /// -// /// Converts a string to an integer. -// /// -// /// String to convert. -// /// The default value. -// /// The value of . -// /// -// /// -// /// is returned when -// /// cannot be converted to a value. -// /// -// /// -// public static int ToInt(string argValue, int defaultValue) -// { -// if (argValue != null) -// { -// string s = argValue.Trim(); -// try -// { -// return int.Parse(s, NumberFormatInfo.InvariantInfo); -// } -// catch (Exception e) -// { -// LogLog.Error(declaringType, "OptionConverter: [" + s + "] is not in proper int form.", e); -// } -// } -// return defaultValue; -// } - /// /// Parses a file size into a number. /// From 54ca7c355e6de708014d36303e29bb4e6a172a90 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Mon, 24 Jan 2022 10:11:34 +0200 Subject: [PATCH 045/122] :alembic: provide "proper" namespacing on netstandard only, reverting to `log4net:event` and similar for .net framework --- .../log4net-672/Program.cs | 102 ++++++++++++++++++ .../log4net-672/log4net-672.csproj | 23 ++++ .../log4net-672/log4net.config | 18 ++++ src/log4net.sln | 13 +++ src/log4net/Layout/XmlLayout.cs | 28 ++++- src/log4net/Layout/XmlLayoutSchemaLog4j.cs | 28 +++++ 6 files changed, 210 insertions(+), 2 deletions(-) create mode 100644 src/integration-testing/log4net-672/Program.cs create mode 100644 src/integration-testing/log4net-672/log4net-672.csproj create mode 100644 src/integration-testing/log4net-672/log4net.config diff --git a/src/integration-testing/log4net-672/Program.cs b/src/integration-testing/log4net-672/Program.cs new file mode 100644 index 000000000..64be479b0 --- /dev/null +++ b/src/integration-testing/log4net-672/Program.cs @@ -0,0 +1,102 @@ +using System; +using System.IO; +using System.Reflection; +using System.Xml; +using log4net; +using log4net.Config; +using log4net.Core; + +if (true) +{ + var appPath = new Uri(Assembly.GetExecutingAssembly().Location).LocalPath; + var appFolder = Path.GetDirectoryName(appPath); + if (appFolder is null) + { + throw new InvalidOperationException( + $"Can't determine app folder for {appPath}" + ); + } + + var configFile = Path.Combine(appFolder, "log4net.config"); + if (!File.Exists(configFile)) + { + throw new InvalidOperationException($"log4net.config not found at {configFile}"); + } + + var info = new FileInfo(configFile); + + XmlConfigurator.Configure(info); + + var logger = LogManager.GetLogger("main"); + + for (var i = 0; i < 10; i++) + { + logger.Info($"test log {i}"); + } + + LogManager.Flush(int.MaxValue); +} + +// Sample.Main(); +// +// public class Sample +// { +// private const string filename = "sampledata.xml"; +// +// public static void Main() +// { +// +// XmlTextWriter writer = new XmlTextWriter (filename, null); +// //Use indenting for readability. +// writer.Formatting = Formatting.Indented; +// +// writer.WriteComment("sample XML fragment"); +// +// //Write an element (this one is the root). +// writer.WriteStartElement("bookstore"); +// +// //Write the namespace declaration. +// writer.WriteAttributeString("xmlns", "bk", null, "log4net"); +// +// writer.WriteStartElement("book"); +// +// //Lookup the prefix and then write the ISBN attribute. +// string prefix = writer.LookupPrefix("urn:samples"); +// writer.WriteStartAttribute(prefix, "ISBN", "urn:samples"); +// writer.WriteString("1-861003-78"); +// writer.WriteEndAttribute(); +// +// //Write the title. +// writer.WriteStartElement("title"); +// writer.WriteString("The Handmaid's Tale"); +// writer.WriteEndElement(); +// +// //Write the price. +// writer.WriteElementString("price", "19.95"); +// +// //Write the style element. +// writer.WriteStartElement(prefix, "style", "urn:samples"); +// writer.WriteString("hardcover"); +// writer.WriteEndElement(); +// +// //Write the end tag for the book element. +// writer.WriteEndElement(); +// +// //Write the close tag for the root element. +// writer.WriteEndElement(); +// +// //Write the XML to file and close the writer. +// writer.Flush(); +// writer.Close(); +// +// //Read the file back in and parse to ensure well formed XML. +// XmlDocument doc = new XmlDocument(); +// //Preserve white space for readability. +// doc.PreserveWhitespace = true; +// //Load the file +// doc.Load(filename); +// +// //Write the XML content to the console. +// Console.Write(doc.InnerXml); +// } +// } diff --git a/src/integration-testing/log4net-672/log4net-672.csproj b/src/integration-testing/log4net-672/log4net-672.csproj new file mode 100644 index 000000000..e0ac3505b --- /dev/null +++ b/src/integration-testing/log4net-672/log4net-672.csproj @@ -0,0 +1,23 @@ + + + + Exe + net6.0 + log4net_672 + disable + enable + preview + NETSTANDARD + + + + + + + + + Always + + + + diff --git a/src/integration-testing/log4net-672/log4net.config b/src/integration-testing/log4net-672/log4net.config new file mode 100644 index 000000000..0e685d603 --- /dev/null +++ b/src/integration-testing/log4net-672/log4net.config @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/log4net.sln b/src/log4net.sln index c08c55c2d..ae6d168ae 100644 --- a/src/log4net.sln +++ b/src/log4net.sln @@ -24,6 +24,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "log4net", "log4net\log4net. EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "log4net.Tests", "log4net.Tests\log4net.Tests.csproj", "{B0530F10-0238-49A9-93B0-8EF412E90BCF}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "integration-testing", "integration-testing", "{8953473C-EEE8-4740-993D-B8E10FA876CD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "log4net-672", "integration-testing\log4net-672\log4net-672.csproj", "{9050922E-E22E-4FF5-A1B0-2F21745C6882}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -43,8 +47,17 @@ Global {B0530F10-0238-49A9-93B0-8EF412E90BCF}.Release|Any CPU.Build.0 = Release|Any CPU {B0530F10-0238-49A9-93B0-8EF412E90BCF}.CrossPlatform|Any CPU.ActiveCfg = CrossPlatform|Any CPU {B0530F10-0238-49A9-93B0-8EF412E90BCF}.CrossPlatform|Any CPU.Build.0 = CrossPlatform|Any CPU + {9050922E-E22E-4FF5-A1B0-2F21745C6882}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9050922E-E22E-4FF5-A1B0-2F21745C6882}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9050922E-E22E-4FF5-A1B0-2F21745C6882}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9050922E-E22E-4FF5-A1B0-2F21745C6882}.Release|Any CPU.Build.0 = Release|Any CPU + {9050922E-E22E-4FF5-A1B0-2F21745C6882}.CrossPlatform|Any CPU.ActiveCfg = Debug|Any CPU + {9050922E-E22E-4FF5-A1B0-2F21745C6882}.CrossPlatform|Any CPU.Build.0 = Debug|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {9050922E-E22E-4FF5-A1B0-2F21745C6882} = {8953473C-EEE8-4740-993D-B8E10FA876CD} + EndGlobalSection EndGlobal diff --git a/src/log4net/Layout/XmlLayout.cs b/src/log4net/Layout/XmlLayout.cs index 66b7dcf8f..7c5c0c291 100644 --- a/src/log4net/Layout/XmlLayout.cs +++ b/src/log4net/Layout/XmlLayout.cs @@ -160,7 +160,6 @@ public bool Base64EncodeProperties set {m_base64Properties=value;} } - #endregion Public Instance Properties #region Implementation of IOptionHandler @@ -199,7 +198,7 @@ public override void ActivateOptions() m_elmLocation = m_prefix + ":" + ELM_LOCATION; } } - + #endregion Implementation of IOptionHandler #region Override implementation of XMLLayoutBase @@ -217,7 +216,12 @@ public override void ActivateOptions() /// protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent) { + #if NETSTANDARD + writer.WriteStartElement(m_prefix, ELM_EVENT, m_prefix); + // writer.WriteAttributeString("xmlns", "log4net", null, "http://logging.apache.org/log4net/schemas/log4net-events-1.2"); + #else writer.WriteStartElement(m_elmEvent); + #endif writer.WriteAttributeString(ATTR_LOGGER, loggingEvent.LoggerName); #if NET_2_0 || NETCF_2_0 || MONO_2_0 || NETSTANDARD @@ -243,7 +247,11 @@ protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent) } // Append the message text + #if NETSTANDARD + writer.WriteStartElement(m_prefix, ELM_MESSAGE, m_prefix); + #else writer.WriteStartElement(m_elmMessage); + #endif if (!this.Base64EncodeMessage) { Transform.WriteEscapedXmlString(writer, loggingEvent.RenderedMessage, this.InvalidCharReplacement); @@ -261,10 +269,18 @@ protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent) // Append the properties text if (properties.Count > 0) { + #if NETSTANDARD + writer.WriteStartElement(m_prefix, ELM_PROPERTIES, m_prefix); + #else writer.WriteStartElement(m_elmProperties); + #endif foreach(System.Collections.DictionaryEntry entry in properties) { + #if NETSTANDARD + writer.WriteStartElement(m_prefix, ELM_DATA, m_prefix); + #else writer.WriteStartElement(m_elmData); + #endif writer.WriteAttributeString(ATTR_NAME, Transform.MaskXmlInvalidCharacters((string)entry.Key,this.InvalidCharReplacement)); // Use an ObjectRenderer to convert the object to a string @@ -289,7 +305,11 @@ protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent) if (exceptionStr != null && exceptionStr.Length > 0) { // Append the stack trace line + #if NETSTANDARD + writer.WriteStartElement(m_prefix, ELM_EXCEPTION, m_prefix); + #else writer.WriteStartElement(m_elmException); + #endif Transform.WriteEscapedXmlString(writer, exceptionStr,this.InvalidCharReplacement); writer.WriteEndElement(); } @@ -298,7 +318,11 @@ protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent) { LocationInfo locationInfo = loggingEvent.LocationInformation; + #if NETSTANDARD + writer.WriteStartElement(m_prefix, ELM_LOCATION, m_prefix); + #else writer.WriteStartElement(m_elmLocation); + #endif writer.WriteAttributeString(ATTR_CLASS, locationInfo.ClassName); writer.WriteAttributeString(ATTR_METHOD, locationInfo.MethodName); writer.WriteAttributeString(ATTR_FILE, locationInfo.FileName); diff --git a/src/log4net/Layout/XmlLayoutSchemaLog4j.cs b/src/log4net/Layout/XmlLayoutSchemaLog4j.cs index 19dde79db..d5ac73fde 100644 --- a/src/log4net/Layout/XmlLayoutSchemaLog4j.cs +++ b/src/log4net/Layout/XmlLayoutSchemaLog4j.cs @@ -172,7 +172,11 @@ protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent) } // Write the start element + #if NETSTANDARD writer.WriteStartElement("log4j", "event", "log4net"); + #else + writer.WriteStartElement("log4j:event"); + #endif writer.WriteAttributeString("logger", loggingEvent.LoggerName); // Calculate the timestamp as the number of milliseconds since january 1970 @@ -187,7 +191,11 @@ protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent) writer.WriteAttributeString("thread", loggingEvent.ThreadName); // Append the message text + #if NETSTANDARD writer.WriteStartElement("log4j", "message", "log4net"); + #else + writer.WriteStartElement("log4j:message"); + #endif Transform.WriteEscapedXmlString(writer, loggingEvent.RenderedMessage,this.InvalidCharReplacement); writer.WriteEndElement(); @@ -199,7 +207,11 @@ protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent) if (valueStr != null && valueStr.Length > 0) { // Append the NDC text + #if NETSTANDARD writer.WriteStartElement("log4j", "NDC", "log4net"); + #else + writer.WriteStartElement("log4j:NDC"); + #endif Transform.WriteEscapedXmlString(writer, valueStr,this.InvalidCharReplacement); writer.WriteEndElement(); } @@ -209,10 +221,18 @@ protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent) PropertiesDictionary properties = loggingEvent.GetProperties(); if (properties.Count > 0) { + #if NETSTANDARD writer.WriteStartElement("log4j", "properties", "log4net"); + #else + writer.WriteStartElement("log4j:properties"); + #endif foreach(System.Collections.DictionaryEntry entry in properties) { + #if NETSTANDARD writer.WriteStartElement("log4j", "data", "log4net"); + #else + writer.WriteStartElement("log4j:data"); + #endif writer.WriteAttributeString("name", (string)entry.Key); // Use an ObjectRenderer to convert the object to a string @@ -228,7 +248,11 @@ protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent) if (exceptionStr != null && exceptionStr.Length > 0) { // Append the stack trace line + #if NETSTANDARD writer.WriteStartElement("log4j", "throwable", "log4net"); + #else + writer.WriteStartElement("log4j:throwable"); + #endif Transform.WriteEscapedXmlString(writer, exceptionStr,this.InvalidCharReplacement); writer.WriteEndElement(); } @@ -237,7 +261,11 @@ protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent) { LocationInfo locationInfo = loggingEvent.LocationInformation; + #if NETSTANDARD writer.WriteStartElement("log4j", "locationInfo", "log4net"); + #else + writer.WriteStartElement("log4j:locationInfo"); + #endif writer.WriteAttributeString("class", locationInfo.ClassName); writer.WriteAttributeString("method", locationInfo.MethodName); writer.WriteAttributeString("file", locationInfo.FileName); From e148f158ffd084ff1315577c15e5f54fa81e2fd7 Mon Sep 17 00:00:00 2001 From: "Bipul Raman (MSFT)" <8312486+BipulRaman@users.noreply.github.com> Date: Sun, 20 Feb 2022 21:56:40 +0530 Subject: [PATCH 046/122] Link Correction. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 85e2fdbfb..c118dc46b 100644 --- a/README.md +++ b/README.md @@ -36,8 +36,8 @@ install relevant SDKs and build for those targets. In particular, older Client Profile .NET Framework targets and dotnet core 1.1 may be installed by using the bundled helper scripts: -- [install-net-framework-sdk-3.5.ps1]() -- [install-dotnet-core-sdk-1.1.ps1]() +- [install-net-framework-sdk-3.5.ps1](install-net-framework-sdk-3.5.ps1) +- [install-dotnet-core-sdk-1.1.ps1](install-dotnet-core-sdk-1.1.ps1) These scripts download the relevant installers from Microsoft servers, but you run them at your own risk. From 025d7f6ac197fc8ca92c776b14d9205d6b899168 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Tue, 22 Feb 2022 12:43:47 +0200 Subject: [PATCH 047/122] :zap: cache resolved windows username when available --- src/log4net/Core/LoggingEvent.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/log4net/Core/LoggingEvent.cs b/src/log4net/Core/LoggingEvent.cs index 26b76ba57..8d89ff935 100644 --- a/src/log4net/Core/LoggingEvent.cs +++ b/src/log4net/Core/LoggingEvent.cs @@ -922,6 +922,8 @@ public string ThreadName public string UserName => m_data.UserName ??= TryGetCurrentUserName() ?? SystemInfo.NotAvailableText; + private static string _cachedWindowsIdentityName; + private static string TryGetCurrentUserName() { #if (NETCF || SSCLI || NETSTANDARD1_3) @@ -937,10 +939,13 @@ private static string TryGetCurrentUserName() try { - using (WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent()) + if (_cachedWindowsIdentityName is not null) { - return windowsIdentity?.Name ?? ""; + return _cachedWindowsIdentityName; } + + using var windowsIdentity = WindowsIdentity.GetCurrent(); + return _cachedWindowsIdentityName = windowsIdentity?.Name ?? ""; } catch (PlatformNotSupportedException) { From 03f686c2ace7dfbff81a32284c4d610dda4a55a0 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Tue, 22 Feb 2022 16:29:41 +0200 Subject: [PATCH 048/122] Revert ":zap: cache resolved windows username when available" This reverts commit 025d7f6ac197fc8ca92c776b14d9205d6b899168. --- src/log4net/Core/LoggingEvent.cs | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/log4net/Core/LoggingEvent.cs b/src/log4net/Core/LoggingEvent.cs index 8d89ff935..26b76ba57 100644 --- a/src/log4net/Core/LoggingEvent.cs +++ b/src/log4net/Core/LoggingEvent.cs @@ -922,8 +922,6 @@ public string ThreadName public string UserName => m_data.UserName ??= TryGetCurrentUserName() ?? SystemInfo.NotAvailableText; - private static string _cachedWindowsIdentityName; - private static string TryGetCurrentUserName() { #if (NETCF || SSCLI || NETSTANDARD1_3) @@ -939,13 +937,10 @@ private static string TryGetCurrentUserName() try { - if (_cachedWindowsIdentityName is not null) + using (WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent()) { - return _cachedWindowsIdentityName; + return windowsIdentity?.Name ?? ""; } - - using var windowsIdentity = WindowsIdentity.GetCurrent(); - return _cachedWindowsIdentityName = windowsIdentity?.Name ?? ""; } catch (PlatformNotSupportedException) { From 9305ea9b46276c0ff5e5e200903390f6d995e454 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Fri, 11 Mar 2022 17:10:27 +0200 Subject: [PATCH 049/122] :bug: should test rolling file name case-insensitive --- .../log4net-672/Program.cs | 151 +- .../log4net-672/log4net-672.csproj | 4 + .../Appender/RollingFileAppenderTest.cs | 4028 +++++++++-------- src/log4net/Appender/RollingFileAppender.cs | 150 +- src/log4net/Core/LoggingEvent.cs | 39 +- 5 files changed, 2234 insertions(+), 2138 deletions(-) diff --git a/src/integration-testing/log4net-672/Program.cs b/src/integration-testing/log4net-672/Program.cs index 64be479b0..79f476119 100644 --- a/src/integration-testing/log4net-672/Program.cs +++ b/src/integration-testing/log4net-672/Program.cs @@ -1,102 +1,91 @@ using System; +using System.Collections.Generic; using System.IO; +using System.Linq; using System.Reflection; -using System.Xml; using log4net; using log4net.Config; -using log4net.Core; -if (true) +const int NO_ERROR = 0; +const int MISSING_LOGS = 1; +const int OVERWRITTEN_LOGS = 2; + +var appPath = new Uri(Assembly.GetExecutingAssembly().Location).LocalPath; +var appFolder = Path.GetDirectoryName(appPath); +if (appFolder is null) +{ + throw new InvalidOperationException( + $"Can't determine app folder for {appPath}" + ); +} + +var logFolder = Path.Combine(appFolder, "Logs"); +if (Directory.Exists(logFolder)) +{ + Directory.Delete(logFolder, recursive: true); +} + +var configFile = Path.Combine(appFolder, "log4net.config"); +if (!File.Exists(configFile)) { - var appPath = new Uri(Assembly.GetExecutingAssembly().Location).LocalPath; - var appFolder = Path.GetDirectoryName(appPath); - if (appFolder is null) + throw new InvalidOperationException($"log4net.config not found at {configFile}"); +} + +var logCount = 10; +var identifiers = new List(); +for (var i = 0; i < 10; i++) +{ + var identifier = Guid.NewGuid(); + identifiers.Add(identifier); + var logged = LogWith(identifier, logCount); + if (logged != logCount) { - throw new InvalidOperationException( - $"Can't determine app folder for {appPath}" - ); + Die($"Missing logs immediately for '{identifier}' - found {logged}/{logCount}", MISSING_LOGS); } +} - var configFile = Path.Combine(appFolder, "log4net.config"); - if (!File.Exists(configFile)) +foreach (var identifier in identifiers) +{ + var logged = CountIdentifierInLogs(identifier); + if (logged != logCount) { - throw new InvalidOperationException($"log4net.config not found at {configFile}"); + Die($"Logs have been overwritten for '{identifier}' - found {logged}/{logCount}", OVERWRITTEN_LOGS); } +} - var info = new FileInfo(configFile); +Console.WriteLine("All good: LOG4NET-672 is resolved"); +return NO_ERROR; - XmlConfigurator.Configure(info); +void Die(string message, int exitCode) +{ + Console.Error.WriteLine(message); + Environment.Exit(exitCode); +} + +int CountIdentifierInLogs(Guid id) +{ + return Directory.EnumerateFiles("Logs").Select( + filePath => CountIdentifierInFile(id, filePath) + ).Sum(); +} + +int CountIdentifierInFile(Guid id, string filePath) +{ + var contents = File.ReadAllLines(filePath); + return contents.Count(line => line.Contains(id.ToString())); +} +int LogWith(Guid identifier, int howManyLogs) +{ + var info = new FileInfo(configFile); + XmlConfigurator.Configure(info); var logger = LogManager.GetLogger("main"); - for (var i = 0; i < 10; i++) + for (var i = 0; i < howManyLogs; i++) { - logger.Info($"test log {i}"); + logger.Info($"test log {i} [{identifier}]"); } LogManager.Flush(int.MaxValue); -} - -// Sample.Main(); -// -// public class Sample -// { -// private const string filename = "sampledata.xml"; -// -// public static void Main() -// { -// -// XmlTextWriter writer = new XmlTextWriter (filename, null); -// //Use indenting for readability. -// writer.Formatting = Formatting.Indented; -// -// writer.WriteComment("sample XML fragment"); -// -// //Write an element (this one is the root). -// writer.WriteStartElement("bookstore"); -// -// //Write the namespace declaration. -// writer.WriteAttributeString("xmlns", "bk", null, "log4net"); -// -// writer.WriteStartElement("book"); -// -// //Lookup the prefix and then write the ISBN attribute. -// string prefix = writer.LookupPrefix("urn:samples"); -// writer.WriteStartAttribute(prefix, "ISBN", "urn:samples"); -// writer.WriteString("1-861003-78"); -// writer.WriteEndAttribute(); -// -// //Write the title. -// writer.WriteStartElement("title"); -// writer.WriteString("The Handmaid's Tale"); -// writer.WriteEndElement(); -// -// //Write the price. -// writer.WriteElementString("price", "19.95"); -// -// //Write the style element. -// writer.WriteStartElement(prefix, "style", "urn:samples"); -// writer.WriteString("hardcover"); -// writer.WriteEndElement(); -// -// //Write the end tag for the book element. -// writer.WriteEndElement(); -// -// //Write the close tag for the root element. -// writer.WriteEndElement(); -// -// //Write the XML to file and close the writer. -// writer.Flush(); -// writer.Close(); -// -// //Read the file back in and parse to ensure well formed XML. -// XmlDocument doc = new XmlDocument(); -// //Preserve white space for readability. -// doc.PreserveWhitespace = true; -// //Load the file -// doc.Load(filename); -// -// //Write the XML content to the console. -// Console.Write(doc.InnerXml); -// } -// } + return CountIdentifierInLogs(identifier); +} \ No newline at end of file diff --git a/src/integration-testing/log4net-672/log4net-672.csproj b/src/integration-testing/log4net-672/log4net-672.csproj index e0ac3505b..5a134f92c 100644 --- a/src/integration-testing/log4net-672/log4net-672.csproj +++ b/src/integration-testing/log4net-672/log4net-672.csproj @@ -20,4 +20,8 @@ + + + + diff --git a/src/log4net.Tests/Appender/RollingFileAppenderTest.cs b/src/log4net.Tests/Appender/RollingFileAppenderTest.cs index 7280eec0f..d6cee4b90 100644 --- a/src/log4net.Tests/Appender/RollingFileAppenderTest.cs +++ b/src/log4net.Tests/Appender/RollingFileAppenderTest.cs @@ -1,4 +1,5 @@ #region Apache License + // // Licensed to the Apache Software Foundation (ASF) under one or more // contributor license agreements. See the NOTICE file distributed with @@ -15,6 +16,7 @@ // See the License for the specific language governing permissions and // limitations under the License. // + #endregion using System; @@ -23,2036 +25,2118 @@ using System.IO; using System.Text; using System.Text.RegularExpressions; - using log4net.Appender; using log4net.Core; using log4net.Layout; using log4net.Repository.Hierarchy; using log4net.Util; - using NUnit.Framework; using System.Globalization; namespace log4net.Tests.Appender { - /// - /// Used for internal unit testing the class. - /// - [TestFixture] - public class RollingFileAppenderTest - { - private const string c_fileName = "test_41d3d834_4320f4da.log"; - private const string c_testMessage98Chars = "01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567"; - private const string c_testMessage99Chars = "012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678"; - private const int c_iMaximumFileSize = 450; // in bytes - private int _iMessagesLoggedThisFile = 0; - private int _iMessagesLogged = 0; - private int _iCountDirection = 0; - private int _MaxSizeRollBackups = 3; - private CountingAppender _caRoot; - private Logger _root; + /// + /// Used for internal unit testing the class. + /// + [TestFixture] + public class RollingFileAppenderTest + { + private const string c_fileName = "test_41d3d834_4320f4da.log"; + + private const string c_testMessage98Chars = + "01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567"; + + private const string c_testMessage99Chars = + "012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678"; + + private const int c_iMaximumFileSize = 450; // in bytes + private int _iMessagesLoggedThisFile = 0; + private int _iMessagesLogged = 0; + private int _iCountDirection = 0; + private int _MaxSizeRollBackups = 3; + private CountingAppender _caRoot; + private Logger _root; #if !NETSTANDARD1_3 - private CultureInfo _currentCulture; - private CultureInfo _currentUICulture; + private CultureInfo _currentCulture; + private CultureInfo _currentUICulture; #endif - private class SilentErrorHandler : IErrorHandler - { - private StringBuilder m_buffer = new StringBuilder(); - - public string Message - { - get { return m_buffer.ToString(); } - } - - public void Error(string message) - { - m_buffer.Append(message + "\n"); - } - - public void Error(string message, Exception e) - { - m_buffer.Append(message + "\n" + e.Message + "\n"); - } - - public void Error(string message, Exception e, ErrorCode errorCode) - { - m_buffer.Append(message + "\n" + e.Message + "\n"); - } - } - - /// - /// Sets up variables used for the tests - /// - private void InitializeVariables() - { - _iMessagesLoggedThisFile = 0; - _iMessagesLogged = 0; - _iCountDirection = +1; // Up - _MaxSizeRollBackups = 3; - } - - /// - /// Shuts down any loggers in the hierarchy, along - /// with all appenders, and deletes any test files used - /// for logging. - /// - private static void ResetAndDeleteTestFiles() - { - // Regular users should not use the clear method lightly! - Utils.GetRepository().ResetConfiguration(); - Utils.GetRepository().Shutdown(); - ((Repository.Hierarchy.Hierarchy)Utils.GetRepository()).Clear(); - - DeleteTestFiles(); - } - - /// - /// Any initialization that happens before each test can - /// go here - /// - [SetUp] - public void SetUp() - { - ResetAndDeleteTestFiles(); - InitializeVariables(); + private class SilentErrorHandler : IErrorHandler + { + private StringBuilder m_buffer = new StringBuilder(); + + public string Message + { + get { return m_buffer.ToString(); } + } + + public void Error(string message) + { + m_buffer.Append(message + "\n"); + } + + public void Error(string message, Exception e) + { + m_buffer.Append(message + "\n" + e.Message + "\n"); + } + + public void Error(string message, Exception e, ErrorCode errorCode) + { + m_buffer.Append(message + "\n" + e.Message + "\n"); + } + } + + /// + /// Sets up variables used for the tests + /// + private void InitializeVariables() + { + _iMessagesLoggedThisFile = 0; + _iMessagesLogged = 0; + _iCountDirection = +1; // Up + _MaxSizeRollBackups = 3; + } + + /// + /// Shuts down any loggers in the hierarchy, along + /// with all appenders, and deletes any test files used + /// for logging. + /// + private static void ResetAndDeleteTestFiles() + { + // Regular users should not use the clear method lightly! + Utils.GetRepository().ResetConfiguration(); + Utils.GetRepository().Shutdown(); + ((Repository.Hierarchy.Hierarchy)Utils.GetRepository()).Clear(); + + DeleteTestFiles(); + } + + /// + /// Any initialization that happens before each test can + /// go here + /// + [SetUp] + public void SetUp() + { + ResetAndDeleteTestFiles(); + InitializeVariables(); #if !NETSTANDARD1_3 - // set correct thread culture - _currentCulture = System.Threading.Thread.CurrentThread.CurrentCulture; - _currentUICulture = System.Threading.Thread.CurrentThread.CurrentUICulture; - System.Threading.Thread.CurrentThread.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.InvariantCulture; + // set correct thread culture + _currentCulture = System.Threading.Thread.CurrentThread.CurrentCulture; + _currentUICulture = System.Threading.Thread.CurrentThread.CurrentUICulture; + System.Threading.Thread.CurrentThread.CurrentCulture = + System.Threading.Thread.CurrentThread.CurrentUICulture = + System.Globalization.CultureInfo.InvariantCulture; #endif - } + } - /// - /// Any steps that happen after each test go here - /// - [TearDown] - public void TearDown() - { - ResetAndDeleteTestFiles(); + /// + /// Any steps that happen after each test go here + /// + [TearDown] + public void TearDown() + { + ResetAndDeleteTestFiles(); #if !NETSTANDARD1_3 - // restore previous culture - System.Threading.Thread.CurrentThread.CurrentCulture = _currentCulture; - System.Threading.Thread.CurrentThread.CurrentUICulture = _currentUICulture; + // restore previous culture + System.Threading.Thread.CurrentThread.CurrentCulture = _currentCulture; + System.Threading.Thread.CurrentThread.CurrentUICulture = _currentUICulture; #endif - } - - /// - /// Finds the number of files that match the base file name, - /// and matches the result against an expected count - /// - /// - private static void VerifyFileCount(int iExpectedCount) - { - VerifyFileCount(iExpectedCount, false); + } + + /// + /// Finds the number of files that match the base file name, + /// and matches the result against an expected count + /// + /// + private static void VerifyFileCount(int iExpectedCount) + { + VerifyFileCount(iExpectedCount, false); + } + + /// + /// Finds the number of files that match the base file name, + /// and matches the result against an expected count + /// + /// + private static void VerifyFileCount(int iExpectedCount, bool preserveLogFileNameExtension) + { + ArrayList alFiles = GetExistingFiles(c_fileName, preserveLogFileNameExtension); + Assert.IsNotNull(alFiles); + Assert.AreEqual(iExpectedCount, alFiles.Count); + } + + /// + /// Creates a file with the given number, and the shared base file name + /// + /// + private static void CreateFile(int iFileNumber) + { + FileInfo fileInfo = new FileInfo(MakeFileName(c_fileName, iFileNumber)); + + FileStream fileStream = null; + try + { + fileStream = fileInfo.Create(); + } + finally + { + if (null != fileStream) + { + try + { + fileStream.Close(); + } + catch + { + } } - /// - /// Finds the number of files that match the base file name, - /// and matches the result against an expected count - /// - /// - private static void VerifyFileCount(int iExpectedCount, bool preserveLogFileNameExtension) - { - ArrayList alFiles = GetExistingFiles(c_fileName, preserveLogFileNameExtension); - Assert.IsNotNull(alFiles); - Assert.AreEqual(iExpectedCount, alFiles.Count); - } - - /// - /// Creates a file with the given number, and the shared base file name - /// - /// - private static void CreateFile(int iFileNumber) - { - FileInfo fileInfo = new FileInfo(MakeFileName(c_fileName, iFileNumber)); - - FileStream fileStream = null; - try - { - fileStream = fileInfo.Create(); - } - finally - { - if (null != fileStream) - { - try - { - fileStream.Close(); - } - catch - { - } - } - } - } - - /// - /// Verifies that the code correctly loads all filenames - /// - [Test] - public void TestGetExistingFiles() - { - VerifyFileCount(0); - CreateFile(0); - VerifyFileCount(1); - CreateFile(1); - VerifyFileCount(2); - } - - [Test] - public void RollingCombinedWithPreserveExtension() + } + } + + /// + /// Verifies that the code correctly loads all filenames + /// + [Test] + public void TestGetExistingFiles() + { + VerifyFileCount(0); + CreateFile(0); + VerifyFileCount(1); + CreateFile(1); + VerifyFileCount(2); + } + + [Test] + public void RollingCombinedWithPreserveExtension() + { + _root = ((Repository.Hierarchy.Hierarchy)Utils.GetRepository()).Root; + _root.Level = Level.All; + PatternLayout patternLayout = new PatternLayout(); + patternLayout.ActivateOptions(); + + RollingFileAppender roller = new RollingFileAppender(); + roller.StaticLogFileName = false; + roller.Layout = patternLayout; + roller.AppendToFile = true; + roller.RollingStyle = RollingFileAppender.RollingMode.Composite; + roller.DatePattern = "dd_MM_yyyy"; + roller.MaxSizeRollBackups = 1; + roller.CountDirection = 1; + roller.PreserveLogFileNameExtension = true; + roller.MaximumFileSize = "10KB"; + roller.File = c_fileName; + roller.ActivateOptions(); + _root.AddAppender(roller); + + _root.Repository.Configured = true; + + for (int i = 0; i < 1000; i++) { - _root = ((Repository.Hierarchy.Hierarchy)Utils.GetRepository()).Root; - _root.Level = Level.All; - PatternLayout patternLayout = new PatternLayout(); - patternLayout.ActivateOptions(); - - RollingFileAppender roller = new RollingFileAppender(); - roller.StaticLogFileName = false; - roller.Layout = patternLayout; - roller.AppendToFile = true; - roller.RollingStyle = RollingFileAppender.RollingMode.Composite; - roller.DatePattern = "dd_MM_yyyy"; - roller.MaxSizeRollBackups = 1; - roller.CountDirection = 1; - roller.PreserveLogFileNameExtension = true; - roller.MaximumFileSize = "10KB"; - roller.File = c_fileName; - roller.ActivateOptions(); - _root.AddAppender(roller); - - _root.Repository.Configured = true; - - for (int i = 0; i < 1000; i++) + StringBuilder s = new StringBuilder(); + for (int j = 50; j < 100; j++) { - StringBuilder s = new StringBuilder(); - for (int j = 50; j < 100; j++) + if (j > 50) { - if (j > 50) { - s.Append(" "); - } - s.Append(j); + s.Append(" "); } - _root.Log(Level.Debug, s.ToString(), null); + + s.Append(j); } - VerifyFileCount(2, true); + + _root.Log(Level.Debug, s.ToString(), null); } - /// - /// Removes all test files that exist - /// - private static void DeleteTestFiles() - { - ArrayList alFiles = GetExistingFiles(c_fileName); - alFiles.AddRange(GetExistingFiles(c_fileName, true)); - foreach(string sFile in alFiles) - { - try - { - Debug.WriteLine("Deleting test file " + sFile); - File.Delete(sFile); - } - catch(Exception ex) - { - Debug.WriteLine("Exception while deleting test file " + ex); - } - } - } - - ///// - ///// Generates a file name associated with the count. - ///// - ///// - ///// - //private string MakeFileName(int iFileCount) - //{ - // return MakeFileName(_fileName, iFileCount); - //} - - /// - /// Generates a file name associated with the count, using - /// the base file name. - /// - /// - /// - /// - private static string MakeFileName(string sBaseFile, int iFileCount) - { - if (0 == iFileCount) - { - return sBaseFile; - } - return sBaseFile + "." + iFileCount; - } - - /// - /// Returns a RollingFileAppender using all the internal settings for maximum - /// file size and number of backups - /// - /// - private RollingFileAppender CreateAppender() - { - return CreateAppender(new FileAppender.ExclusiveLock()); - } - - /// - /// Returns a RollingFileAppender using all the internal settings for maximum - /// file size and number of backups - /// - /// The locking model to test - /// - private RollingFileAppender CreateAppender(FileAppender.LockingModelBase lockModel) - { - // - // Use a basic pattern that - // includes just the message and a CR/LF. - // - PatternLayout layout = new PatternLayout("%m%n"); - - // - // Create the new appender - // - RollingFileAppender appender = new RollingFileAppender(); - appender.Layout = layout; - appender.File = c_fileName; - appender.Encoding = Encoding.ASCII; - appender.MaximumFileSize = c_iMaximumFileSize.ToString(); - appender.MaxSizeRollBackups = _MaxSizeRollBackups; - appender.CountDirection = _iCountDirection; - appender.RollingStyle = RollingFileAppender.RollingMode.Size; - appender.LockingModel = lockModel; - - appender.ActivateOptions(); - - return appender; - } - - /// - /// Used for test purposes, a table of these objects can be used to identify - /// any existing files and their expected length. - /// - public class RollFileEntry - { - /// - /// Stores the name of the file - /// - private string m_fileName; - - /// - /// The expected length of the file - /// - private long m_fileLength; - - /// - /// Default constructor - /// - public RollFileEntry() - { - } - - /// - /// Constructor used when the fileInfo and expected length are known - /// - /// - /// - public RollFileEntry(string fileName, long fileLength) - { - m_fileName = fileName; - m_fileLength = fileLength; - } - - /// - /// Stores the name of the file - /// - public string FileName - { - get { return m_fileName; } - } - - /// - /// The expected length of the file - /// - public long FileLength - { - get { return m_fileLength; } - } - } - - /// - /// Used for table-driven testing. This class holds information that can be used - /// for testing of file rolling. - /// - public class RollConditions - { - /// - /// A table of entries showing files that should exist and their expected sizes - /// before logging is called - /// - private RollFileEntry[] m_preLogFileEntries; - - /// - /// A table of entries showing files that should exist and their expected sizes - /// after a message is logged - /// - private RollFileEntry[] m_postLogFileEntries; - - /// - /// Constructor, taking all required parameters - /// - /// - /// - public RollConditions(RollFileEntry[] preLogFileEntries, RollFileEntry[] postLogFileEntries) - { - m_preLogFileEntries = preLogFileEntries; - m_postLogFileEntries = postLogFileEntries; - } - - /// - /// A table of entries showing files that should exist and their expected sizes - /// before logging is called - /// - public RollFileEntry[] GetPreLogFileEntries() - { - return m_preLogFileEntries; - } - - /// - /// A table of entries showing files that should exist and their expected sizes - /// after a message is logged - /// - public RollFileEntry[] GetPostLogFileEntries() - { - return m_postLogFileEntries; - } - } - - private static void VerifyExistenceAndRemoveFromList(ArrayList alExisting, string sFileName, FileInfo file, RollFileEntry entry) - { - Assert.IsTrue(alExisting.Contains(sFileName), "filename {0} not found in test directory", sFileName); - Assert.AreEqual(entry.FileLength, file.Length, "file length mismatch"); - // Remove this file from the list - alExisting.Remove(sFileName); - } - - /// - /// Checks that all the expected files exist, and only the expected files. Also - /// verifies the length of all files against the expected length - /// - /// - /// - private static void VerifyFileConditions(string sBaseFileName, RollFileEntry[] fileEntries) - { - ArrayList alExisting = GetExistingFiles(sBaseFileName); - if (null != fileEntries) - { - // AssertEquals( "File count mismatch", alExisting.Count, fileEntries.Length ); - foreach(RollFileEntry rollFile in fileEntries) - { - string sFileName = rollFile.FileName; - FileInfo file = new FileInfo(sFileName); - - if (rollFile.FileLength > 0) - { - Assert.IsTrue(file.Exists, "filename {0} does not exist", sFileName); - VerifyExistenceAndRemoveFromList(alExisting, sFileName, file, rollFile); - } - else - { - // If length is 0, file may not exist yet. If file exists, make sure length - // is zero. If file doesn't exist, this is OK - - if (file.Exists) - { - VerifyExistenceAndRemoveFromList(alExisting, sFileName, file, rollFile); - } - } - } - } - else - { - Assert.AreEqual(0, alExisting.Count); - } - - // This check ensures no extra files matching the wildcard pattern exist. - // We only want the files we expect, and no others - Assert.AreEqual(0, alExisting.Count); - } - - /// - /// Called before logging a message to check that all the expected files exist, - /// and only the expected files. Also verifies the length of all files against - /// the expected length - /// - /// - /// - private static void VerifyPreConditions(string sBaseFileName, RollConditions entry) - { - VerifyFileConditions(sBaseFileName, entry.GetPreLogFileEntries()); - } - - /// - /// Called after logging a message to check that all the expected files exist, - /// and only the expected files. Also verifies the length of all files against - /// the expected length - /// - /// - /// - private static void VerifyPostConditions(string sBaseFileName, RollConditions entry) - { - VerifyFileConditions(sBaseFileName, entry.GetPostLogFileEntries()); - } - - /// - /// Logs a message, verifying the expected message counts against the - /// current running totals. - /// - /// - /// - private void LogMessage(RollConditions entry, string sMessageToLog) - { - Assert.AreEqual(_caRoot.Counter, _iMessagesLogged++); - _root.Log(Level.Debug, sMessageToLog, null); - Assert.AreEqual(_caRoot.Counter, _iMessagesLogged); - _iMessagesLoggedThisFile++; - } - - //private void DumpFileEntry( RollFileEntry entry ) - //{ - // System.Diagnostics.Debug.WriteLine( "\tfile name: " + entry.FileName ); - // System.Diagnostics.Debug.WriteLine( "\tfile length: " + entry.FileLength ); - //} - - //private void DumpTableEntry( RollConditions entry ) - //{ - // System.Diagnostics.Debug.WriteLine( "Pre-Conditions" ); - // foreach( RollFileEntry file in entry.GetPreLogFileEntries() ) - // { - // DumpFileEntry( file ); - // } - // System.Diagnostics.Debug.WriteLine( "Post-Conditions" ); - // foreach( RollFileEntry file in entry.GetPostLogFileEntries() ) - // { - // DumpFileEntry( file ); - // } - // // System.Diagnostics.Debug.WriteLine(""); - //} - - /// - /// Runs through all table entries, logging messages. Before each message is logged, - /// pre-conditions are checked to ensure the expected files exist and they are the - /// expected size. After logging, verifies the same. - /// - /// - /// - /// - private void RollFromTableEntries(string sBaseFileName, RollConditions[] entries, string sMessageToLog) - { - for(int i = 0; i < entries.Length; i++) - { - RollConditions entry = entries[i]; - - // System.Diagnostics.Debug.WriteLine( i + ": Entry " + i + " pre/post conditions"); - // DumpTableEntry( entry ); - // System.Diagnostics.Debug.WriteLine( i + ": Testing entry pre-conditions"); - VerifyPreConditions(sBaseFileName, entry); - // System.Diagnostics.Debug.WriteLine( i + ": Logging message"); - LogMessage(entry, sMessageToLog); - // System.Diagnostics.Debug.WriteLine( i + ": Testing entry post-conditions"); - VerifyPostConditions(sBaseFileName, entry); - // System.Diagnostics.Debug.WriteLine( i + ": Finished validating entry\n"); - } - } + VerifyFileCount(2, true); + } - private static readonly int s_Newline_Length = Environment.NewLine.Length; + /// + /// Removes all test files that exist + /// + private static void DeleteTestFiles() + { + ArrayList alFiles = GetExistingFiles(c_fileName); + alFiles.AddRange(GetExistingFiles(c_fileName, true)); + foreach (string sFile in alFiles) + { + try + { + Debug.WriteLine("Deleting test file " + sFile); + File.Delete(sFile); + } + catch (Exception ex) + { + Debug.WriteLine("Exception while deleting test file " + ex); + } + } + } - /// - /// Returns the number of bytes logged per message, including - /// any newline characters in addition to the message length. - /// - /// - /// - private static int TotalMessageLength(string sMessage) - { - return sMessage.Length + s_Newline_Length; - } - - /// - /// Determines how many messages of a fixed length can be logged - /// to a single file before the file rolls. - /// - /// - /// - private static int MessagesPerFile(int iMessageLength) - { - int iMessagesPerFile = c_iMaximumFileSize / iMessageLength; - - // - // RollingFileAppender checks for wrap BEFORE logging, - // so we will actually get one more message per file than - // we would otherwise. - // - if (iMessagesPerFile * iMessageLength < c_iMaximumFileSize) - { - iMessagesPerFile++; - } - - return iMessagesPerFile; - } - - /// - /// Determines the name of the current file - /// - /// - private static string GetCurrentFile() - { - // Current file name is always the base file name when - // counting. Dates will need a different approach - return c_fileName; - } - - /// - /// Turns a group of file names into an array of file entries that include the name - /// and a size. This is useful for assigning the properties of backup files, when - /// the length of the files are all the same size due to a fixed message length. - /// - /// - /// - /// - private static RollFileEntry[] MakeBackupFileEntriesFromBackupGroup(string sBackupGroup, int iBackupFileLength) - { - string[] sFiles = sBackupGroup.Split(' '); - - ArrayList alEntries = new ArrayList(); - - for(int i = 0; i < sFiles.Length; i++) - { - // Weed out any whitespace entries from the array - if (sFiles[i].Trim().Length > 0) - { - alEntries.Add(new RollFileEntry(sFiles[i], iBackupFileLength)); - } - } - - return (RollFileEntry[])alEntries.ToArray(typeof(RollFileEntry)); - } - - /// - /// Finds the iGroup group in the string (comma separated groups) - /// - /// - /// - /// - private static string GetBackupGroup(string sBackupGroups, int iGroup) - { - string[] sGroups = sBackupGroups.Split(','); - return sGroups[iGroup]; - } - - ///// - ///// Builds a collection of file entries based on the file names - ///// specified in a groups string and the max file size from the - ///// stats object - ///// - ///// - ///// - ///// - //private RollFileEntry[] MakeBackupFileEntriesForPreCondition( string sBackupGroups, RollingStats stats ) - //{ - // if (0 == stats.NumberOfFileRolls ) - // { - // return null; // first round has no previous backups - // } - // string sGroup; - // if (0 == stats.MessagesThisFile ) - // { - // // first file has special pattern...since rolling doesn't occur when message - // // is logged, rather before next message is logged. - // if (stats.NumberOfFileRolls <= 1 ) - // { - // return null; - // } - // // Use backup files from previous round. The minus 2 is because we have already - // // rolled, and the first round uses null instead of the string - // sGroup = GetBackupGroup( sBackupGroups, stats.NumberOfFileRolls-2 ); - // } - // else - // { - // sGroup = GetBackupGroup( sBackupGroups, stats.NumberOfFileRolls-1 ); - // } - // return MakeBackupFileEntriesFromBackupGroup( sGroup, stats.MaximumFileSize ); - //} - - /// - /// Builds a collection of file entries based on the file names - /// specified in a groups string and the max file size from the - /// stats object - /// - /// - /// - /// - private static RollFileEntry[] MakeBackupFileEntriesForPostCondition(string sBackupGroups, RollingStats stats) - { - if (0 == stats.NumberOfFileRolls) - { - return null; // first round has no previous backups - } - string sGroup = GetBackupGroup(sBackupGroups, stats.NumberOfFileRolls - 1); - return MakeBackupFileEntriesFromBackupGroup(sGroup, stats.MaximumFileSize); - } - - - /// - /// This class holds information that is used while we are generating - /// test data sets - /// - public class RollingStats - { - private int iTotalMessageLength; - private int iMessagesPerFile; - private int iMessagesThisFile; - private int iNumberOfFileRolls; - - /// - /// Number of total bytes a log file can reach. - /// - public int MaximumFileSize - { - get { return TotalMessageLength * MessagesPerFile; } - } - - /// - /// The length of a message, including any CR/LF characters. - /// This length assumes all messages are a fixed length for - /// test purposes. - /// - public int TotalMessageLength - { - get { return iTotalMessageLength; } - set { iTotalMessageLength = value; } - } - - /// - /// A count of the number of messages that are logged to each - /// file. - /// - public int MessagesPerFile - { - get { return iMessagesPerFile; } - set { iMessagesPerFile = value; } - } - - /// - /// Counts how many messages have been logged to the current file - /// - public int MessagesThisFile - { - get { return iMessagesThisFile; } - set { iMessagesThisFile = value; } - } - - /// - /// Counts how many times a file roll has occurred - /// - public int NumberOfFileRolls - { - get { return iNumberOfFileRolls; } - set { iNumberOfFileRolls = value; } - } - } - - /// - /// The stats are used to keep track of progress while we are algorithmically - /// generating a table of pre/post condition tests for file rolling. - /// - /// - /// - private static RollingStats InitializeStats(string sTestMessage) - { - RollingStats rollingStats = new RollingStats(); - - rollingStats.TotalMessageLength = TotalMessageLength(sTestMessage); - rollingStats.MessagesPerFile = MessagesPerFile(rollingStats.TotalMessageLength); - rollingStats.MessagesThisFile = 0; - rollingStats.NumberOfFileRolls = 0; - - return rollingStats; - } - - /// - /// Takes an existing array of RollFileEntry objects, creates a new array one element - /// bigger, and appends the final element to the end. If the existing entries are - /// null (no entries), then a one-element array is returned with the final element - /// as the only entry. - /// - /// - /// - /// - private static RollFileEntry[] AddFinalElement(RollFileEntry[] existing, RollFileEntry final) - { - int iLength = 1; - if (null != existing) - { - iLength += existing.Length; - } - RollFileEntry[] combined = new RollFileEntry[iLength]; - if (null != existing) - { - Array.Copy(existing, 0, combined, 0, existing.Length); - } - combined[iLength - 1] = final; - return combined; - } - - /// - /// Generates the pre and post condition arrays from an array of backup files and the - /// current file / next file. - /// - /// - /// - /// - /// - /// - /// - private static RollConditions BuildTableEntry(string sBackupFiles, RollConditions preCondition, RollFileEntry current, RollFileEntry currentNext, RollingStats rollingStats) - { - RollFileEntry[] backupsPost = MakeBackupFileEntriesForPostCondition(sBackupFiles, rollingStats); - RollFileEntry[] post = AddFinalElement(backupsPost, currentNext); - if (null == preCondition) - { - return new RollConditions(AddFinalElement(null, current), post); - } - return new RollConditions(preCondition.GetPostLogFileEntries(), post); - } - - /// - /// Returns a RollFileEntry that represents the next state of the current file, - /// based on the current state. When the current state would roll, the next - /// entry is the current file wrapped to 0 bytes. Otherwise, the next state - /// is the post-condition passed in as the currentNext parameter - /// - /// - /// - /// - private static RollFileEntry MoveNextEntry(RollingStats rollingStats, RollFileEntry currentNext) - { - rollingStats.MessagesThisFile = rollingStats.MessagesThisFile + 1; - if (rollingStats.MessagesThisFile >= rollingStats.MessagesPerFile) - { - rollingStats.MessagesThisFile = 0; - rollingStats.NumberOfFileRolls = rollingStats.NumberOfFileRolls + 1; - - return new RollFileEntry(GetCurrentFile(), 0); - } - else - { - return currentNext; - } - } - - /// - /// Callback point for the regular expression parser. Turns - /// the number into a file name. - /// - /// - /// - private static string NumberedNameMaker(Match match) - { - Int32 iValue = Int32.Parse(match.Value); - return MakeFileName(c_fileName, iValue); - } - - /// - /// Parses a numeric list of files, turning them into file names. - /// Calls back to a method that does the actual replacement, turning - /// the numeric value into a filename. - /// - /// - /// - /// - private static string ConvertToFiles(string sBackupInfo, MatchEvaluator evaluator) - { - Regex regex = new Regex(@"\d+"); - return regex.Replace(sBackupInfo, evaluator); - } - - /// - /// Makes test entries used for verifying counted file names - /// - /// A message to log repeatedly - /// Filename groups used to indicate backup file name progression - /// that results after each message is logged - /// How many times the test message will be repeatedly logged - /// - private static RollConditions[] MakeNumericTestEntries(string sTestMessage, string sBackupInfo, int iMessagesToLog) - { - return MakeTestEntries( - sTestMessage, - sBackupInfo, - iMessagesToLog, - new MatchEvaluator(NumberedNameMaker)); - } - - /// - /// This routine takes a list of backup file names and a message that will be logged - /// repeatedly, and generates a collection of objects containing pre-condition and - /// post-condition information. This pre/post information shows the names and expected - /// file sizes for all files just before and just after a message is logged. - /// - /// A message to log repeatedly - /// Filename groups used to indicate backup file name progression - /// that results after each message is logged - /// How many times the test message will be repeatedly logged - /// Function that can turn a number into a filename - /// - private static RollConditions[] MakeTestEntries(string sTestMessage, string sBackupInfo, int iMessagesToLog, MatchEvaluator evaluator) - { - string sBackupFiles = ConvertToFiles(sBackupInfo, evaluator); - - RollConditions[] table = new RollConditions[iMessagesToLog]; - - RollingStats rollingStats = InitializeStats(sTestMessage); - - RollConditions preCondition = null; - rollingStats.MessagesThisFile = 0; - - RollFileEntry currentFile = new RollFileEntry(GetCurrentFile(), 0); - for(int i = 0; i < iMessagesToLog; i++) - { - RollFileEntry currentNext = new RollFileEntry( - GetCurrentFile(), - (1 + rollingStats.MessagesThisFile) * rollingStats.TotalMessageLength); - - table[i] = BuildTableEntry(sBackupFiles, preCondition, currentFile, currentNext, rollingStats); - preCondition = table[i]; - - //System.Diagnostics.Debug.WriteLine( "Message " + i ); - //DumpTableEntry( table[i] ); - - currentFile = MoveNextEntry(rollingStats, currentNext); - } - - return table; - } - - /// - /// Uses the externally defined rolling table to verify rolling names/sizes - /// - /// - /// Pattern is: check pre-conditions. Log messages, checking size of current file. - /// when size exceeds limit, check post conditions. Can determine from message the - /// number of messages N that will cause a roll to occur. Challenge is to verify the - /// expected files, their sizes, and the names. For a message of length L, the backups - /// will be of size (N * L), and the current file will be of size (K * L), where K is - /// the number of messages that have been logged to this file. - /// - /// File sizes can be checked algorithmically. - /// - /// File names are generated using a table driven algorithm, where a number is turned into - /// the actual filename. - /// - /// The entries are comma-separated, with spaces between the names. Each comma indicates - /// a 'roll', and the group between commas indicates the numbers for all backup files that - /// occur as a result of the roll. It is assumed that no backup files exist before a roll - /// occurs - /// - /// - private void VerifyRolling(RollConditions[] table) - { - ConfigureRootAppender(); - RollFromTableEntries(c_fileName, table, GetTestMessage()); - } - - /// - /// Validates rolling using a fixed number of backup files, with - /// count direction set to up, so that newer files have higher counts. - /// Newest = N, Oldest = N-K, where K is the number of backups to allow - /// and N is the number of times rolling has occurred. - /// - [Test] - public void TestRollingCountUpFixedBackups() - { - // - // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the - // oldest, and 3 is the newest - // - string sBackupInfo = "1, 1 2, 1 2 3, 2 3 4, 3 4 5"; - - // - // Count Up - // - _iCountDirection = +1; - - // - // Log 30 messages. This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500 - // bytes for current file as messages are logged. - // - int iMessagesToLog = 30; - - VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog)); - } - - /// - /// Validates rolling using an infinite number of backup files, with - /// count direction set to up, so that newer files have higher counts. - /// Newest = N, Oldest = 1, where N is the number of times rolling has - /// occurred. - /// - [Test] - public void TestRollingCountUpInfiniteBackups() - { - // - // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the - // oldest, and 3 is the newest - // - string sBackupInfo = "1, 1 2, 1 2 3, 1 2 3 4, 1 2 3 4 5"; - - // - // Count Up - // - _iCountDirection = +1; - - // - // Infinite backups - // - _MaxSizeRollBackups = -1; - - // - // Log 30 messages. This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500 - // bytes for current file as messages are logged. - // - int iMessagesToLog = 30; - - VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog)); - } - - /// - /// Validates rolling with no backup files, with count direction set to up. - /// Only the current file should be present, wrapping to 0 bytes once the - /// previous file fills up. - /// - [Test] - public void TestRollingCountUpZeroBackups() - { - // - // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the - // oldest, and 3 is the newest - // - string sBackupInfo = ", , , , "; - - // - // Count Up - // - _iCountDirection = +1; - - // - // No backups - // - _MaxSizeRollBackups = 0; - - // - // Log 30 messages. This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500 - // bytes for current file as messages are logged. - // - int iMessagesToLog = 30; - - VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog)); - } - - - /// - /// Validates rolling using a fixed number of backup files, with - /// count direction set to down, so that older files have higher counts. - /// Newest = 1, Oldest = N, where N is the number of backups to allow - /// - [Test] - public void TestRollingCountDownFixedBackups() - { - // - // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the - // oldest, and 3 is the newest - // - string sBackupInfo = "1, 1 2, 1 2 3, 1 2 3, 1 2 3"; - - // - // Count Up - // - _iCountDirection = -1; - - // - // Log 30 messages. This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500 - // bytes for current file as messages are logged. - // - int iMessagesToLog = 30; - - VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog)); - } - - /// - /// Validates rolling using an infinite number of backup files, with - /// count direction set to down, so that older files have higher counts. - /// Newest = 1, Oldest = N, where N is the number of times rolling has - /// occurred - /// - [Test] - public void TestRollingCountDownInfiniteBackups() - { - // - // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the - // oldest, and 3 is the newest - // - string sBackupInfo = "1, 1 2, 1 2 3, 1 2 3 4, 1 2 3 4 5"; - - // - // Count Down - // - _iCountDirection = -1; - - // - // Infinite backups - // - _MaxSizeRollBackups = -1; - - // - // Log 30 messages. This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500 - // bytes for current file as messages are logged. - // - int iMessagesToLog = 30; - - VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog)); - } - - /// - /// Validates rolling with no backup files, with count direction set to down. - /// Only the current file should be present, wrapping to 0 bytes once the - /// previous file fills up. - /// - [Test] - public void TestRollingCountDownZeroBackups() - { - // - // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the - // oldest, and 3 is the newest - // - string sBackupInfo = ", , , , "; - - // - // Count Up - // - _iCountDirection = -1; - - // - // No backups - // - _MaxSizeRollBackups = 0; - - // - // Log 30 messages. This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500 - // bytes for current file as messages are logged. - // - int iMessagesToLog = 30; - - VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog)); - } - - /// - /// Configures the root appender for counting and rolling - /// - private void ConfigureRootAppender() - { - _root = ((Repository.Hierarchy.Hierarchy)Utils.GetRepository()).Root; - _root.Level = Level.Debug; - _caRoot = new CountingAppender(); - _root.AddAppender(_caRoot); - Assert.AreEqual(_caRoot.Counter, 0); - - // - // Set the root appender with a RollingFileAppender - // - _root.AddAppender(CreateAppender()); - - _root.Repository.Configured = true; - } - - /// - /// Verifies that the current backup index is detected correctly when initializing - /// - /// - /// - /// - private static void VerifyInitializeRollBackupsFromBaseFile(string sBaseFile, ArrayList alFiles, int iExpectedCurSizeRollBackups) - { - InitializeAndVerifyExpectedValue(alFiles, sBaseFile, CreateRollingFileAppender("5,0,1"), iExpectedCurSizeRollBackups); - } - - /// - /// Tests that the current backup index is 0 when no - /// existing files are seen - /// - [Test] - public void TestInitializeRollBackups1() - { - string sBaseFile = "LogFile.log"; - ArrayList arrFiles = new ArrayList(); - arrFiles.Add("junk1"); - arrFiles.Add("junk1.log"); - arrFiles.Add("junk2.log"); - arrFiles.Add("junk.log.1"); - arrFiles.Add("junk.log.2"); - - int iExpectedCurSizeRollBackups = 0; - VerifyInitializeRollBackupsFromBaseFile(sBaseFile, arrFiles, iExpectedCurSizeRollBackups); - } - - /// - /// Verifies that files are detected when the base file is specified - /// - /// - private static void VerifyInitializeRollBackupsFromBaseFile(string sBaseFile) - { - ArrayList alFiles = MakeTestDataFromString(sBaseFile, "0,1,2"); - - int iExpectedCurSizeRollBackups = 2; - VerifyInitializeRollBackupsFromBaseFile(sBaseFile, alFiles, iExpectedCurSizeRollBackups); - } - - /// - /// Verifies that count goes to the highest when counting up - /// - [Test] - public void TestInitializeCountUpFixed() - { - ArrayList alFiles = MakeTestDataFromString("3,4,5"); - int iExpectedValue = 5; - InitializeAndVerifyExpectedValue(alFiles, c_fileName, CreateRollingFileAppender("3,0,1"), iExpectedValue); - } - - /// - /// Verifies that count goes to the highest when counting up - /// - [Test] - public void TestInitializeCountUpFixed2() - { - ArrayList alFiles = MakeTestDataFromString("0,3"); - int iExpectedValue = 3; - InitializeAndVerifyExpectedValue(alFiles, c_fileName, CreateRollingFileAppender("3,0,1"), iExpectedValue); - } - - /// - /// Verifies that count stays at 0 for the zero backups case - /// when counting up - /// - [Test] - public void TestInitializeCountUpZeroBackups() - { - ArrayList alFiles = MakeTestDataFromString("0,3"); - int iExpectedValue = 0; - InitializeAndVerifyExpectedValue(alFiles, c_fileName, CreateRollingFileAppender("0,0,1"), iExpectedValue); - } - - /// - /// Verifies that count stays at 0 for the zero backups case - /// when counting down - /// - [Test] - public void TestInitializeCountDownZeroBackups() - { - ArrayList alFiles = MakeTestDataFromString("0,3"); - int iExpectedValue = 0; - InitializeAndVerifyExpectedValue(alFiles, c_fileName, CreateRollingFileAppender("0,0,-1"), iExpectedValue); - } - - - /// - /// Verifies that count goes to the highest when counting up - /// - [Test] - public void TestInitializeCountDownFixed() - { - ArrayList alFiles = MakeTestDataFromString("4,5,6"); - VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 0); - } - - /// - /// Verifies that count goes to the highest when counting up - /// - [Test] - public void TestInitializeCountDownFixed2() - { - ArrayList alFiles = MakeTestDataFromString("1,5,6"); - VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 1); - } - - /// - /// Verifies that count goes to the highest when counting up - /// - [Test] - public void TestInitializeCountDownFixed3() - { - ArrayList alFiles = MakeTestDataFromString("2,5,6"); - VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 2); - } - - /// - /// Verifies that count goes to the highest when counting up - /// - [Test] - public void TestInitializeCountDownFixed4() - { - ArrayList alFiles = MakeTestDataFromString("3,5,6"); - VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 3); - } - - /// - /// Verifies that count goes to the highest when counting up - /// - [Test] - public void TestInitializeCountDownFixed5() - { - ArrayList alFiles = MakeTestDataFromString("1,2,3"); - VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 3); - } - - /// - /// Verifies that count goes to the highest when counting up - /// - [Test] - public void TestInitializeCountDownFixed6() - { - ArrayList alFiles = MakeTestDataFromString("1,2"); - VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 2); - } - - /// - /// Verifies that count goes to the highest when counting up - /// - [Test] - public void TestInitializeCountDownFixed7() - { - ArrayList alFiles = MakeTestDataFromString("2,3"); - VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 3); - } - - private static void InitializeAndVerifyExpectedValue(ArrayList alFiles, string sBaseFile, RollingFileAppender rfa, int iExpectedValue) - { - InitializeRollBackups(rfa, sBaseFile, alFiles); - Assert.AreEqual(iExpectedValue, GetFieldCurSizeRollBackups(rfa)); - } - - /// - /// Tests the count down case, with infinite max backups, to see that - /// initialization of the rolling file appender results in the expected value - /// - /// - /// - /// - private static void VerifyInitializeDownInfiniteExpectedValue(ArrayList alFiles, string sBaseFile, int iExpectedValue) - { - InitializeAndVerifyExpectedValue(alFiles, sBaseFile, CreateRollingFileAppender("-1,0,-1"), iExpectedValue); - } - - /// - /// Creates a RollingFileAppender with the desired values, where the - /// values are passed as a comma separated string, with 3 parameters, - /// m_maxSizeRollBackups, m_curSizeRollBackups, CountDirection - /// - /// - /// - private static RollingFileAppender CreateRollingFileAppender(string sParams) - { - string[] asParams = sParams.Split(','); - if (null == asParams || asParams.Length != 3) - { - throw new ArgumentOutOfRangeException(sParams, sParams, "Must have 3 comma separated params: MaxSizeRollBackups, CurSizeRollBackups, CountDirection"); - } - - RollingFileAppender rfa = new RollingFileAppender(); - rfa.RollingStyle = RollingFileAppender.RollingMode.Size; - SetFieldMaxSizeRollBackups(rfa, Int32.Parse(asParams[0].Trim())); - SetFieldCurSizeRollBackups(rfa, Int32.Parse(asParams[1].Trim())); - rfa.CountDirection = Int32.Parse(asParams[2].Trim()); - - return rfa; - } - - /// - /// Verifies that count goes to the highest when counting down - /// and infinite backups are selected - /// - [Test] - public void TestInitializeCountDownInfinite() - { - ArrayList alFiles = MakeTestDataFromString("2,3"); - VerifyInitializeDownInfiniteExpectedValue(alFiles, c_fileName, 3); - } - - /// - /// Verifies that count goes to the highest when counting down - /// and infinite backups are selected - /// - [Test] - public void TestInitializeCountDownInfinite2() - { - ArrayList alFiles = MakeTestDataFromString("2,3,4,5,6,7,8,9,10"); - VerifyInitializeDownInfiniteExpectedValue(alFiles, c_fileName, 10); - } - - /// - /// Verifies that count goes to the highest when counting down - /// and infinite backups are selected - /// - [Test] - public void TestInitializeCountDownInfinite3() - { - ArrayList alFiles = MakeTestDataFromString("9,10,3,4,5,7,9,6,1,2,8"); - VerifyInitializeDownInfiniteExpectedValue(alFiles, c_fileName, 10); - } - - /// - /// Verifies that count goes to the highest when counting up - /// and infinite backups are selected - /// - [Test] - public void TestInitializeCountUpInfinite() - { - ArrayList alFiles = MakeTestDataFromString("2,3"); - VerifyInitializeUpInfiniteExpectedValue(alFiles, c_fileName, 3); - } - - /// - /// Verifies that count goes to the highest when counting up - /// and infinite backups are selected - /// - [Test] - public void TestInitializeCountUpInfinite2() - { - ArrayList alFiles = MakeTestDataFromString("2,3,4,5,6,7,8,9,10"); - VerifyInitializeUpInfiniteExpectedValue(alFiles, c_fileName, 10); - } - - /// - /// Verifies that count goes to the highest when counting up - /// and infinite backups are selected - /// - [Test] - public void TestInitializeCountUpInfinite3() - { - ArrayList alFiles = MakeTestDataFromString("9,10,3,4,5,7,9,6,1,2,8"); - VerifyInitializeUpInfiniteExpectedValue(alFiles, c_fileName, 10); - } - - /// - /// Creates a logger hierarchy, configures a rolling file appender and returns an ILogger - /// - /// The filename to log to - /// The locking model to use. - /// The error handler to use. - /// A configured ILogger - private static ILogger CreateLogger(string filename, FileAppender.LockingModelBase lockModel, IErrorHandler handler) - { - return CreateLogger(filename, lockModel, handler, 100000, 0); - } - - /// - /// Creates a logger hierarchy, configures a rolling file appender and returns an ILogger - /// - /// The filename to log to - /// The locking model to use. - /// The error handler to use. - /// Maximum file size for roll - /// Maximum number of roll backups - /// A configured ILogger - private static ILogger CreateLogger(string filename, FileAppender.LockingModelBase lockModel, IErrorHandler handler, int maxFileSize, int maxSizeRollBackups) - { - Repository.Hierarchy.Hierarchy h = (Repository.Hierarchy.Hierarchy)LogManager.CreateRepository("TestRepository"); - - RollingFileAppender appender = new RollingFileAppender(); - appender.File = filename; - appender.AppendToFile = false; - appender.CountDirection = 0; - appender.RollingStyle = RollingFileAppender.RollingMode.Size; - appender.MaxFileSize = maxFileSize; - appender.Encoding = Encoding.ASCII; - appender.ErrorHandler = handler; - appender.MaxSizeRollBackups = maxSizeRollBackups; - if (lockModel != null) - { - appender.LockingModel = lockModel; - } - - PatternLayout layout = new PatternLayout(); - layout.ConversionPattern = "%m%n"; - layout.ActivateOptions(); - - appender.Layout = layout; - appender.ActivateOptions(); - - h.Root.AddAppender(appender); - h.Configured = true; - - ILogger log = h.GetLogger("Logger"); - return log; - } - - /// - /// Destroys the logger hierarchy created by - /// - private static void DestroyLogger() - { - Repository.Hierarchy.Hierarchy h = (Repository.Hierarchy.Hierarchy)LogManager.GetRepository("TestRepository"); - h.ResetConfiguration(); - //Replace the repository selector so that we can recreate the hierarchy with the same name if necessary - LoggerManager.RepositorySelector = new DefaultRepositorySelector(typeof(log4net.Repository.Hierarchy.Hierarchy)); - } - - private static void AssertFileEquals(string filename, string contents) + ///// + ///// Generates a file name associated with the count. + ///// + ///// + ///// + //private string MakeFileName(int iFileCount) + //{ + // return MakeFileName(_fileName, iFileCount); + //} + + /// + /// Generates a file name associated with the count, using + /// the base file name. + /// + /// + /// + /// + private static string MakeFileName(string sBaseFile, int iFileCount) { - FileInfo fileinfo = new FileInfo(filename); - StreamReader sr = new StreamReader(fileinfo.OpenRead()); - string logcont = sr.ReadToEnd(); - sr.Close(); - - Assert.AreEqual(contents, logcont, "Log contents is not what is expected"); - - File.Delete(filename); - } - - /// - /// Verifies that logging a message actually produces output - /// - [Test] - public void TestLogOutput() - { - string filename ="test_simple.log"; - SilentErrorHandler sh = new SilentErrorHandler(); - ILogger log = CreateLogger(filename, new FileAppender.ExclusiveLock(), sh); - log.Log(GetType(), Level.Info, "This is a message", null); - log.Log(GetType(), Level.Info, "This is a message 2", null); - DestroyLogger(); - - AssertFileEquals(filename, "This is a message" + Environment.NewLine + "This is a message 2" + Environment.NewLine); - Assert.AreEqual("", sh.Message, "Unexpected error message"); - } - - /// - /// Verifies that attempting to log to a locked file fails gracefully - /// - [Test] - public void TestExclusiveLockFails() - { - string filename ="test_exclusive_lock_fails.log"; - - FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None); - fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4); - - SilentErrorHandler sh = new SilentErrorHandler(); - ILogger log = CreateLogger(filename, new FileAppender.ExclusiveLock(), sh); - log.Log(GetType(), Level.Info, "This is a message", null); - log.Log(GetType(), Level.Info, "This is a message 2", null); - DestroyLogger(); - fs.Close(); - - AssertFileEquals(filename, "Test"); - Assert.AreEqual(sh.Message.Substring(0, 30), "Unable to acquire lock on file", "Expecting an error message"); - } - - /// - /// Verifies that attempting to log to a locked file recovers if the lock is released - /// - [Test] - public void TestExclusiveLockRecovers() - { - string filename ="test_exclusive_lock_recovers.log"; - - FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None); - fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4); - - SilentErrorHandler sh = new SilentErrorHandler(); - ILogger log = CreateLogger(filename, new FileAppender.ExclusiveLock(), sh); - log.Log(GetType(), Level.Info, "This is a message", null); - fs.Close(); - log.Log(GetType(), Level.Info, "This is a message 2", null); - DestroyLogger(); - - AssertFileEquals(filename, "This is a message 2" + Environment.NewLine); - Assert.AreEqual("Unable to acquire lock on file", sh.Message.Substring(0, 30), "Expecting an error message"); - } - - /// - /// Verifies that attempting to log to a file with ExclusiveLock really locks the file - /// - [Test] - public void TestExclusiveLockLocks() - { - string filename ="test_exclusive_lock_locks.log"; - bool locked = false; - - SilentErrorHandler sh = new SilentErrorHandler(); - ILogger log = CreateLogger(filename, new FileAppender.ExclusiveLock(), sh); - log.Log(GetType(), Level.Info, "This is a message", null); - - try - { - FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None); - fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4); - fs.Close(); - } - catch(IOException e1) - { -#if MONO - Assert.AreEqual("Sharing violation on path ", e1.Message.Substring(0, 26), "Unexpected exception"); -#else - Assert.AreEqual("The process cannot access the file ", e1.Message.Substring(0, 35), "Unexpected exception"); -#endif - locked = true; - } + if (0 == iFileCount) + { + return sBaseFile; + } - log.Log(GetType(), Level.Info, "This is a message 2", null); - DestroyLogger(); + return sBaseFile + "." + iFileCount; + } - Assert.IsTrue(locked, "File was not locked"); -#if !MONO || MONO_3_5 || MONO_4_0 // at least on Linux with Mono 2.4 exclusive locking doesn't work as one would expect - AssertFileEquals(filename, "This is a message" + Environment.NewLine + "This is a message 2" + Environment.NewLine); -#endif - Assert.AreEqual("", sh.Message, "Unexpected error message"); - } - - - /// - /// Verifies that attempting to log to a locked file fails gracefully - /// - [Test] - public void TestMinimalLockFails() - { - string filename ="test_minimal_lock_fails.log"; - - FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None); - fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4); - - SilentErrorHandler sh = new SilentErrorHandler(); - ILogger log = CreateLogger(filename, new FileAppender.MinimalLock(), sh); - log.Log(GetType(), Level.Info, "This is a message", null); - log.Log(GetType(), Level.Info, "This is a message 2", null); - DestroyLogger(); - fs.Close(); - - AssertFileEquals(filename, "Test"); - Assert.AreEqual("Unable to acquire lock on file", sh.Message.Substring(0, 30), "Expecting an error message"); - } - - /// - /// Verifies that attempting to log to a locked file recovers if the lock is released - /// - [Test] - public void TestMinimalLockRecovers() - { - string filename ="test_minimal_lock_recovers.log"; - - FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None); - fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4); - - SilentErrorHandler sh = new SilentErrorHandler(); - ILogger log = CreateLogger(filename, new FileAppender.MinimalLock(), sh); - log.Log(GetType(), Level.Info, "This is a message", null); - fs.Close(); - log.Log(GetType(), Level.Info, "This is a message 2", null); - DestroyLogger(); - - AssertFileEquals(filename, "This is a message 2" + Environment.NewLine); - Assert.AreEqual("Unable to acquire lock on file", sh.Message.Substring(0, 30), "Expecting an error message"); - } - - /// - /// Verifies that attempting to log to a file with MinimalLock doesn't lock the file - /// - [Test] - public void TestMinimalLockUnlocks() - { - string filename ="test_minimal_lock_unlocks.log"; - bool locked; - - SilentErrorHandler sh = new SilentErrorHandler(); - ILogger log = CreateLogger(filename, new FileAppender.MinimalLock(), sh); - log.Log(GetType(), Level.Info, "This is a message", null); - - locked = true; - FileStream fs = new FileStream(filename, FileMode.Append, FileAccess.Write, FileShare.None); - fs.Write(Encoding.ASCII.GetBytes("Test" + Environment.NewLine), 0, 4 + Environment.NewLine.Length); - fs.Close(); - - log.Log(GetType(), Level.Info, "This is a message 2", null); - DestroyLogger(); - - Assert.IsTrue(locked, "File was not locked"); - AssertFileEquals(filename, "This is a message" + Environment.NewLine + "Test" + Environment.NewLine + "This is a message 2" + Environment.NewLine); - Assert.AreEqual("", sh.Message, "Unexpected error message"); - } + /// + /// Returns a RollingFileAppender using all the internal settings for maximum + /// file size and number of backups + /// + /// + private RollingFileAppender CreateAppender() + { + return CreateAppender(new FileAppender.ExclusiveLock()); + } -#if !NETCF /// - /// Verifies that attempting to log to a locked file fails gracefully + /// Returns a RollingFileAppender using all the internal settings for maximum + /// file size and number of backups /// - [Test] - public void TestInterProcessLockFails() { - string filename ="test_interprocess_lock_fails.log"; + /// The locking model to test + /// + private RollingFileAppender CreateAppender(FileAppender.LockingModelBase lockModel) + { + // + // Use a basic pattern that + // includes just the message and a CR/LF. + // + PatternLayout layout = new PatternLayout("%m%n"); + + // + // Create the new appender + // + RollingFileAppender appender = new RollingFileAppender(); + appender.Layout = layout; + appender.File = c_fileName; + appender.Encoding = Encoding.ASCII; + appender.MaximumFileSize = c_iMaximumFileSize.ToString(); + appender.MaxSizeRollBackups = _MaxSizeRollBackups; + appender.CountDirection = _iCountDirection; + appender.RollingStyle = RollingFileAppender.RollingMode.Size; + appender.LockingModel = lockModel; + + appender.ActivateOptions(); + + return appender; + } - FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None); - fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4); + /// + /// Used for test purposes, a table of these objects can be used to identify + /// any existing files and their expected length. + /// + public class RollFileEntry + { + /// + /// Stores the name of the file + /// + private string m_fileName; + + /// + /// The expected length of the file + /// + private long m_fileLength; + + /// + /// Default constructor + /// + public RollFileEntry() + { + } - SilentErrorHandler sh = new SilentErrorHandler(); - ILogger log = CreateLogger(filename, new FileAppender.InterProcessLock(), sh); - log.Log(GetType(), Level.Info, "This is a message", null); - log.Log(GetType(), Level.Info, "This is a message 2", null); - DestroyLogger(); - fs.Close(); + /// + /// Constructor used when the fileInfo and expected length are known + /// + /// + /// + public RollFileEntry(string fileName, long fileLength) + { + m_fileName = fileName; + m_fileLength = fileLength; + } - AssertFileEquals(filename, "Test"); - Assert.AreEqual("Unable to acquire lock on file", sh.Message.Substring(0, 30), "Expecting an error message"); + /// + /// Stores the name of the file + /// + public string FileName + { + get { return m_fileName; } + } + + /// + /// The expected length of the file + /// + public long FileLength + { + get { return m_fileLength; } + } } /// - /// Verifies that attempting to log to a locked file recovers if the lock is released + /// Used for table-driven testing. This class holds information that can be used + /// for testing of file rolling. /// - [Test] - public void TestInterProcessLockRecovers() { - string filename ="test_interprocess_lock_recovers.log"; + public class RollConditions + { + /// + /// A table of entries showing files that should exist and their expected sizes + /// before logging is called + /// + private RollFileEntry[] m_preLogFileEntries; + + /// + /// A table of entries showing files that should exist and their expected sizes + /// after a message is logged + /// + private RollFileEntry[] m_postLogFileEntries; + + /// + /// Constructor, taking all required parameters + /// + /// + /// + public RollConditions(RollFileEntry[] preLogFileEntries, RollFileEntry[] postLogFileEntries) + { + m_preLogFileEntries = preLogFileEntries; + m_postLogFileEntries = postLogFileEntries; + } - FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None); - fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4); + /// + /// A table of entries showing files that should exist and their expected sizes + /// before logging is called + /// + public RollFileEntry[] GetPreLogFileEntries() + { + return m_preLogFileEntries; + } - SilentErrorHandler sh = new SilentErrorHandler(); - ILogger log = CreateLogger(filename, new FileAppender.InterProcessLock(), sh); - log.Log(GetType(), Level.Info, "This is a message", null); - fs.Close(); - log.Log(GetType(), Level.Info, "This is a message 2", null); - DestroyLogger(); + /// + /// A table of entries showing files that should exist and their expected sizes + /// after a message is logged + /// + public RollFileEntry[] GetPostLogFileEntries() + { + return m_postLogFileEntries; + } + } - AssertFileEquals(filename, "This is a message 2" + Environment.NewLine); - Assert.AreEqual("Unable to acquire lock on file", sh.Message.Substring(0, 30), "Expecting an error message"); + private static void VerifyExistenceAndRemoveFromList(ArrayList alExisting, + string sFileName, + FileInfo file, + RollFileEntry entry) + { + Assert.IsTrue(alExisting.Contains(sFileName), "filename {0} not found in test directory", sFileName); + Assert.AreEqual(entry.FileLength, file.Length, "file length mismatch"); + // Remove this file from the list + alExisting.Remove(sFileName); } /// - /// Verifies that attempting to log to a file with InterProcessLock really locks the file + /// Checks that all the expected files exist, and only the expected files. Also + /// verifies the length of all files against the expected length /// - [Test] - public void TestInterProcessLockUnlocks() { - string filename ="test_interprocess_lock_unlocks.log"; - bool locked; + /// + /// + private static void VerifyFileConditions(string sBaseFileName, RollFileEntry[] fileEntries) + { + ArrayList alExisting = GetExistingFiles(sBaseFileName); + if (null != fileEntries) + { + // AssertEquals( "File count mismatch", alExisting.Count, fileEntries.Length ); + foreach (RollFileEntry rollFile in fileEntries) + { + string sFileName = rollFile.FileName; + FileInfo file = new FileInfo(sFileName); - SilentErrorHandler sh = new SilentErrorHandler(); - ILogger log = CreateLogger(filename, new FileAppender.InterProcessLock(), sh); - log.Log(GetType(), Level.Info, "This is a message", null); + if (rollFile.FileLength > 0) + { + Assert.IsTrue(file.Exists, "filename {0} does not exist", sFileName); + VerifyExistenceAndRemoveFromList(alExisting, sFileName, file, rollFile); + } + else + { + // If length is 0, file may not exist yet. If file exists, make sure length + // is zero. If file doesn't exist, this is OK - locked = true; - FileStream fs = new FileStream(filename, FileMode.Append, FileAccess.Write, FileShare.ReadWrite); - fs.Write(Encoding.ASCII.GetBytes("Test" + Environment.NewLine), 0, 4 + Environment.NewLine.Length); - fs.Close(); + if (file.Exists) + { + VerifyExistenceAndRemoveFromList(alExisting, sFileName, file, rollFile); + } + } + } + } + else + { + Assert.AreEqual(0, alExisting.Count); + } - log.Log(GetType(), Level.Info, "This is a message 2", null); - DestroyLogger(); + // This check ensures no extra files matching the wildcard pattern exist. + // We only want the files we expect, and no others + Assert.AreEqual(0, alExisting.Count); + } - Assert.IsTrue(locked, "File was not locked"); - AssertFileEquals(filename, "This is a message" + Environment.NewLine + "Test" + Environment.NewLine + "This is a message 2" + Environment.NewLine); - Assert.AreEqual("", sh.Message, "Unexpected error message"); + /// + /// Called before logging a message to check that all the expected files exist, + /// and only the expected files. Also verifies the length of all files against + /// the expected length + /// + /// + /// + private static void VerifyPreConditions(string sBaseFileName, RollConditions entry) + { + VerifyFileConditions(sBaseFileName, entry.GetPreLogFileEntries()); } - /// - /// Verifies that rolling file works - /// - [Test] - public void TestInterProcessLockRoll() - { - string filename ="test_interprocess_lock_roll.log"; + /// + /// Called after logging a message to check that all the expected files exist, + /// and only the expected files. Also verifies the length of all files against + /// the expected length + /// + /// + /// + private static void VerifyPostConditions(string sBaseFileName, RollConditions entry) + { + VerifyFileConditions(sBaseFileName, entry.GetPostLogFileEntries()); + } - SilentErrorHandler sh = new SilentErrorHandler(); - ILogger log = CreateLogger(filename, new FileAppender.InterProcessLock(), sh, 1, 2); + /// + /// Logs a message, verifying the expected message counts against the + /// current running totals. + /// + /// + /// + private void LogMessage(RollConditions entry, string sMessageToLog) + { + Assert.AreEqual(_caRoot.Counter, _iMessagesLogged++); + _root.Log(Level.Debug, sMessageToLog, null); + Assert.AreEqual(_caRoot.Counter, _iMessagesLogged); + _iMessagesLoggedThisFile++; + } - Assert.DoesNotThrow(delegate { log.Log(GetType(), Level.Info, "A", null); }); - Assert.DoesNotThrow(delegate { log.Log(GetType(), Level.Info, "A", null); }); - - DestroyLogger(); + //private void DumpFileEntry( RollFileEntry entry ) + //{ + // System.Diagnostics.Debug.WriteLine( "\tfile name: " + entry.FileName ); + // System.Diagnostics.Debug.WriteLine( "\tfile length: " + entry.FileLength ); + //} + + //private void DumpTableEntry( RollConditions entry ) + //{ + // System.Diagnostics.Debug.WriteLine( "Pre-Conditions" ); + // foreach( RollFileEntry file in entry.GetPreLogFileEntries() ) + // { + // DumpFileEntry( file ); + // } + // System.Diagnostics.Debug.WriteLine( "Post-Conditions" ); + // foreach( RollFileEntry file in entry.GetPostLogFileEntries() ) + // { + // DumpFileEntry( file ); + // } + // // System.Diagnostics.Debug.WriteLine(""); + //} - AssertFileEquals(filename, "A" + Environment.NewLine); - AssertFileEquals(filename + ".1", "A" + Environment.NewLine); - Assert.IsEmpty(sh.Message); - } -#endif + /// + /// Runs through all table entries, logging messages. Before each message is logged, + /// pre-conditions are checked to ensure the expected files exist and they are the + /// expected size. After logging, verifies the same. + /// + /// + /// + /// + private void RollFromTableEntries(string sBaseFileName, RollConditions[] entries, string sMessageToLog) + { + for (int i = 0; i < entries.Length; i++) + { + RollConditions entry = entries[i]; + + // System.Diagnostics.Debug.WriteLine( i + ": Entry " + i + " pre/post conditions"); + // DumpTableEntry( entry ); + // System.Diagnostics.Debug.WriteLine( i + ": Testing entry pre-conditions"); + VerifyPreConditions(sBaseFileName, entry); + // System.Diagnostics.Debug.WriteLine( i + ": Logging message"); + LogMessage(entry, sMessageToLog); + // System.Diagnostics.Debug.WriteLine( i + ": Testing entry post-conditions"); + VerifyPostConditions(sBaseFileName, entry); + // System.Diagnostics.Debug.WriteLine( i + ": Finished validating entry\n"); + } + } + + private static readonly int s_Newline_Length = Environment.NewLine.Length; + + /// + /// Returns the number of bytes logged per message, including + /// any newline characters in addition to the message length. + /// + /// + /// + private static int TotalMessageLength(string sMessage) + { + return sMessage.Length + s_Newline_Length; + } + + /// + /// Determines how many messages of a fixed length can be logged + /// to a single file before the file rolls. + /// + /// + /// + private static int MessagesPerFile(int iMessageLength) + { + int iMessagesPerFile = c_iMaximumFileSize / iMessageLength; + + // + // RollingFileAppender checks for wrap BEFORE logging, + // so we will actually get one more message per file than + // we would otherwise. + // + if (iMessagesPerFile * iMessageLength < c_iMaximumFileSize) + { + iMessagesPerFile++; + } + + return iMessagesPerFile; + } + + /// + /// Determines the name of the current file + /// + /// + private static string GetCurrentFile() + { + // Current file name is always the base file name when + // counting. Dates will need a different approach + return c_fileName; + } /// - /// Verify that the default LockModel is ExclusiveLock, to maintain backwards compatibility with previous behaviour - /// - [Test] - public void TestDefaultLockingModel() - { - string filename ="test_default.log"; - - SilentErrorHandler sh = new SilentErrorHandler(); - ILogger log = CreateLogger(filename, null, sh); - - IAppender[] appenders = log.Repository.GetAppenders(); - Assert.AreEqual(1, appenders.Length, "The wrong number of appenders are configured"); - - RollingFileAppender rfa = (RollingFileAppender)(appenders[0]); - Assert.AreEqual(typeof(log4net.Appender.FileAppender.ExclusiveLock), rfa.LockingModel.GetType(), "The LockingModel is of an unexpected type"); - - DestroyLogger(); - } - - /// - /// Tests the count up case, with infinite max backups , to see that - /// initialization of the rolling file appender results in the expected value - /// - /// - /// - /// - private static void VerifyInitializeUpInfiniteExpectedValue(ArrayList alFiles, string sBaseFile, int iExpectedValue) - { - InitializeAndVerifyExpectedValue(alFiles, sBaseFile, CreateRollingFileAppender("-1,0,1"), iExpectedValue); - } - - - /// - /// Tests the count down case, with max backups limited to 3, to see that - /// initialization of the rolling file appender results in the expected value - /// - /// - /// - /// - private static void VerifyInitializeDownFixedExpectedValue(ArrayList alFiles, string sBaseFile, int iExpectedValue) - { - InitializeAndVerifyExpectedValue(alFiles, sBaseFile, CreateRollingFileAppender("3,0,-1"), iExpectedValue); - } - - /// - /// Turns a string of comma separated numbers into a collection of filenames - /// generated from the numbers. - /// - /// Defaults to filename in _fileName variable. - /// - /// - /// Comma separated list of numbers for counted file names - /// - private static ArrayList MakeTestDataFromString(string sFileNumbers) - { - return MakeTestDataFromString(c_fileName, sFileNumbers); - } - - /// - /// Turns a string of comma separated numbers into a collection of filenames - /// generated from the numbers - /// - /// Uses the input filename. - /// - /// Name of file to combine with numbers when generating counted file names - /// Comma separated list of numbers for counted file names - /// - private static ArrayList MakeTestDataFromString(string sFileName, string sFileNumbers) - { - ArrayList alFiles = new ArrayList(); - - string[] sNumbers = sFileNumbers.Split(','); - foreach(string sNumber in sNumbers) - { - Int32 iValue = Int32.Parse(sNumber.Trim()); - alFiles.Add(MakeFileName(sFileName, iValue)); - } - - return alFiles; - } - - /// - /// Tests that the current backup index is correctly detected - /// for a file with no extension - /// - [Test] - public void TestInitializeRollBackups2() - { - VerifyInitializeRollBackupsFromBaseFile("LogFile"); - } - - /// - /// Tests that the current backup index is correctly detected - /// for a file with a .log extension - /// - [Test] - public void TestInitializeRollBackups3() - { - VerifyInitializeRollBackupsFromBaseFile("LogFile.log"); - } - - /// - /// Makes sure that the initialization can detect the backup - /// number correctly. - /// - /// - /// - public void VerifyInitializeRollBackups(int iBackups, int iMaxSizeRollBackups) - { - string sBaseFile = "LogFile.log"; - ArrayList arrFiles = new ArrayList(); - arrFiles.Add("junk1"); - for(int i = 0; i < iBackups; i++) - { - arrFiles.Add(MakeFileName(sBaseFile, i)); - } - RollingFileAppender rfa = new RollingFileAppender(); - rfa.RollingStyle = RollingFileAppender.RollingMode.Size; - SetFieldMaxSizeRollBackups(rfa, iMaxSizeRollBackups); - SetFieldCurSizeRollBackups(rfa, 0); - InitializeRollBackups(rfa, sBaseFile, arrFiles); - - // iBackups / Meaning - // 0 = none - // 1 = file.log - // 2 = file.log.1 - // 3 = file.log.2 - if (0 == iBackups || - 1 == iBackups) - { - Assert.AreEqual(0, GetFieldCurSizeRollBackups(rfa)); - } - else - { - Assert.AreEqual(Math.Min(iBackups - 1, iMaxSizeRollBackups), GetFieldCurSizeRollBackups(rfa)); - } - } - - /// - /// Tests that the current backup index is correctly detected, - /// and gets no bigger than the max backups setting - /// - [Test] - public void TestInitializeRollBackups4() - { - const int iMaxRollBackups = 5; - VerifyInitializeRollBackups(0, iMaxRollBackups); - VerifyInitializeRollBackups(1, iMaxRollBackups); - VerifyInitializeRollBackups(2, iMaxRollBackups); - VerifyInitializeRollBackups(3, iMaxRollBackups); - VerifyInitializeRollBackups(4, iMaxRollBackups); - VerifyInitializeRollBackups(5, iMaxRollBackups); - VerifyInitializeRollBackups(6, iMaxRollBackups); - // Final we cap out at the max value - VerifyInitializeRollBackups(7, iMaxRollBackups); - VerifyInitializeRollBackups(8, iMaxRollBackups); - } - - /// - /// - /// - [Test, Ignore("Not Implemented: Want to test counted files limited up, to see that others are ?? ignored? deleted?")] - public void TestInitialization3() - { - } - - /// - /// - /// - [Test, Ignore("Not Implemented: Want to test counted files limited down, to see that others are ?? ignored? deleted?")] - public void TestInitialization4() - { - } - - /// - /// - /// - [Test, Ignore("Not Implemented: Want to test dated files with a limit, to see that others are ?? ignored? deleted?")] - public void TestInitialization5() - { - } - - /// - /// - /// - [Test, Ignore("Not Implemented: Want to test dated files with no limit, to see that others are ?? ignored? deleted?")] - public void TestInitialization6() - { - } - - /// - /// - /// - [Test, Ignore("Not Implemented: Want to test dated files with mixed dates existing, to see that other dates do not matter")] - public void TestInitialization7() - { - } - - - // - // Helper functions to dig into the appender - // - - private static ArrayList GetExistingFiles(string baseFilePath) - { - return GetExistingFiles(baseFilePath, false); + /// Turns a group of file names into an array of file entries that include the name + /// and a size. This is useful for assigning the properties of backup files, when + /// the length of the files are all the same size due to a fixed message length. + /// + /// + /// + /// + private static RollFileEntry[] MakeBackupFileEntriesFromBackupGroup(string sBackupGroup, int iBackupFileLength) + { + string[] sFiles = sBackupGroup.Split(' '); + + ArrayList alEntries = new ArrayList(); + + for (int i = 0; i < sFiles.Length; i++) + { + // Weed out any whitespace entries from the array + if (sFiles[i].Trim().Length > 0) + { + alEntries.Add(new RollFileEntry(sFiles[i], iBackupFileLength)); } - private static ArrayList GetExistingFiles(string baseFilePath, bool preserveLogFileNameExtension) - { - RollingFileAppender appender = new RollingFileAppender(); - appender.PreserveLogFileNameExtension = preserveLogFileNameExtension; - appender.SecurityContext = NullSecurityContext.Instance; - - return (ArrayList)Utils.InvokeMethod(appender, "GetExistingFiles", baseFilePath); - } - - private static void InitializeRollBackups(RollingFileAppender appender, string baseFile, ArrayList arrayFiles) - { - Utils.InvokeMethod(appender, "InitializeRollBackups", baseFile, arrayFiles); - } - - private static int GetFieldCurSizeRollBackups(RollingFileAppender appender) - { - return (int)Utils.GetField(appender, "m_curSizeRollBackups"); - } - - private static void SetFieldCurSizeRollBackups(RollingFileAppender appender, int val) - { - Utils.SetField(appender, "m_curSizeRollBackups", val); - } - - private static void SetFieldMaxSizeRollBackups(RollingFileAppender appender, int val) - { - Utils.SetField(appender, "m_maxSizeRollBackups", val); - } - - private static string GetTestMessage() - { - switch (Environment.NewLine.Length) - { - case 2: - return c_testMessage98Chars; - - case 1: - return c_testMessage99Chars; - - default: - throw new Exception("Unexpected Environment.NewLine.Length"); - } - } - } - - [TestFixture] - public class RollingFileAppenderSubClassTest : RollingFileAppender - { - [Test] - public void TestComputeCheckPeriod() - { - RollingFileAppender rfa = new RollingFileAppender(); - - Assert.AreEqual(RollPoint.TopOfMinute, InvokeComputeCheckPeriod(rfa, ".yyyy-MM-dd HH:mm"), "TopOfMinute pattern"); - Assert.AreEqual(RollPoint.TopOfHour, InvokeComputeCheckPeriod(rfa, ".yyyy-MM-dd HH"), "TopOfHour pattern"); - Assert.AreEqual(RollPoint.HalfDay, InvokeComputeCheckPeriod(rfa, ".yyyy-MM-dd tt"), "HalfDay pattern"); - Assert.AreEqual(RollPoint.TopOfDay, InvokeComputeCheckPeriod(rfa, ".yyyy-MM-dd"), "TopOfDay pattern"); - Assert.AreEqual(RollPoint.TopOfMonth, InvokeComputeCheckPeriod(rfa, ".yyyy-MM"), "TopOfMonth pattern"); - - // Test invalid roll point - Assert.AreEqual(RollPoint.InvalidRollPoint, InvokeComputeCheckPeriod(rfa, "..."), "TopOfMonth pattern"); - } - - private static RollPoint InvokeComputeCheckPeriod(RollingFileAppender rollingFileAppender, string datePattern) - { - return (RollPoint)Utils.InvokeMethod(rollingFileAppender, "ComputeCheckPeriod", datePattern); - } - } -} + } + + return (RollFileEntry[])alEntries.ToArray(typeof(RollFileEntry)); + } + + /// + /// Finds the iGroup group in the string (comma separated groups) + /// + /// + /// + /// + private static string GetBackupGroup(string sBackupGroups, int iGroup) + { + string[] sGroups = sBackupGroups.Split(','); + return sGroups[iGroup]; + } + + ///// + ///// Builds a collection of file entries based on the file names + ///// specified in a groups string and the max file size from the + ///// stats object + ///// + ///// + ///// + ///// + //private RollFileEntry[] MakeBackupFileEntriesForPreCondition( string sBackupGroups, RollingStats stats ) + //{ + // if (0 == stats.NumberOfFileRolls ) + // { + // return null; // first round has no previous backups + // } + // string sGroup; + // if (0 == stats.MessagesThisFile ) + // { + // // first file has special pattern...since rolling doesn't occur when message + // // is logged, rather before next message is logged. + // if (stats.NumberOfFileRolls <= 1 ) + // { + // return null; + // } + // // Use backup files from previous round. The minus 2 is because we have already + // // rolled, and the first round uses null instead of the string + // sGroup = GetBackupGroup( sBackupGroups, stats.NumberOfFileRolls-2 ); + // } + // else + // { + // sGroup = GetBackupGroup( sBackupGroups, stats.NumberOfFileRolls-1 ); + // } + // return MakeBackupFileEntriesFromBackupGroup( sGroup, stats.MaximumFileSize ); + //} + + /// + /// Builds a collection of file entries based on the file names + /// specified in a groups string and the max file size from the + /// stats object + /// + /// + /// + /// + private static RollFileEntry[] MakeBackupFileEntriesForPostCondition(string sBackupGroups, RollingStats stats) + { + if (0 == stats.NumberOfFileRolls) + { + return null; // first round has no previous backups + } + + string sGroup = GetBackupGroup(sBackupGroups, stats.NumberOfFileRolls - 1); + return MakeBackupFileEntriesFromBackupGroup(sGroup, stats.MaximumFileSize); + } + + + /// + /// This class holds information that is used while we are generating + /// test data sets + /// + public class RollingStats + { + private int iTotalMessageLength; + private int iMessagesPerFile; + private int iMessagesThisFile; + private int iNumberOfFileRolls; + + /// + /// Number of total bytes a log file can reach. + /// + public int MaximumFileSize + { + get { return TotalMessageLength * MessagesPerFile; } + } + + /// + /// The length of a message, including any CR/LF characters. + /// This length assumes all messages are a fixed length for + /// test purposes. + /// + public int TotalMessageLength + { + get { return iTotalMessageLength; } + set { iTotalMessageLength = value; } + } + + /// + /// A count of the number of messages that are logged to each + /// file. + /// + public int MessagesPerFile + { + get { return iMessagesPerFile; } + set { iMessagesPerFile = value; } + } + + /// + /// Counts how many messages have been logged to the current file + /// + public int MessagesThisFile + { + get { return iMessagesThisFile; } + set { iMessagesThisFile = value; } + } + + /// + /// Counts how many times a file roll has occurred + /// + public int NumberOfFileRolls + { + get { return iNumberOfFileRolls; } + set { iNumberOfFileRolls = value; } + } + } + + /// + /// The stats are used to keep track of progress while we are algorithmically + /// generating a table of pre/post condition tests for file rolling. + /// + /// + /// + private static RollingStats InitializeStats(string sTestMessage) + { + RollingStats rollingStats = new RollingStats(); + + rollingStats.TotalMessageLength = TotalMessageLength(sTestMessage); + rollingStats.MessagesPerFile = MessagesPerFile(rollingStats.TotalMessageLength); + rollingStats.MessagesThisFile = 0; + rollingStats.NumberOfFileRolls = 0; + + return rollingStats; + } + + /// + /// Takes an existing array of RollFileEntry objects, creates a new array one element + /// bigger, and appends the final element to the end. If the existing entries are + /// null (no entries), then a one-element array is returned with the final element + /// as the only entry. + /// + /// + /// + /// + private static RollFileEntry[] AddFinalElement(RollFileEntry[] existing, RollFileEntry final) + { + int iLength = 1; + if (null != existing) + { + iLength += existing.Length; + } + + RollFileEntry[] combined = new RollFileEntry[iLength]; + if (null != existing) + { + Array.Copy(existing, 0, combined, 0, existing.Length); + } + + combined[iLength - 1] = final; + return combined; + } + + /// + /// Generates the pre and post condition arrays from an array of backup files and the + /// current file / next file. + /// + /// + /// + /// + /// + /// + /// + private static RollConditions BuildTableEntry(string sBackupFiles, + RollConditions preCondition, + RollFileEntry current, + RollFileEntry currentNext, + RollingStats rollingStats) + { + RollFileEntry[] backupsPost = MakeBackupFileEntriesForPostCondition(sBackupFiles, rollingStats); + RollFileEntry[] post = AddFinalElement(backupsPost, currentNext); + if (null == preCondition) + { + return new RollConditions(AddFinalElement(null, current), post); + } + + return new RollConditions(preCondition.GetPostLogFileEntries(), post); + } + + /// + /// Returns a RollFileEntry that represents the next state of the current file, + /// based on the current state. When the current state would roll, the next + /// entry is the current file wrapped to 0 bytes. Otherwise, the next state + /// is the post-condition passed in as the currentNext parameter + /// + /// + /// + /// + private static RollFileEntry MoveNextEntry(RollingStats rollingStats, RollFileEntry currentNext) + { + rollingStats.MessagesThisFile = rollingStats.MessagesThisFile + 1; + if (rollingStats.MessagesThisFile >= rollingStats.MessagesPerFile) + { + rollingStats.MessagesThisFile = 0; + rollingStats.NumberOfFileRolls = rollingStats.NumberOfFileRolls + 1; + + return new RollFileEntry(GetCurrentFile(), 0); + } + else + { + return currentNext; + } + } + + /// + /// Callback point for the regular expression parser. Turns + /// the number into a file name. + /// + /// + /// + private static string NumberedNameMaker(Match match) + { + Int32 iValue = Int32.Parse(match.Value); + return MakeFileName(c_fileName, iValue); + } + + /// + /// Parses a numeric list of files, turning them into file names. + /// Calls back to a method that does the actual replacement, turning + /// the numeric value into a filename. + /// + /// + /// + /// + private static string ConvertToFiles(string sBackupInfo, MatchEvaluator evaluator) + { + Regex regex = new Regex(@"\d+"); + return regex.Replace(sBackupInfo, evaluator); + } + + /// + /// Makes test entries used for verifying counted file names + /// + /// A message to log repeatedly + /// Filename groups used to indicate backup file name progression + /// that results after each message is logged + /// How many times the test message will be repeatedly logged + /// + private static RollConditions[] MakeNumericTestEntries(string sTestMessage, + string sBackupInfo, + int iMessagesToLog) + { + return MakeTestEntries( + sTestMessage, + sBackupInfo, + iMessagesToLog, + new MatchEvaluator(NumberedNameMaker)); + } + + /// + /// This routine takes a list of backup file names and a message that will be logged + /// repeatedly, and generates a collection of objects containing pre-condition and + /// post-condition information. This pre/post information shows the names and expected + /// file sizes for all files just before and just after a message is logged. + /// + /// A message to log repeatedly + /// Filename groups used to indicate backup file name progression + /// that results after each message is logged + /// How many times the test message will be repeatedly logged + /// Function that can turn a number into a filename + /// + private static RollConditions[] MakeTestEntries(string sTestMessage, + string sBackupInfo, + int iMessagesToLog, + MatchEvaluator evaluator) + { + string sBackupFiles = ConvertToFiles(sBackupInfo, evaluator); + + RollConditions[] table = new RollConditions[iMessagesToLog]; + + RollingStats rollingStats = InitializeStats(sTestMessage); + + RollConditions preCondition = null; + rollingStats.MessagesThisFile = 0; + + RollFileEntry currentFile = new RollFileEntry(GetCurrentFile(), 0); + for (int i = 0; i < iMessagesToLog; i++) + { + RollFileEntry currentNext = new RollFileEntry( + GetCurrentFile(), + (1 + rollingStats.MessagesThisFile) * rollingStats.TotalMessageLength); + + table[i] = BuildTableEntry(sBackupFiles, preCondition, currentFile, currentNext, rollingStats); + preCondition = table[i]; + + //System.Diagnostics.Debug.WriteLine( "Message " + i ); + //DumpTableEntry( table[i] ); + + currentFile = MoveNextEntry(rollingStats, currentNext); + } + + return table; + } + + /// + /// Uses the externally defined rolling table to verify rolling names/sizes + /// + /// + /// Pattern is: check pre-conditions. Log messages, checking size of current file. + /// when size exceeds limit, check post conditions. Can determine from message the + /// number of messages N that will cause a roll to occur. Challenge is to verify the + /// expected files, their sizes, and the names. For a message of length L, the backups + /// will be of size (N * L), and the current file will be of size (K * L), where K is + /// the number of messages that have been logged to this file. + /// + /// File sizes can be checked algorithmically. + /// + /// File names are generated using a table driven algorithm, where a number is turned into + /// the actual filename. + /// + /// The entries are comma-separated, with spaces between the names. Each comma indicates + /// a 'roll', and the group between commas indicates the numbers for all backup files that + /// occur as a result of the roll. It is assumed that no backup files exist before a roll + /// occurs + /// + /// + private void VerifyRolling(RollConditions[] table) + { + ConfigureRootAppender(); + RollFromTableEntries(c_fileName, table, GetTestMessage()); + } + + /// + /// Validates rolling using a fixed number of backup files, with + /// count direction set to up, so that newer files have higher counts. + /// Newest = N, Oldest = N-K, where K is the number of backups to allow + /// and N is the number of times rolling has occurred. + /// + [Test] + public void TestRollingCountUpFixedBackups() + { + // + // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the + // oldest, and 3 is the newest + // + string sBackupInfo = "1, 1 2, 1 2 3, 2 3 4, 3 4 5"; + + // + // Count Up + // + _iCountDirection = +1; + + // + // Log 30 messages. This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500 + // bytes for current file as messages are logged. + // + int iMessagesToLog = 30; + + VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog)); + } + + /// + /// Validates rolling using an infinite number of backup files, with + /// count direction set to up, so that newer files have higher counts. + /// Newest = N, Oldest = 1, where N is the number of times rolling has + /// occurred. + /// + [Test] + public void TestRollingCountUpInfiniteBackups() + { + // + // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the + // oldest, and 3 is the newest + // + string sBackupInfo = "1, 1 2, 1 2 3, 1 2 3 4, 1 2 3 4 5"; + + // + // Count Up + // + _iCountDirection = +1; + + // + // Infinite backups + // + _MaxSizeRollBackups = -1; + + // + // Log 30 messages. This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500 + // bytes for current file as messages are logged. + // + int iMessagesToLog = 30; + + VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog)); + } + + /// + /// Validates rolling with no backup files, with count direction set to up. + /// Only the current file should be present, wrapping to 0 bytes once the + /// previous file fills up. + /// + [Test] + public void TestRollingCountUpZeroBackups() + { + // + // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the + // oldest, and 3 is the newest + // + string sBackupInfo = ", , , , "; + + // + // Count Up + // + _iCountDirection = +1; + + // + // No backups + // + _MaxSizeRollBackups = 0; + + // + // Log 30 messages. This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500 + // bytes for current file as messages are logged. + // + int iMessagesToLog = 30; + + VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog)); + } + + + /// + /// Validates rolling using a fixed number of backup files, with + /// count direction set to down, so that older files have higher counts. + /// Newest = 1, Oldest = N, where N is the number of backups to allow + /// + [Test] + public void TestRollingCountDownFixedBackups() + { + // + // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the + // oldest, and 3 is the newest + // + string sBackupInfo = "1, 1 2, 1 2 3, 1 2 3, 1 2 3"; + + // + // Count Up + // + _iCountDirection = -1; + + // + // Log 30 messages. This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500 + // bytes for current file as messages are logged. + // + int iMessagesToLog = 30; + + VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog)); + } + + /// + /// Validates rolling using an infinite number of backup files, with + /// count direction set to down, so that older files have higher counts. + /// Newest = 1, Oldest = N, where N is the number of times rolling has + /// occurred + /// + [Test] + public void TestRollingCountDownInfiniteBackups() + { + // + // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the + // oldest, and 3 is the newest + // + string sBackupInfo = "1, 1 2, 1 2 3, 1 2 3 4, 1 2 3 4 5"; + + // + // Count Down + // + _iCountDirection = -1; + + // + // Infinite backups + // + _MaxSizeRollBackups = -1; + + // + // Log 30 messages. This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500 + // bytes for current file as messages are logged. + // + int iMessagesToLog = 30; + + VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog)); + } + + /// + /// Validates rolling with no backup files, with count direction set to down. + /// Only the current file should be present, wrapping to 0 bytes once the + /// previous file fills up. + /// + [Test] + public void TestRollingCountDownZeroBackups() + { + // + // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the + // oldest, and 3 is the newest + // + string sBackupInfo = ", , , , "; + + // + // Count Up + // + _iCountDirection = -1; + + // + // No backups + // + _MaxSizeRollBackups = 0; + + // + // Log 30 messages. This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500 + // bytes for current file as messages are logged. + // + int iMessagesToLog = 30; + + VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog)); + } + + /// + /// Configures the root appender for counting and rolling + /// + private void ConfigureRootAppender() + { + _root = ((Repository.Hierarchy.Hierarchy)Utils.GetRepository()).Root; + _root.Level = Level.Debug; + _caRoot = new CountingAppender(); + _root.AddAppender(_caRoot); + Assert.AreEqual(_caRoot.Counter, 0); + + // + // Set the root appender with a RollingFileAppender + // + _root.AddAppender(CreateAppender()); + + _root.Repository.Configured = true; + } + + /// + /// Verifies that the current backup index is detected correctly when initializing + /// + /// + /// + /// + private static void VerifyInitializeRollBackupsFromBaseFile(string sBaseFile, + ArrayList alFiles, + int iExpectedCurSizeRollBackups) + { + InitializeAndVerifyExpectedValue(alFiles, sBaseFile, CreateRollingFileAppender("5,0,1"), + iExpectedCurSizeRollBackups); + } + + /// + /// Tests that the current backup index is 0 when no + /// existing files are seen + /// + [Test] + public void TestInitializeRollBackups1() + { + string sBaseFile = "LogFile.log"; + ArrayList arrFiles = new ArrayList(); + arrFiles.Add("junk1"); + arrFiles.Add("junk1.log"); + arrFiles.Add("junk2.log"); + arrFiles.Add("junk.log.1"); + arrFiles.Add("junk.log.2"); + + int iExpectedCurSizeRollBackups = 0; + VerifyInitializeRollBackupsFromBaseFile(sBaseFile, arrFiles, iExpectedCurSizeRollBackups); + } + + /// + /// Verifies that files are detected when the base file is specified + /// + /// + private static void VerifyInitializeRollBackupsFromBaseFile(string sBaseFile) + { + ArrayList alFiles = MakeTestDataFromString(sBaseFile, "0,1,2"); + + int iExpectedCurSizeRollBackups = 2; + VerifyInitializeRollBackupsFromBaseFile(sBaseFile, alFiles, iExpectedCurSizeRollBackups); + } + + /// + /// Verifies that count goes to the highest when counting up + /// + [Test] + public void TestInitializeCountUpFixed() + { + ArrayList alFiles = MakeTestDataFromString("3,4,5"); + int iExpectedValue = 5; + InitializeAndVerifyExpectedValue(alFiles, c_fileName, CreateRollingFileAppender("3,0,1"), iExpectedValue); + } + + /// + /// Verifies that count goes to the highest when counting up + /// + [Test] + public void TestInitializeCountUpFixed2() + { + ArrayList alFiles = MakeTestDataFromString("0,3"); + int iExpectedValue = 3; + InitializeAndVerifyExpectedValue(alFiles, c_fileName, CreateRollingFileAppender("3,0,1"), iExpectedValue); + } + + /// + /// Verifies that count stays at 0 for the zero backups case + /// when counting up + /// + [Test] + public void TestInitializeCountUpZeroBackups() + { + ArrayList alFiles = MakeTestDataFromString("0,3"); + int iExpectedValue = 0; + InitializeAndVerifyExpectedValue(alFiles, c_fileName, CreateRollingFileAppender("0,0,1"), iExpectedValue); + } + + /// + /// Verifies that count stays at 0 for the zero backups case + /// when counting down + /// + [Test] + public void TestInitializeCountDownZeroBackups() + { + ArrayList alFiles = MakeTestDataFromString("0,3"); + int iExpectedValue = 0; + InitializeAndVerifyExpectedValue(alFiles, c_fileName, CreateRollingFileAppender("0,0,-1"), iExpectedValue); + } + + + /// + /// Verifies that count goes to the highest when counting up + /// + [Test] + public void TestInitializeCountDownFixed() + { + ArrayList alFiles = MakeTestDataFromString("4,5,6"); + VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 0); + } + + /// + /// Verifies that count goes to the highest when counting up + /// + [Test] + public void TestInitializeCountDownFixed2() + { + ArrayList alFiles = MakeTestDataFromString("1,5,6"); + VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 1); + } + + /// + /// Verifies that count goes to the highest when counting up + /// + [Test] + public void TestInitializeCountDownFixed3() + { + ArrayList alFiles = MakeTestDataFromString("2,5,6"); + VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 2); + } + + /// + /// Verifies that count goes to the highest when counting up + /// + [Test] + public void TestInitializeCountDownFixed4() + { + ArrayList alFiles = MakeTestDataFromString("3,5,6"); + VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 3); + } + + /// + /// Verifies that count goes to the highest when counting up + /// + [Test] + public void TestInitializeCountDownFixed5() + { + ArrayList alFiles = MakeTestDataFromString("1,2,3"); + VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 3); + } + + /// + /// Verifies that count goes to the highest when counting up + /// + [Test] + public void TestInitializeCountDownFixed6() + { + ArrayList alFiles = MakeTestDataFromString("1,2"); + VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 2); + } + + /// + /// Verifies that count goes to the highest when counting up + /// + [Test] + public void TestInitializeCountDownFixed7() + { + ArrayList alFiles = MakeTestDataFromString("2,3"); + VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 3); + } + + private static void InitializeAndVerifyExpectedValue(ArrayList alFiles, + string sBaseFile, + RollingFileAppender rfa, + int iExpectedValue) + { + InitializeRollBackups(rfa, sBaseFile, alFiles); + Assert.AreEqual(iExpectedValue, GetFieldCurSizeRollBackups(rfa)); + } + + /// + /// Tests the count down case, with infinite max backups, to see that + /// initialization of the rolling file appender results in the expected value + /// + /// + /// + /// + private static void VerifyInitializeDownInfiniteExpectedValue(ArrayList alFiles, + string sBaseFile, + int iExpectedValue) + { + InitializeAndVerifyExpectedValue(alFiles, sBaseFile, CreateRollingFileAppender("-1,0,-1"), iExpectedValue); + } + + /// + /// Creates a RollingFileAppender with the desired values, where the + /// values are passed as a comma separated string, with 3 parameters, + /// m_maxSizeRollBackups, m_curSizeRollBackups, CountDirection + /// + /// + /// + private static RollingFileAppender CreateRollingFileAppender(string sParams) + { + string[] asParams = sParams.Split(','); + if (null == asParams || asParams.Length != 3) + { + throw new ArgumentOutOfRangeException(sParams, sParams, + "Must have 3 comma separated params: MaxSizeRollBackups, CurSizeRollBackups, CountDirection"); + } + + RollingFileAppender rfa = new RollingFileAppender(); + rfa.RollingStyle = RollingFileAppender.RollingMode.Size; + SetFieldMaxSizeRollBackups(rfa, Int32.Parse(asParams[0].Trim())); + SetFieldCurSizeRollBackups(rfa, Int32.Parse(asParams[1].Trim())); + rfa.CountDirection = Int32.Parse(asParams[2].Trim()); + + return rfa; + } + + /// + /// Verifies that count goes to the highest when counting down + /// and infinite backups are selected + /// + [Test] + public void TestInitializeCountDownInfinite() + { + ArrayList alFiles = MakeTestDataFromString("2,3"); + VerifyInitializeDownInfiniteExpectedValue(alFiles, c_fileName, 3); + } + + /// + /// Verifies that count goes to the highest when counting down + /// and infinite backups are selected + /// + [Test] + public void TestInitializeCountDownInfinite2() + { + ArrayList alFiles = MakeTestDataFromString("2,3,4,5,6,7,8,9,10"); + VerifyInitializeDownInfiniteExpectedValue(alFiles, c_fileName, 10); + } + + /// + /// Verifies that count goes to the highest when counting down + /// and infinite backups are selected + /// + [Test] + public void TestInitializeCountDownInfinite3() + { + ArrayList alFiles = MakeTestDataFromString("9,10,3,4,5,7,9,6,1,2,8"); + VerifyInitializeDownInfiniteExpectedValue(alFiles, c_fileName, 10); + } + + /// + /// Verifies that count goes to the highest when counting up + /// and infinite backups are selected + /// + [Test] + public void TestInitializeCountUpInfinite() + { + ArrayList alFiles = MakeTestDataFromString("2,3"); + VerifyInitializeUpInfiniteExpectedValue(alFiles, c_fileName, 3); + } + + /// + /// Verifies that count goes to the highest when counting up + /// and infinite backups are selected + /// + [Test] + public void TestInitializeCountUpInfinite2() + { + ArrayList alFiles = MakeTestDataFromString("2,3,4,5,6,7,8,9,10"); + VerifyInitializeUpInfiniteExpectedValue(alFiles, c_fileName, 10); + } + + /// + /// Verifies that count goes to the highest when counting up + /// and infinite backups are selected + /// + [Test] + public void TestInitializeCountUpInfinite3() + { + ArrayList alFiles = MakeTestDataFromString("9,10,3,4,5,7,9,6,1,2,8"); + VerifyInitializeUpInfiniteExpectedValue(alFiles, c_fileName, 10); + } + + /// + /// Creates a logger hierarchy, configures a rolling file appender and returns an ILogger + /// + /// The filename to log to + /// The locking model to use. + /// The error handler to use. + /// A configured ILogger + private static ILogger CreateLogger(string filename, + FileAppender.LockingModelBase lockModel, + IErrorHandler handler) + { + return CreateLogger(filename, lockModel, handler, 100000, 0); + } + + /// + /// Creates a logger hierarchy, configures a rolling file appender and returns an ILogger + /// + /// The filename to log to + /// The locking model to use. + /// The error handler to use. + /// Maximum file size for roll + /// Maximum number of roll backups + /// A configured ILogger + private static ILogger CreateLogger(string filename, + FileAppender.LockingModelBase lockModel, + IErrorHandler handler, + int maxFileSize, + int maxSizeRollBackups) + { + Repository.Hierarchy.Hierarchy h = + (Repository.Hierarchy.Hierarchy)LogManager.CreateRepository("TestRepository"); + + RollingFileAppender appender = new RollingFileAppender(); + appender.File = filename; + appender.AppendToFile = false; + appender.CountDirection = 0; + appender.RollingStyle = RollingFileAppender.RollingMode.Size; + appender.MaxFileSize = maxFileSize; + appender.Encoding = Encoding.ASCII; + appender.ErrorHandler = handler; + appender.MaxSizeRollBackups = maxSizeRollBackups; + if (lockModel != null) + { + appender.LockingModel = lockModel; + } + + PatternLayout layout = new PatternLayout(); + layout.ConversionPattern = "%m%n"; + layout.ActivateOptions(); + + appender.Layout = layout; + appender.ActivateOptions(); + + h.Root.AddAppender(appender); + h.Configured = true; + + ILogger log = h.GetLogger("Logger"); + return log; + } + + /// + /// Destroys the logger hierarchy created by + /// + private static void DestroyLogger() + { + Repository.Hierarchy.Hierarchy h = + (Repository.Hierarchy.Hierarchy)LogManager.GetRepository("TestRepository"); + h.ResetConfiguration(); + //Replace the repository selector so that we can recreate the hierarchy with the same name if necessary + LoggerManager.RepositorySelector = + new DefaultRepositorySelector(typeof(log4net.Repository.Hierarchy.Hierarchy)); + } + + private static void AssertFileEquals(string filename, string contents) + { + FileInfo fileinfo = new FileInfo(filename); + StreamReader sr = new StreamReader(fileinfo.OpenRead()); + string logcont = sr.ReadToEnd(); + sr.Close(); + + Assert.AreEqual(contents, logcont, "Log contents is not what is expected"); + + File.Delete(filename); + } + + /// + /// Verifies that logging a message actually produces output + /// + [Test] + public void TestLogOutput() + { + string filename = "test_simple.log"; + SilentErrorHandler sh = new SilentErrorHandler(); + ILogger log = CreateLogger(filename, new FileAppender.ExclusiveLock(), sh); + log.Log(GetType(), Level.Info, "This is a message", null); + log.Log(GetType(), Level.Info, "This is a message 2", null); + DestroyLogger(); + + AssertFileEquals(filename, + "This is a message" + Environment.NewLine + "This is a message 2" + Environment.NewLine); + Assert.AreEqual("", sh.Message, "Unexpected error message"); + } + + /// + /// Verifies that attempting to log to a locked file fails gracefully + /// + [Test] + public void TestExclusiveLockFails() + { + string filename = "test_exclusive_lock_fails.log"; + + FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None); + fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4); + + SilentErrorHandler sh = new SilentErrorHandler(); + ILogger log = CreateLogger(filename, new FileAppender.ExclusiveLock(), sh); + log.Log(GetType(), Level.Info, "This is a message", null); + log.Log(GetType(), Level.Info, "This is a message 2", null); + DestroyLogger(); + fs.Close(); + + AssertFileEquals(filename, "Test"); + Assert.AreEqual(sh.Message.Substring(0, 30), "Unable to acquire lock on file", + "Expecting an error message"); + } + + /// + /// Verifies that attempting to log to a locked file recovers if the lock is released + /// + [Test] + public void TestExclusiveLockRecovers() + { + string filename = "test_exclusive_lock_recovers.log"; + + FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None); + fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4); + + SilentErrorHandler sh = new SilentErrorHandler(); + ILogger log = CreateLogger(filename, new FileAppender.ExclusiveLock(), sh); + log.Log(GetType(), Level.Info, "This is a message", null); + fs.Close(); + log.Log(GetType(), Level.Info, "This is a message 2", null); + DestroyLogger(); + + AssertFileEquals(filename, "This is a message 2" + Environment.NewLine); + Assert.AreEqual("Unable to acquire lock on file", sh.Message.Substring(0, 30), + "Expecting an error message"); + } + + /// + /// Verifies that attempting to log to a file with ExclusiveLock really locks the file + /// + [Test] + public void TestExclusiveLockLocks() + { + string filename = "test_exclusive_lock_locks.log"; + bool locked = false; + + SilentErrorHandler sh = new SilentErrorHandler(); + ILogger log = CreateLogger(filename, new FileAppender.ExclusiveLock(), sh); + log.Log(GetType(), Level.Info, "This is a message", null); + + try + { + FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None); + fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4); + fs.Close(); + } + catch (IOException e1) + { +#if MONO + Assert.AreEqual("Sharing violation on path ", e1.Message.Substring(0, 26), "Unexpected exception"); +#else + Assert.AreEqual("The process cannot access the file ", e1.Message.Substring(0, 35), + "Unexpected exception"); +#endif + locked = true; + } + + log.Log(GetType(), Level.Info, "This is a message 2", null); + DestroyLogger(); + + Assert.IsTrue(locked, "File was not locked"); +#if !MONO || MONO_3_5 || MONO_4_0 // at least on Linux with Mono 2.4 exclusive locking doesn't work as one would expect + AssertFileEquals(filename, + "This is a message" + Environment.NewLine + "This is a message 2" + Environment.NewLine); +#endif + Assert.AreEqual("", sh.Message, "Unexpected error message"); + } + + + /// + /// Verifies that attempting to log to a locked file fails gracefully + /// + [Test] + public void TestMinimalLockFails() + { + string filename = "test_minimal_lock_fails.log"; + + FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None); + fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4); + + SilentErrorHandler sh = new SilentErrorHandler(); + ILogger log = CreateLogger(filename, new FileAppender.MinimalLock(), sh); + log.Log(GetType(), Level.Info, "This is a message", null); + log.Log(GetType(), Level.Info, "This is a message 2", null); + DestroyLogger(); + fs.Close(); + + AssertFileEquals(filename, "Test"); + Assert.AreEqual("Unable to acquire lock on file", sh.Message.Substring(0, 30), + "Expecting an error message"); + } + + /// + /// Verifies that attempting to log to a locked file recovers if the lock is released + /// + [Test] + public void TestMinimalLockRecovers() + { + string filename = "test_minimal_lock_recovers.log"; + + FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None); + fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4); + + SilentErrorHandler sh = new SilentErrorHandler(); + ILogger log = CreateLogger(filename, new FileAppender.MinimalLock(), sh); + log.Log(GetType(), Level.Info, "This is a message", null); + fs.Close(); + log.Log(GetType(), Level.Info, "This is a message 2", null); + DestroyLogger(); + + AssertFileEquals(filename, "This is a message 2" + Environment.NewLine); + Assert.AreEqual("Unable to acquire lock on file", sh.Message.Substring(0, 30), + "Expecting an error message"); + } + + /// + /// Verifies that attempting to log to a file with MinimalLock doesn't lock the file + /// + [Test] + public void TestMinimalLockUnlocks() + { + string filename = "test_minimal_lock_unlocks.log"; + bool locked; + + SilentErrorHandler sh = new SilentErrorHandler(); + ILogger log = CreateLogger(filename, new FileAppender.MinimalLock(), sh); + log.Log(GetType(), Level.Info, "This is a message", null); + + locked = true; + FileStream fs = new FileStream(filename, FileMode.Append, FileAccess.Write, FileShare.None); + fs.Write(Encoding.ASCII.GetBytes("Test" + Environment.NewLine), 0, 4 + Environment.NewLine.Length); + fs.Close(); + + log.Log(GetType(), Level.Info, "This is a message 2", null); + DestroyLogger(); + + Assert.IsTrue(locked, "File was not locked"); + AssertFileEquals(filename, + "This is a message" + Environment.NewLine + "Test" + Environment.NewLine + "This is a message 2" + + Environment.NewLine); + Assert.AreEqual("", sh.Message, "Unexpected error message"); + } + +#if !NETCF + /// + /// Verifies that attempting to log to a locked file fails gracefully + /// + [Test] + public void TestInterProcessLockFails() + { + string filename = "test_interprocess_lock_fails.log"; + + FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None); + fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4); + + SilentErrorHandler sh = new SilentErrorHandler(); + ILogger log = CreateLogger(filename, new FileAppender.InterProcessLock(), sh); + log.Log(GetType(), Level.Info, "This is a message", null); + log.Log(GetType(), Level.Info, "This is a message 2", null); + DestroyLogger(); + fs.Close(); + + AssertFileEquals(filename, "Test"); + Assert.AreEqual("Unable to acquire lock on file", sh.Message.Substring(0, 30), + "Expecting an error message"); + } + + /// + /// Verifies that attempting to log to a locked file recovers if the lock is released + /// + [Test] + public void TestInterProcessLockRecovers() + { + string filename = "test_interprocess_lock_recovers.log"; + + FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None); + fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4); + + SilentErrorHandler sh = new SilentErrorHandler(); + ILogger log = CreateLogger(filename, new FileAppender.InterProcessLock(), sh); + log.Log(GetType(), Level.Info, "This is a message", null); + fs.Close(); + log.Log(GetType(), Level.Info, "This is a message 2", null); + DestroyLogger(); + + AssertFileEquals(filename, "This is a message 2" + Environment.NewLine); + Assert.AreEqual("Unable to acquire lock on file", sh.Message.Substring(0, 30), + "Expecting an error message"); + } + + /// + /// Verifies that attempting to log to a file with InterProcessLock really locks the file + /// + [Test] + public void TestInterProcessLockUnlocks() + { + string filename = "test_interprocess_lock_unlocks.log"; + bool locked; + + SilentErrorHandler sh = new SilentErrorHandler(); + ILogger log = CreateLogger(filename, new FileAppender.InterProcessLock(), sh); + log.Log(GetType(), Level.Info, "This is a message", null); + + locked = true; + FileStream fs = new FileStream(filename, FileMode.Append, FileAccess.Write, FileShare.ReadWrite); + fs.Write(Encoding.ASCII.GetBytes("Test" + Environment.NewLine), 0, 4 + Environment.NewLine.Length); + fs.Close(); + + log.Log(GetType(), Level.Info, "This is a message 2", null); + DestroyLogger(); + + Assert.IsTrue(locked, "File was not locked"); + AssertFileEquals(filename, + "This is a message" + Environment.NewLine + "Test" + Environment.NewLine + "This is a message 2" + + Environment.NewLine); + Assert.AreEqual("", sh.Message, "Unexpected error message"); + } + + /// + /// Verifies that rolling file works + /// + [Test] + public void TestInterProcessLockRoll() + { + string filename = "test_interprocess_lock_roll.log"; + + SilentErrorHandler sh = new SilentErrorHandler(); + ILogger log = CreateLogger(filename, new FileAppender.InterProcessLock(), sh, 1, 2); + + Assert.DoesNotThrow(delegate + { + log.Log(GetType(), Level.Info, "A", null); + }); + Assert.DoesNotThrow(delegate + { + log.Log(GetType(), Level.Info, "A", null); + }); + + DestroyLogger(); + + AssertFileEquals(filename, "A" + Environment.NewLine); + AssertFileEquals(filename + ".1", "A" + Environment.NewLine); + Assert.IsEmpty(sh.Message); + } +#endif + + /// + /// Verify that the default LockModel is ExclusiveLock, to maintain backwards compatibility with previous behaviour + /// + [Test] + public void TestDefaultLockingModel() + { + string filename = "test_default.log"; + + SilentErrorHandler sh = new SilentErrorHandler(); + ILogger log = CreateLogger(filename, null, sh); + + IAppender[] appenders = log.Repository.GetAppenders(); + Assert.AreEqual(1, appenders.Length, "The wrong number of appenders are configured"); + + RollingFileAppender rfa = (RollingFileAppender)(appenders[0]); + Assert.AreEqual(typeof(log4net.Appender.FileAppender.ExclusiveLock), rfa.LockingModel.GetType(), + "The LockingModel is of an unexpected type"); + + DestroyLogger(); + } + + /// + /// Tests the count up case, with infinite max backups , to see that + /// initialization of the rolling file appender results in the expected value + /// + /// + /// + /// + private static void VerifyInitializeUpInfiniteExpectedValue(ArrayList alFiles, + string sBaseFile, + int iExpectedValue) + { + InitializeAndVerifyExpectedValue(alFiles, sBaseFile, CreateRollingFileAppender("-1,0,1"), iExpectedValue); + } + + + /// + /// Tests the count down case, with max backups limited to 3, to see that + /// initialization of the rolling file appender results in the expected value + /// + /// + /// + /// + private static void VerifyInitializeDownFixedExpectedValue(ArrayList alFiles, + string sBaseFile, + int iExpectedValue) + { + InitializeAndVerifyExpectedValue(alFiles, sBaseFile, CreateRollingFileAppender("3,0,-1"), iExpectedValue); + } + + /// + /// Turns a string of comma separated numbers into a collection of filenames + /// generated from the numbers. + /// + /// Defaults to filename in _fileName variable. + /// + /// + /// Comma separated list of numbers for counted file names + /// + private static ArrayList MakeTestDataFromString(string sFileNumbers) + { + return MakeTestDataFromString(c_fileName, sFileNumbers); + } + + /// + /// Turns a string of comma separated numbers into a collection of filenames + /// generated from the numbers + /// + /// Uses the input filename. + /// + /// Name of file to combine with numbers when generating counted file names + /// Comma separated list of numbers for counted file names + /// + private static ArrayList MakeTestDataFromString(string sFileName, string sFileNumbers) + { + ArrayList alFiles = new ArrayList(); + + string[] sNumbers = sFileNumbers.Split(','); + foreach (string sNumber in sNumbers) + { + Int32 iValue = Int32.Parse(sNumber.Trim()); + alFiles.Add(MakeFileName(sFileName, iValue)); + } + + return alFiles; + } + + /// + /// Tests that the current backup index is correctly detected + /// for a file with no extension + /// + [Test] + public void TestInitializeRollBackups2() + { + VerifyInitializeRollBackupsFromBaseFile("LogFile"); + } + + /// + /// Tests that the current backup index is correctly detected + /// for a file with a .log extension + /// + [Test] + public void TestInitializeRollBackups3() + { + VerifyInitializeRollBackupsFromBaseFile("LogFile.log"); + } + + /// + /// Makes sure that the initialization can detect the backup + /// number correctly. + /// + /// + /// + public void VerifyInitializeRollBackups(int iBackups, int iMaxSizeRollBackups) + { + string sBaseFile = "LogFile.log"; + ArrayList arrFiles = new ArrayList(); + arrFiles.Add("junk1"); + for (int i = 0; i < iBackups; i++) + { + arrFiles.Add(MakeFileName(sBaseFile, i)); + } + + RollingFileAppender rfa = new RollingFileAppender(); + rfa.RollingStyle = RollingFileAppender.RollingMode.Size; + SetFieldMaxSizeRollBackups(rfa, iMaxSizeRollBackups); + SetFieldCurSizeRollBackups(rfa, 0); + InitializeRollBackups(rfa, sBaseFile, arrFiles); + + // iBackups / Meaning + // 0 = none + // 1 = file.log + // 2 = file.log.1 + // 3 = file.log.2 + if (0 == iBackups || + 1 == iBackups) + { + Assert.AreEqual(0, GetFieldCurSizeRollBackups(rfa)); + } + else + { + Assert.AreEqual(Math.Min(iBackups - 1, iMaxSizeRollBackups), GetFieldCurSizeRollBackups(rfa)); + } + } + + /// + /// Tests that the current backup index is correctly detected, + /// and gets no bigger than the max backups setting + /// + [Test] + public void TestInitializeRollBackups4() + { + const int iMaxRollBackups = 5; + VerifyInitializeRollBackups(0, iMaxRollBackups); + VerifyInitializeRollBackups(1, iMaxRollBackups); + VerifyInitializeRollBackups(2, iMaxRollBackups); + VerifyInitializeRollBackups(3, iMaxRollBackups); + VerifyInitializeRollBackups(4, iMaxRollBackups); + VerifyInitializeRollBackups(5, iMaxRollBackups); + VerifyInitializeRollBackups(6, iMaxRollBackups); + // Final we cap out at the max value + VerifyInitializeRollBackups(7, iMaxRollBackups); + VerifyInitializeRollBackups(8, iMaxRollBackups); + } + + /// + /// + /// + [Test, + Ignore("Not Implemented: Want to test counted files limited up, to see that others are ?? ignored? deleted?")] + public void TestInitialization3() + { + } + + /// + /// + /// + [Test, + Ignore( + "Not Implemented: Want to test counted files limited down, to see that others are ?? ignored? deleted?")] + public void TestInitialization4() + { + } + + /// + /// + /// + [Test, + Ignore("Not Implemented: Want to test dated files with a limit, to see that others are ?? ignored? deleted?")] + public void TestInitialization5() + { + } + + /// + /// + /// + [Test, + Ignore("Not Implemented: Want to test dated files with no limit, to see that others are ?? ignored? deleted?")] + public void TestInitialization6() + { + } + + /// + /// + /// + [Test, + Ignore( + "Not Implemented: Want to test dated files with mixed dates existing, to see that other dates do not matter")] + public void TestInitialization7() + { + } + + + // + // Helper functions to dig into the appender + // + + private static ArrayList GetExistingFiles(string baseFilePath) + { + return GetExistingFiles(baseFilePath, false); + } + + private static ArrayList GetExistingFiles(string baseFilePath, bool preserveLogFileNameExtension) + { + RollingFileAppender appender = new RollingFileAppender(); + appender.PreserveLogFileNameExtension = preserveLogFileNameExtension; + appender.SecurityContext = NullSecurityContext.Instance; + + return (ArrayList)Utils.InvokeMethod(appender, "GetExistingFiles", baseFilePath); + } + + private static void InitializeRollBackups(RollingFileAppender appender, string baseFile, ArrayList arrayFiles) + { + Utils.InvokeMethod(appender, "InitializeRollBackups", baseFile, arrayFiles); + } + + private static int GetFieldCurSizeRollBackups(RollingFileAppender appender) + { + return (int)Utils.GetField(appender, "m_curSizeRollBackups"); + } + + private static void SetFieldCurSizeRollBackups(RollingFileAppender appender, int val) + { + Utils.SetField(appender, "m_curSizeRollBackups", val); + } + + private static void SetFieldMaxSizeRollBackups(RollingFileAppender appender, int val) + { + Utils.SetField(appender, "m_maxSizeRollBackups", val); + } + + private static string GetTestMessage() + { + switch (Environment.NewLine.Length) + { + case 2: + return c_testMessage98Chars; + + case 1: + return c_testMessage99Chars; + + default: + throw new Exception("Unexpected Environment.NewLine.Length"); + } + } + } + + [TestFixture] + public class RollingFileAppenderSubClassTest : RollingFileAppender + { + [Test] + public void TestComputeCheckPeriod() + { + RollingFileAppender rfa = new RollingFileAppender(); + + Assert.AreEqual(RollPoint.TopOfMinute, InvokeComputeCheckPeriod(rfa, ".yyyy-MM-dd HH:mm"), + "TopOfMinute pattern"); + Assert.AreEqual(RollPoint.TopOfHour, InvokeComputeCheckPeriod(rfa, ".yyyy-MM-dd HH"), "TopOfHour pattern"); + Assert.AreEqual(RollPoint.HalfDay, InvokeComputeCheckPeriod(rfa, ".yyyy-MM-dd tt"), "HalfDay pattern"); + Assert.AreEqual(RollPoint.TopOfDay, InvokeComputeCheckPeriod(rfa, ".yyyy-MM-dd"), "TopOfDay pattern"); + Assert.AreEqual(RollPoint.TopOfMonth, InvokeComputeCheckPeriod(rfa, ".yyyy-MM"), "TopOfMonth pattern"); + + // Test invalid roll point + Assert.AreEqual(RollPoint.InvalidRollPoint, InvokeComputeCheckPeriod(rfa, "..."), "TopOfMonth pattern"); + } + + private static RollPoint InvokeComputeCheckPeriod(RollingFileAppender rollingFileAppender, string datePattern) + { + return (RollPoint)Utils.InvokeMethod(rollingFileAppender, "ComputeCheckPeriod", datePattern); + } + } +} \ No newline at end of file diff --git a/src/log4net/Appender/RollingFileAppender.cs b/src/log4net/Appender/RollingFileAppender.cs index f53dd7888..d6aef101b 100644 --- a/src/log4net/Appender/RollingFileAppender.cs +++ b/src/log4net/Appender/RollingFileAppender.cs @@ -470,7 +470,7 @@ public RollingMode RollingStyle m_rollDate = false; m_rollSize = false; - this.AppendToFile = false; + AppendToFile = false; break; case RollingMode.Size: @@ -623,7 +623,7 @@ protected virtual void AdjustFileBeforeAppend() #endif if (m_rollDate) { - DateTime n = m_dateTime.Now; + var n = m_dateTime.Now; if (n >= m_nextCheck) { m_now = n; @@ -729,7 +729,7 @@ protected string GetNextOutputFileName(string fileName) if (m_rollDate) { - fileName = CombinePath(fileName, m_now.ToString(m_datePattern, System.Globalization.DateTimeFormatInfo.InvariantInfo)); + fileName = CombinePath(fileName, m_now.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo)); } if (m_countDirection >= 0) @@ -757,11 +757,11 @@ private void DetermineCurSizeRollBackups() using(SecurityContext.Impersonate(this)) { - fullPath = System.IO.Path.GetFullPath(m_baseFileName); - fileName = System.IO.Path.GetFileName(fullPath); + fullPath = Path.GetFullPath(m_baseFileName); + fileName = Path.GetFileName(fullPath); } - ArrayList arrayFiles = GetExistingFiles(fullPath); + var arrayFiles = GetExistingFiles(fullPath); InitializeRollBackups(fileName, arrayFiles); LogLog.Debug(declaringType, "curSizeRollBackups starts at ["+m_curSizeRollBackups+"]"); @@ -793,26 +793,26 @@ private string GetWildcardPatternForFile(string baseFileName) /// private ArrayList GetExistingFiles(string baseFilePath) { - ArrayList alFiles = new ArrayList(); + var alFiles = new ArrayList(); string directory = null; using(SecurityContext.Impersonate(this)) { - string fullPath = Path.GetFullPath(baseFilePath); + var fullPath = Path.GetFullPath(baseFilePath); directory = Path.GetDirectoryName(fullPath); if (Directory.Exists(directory)) { - string baseFileName = Path.GetFileName(fullPath); + var baseFileName = Path.GetFileName(fullPath); - string[] files = Directory.GetFiles(directory, GetWildcardPatternForFile(baseFileName)); + var files = Directory.GetFiles(directory, GetWildcardPatternForFile(baseFileName)); if (files != null) { - for (int i = 0; i < files.Length; i++) + for (var i = 0; i < files.Length; i++) { - string curFileName = Path.GetFileName(files[i]); + var curFileName = Path.GetFileName(files[i]); if (curFileName.StartsWith(Path.GetFileNameWithoutExtension(baseFileName))) { alFiles.Add(curFileName); @@ -849,11 +849,11 @@ private void RollOverIfDateBoundaryCrossing() } #endif } - LogLog.Debug(declaringType, "["+last.ToString(m_datePattern,System.Globalization.DateTimeFormatInfo.InvariantInfo)+"] vs. ["+m_now.ToString(m_datePattern,System.Globalization.DateTimeFormatInfo.InvariantInfo)+"]"); + LogLog.Debug(declaringType, "["+last.ToString(m_datePattern,DateTimeFormatInfo.InvariantInfo)+"] vs. ["+m_now.ToString(m_datePattern,DateTimeFormatInfo.InvariantInfo)+"]"); - if (!(last.ToString(m_datePattern,System.Globalization.DateTimeFormatInfo.InvariantInfo).Equals(m_now.ToString(m_datePattern, System.Globalization.DateTimeFormatInfo.InvariantInfo)))) + if (!(last.ToString(m_datePattern,DateTimeFormatInfo.InvariantInfo).Equals(m_now.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo)))) { - m_scheduledFilename = CombinePath(m_baseFileName, last.ToString(m_datePattern, System.Globalization.DateTimeFormatInfo.InvariantInfo)); + m_scheduledFilename = CombinePath(m_baseFileName, last.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo)); LogLog.Debug(declaringType, "Initial roll over to ["+m_scheduledFilename+"]"); RollOverTime(false); LogLog.Debug(declaringType, "curSizeRollBackups after rollOver at ["+m_curSizeRollBackups+"]"); @@ -881,29 +881,33 @@ protected void ExistingInit() RollOverIfDateBoundaryCrossing(); // If file exists and we are not appending then roll it out of the way - if (AppendToFile == false) + if (AppendToFile != false) { - bool fileExists = false; - string fileName = GetNextOutputFileName(m_baseFileName); + return; + } - using(SecurityContext.Impersonate(this)) - { - fileExists = System.IO.File.Exists(fileName); - } + bool fileExists; + var fileName = GetNextOutputFileName(m_baseFileName); - if (fileExists) - { - if (m_maxSizeRollBackups == 0) - { - LogLog.Debug(declaringType, "Output file ["+fileName+"] already exists. MaxSizeRollBackups is 0; cannot roll. Overwriting existing file."); - } - else - { - LogLog.Debug(declaringType, "Output file ["+fileName+"] already exists. Not appending to file. Rolling existing file out of the way."); + using(SecurityContext.Impersonate(this)) + { + fileExists = System.IO.File.Exists(fileName); + } - RollOverRenameFiles(fileName); - } - } + if (!fileExists) + { + return; + } + + if (m_maxSizeRollBackups == 0) + { + LogLog.Debug(declaringType, "Output file ["+fileName+"] already exists. MaxSizeRollBackups is 0; cannot roll. Overwriting existing file."); + } + else + { + LogLog.Debug(declaringType, "Output file ["+fileName+"] already exists. Not appending to file. Rolling existing file out of the way."); + + RollOverRenameFiles(fileName); } } @@ -918,6 +922,8 @@ protected void ExistingInit() /// private void InitializeFromOneFile(string baseFile, string curFileName) { + curFileName = curFileName.ToLower(); + baseFile = baseFile.ToLower(); if (curFileName.StartsWith(Path.GetFileNameWithoutExtension(baseFile)) == false) { // This is not a log file, so ignore @@ -929,24 +935,16 @@ private void InitializeFromOneFile(string baseFile, string curFileName) return; } - /* - if (m_staticLogFileName) - { - int endLength = curFileName.Length - index; - if (baseFile.Length + endLength != curFileName.Length) - { - // file is probably scheduledFilename + .x so I don't care - return; - } - } - */ - // Only look for files in the current roll point if (m_rollDate && !m_staticLogFileName) { - string date = m_dateTime.Now.ToString(m_datePattern, System.Globalization.DateTimeFormatInfo.InvariantInfo); - string prefix = m_preserveLogFileNameExtension ? Path.GetFileNameWithoutExtension(baseFile) + date : baseFile + date; - string suffix = m_preserveLogFileNameExtension ? Path.GetExtension(baseFile) : ""; + var date = m_dateTime.Now.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo).ToLower(); + var prefix = (m_preserveLogFileNameExtension + ? Path.GetFileNameWithoutExtension(baseFile) + date + : baseFile + date).ToLower(); + var suffix = m_preserveLogFileNameExtension + ? Path.GetExtension(baseFile).ToLower() + : ""; if (!curFileName.StartsWith(prefix) || !curFileName.EndsWith(suffix)) { LogLog.Debug(declaringType, "Ignoring file ["+curFileName+"] because it is from a different date period"); @@ -957,7 +955,7 @@ private void InitializeFromOneFile(string baseFile, string curFileName) try { // Bump the counter up to the highest count seen so far - int backup = GetBackUpIndex(curFileName); + var backup = GetBackUpIndex(curFileName); // caution: we might get a false positive when certain // date patterns such as yyyyMMdd are used...those are @@ -1013,15 +1011,15 @@ private void InitializeFromOneFile(string baseFile, string curFileName) /// private int GetBackUpIndex(string curFileName) { - int backUpIndex = -1; - string fileName = curFileName; + var backUpIndex = -1; + var fileName = curFileName; if (m_preserveLogFileNameExtension) { fileName = Path.GetFileNameWithoutExtension(fileName); } - int index = fileName.LastIndexOf("."); + var index = fileName.LastIndexOf("."); if (index > 0) { // if the "yyyy-MM-dd" component of file.log.yyyy-MM-dd is passed to TryParse @@ -1043,7 +1041,7 @@ private void InitializeRollBackups(string baseFile, ArrayList arrayFiles) { if (null != arrayFiles) { - string baseFileLower = baseFile.ToLowerInvariant(); + var baseFileLower = baseFile.ToLowerInvariant(); foreach(string curFileName in arrayFiles) { @@ -1072,13 +1070,13 @@ private RollPoint ComputeCheckPeriod(string datePattern) // purposes to calculate the resolution of the date pattern. // Get string representation of base line date - string r0 = s_date1970.ToString(datePattern, System.Globalization.DateTimeFormatInfo.InvariantInfo); + var r0 = s_date1970.ToString(datePattern, DateTimeFormatInfo.InvariantInfo); // Check each type of rolling mode starting with the smallest increment. - for(int i = (int)RollPoint.TopOfMinute; i <= (int)RollPoint.TopOfMonth; i++) + for(var i = (int)RollPoint.TopOfMinute; i <= (int)RollPoint.TopOfMonth; i++) { // Get string representation of next pattern - string r1 = NextCheckDate(s_date1970, (RollPoint)i).ToString(datePattern, System.Globalization.DateTimeFormatInfo.InvariantInfo); + var r1 = NextCheckDate(s_date1970, (RollPoint)i).ToString(datePattern, DateTimeFormatInfo.InvariantInfo); LogLog.Debug(declaringType, "Type = ["+i+"], r0 = ["+r0+"], r1 = ["+r1+"]"); @@ -1169,7 +1167,7 @@ public override void ActivateOptions() if (m_rollDate && File != null && m_scheduledFilename == null) { - m_scheduledFilename = CombinePath(File, m_now.ToString(m_datePattern, System.Globalization.DateTimeFormatInfo.InvariantInfo)); + m_scheduledFilename = CombinePath(File, m_now.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo)); } ExistingInit(); @@ -1189,7 +1187,7 @@ public override void ActivateOptions() /// private string CombinePath(string path1, string path2) { - string extension = Path.GetExtension(path1); + var extension = Path.GetExtension(path1); if (m_preserveLogFileNameExtension && extension.Length > 0) { return Path.Combine(Path.GetDirectoryName(path1), Path.GetFileNameWithoutExtension(path1) + path2 + extension); @@ -1225,7 +1223,7 @@ protected void RollOverTime(bool fileIsOpen) //is the new file name equivalent to the 'current' one //something has gone wrong if we hit this -- we should only //roll over if the new file will be different from the old - string dateFormat = m_now.ToString(m_datePattern, System.Globalization.DateTimeFormatInfo.InvariantInfo); + var dateFormat = m_now.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo); if (m_scheduledFilename.Equals(CombinePath(File, dateFormat))) { ErrorHandler.Error("Compare " + m_scheduledFilename + " : " + CombinePath(File, dateFormat)); @@ -1235,14 +1233,14 @@ protected void RollOverTime(bool fileIsOpen) if (fileIsOpen) { // close current file, and rename it to datedFilename - this.CloseFile(); + CloseFile(); } //we may have to roll over a large number of backups here - for (int i = 1; i <= m_curSizeRollBackups; i++) + for (var i = 1; i <= m_curSizeRollBackups; i++) { - string from = CombinePath(File, "." + i); - string to = CombinePath(m_scheduledFilename, "." + i); + var from = CombinePath(File, "." + i); + var to = CombinePath(m_scheduledFilename, "." + i); RollFile(from, to); } @@ -1253,7 +1251,7 @@ protected void RollOverTime(bool fileIsOpen) m_curSizeRollBackups = 0; //new scheduled name - m_scheduledFilename = CombinePath(File, m_now.ToString(m_datePattern, System.Globalization.DateTimeFormatInfo.InvariantInfo)); + m_scheduledFilename = CombinePath(File, m_now.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo)); if (fileIsOpen) { @@ -1336,11 +1334,11 @@ protected void DeleteFile(string fileName) { // We may not have permission to delete the file, or the file may be locked - string fileToDelete = fileName; + var fileToDelete = fileName; // Try to move the file to temp name. // If the file is locked we may still be able to move it - string tempFileName = fileName + "." + Environment.TickCount + ".DeletePending"; + var tempFileName = fileName + "." + Environment.TickCount + ".DeletePending"; try { using(SecurityContext.Impersonate(this)) @@ -1408,7 +1406,7 @@ protected void DeleteFile(string fileName) /// protected void RollOverSize() { - this.CloseFile(); // keep windows happy. + CloseFile(); // keep windows happy. LogLog.Debug(declaringType, "rolling over count ["+((CountingQuietTextWriter)QuietWriter).Count+"]"); LogLog.Debug(declaringType, "maxSizeRollBackups ["+m_maxSizeRollBackups+"]"); @@ -1467,7 +1465,7 @@ protected void RollOverRenameFiles(string baseFileName) } // Map {(maxBackupIndex - 1), ..., 2, 1} to {maxBackupIndex, ..., 3, 2} - for (int i = m_curSizeRollBackups; i >= 1; i--) + for (var i = m_curSizeRollBackups; i >= 1; i--) { RollFile((CombinePath(baseFileName, "." + i)), (CombinePath(baseFileName, "." + (i + 1)))); } @@ -1483,7 +1481,7 @@ protected void RollOverRenameFiles(string baseFileName) if (m_curSizeRollBackups >= m_maxSizeRollBackups && m_maxSizeRollBackups > 0) { //delete the first and keep counting up. - int oldestFileIndex = m_curSizeRollBackups - m_maxSizeRollBackups; + var oldestFileIndex = m_curSizeRollBackups - m_maxSizeRollBackups; // If static then there is 1 file without a number, therefore 1 less archive if (m_staticLogFileName) @@ -1494,14 +1492,14 @@ protected void RollOverRenameFiles(string baseFileName) // If using a static log file then the base for the numbered sequence is the baseFileName passed in // If not using a static log file then the baseFileName will already have a numbered postfix which // we must remove, however it may have a date postfix which we must keep! - string archiveFileBaseName = baseFileName; + var archiveFileBaseName = baseFileName; if (!m_staticLogFileName) { if (m_preserveLogFileNameExtension) { - string extension = Path.GetExtension(archiveFileBaseName); - string baseName = Path.GetFileNameWithoutExtension(archiveFileBaseName); - int lastDotIndex = baseName.LastIndexOf("."); + var extension = Path.GetExtension(archiveFileBaseName); + var baseName = Path.GetFileNameWithoutExtension(archiveFileBaseName); + var lastDotIndex = baseName.LastIndexOf("."); if (lastDotIndex >= 0) { archiveFileBaseName = baseName.Substring(0, lastDotIndex) + extension; @@ -1509,7 +1507,7 @@ protected void RollOverRenameFiles(string baseFileName) } else { - int lastDotIndex = archiveFileBaseName.LastIndexOf("."); + var lastDotIndex = archiveFileBaseName.LastIndexOf("."); if (lastDotIndex >= 0) { archiveFileBaseName = archiveFileBaseName.Substring(0, lastDotIndex); @@ -1554,7 +1552,7 @@ protected void RollOverRenameFiles(string baseFileName) protected DateTime NextCheckDate(DateTime currentDateTime, RollPoint rollPoint) { // Local variable to work on (this does not look very efficient) - DateTime current = currentDateTime; + var current = currentDateTime; // Do slightly different things depending on what the type of roll point we want. switch(rollPoint) diff --git a/src/log4net/Core/LoggingEvent.cs b/src/log4net/Core/LoggingEvent.cs index 26b76ba57..8abb555e1 100644 --- a/src/log4net/Core/LoggingEvent.cs +++ b/src/log4net/Core/LoggingEvent.cs @@ -922,7 +922,7 @@ public string ThreadName public string UserName => m_data.UserName ??= TryGetCurrentUserName() ?? SystemInfo.NotAvailableText; - private static string TryGetCurrentUserName() + private string TryGetCurrentUserName() { #if (NETCF || SSCLI || NETSTANDARD1_3) // On compact framework there's no notion of current Windows user @@ -937,10 +937,8 @@ private static string TryGetCurrentUserName() try { - using (WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent()) - { - return windowsIdentity?.Name ?? ""; - } + return _cachedWindowsIdentityUserName ??= + TryReadWindowsIdentityUserName(); } catch (PlatformNotSupportedException) { @@ -963,6 +961,16 @@ private static string TryGetCurrentUserName() } #endif } + +#if (NETCF || SSCLI || NETSTANDARD1_3) +#else + private string _cachedWindowsIdentityUserName; + private static string TryReadWindowsIdentityUserName() + { + using var identity = WindowsIdentity.GetCurrent(); + return identity?.Name ?? ""; + } +#endif #if (NETCF || SSCLI || NETSTANDARD1_3) #else @@ -1464,10 +1472,23 @@ private void CreateCompositeProperties() // TODO: Add Repository Properties // event properties - var eventProperties = new PropertiesDictionary(); - eventProperties[UserNameProperty] = UserName; - eventProperties[IdentityProperty] = Identity; - compositeProperties.Add(eventProperties); + var shouldFixUserName = (m_fixFlags & FixFlags.UserName) != 0; + var shouldFixIdentity = (m_fixFlags & FixFlags.Identity) != 0; + if (shouldFixIdentity || shouldFixUserName) + { + var eventProperties = new PropertiesDictionary(); + if (shouldFixUserName) + { + eventProperties[UserNameProperty] = UserName; + } + + if (shouldFixIdentity) + { + eventProperties[IdentityProperty] = Identity; + } + + compositeProperties.Add(eventProperties); + } compositeProperties.Add(GlobalContext.Properties.GetReadOnlyProperties()); m_compositeProperties = compositeProperties; From 628fb62fc39d916ba711d7ade4d8b0234613cb7f Mon Sep 17 00:00:00 2001 From: "Bipul Raman (MSFT)" <8312486+BipulRaman@users.noreply.github.com> Date: Fri, 18 Mar 2022 19:32:53 +0530 Subject: [PATCH 050/122] Enforcing TLS 1.2 Enforce TLS 1.2 in PowerShell Scrips as Microsoft is deprecating all old TLS versions --- install-dotnet-core-sdk-1.1.ps1 | 3 +++ install-net-framework-sdk-3.5.ps1 | 3 +++ 2 files changed, 6 insertions(+) diff --git a/install-dotnet-core-sdk-1.1.ps1 b/install-dotnet-core-sdk-1.1.ps1 index d7333e897..038d9d629 100644 --- a/install-dotnet-core-sdk-1.1.ps1 +++ b/install-dotnet-core-sdk-1.1.ps1 @@ -1,3 +1,6 @@ +#Enforce TLS 1.2 as Microsoft is deprecating all old TLS versions +[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12; + $installer="dotnet-dev-win-x64.1.1.14.exe" Write-Host "Downloading $installer" Invoke-WebRequest -Uri "https://download.visualstudio.microsoft.com/download/pr/c6b9a396-5e7a-4b91-86f6-f9e8df3bf1dd/6d61addfd6069e404981bede03f8f4f9/$installer" -OutFile $installer diff --git a/install-net-framework-sdk-3.5.ps1 b/install-net-framework-sdk-3.5.ps1 index e78fa37f2..7858dc987 100644 --- a/install-net-framework-sdk-3.5.ps1 +++ b/install-net-framework-sdk-3.5.ps1 @@ -1,3 +1,6 @@ +#Enforce TLS 1.2 as Microsoft is deprecating all old TLS versions +[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12; + if (-not (Test-Path dotnetfx35.exe)) { Write-Host "Downloading dotnetfx35.exe" Invoke-WebRequest -Uri "https://download.microsoft.com/download/2/0/E/20E90413-712F-438C-988E-FDAA79A8AC3D/dotnetfx35.exe" -OutFile dotnetfx35.exe From cada6618b41286a29ea0724fa8f112884cf6bdef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Apr 2022 05:07:34 +0000 Subject: [PATCH 051/122] :arrow_up: Bump minimist from 1.2.5 to 1.2.6 Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. - [Release notes](https://github.com/substack/minimist/releases) - [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) --- updated-dependencies: - dependency-name: minimist dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0af47db34..869245ab1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3852,9 +3852,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "mixin-deep": { From 10d9a4e77988d7b2bd2d75a85725c0f4b3d726a7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 May 2022 17:39:56 +0000 Subject: [PATCH 052/122] :arrow_up: Bump ant from 1.9.4 to 1.10.11 Bumps ant from 1.9.4 to 1.10.11. --- updated-dependencies: - dependency-name: org.apache.ant:ant dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 36c4c2b49..c73577adc 100644 --- a/pom.xml +++ b/pom.xml @@ -116,7 +116,7 @@ org.apache.ant ant - 1.9.4 + 1.10.11 From 668ab7878ec212037658cab8dbf554218af21560 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 May 2022 17:39:58 +0000 Subject: [PATCH 053/122] :arrow_up: Bump System.Text.RegularExpressions in /src/log4net Bumps System.Text.RegularExpressions from 4.3.0 to 4.3.1. --- updated-dependencies: - dependency-name: System.Text.RegularExpressions dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- src/log4net/log4net.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/log4net/log4net.csproj b/src/log4net/log4net.csproj index 6de258f4d..24ffd912e 100644 --- a/src/log4net/log4net.csproj +++ b/src/log4net/log4net.csproj @@ -157,7 +157,7 @@ - + From e795b6add00b8ab8eb9075422c75dae054467acc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 May 2022 17:40:14 +0000 Subject: [PATCH 054/122] :arrow_up: Bump path-parse from 1.0.6 to 1.0.7 Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7. - [Release notes](https://github.com/jbgutierrez/path-parse/releases) - [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7) --- updated-dependencies: - dependency-name: path-parse dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0af47db34..f2c992abd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4395,9 +4395,9 @@ "dev": true }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "path-root": { From 3bc53bb2daf260276fadb11d645e418e77c68474 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 May 2022 17:40:38 +0000 Subject: [PATCH 055/122] :arrow_up: Bump hosted-git-info from 2.8.8 to 2.8.9 Bumps [hosted-git-info](https://github.com/npm/hosted-git-info) from 2.8.8 to 2.8.9. - [Release notes](https://github.com/npm/hosted-git-info/releases) - [Changelog](https://github.com/npm/hosted-git-info/blob/v2.8.9/CHANGELOG.md) - [Commits](https://github.com/npm/hosted-git-info/compare/v2.8.8...v2.8.9) --- updated-dependencies: - dependency-name: hosted-git-info dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0af47db34..666bcf58f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2941,9 +2941,9 @@ } }, "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, "http-cache-semantics": { From bcea09c6273de3a54edbc2e43d03339b49a4aba6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 Jun 2022 04:16:43 +0000 Subject: [PATCH 056/122] :arrow_up: Bump shell-quote from 1.7.2 to 1.7.3 Bumps [shell-quote](https://github.com/substack/node-shell-quote) from 1.7.2 to 1.7.3. - [Release notes](https://github.com/substack/node-shell-quote/releases) - [Changelog](https://github.com/substack/node-shell-quote/blob/master/CHANGELOG.md) - [Commits](https://github.com/substack/node-shell-quote/compare/v1.7.2...1.7.3) --- updated-dependencies: - dependency-name: shell-quote dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0af47db34..dc145b422 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5253,9 +5253,9 @@ "dev": true }, "shell-quote": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", - "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", + "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", "dev": true }, "side-channel": { From 6bd138ae60edc45b64574fbb8846a539b758ad24 Mon Sep 17 00:00:00 2001 From: Jan Friedrich Date: Tue, 28 Jun 2022 13:37:25 +0200 Subject: [PATCH 057/122] adding extension points for revising logged content --- src/log4net/Core/LoggingEvent.cs | 9 +++++---- src/log4net/Util/SystemStringFormat.cs | 18 +++++++++++++----- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/log4net/Core/LoggingEvent.cs b/src/log4net/Core/LoggingEvent.cs index 8abb555e1..cf228a717 100644 --- a/src/log4net/Core/LoggingEvent.cs +++ b/src/log4net/Core/LoggingEvent.cs @@ -680,6 +680,7 @@ public LocationInfo LocationInformation public object MessageObject { get { return m_message; } + protected set { m_message = value; } } /// @@ -743,7 +744,7 @@ internal void EnsureRepository(ILoggerRepository repository) /// The collected information is cached for future use. /// /// - public string RenderedMessage + public virtual string RenderedMessage { get { @@ -785,7 +786,7 @@ public string RenderedMessage /// to be accessed multiple times then the property will be more efficient. /// /// - public void WriteRenderedMessage(TextWriter writer) + public virtual void WriteRenderedMessage(TextWriter writer) { if (m_data.Message != null) { @@ -1357,7 +1358,7 @@ public void FixVolatileData(bool fastButLoose) /// It is not possible to 'unfix' a field. /// /// - protected void FixVolatileData(FixFlags flags) + protected virtual void FixVolatileData(FixFlags flags) { object forceCreation = null; @@ -1641,7 +1642,7 @@ public PropertiesDictionary GetProperties() /// /// The application supplied message of logging event. /// - private readonly object m_message; + private object m_message; /// /// The exception that was thrown. diff --git a/src/log4net/Util/SystemStringFormat.cs b/src/log4net/Util/SystemStringFormat.cs index cd71c03b9..f28f0777d 100644 --- a/src/log4net/Util/SystemStringFormat.cs +++ b/src/log4net/Util/SystemStringFormat.cs @@ -36,8 +36,16 @@ namespace log4net.Util public sealed class SystemStringFormat { private readonly IFormatProvider m_provider; - private readonly string m_format; - private readonly object[] m_args; + + /// + /// Format + /// + public string Format { get; set; } + + /// + /// Args + /// + public object[] Args { get; set; } #region Constructor @@ -50,8 +58,8 @@ public sealed class SystemStringFormat public SystemStringFormat(IFormatProvider provider, string format, params object[] args) { m_provider = provider; - m_format = format; - m_args = args; + Format = format; + Args = args; } #endregion Constructor @@ -62,7 +70,7 @@ public SystemStringFormat(IFormatProvider provider, string format, params object /// the formatted string public override string ToString() { - return StringFormat(m_provider, m_format, m_args); + return StringFormat(m_provider, Format, Args); } #region StringFormat From 882be824d608d9187329a4d7af1f59bfa9740664 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Fri, 22 Jul 2022 12:20:05 +0200 Subject: [PATCH 058/122] :wrench: finally give up on net35-client - it's seemingly impossible to target on any modern machine and is only valid for winxp targets --- package-lock.json | 8094 +++++++++++++++++++++--- package.json | 2 +- src/log4net.Tests/log4net.Tests.csproj | 2 +- src/log4net.sln | 7 - src/log4net/log4net.csproj | 17 +- 5 files changed, 7137 insertions(+), 985 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8f38b9179..702c89bd2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,8 +1,7096 @@ { "name": "log4net", "version": "2.0.12", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "log4net", + "version": "2.0.12", + "license": "Apache-2.0", + "devDependencies": { + "cross-env": "^7.0.2", + "gulp-debug": "^4.0.0", + "gulp-rename": "^2.0.0", + "gulp-zip": "^5.0.2", + "npm-run-all": "^4.1.5", + "rimraf": "^3.0.2", + "simple-git": "^2.20.1", + "which": "^2.0.2", + "yafs": "^1.5.0", + "zarro": "^1.106.0" + } + }, + "node_modules/@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1" + } + }, + "node_modules/@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", + "dev": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.0.tgz", + "integrity": "sha512-eMhwJXc931Ihh4tkU+Y7GiLzT/y/DBNpNtr4yU9O2w3SYBsr9NaOPhQlLKRmoWtI54uNwuo0IOUFQjVOTZYRvw==", + "dev": true + }, + "node_modules/@types/xml2js": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.9.tgz", + "integrity": "sha512-CHiCKIihl1pychwR2RNX5mAYmJDACgFVCMT5OArMaO3erzwXVcBqPcusr+Vl8yeeXukxZqtF8mZioqX+mpjjdw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-cyan": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", + "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", + "dev": true, + "dependencies": { + "ansi-wrap": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "dev": true, + "dependencies": { + "ansi-wrap": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "dev": true, + "dependencies": { + "ansi-wrap": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/anymatch/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", + "dev": true, + "dependencies": { + "buffer-equal": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-filter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", + "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", + "dev": true, + "dependencies": { + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", + "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", + "dev": true, + "dependencies": { + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-initial": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", + "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", + "dev": true, + "dependencies": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-initial/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-last": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", + "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", + "dev": true, + "dependencies": { + "is-number": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-last/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", + "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "dev": true, + "dependencies": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-sort/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz", + "integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap/node_modules/es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap/node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap/node_modules/is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap/node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap/node_modules/object-inspect": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.1.tgz", + "integrity": "sha512-If7BjFlpkzzBeV1cqgT3OSWT3azyoxDGajR+iGnFBfVV2EWyDyWaZZW2ERDjUaY2QM8i5jI3Sj7mhsM4DDAqWA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap/node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap/node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap/node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async-done": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "node_modules/async-settle": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", + "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", + "dev": true, + "dependencies": { + "async-done": "^1.2.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "node_modules/bach": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", + "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", + "dev": true, + "dependencies": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/child-process-promise": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/child-process-promise/-/child-process-promise-2.2.1.tgz", + "integrity": "sha1-RzChHvYQ+tRQuPIjx50x172tgHQ=", + "dev": true, + "dependencies": { + "cross-spawn": "^4.0.2", + "node-version": "^1.0.0", + "promise-polyfill": "^6.0.1" + } + }, + "node_modules/child-process-promise/node_modules/cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "dev": true, + "dependencies": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "node_modules/child-process-promise/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", + "dev": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/chokidar/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/chokidar/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "node_modules/cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collection-map": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", + "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", + "dev": true, + "dependencies": { + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-props": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.5.tgz", + "integrity": "sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==", + "dev": true, + "dependencies": { + "each-props": "^1.3.2", + "is-plain-object": "^5.0.0" + } + }, + "node_modules/copy-props/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "node_modules/cross-env": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.2.tgz", + "integrity": "sha512-KZP/bMEOJEDCkDQAyRhu3RL2ZO/SUVrxQVI0G3YEQ+OLbRA3c6zgixe8Mq8a/z7+HKlNEjo8oiLUs8iRijY2Rw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", + "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "dev": true, + "dependencies": { + "kind-of": "^5.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-compare/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-resolution": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", + "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", + "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", + "dev": true, + "dependencies": { + "globby": "^10.0.1", + "graceful-fs": "^4.2.2", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.1", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dir-glob/node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/each-props": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", + "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.1", + "object.defaults": "^1.1.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dev": true, + "dependencies": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/event-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-4.0.1.tgz", + "integrity": "sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==", + "dev": true, + "dependencies": { + "duplexer": "^0.1.1", + "from": "^0.1.7", + "map-stream": "0.0.7", + "pause-stream": "^0.0.11", + "split": "^1.0.1", + "stream-combiner": "^0.2.2", + "through": "^2.3.8" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ext": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", + "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", + "dev": true, + "dependencies": { + "type": "^2.5.0" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==", + "dev": true + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "dependencies": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz", + "integrity": "sha1-5qdUzI8V5YmHqpy9J69m/W9OWvk=", + "dev": true + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/findup-sync/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, + "node_modules/fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/fs-mkdirp-stream/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==", + "dev": true, + "dependencies": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/glob-stream/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-stream/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.5.tgz", + "integrity": "sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==", + "dev": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-done": "^1.2.0", + "chokidar": "^2.0.0", + "is-negated-glob": "^1.0.0", + "just-debounce": "^1.0.0", + "normalize-path": "^3.0.0", + "object.defaults": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "dev": true, + "dependencies": { + "sparkles": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, + "node_modules/gulp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", + "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", + "dev": true, + "dependencies": { + "glob-watcher": "^5.0.3", + "gulp-cli": "^2.2.0", + "undertaker": "^1.2.1", + "vinyl-fs": "^3.0.0" + }, + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gulp-debug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/gulp-debug/-/gulp-debug-4.0.0.tgz", + "integrity": "sha512-cn/GhMD2nVZCVxAl5vWao4/dcoZ8wUJ8w3oqTvQaGDmC1vT7swNOEbhQTWJp+/otKePT64aENcqAQXDcdj5H1g==", + "dev": true, + "dependencies": { + "chalk": "^2.3.0", + "fancy-log": "^1.3.2", + "plur": "^3.0.0", + "stringify-object": "^3.0.0", + "through2": "^2.0.0", + "tildify": "^1.1.2" + }, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "gulp": ">=4" + } + }, + "node_modules/gulp-debug/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/gulp-dotnet-cli": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/gulp-dotnet-cli/-/gulp-dotnet-cli-1.1.0.tgz", + "integrity": "sha1-hvuGddTANM4DAezVM1VZX6N0vGs=", + "dev": true, + "dependencies": { + "child-process-promise": "^2.2.0", + "plugin-error": "^0.1.2", + "through2": "^2.0.3" + } + }, + "node_modules/gulp-dotnet-cli/node_modules/arr-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", + "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", + "dev": true, + "dependencies": { + "arr-flatten": "^1.0.1", + "array-slice": "^0.2.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-dotnet-cli/node_modules/arr-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-dotnet-cli/node_modules/array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-dotnet-cli/node_modules/extend-shallow": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "dev": true, + "dependencies": { + "kind-of": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-dotnet-cli/node_modules/kind-of": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-dotnet-cli/node_modules/plugin-error": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", + "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", + "dev": true, + "dependencies": { + "ansi-cyan": "^0.1.1", + "ansi-red": "^0.1.1", + "arr-diff": "^1.0.1", + "arr-union": "^2.0.1", + "extend-shallow": "^1.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-dotnet-cli/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/gulp-edit-xml": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/gulp-edit-xml/-/gulp-edit-xml-3.1.1.tgz", + "integrity": "sha512-wTIT90WAupTJZY9gQbH3ojc7M4RvJEYj/v4ZReQNbi5mlXMw93gvKxLxc1K+5P0SMhq0R92ymLJERiYQoHbenQ==", + "dev": true, + "dependencies": { + "@types/xml2js": "^0.4.5", + "lodash.defaultsdeep": "^4.6.1", + "lodash.isfunction": "^3.0.6", + "lodash.isobject": "^3.0.2", + "plugin-error": "^1.0.1", + "xml2js": "^0.4.8" + } + }, + "node_modules/gulp-filter": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-6.0.0.tgz", + "integrity": "sha512-veQFW93kf6jBdWdF/RxMEIlDK2mkjHyPftM381DID2C9ImTVngwYpyyThxm4/EpgcNOT37BLefzMOjEKbyYg0Q==", + "dev": true, + "dependencies": { + "multimatch": "^4.0.0", + "plugin-error": "^1.0.1", + "streamfilter": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/gulp-msbuild": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/gulp-msbuild/-/gulp-msbuild-0.10.0.tgz", + "integrity": "sha512-MvLl64B1bI5212Q8lYMeZBx/sqh232iZI38lzKc01drZLbBTHP4SGmWYGIBgiCwEGdqwFn++ReBnV1BcOT8hqA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "didyoumean": "~1.2.1", + "glob": "^7.1.1", + "lodash.clonedeep": "^4.5.0", + "lodash.intersection": "^4.4.0", + "lodash.template": "^4.5.0", + "plugin-error": "^1.0.1", + "through2": "^2.0.0", + "uuid": "^3.0.1", + "vinyl": "^2.2.0" + }, + "engines": { + "node": ">=0.8.0", + "npm": ">=1.2.10" + } + }, + "node_modules/gulp-msbuild/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/gulp-msbuild/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/gulp-msbuild/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/gulp-msbuild/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/gulp-msbuild/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/gulp-msbuild/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/gulp-msbuild/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/gulp-rename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-2.0.0.tgz", + "integrity": "sha512-97Vba4KBzbYmR5VBs9mWmK+HwIf5mj+/zioxfZhOKeXtx5ZjBk57KFlePf5nxq9QsTtFl0ejnHE3zTC9MHXqyQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/gulp-zip": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/gulp-zip/-/gulp-zip-5.0.2.tgz", + "integrity": "sha512-rZd0Ppuc8Bf7J2/WzcdNaeb+lcEXf1R8mV/PJ9Kdu7PmnInWVeLSmiXIka/2QSe6uhAsGVFAMffWSaMzAPGTBg==", + "dev": true, + "dependencies": { + "get-stream": "^5.1.0", + "plugin-error": "^1.0.1", + "through2": "^3.0.1", + "vinyl": "^2.1.0", + "yazl": "^2.5.1" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "gulp": ">=4" + }, + "peerDependenciesMeta": { + "gulp": { + "optional": true + } + } + }, + "node_modules/gulp-zip/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gulp-zip/node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/gulp/node_modules/ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "dependencies": { + "ansi-wrap": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp/node_modules/gulp-cli": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.3.0.tgz", + "integrity": "sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==", + "dev": true, + "dependencies": { + "ansi-colors": "^1.0.1", + "archy": "^1.0.0", + "array-sort": "^1.0.0", + "color-support": "^1.1.3", + "concat-stream": "^1.6.0", + "copy-props": "^2.0.1", + "fancy-log": "^1.3.2", + "gulplog": "^1.0.0", + "interpret": "^1.4.0", + "isobject": "^3.0.1", + "liftoff": "^3.1.0", + "matchdep": "^2.0.0", + "mute-stdout": "^1.0.0", + "pretty-hrtime": "^1.0.0", + "replace-homedir": "^1.0.0", + "semver-greatest-satisfied-range": "^1.1.0", + "v8flags": "^3.2.0", + "yargs": "^7.1.0" + }, + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "dependencies": { + "glogg": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dev": true, + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag/node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/ignore": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", + "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/irregular-plurals": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-2.0.0.tgz", + "integrity": "sha512-Y75zBYLkh0lJ9qxeHlMjQ7bSbyiSqNW/UOPWDmzC7cXskL1hekSITh1Oc6JV0XCWWZ9DE8VYSB71xocLk3gmGw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "node_modules/is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/just-debounce": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.1.0.tgz", + "integrity": "sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==", + "dev": true + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/last-run": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", + "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", + "dev": true, + "dependencies": { + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "dependencies": { + "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", + "dev": true, + "dependencies": { + "flush-write-stream": "^1.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/liftoff": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", + "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", + "dev": true, + "dependencies": { + "extend": "^3.0.0", + "findup-sync": "^3.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", + "dev": true + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "dev": true + }, + "node_modules/lodash.defaultsdeep": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", + "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", + "dev": true + }, + "node_modules/lodash.intersection": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.intersection/-/lodash.intersection-4.4.0.tgz", + "integrity": "sha512-N+L0cCfnqMv6mxXtSPeKt+IavbOBBSiAEkKyLasZ8BVcP9YXQgxLO12oPR8OyURwKV8l5vJKiE1M8aS70heuMg==", + "dev": true + }, + "node_modules/lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", + "dev": true + }, + "node_modules/lodash.isobject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", + "integrity": "sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0=", + "dev": true + }, + "node_modules/lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "dependencies": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "node_modules/lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "dependencies": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", + "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=", + "dev": true + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", + "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", + "dev": true, + "dependencies": { + "findup-sync": "^2.0.0", + "micromatch": "^3.0.4", + "resolve": "^1.4.0", + "stack-trace": "0.0.10" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/matchdep/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/matchdep/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dev": true, + "dependencies": { + "mime-db": "1.51.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/multimatch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-4.0.0.tgz", + "integrity": "sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==", + "dev": true, + "dependencies": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mute-stdout": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", + "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/nan": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", + "dev": true, + "optional": true + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/node-version": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/node-version/-/node-version-1.2.0.tgz", + "integrity": "sha512-ma6oU4Sk0qOoKEAymVoTvk8EdXEobdS7m/mAGhDJ8Rouugho48crHBORAmy5BoOcv8wraPM6xumapQp5hl4iIQ==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "dev": true, + "dependencies": { + "once": "^1.3.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm-run-all/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/npm-run-all/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "dependencies": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "dev": true, + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.reduce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", + "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", + "dev": true, + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.1" + } + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "dependencies": { + "lcid": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "dev": true, + "dependencies": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "dependencies": { + "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dev": true, + "dependencies": { + "through": "~2.3" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "dependencies": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/plugin-error/node_modules/ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "dependencies": { + "ansi-wrap": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plur": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/plur/-/plur-3.1.1.tgz", + "integrity": "sha512-t1Ax8KUvV3FFII8ltczPn2tJdjqbd1sIzu6t4JL7nQ3EyeL/lTrj5PWKb06ic5/6XYDr65rQ4uzQEGN70/6X5w==", + "dev": true, + "dependencies": { + "irregular-plurals": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/promise-polyfill": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-6.1.0.tgz", + "integrity": "sha1-36lpQ+qcEh/KTem1hoyznTRy4Fc=", + "dev": true + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/readdirp/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readline": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", + "integrity": "sha1-xYDXfvLPyHUrEySYBg3JeTp6wBw=", + "dev": true + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", + "dev": true, + "dependencies": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-bom-stream/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/replace-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", + "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dev": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/require-dir": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/require-dir/-/require-dir-1.2.0.tgz", + "integrity": "sha512-LY85DTSu+heYgDqq/mK+7zFHWkttVNRXC9NKcKGyuGLdlsfbjEPrIEYdCVrx6hqnJb+xSu3Lzaoo8VnmOhhjNA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "node_modules/requirejs": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.6.tgz", + "integrity": "sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg==", + "dev": true, + "bin": { + "r_js": "bin/r.js", + "r.js": "bin/r.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "dependencies": { + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "dev": true, + "dependencies": { + "value-or-function": "^3.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/run-sequence": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/run-sequence/-/run-sequence-2.2.1.tgz", + "integrity": "sha512-qkzZnQWMZjcKbh3CNly2srtrkaO/2H/SI5f2eliMCapdRD3UhMrwjfOAZJAnZ2H8Ju4aBzFZkBGXUqFs9V0yxw==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "fancy-log": "^1.3.2", + "plugin-error": "^0.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/run-sequence/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/run-sequence/node_modules/arr-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", + "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", + "dev": true, + "dependencies": { + "arr-flatten": "^1.0.1", + "array-slice": "^0.2.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/run-sequence/node_modules/arr-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/run-sequence/node_modules/array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/run-sequence/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/run-sequence/node_modules/extend-shallow": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "dev": true, + "dependencies": { + "kind-of": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/run-sequence/node_modules/kind-of": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/run-sequence/node_modules/plugin-error": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", + "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", + "dev": true, + "dependencies": { + "ansi-cyan": "^0.1.1", + "ansi-red": "^0.1.1", + "arr-diff": "^1.0.1", + "arr-union": "^2.0.1", + "extend-shallow": "^1.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/run-sequence/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/semver-greatest-satisfied-range": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", + "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", + "dev": true, + "dependencies": { + "sver-compat": "^1.5.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", + "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", + "dev": true + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel/node_modules/object-inspect": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.1.tgz", + "integrity": "sha512-If7BjFlpkzzBeV1cqgT3OSWT3azyoxDGajR+iGnFBfVV2EWyDyWaZZW2ERDjUaY2QM8i5jI3Sj7mhsM4DDAqWA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-git": { + "version": "2.48.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-2.48.0.tgz", + "integrity": "sha512-z4qtrRuaAFJS4PUd0g+xy7aN4y+RvEt/QTJpR184lhJguBA1S/LsVlvE/CM95RsYMOFJG3NGGDjqFCzKU19S/A==", + "dev": true, + "dependencies": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.3.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/steveukx/" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", + "dev": true + }, + "node_modules/sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "node_modules/split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stream-combiner": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", + "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", + "dev": true, + "dependencies": { + "duplexer": "~0.1.1", + "through": "~2.3.4" + } + }, + "node_modules/stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", + "dev": true + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "node_modules/streamfilter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-3.0.0.tgz", + "integrity": "sha512-kvKNfXCmUyC8lAXSSHCIXBUlo/lhsLcCU/OmzACZYpRUdtKIH68xYhm/+HI15jFJYtNJGYtCgn2wmIiExY1VwA==", + "dev": true, + "dependencies": { + "readable-stream": "^3.0.6" + }, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/streamfilter/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string.prototype.padend": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.0.tgz", + "integrity": "sha512-3aIv8Ffdp8EZj8iLwREGpQaUZiPyrWrpzMBHvkiSW/bK/EGve9np07Vwy7IJ5waydpGXzQZu/F8Oze2/IWkBaA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimleft": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", + "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimright": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", + "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sver-compat": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", + "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", + "dev": true, + "dependencies": { + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/temp": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", + "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", + "dev": true, + "dependencies": { + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/temp/node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/temp/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "node_modules/through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + }, + "node_modules/through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dev": true, + "dependencies": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "node_modules/through2-filter/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/tildify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", + "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", + "dev": true, + "dependencies": { + "os-homedir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "dev": true, + "dependencies": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "dev": true, + "dependencies": { + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/to-through/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbox-primitive/node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/undertaker": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz", + "integrity": "sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "fast-levenshtein": "^1.0.0", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/undertaker-forward-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/undertaker-forward-reference/-/undertaker-forward-reference-1.0.2.tgz", + "integrity": "sha1-JAFdvpaUa1M6j7AIuu4WeT8QV/Y=", + "dev": true, + "dependencies": { + "undertaker-registry": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "dev": true, + "dependencies": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "dev": true, + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "dev": true, + "dependencies": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-fs/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", + "dev": true, + "dependencies": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-sourcemap/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true + }, + "node_modules/yafs": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/yafs/-/yafs-1.5.0.tgz", + "integrity": "sha512-FRrHCUDPZw4UEAi53wJhXXGdWHdd9/cZUpoh8kBGI/JCWkSIMB2UifeU2AD6GXaRd4wwrQYzEDrX1HTrSoup5w==", + "dev": true + }, + "node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "node_modules/yargs": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.2.tgz", + "integrity": "sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==", + "dev": true, + "dependencies": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.1" + } + }, + "node_modules/yargs-parser": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", + "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", + "dev": true, + "dependencies": { + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" + } + }, + "node_modules/yazl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3" + } + }, + "node_modules/zarro": { + "version": "1.106.0", + "resolved": "https://registry.npmjs.org/zarro/-/zarro-1.106.0.tgz", + "integrity": "sha512-AYj4+Sjz5L1HfzUXs4Uo/hZ0xi36WEumzLmH8EJLNLTq370SBad1TcEH3780EEzoJv57cqlbaXNCVU7L1OTpFg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1", + "array.prototype.flatmap": "^1.2.4", + "cross-env": "^7.0.3", + "debug": "^4.3.1", + "del": "^5.1.0", + "event-stream": "^4.0.1", + "fancy-log": "^1.3.3", + "gulp": "^4.0.2", + "gulp-debug": "^4.0.0", + "gulp-dotnet-cli": "^1.1.0", + "gulp-edit-xml": "^3.1.1", + "gulp-filter": "^6.0.0", + "gulp-msbuild": "^0.10.0", + "mkdirp": "^1.0.4", + "npm-run-all": "^4.1.5", + "plugin-error": "^1.0.1", + "readline": "^1.3.0", + "request": "^2.88.2", + "require-dir": "^1.2.0", + "requirejs": "^2.3.6", + "rimraf": "^3.0.2", + "run-sequence": "^2.2.1", + "sax": "^1.2.4", + "simple-git": "^3.4.0", + "temp": "^0.9.4", + "through2": "^3.0.2", + "undertaker-forward-reference": "^1.0.2", + "vinyl": "^2.2.1", + "which": "^2.0.2", + "xml2js": "^0.4.23" + }, + "bin": { + "zarro": "index.js" + } + }, + "node_modules/zarro/node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/zarro/node_modules/simple-git": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.10.0.tgz", + "integrity": "sha512-2w35xrS5rVtAW0g67LqtxCZN5cdddz/woQRfS0OJXaljXEoTychZ4jnE+CQgra/wX4ZvHeiChTUMenCwfIYEYw==", + "dev": true, + "dependencies": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.3.4" + }, + "funding": { + "type": "github", + "url": "https://github.com/steveukx/git-js?sponsor=1" + } + }, + "node_modules/zarro/node_modules/vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "dev": true, + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + } + }, "dependencies": { "@kwsites/file-exists": { "version": "1.1.1", @@ -45,21 +7133,6 @@ "fastq": "^1.6.0" } }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "requires": { - "defer-to-connect": "^1.0.1" - } - }, "@types/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", @@ -91,12 +7164,6 @@ "@types/node": "*" } }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, "aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -119,49 +7186,6 @@ "uri-js": "^4.2.2" } }, - "ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "requires": { - "string-width": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -757,122 +7781,6 @@ "file-uri-to-path": "1.0.0" } }, - "boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "dev": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "camelcase": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", - "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } - } - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -927,48 +7835,6 @@ "unset-value": "^1.0.0" } }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -1096,7 +7962,7 @@ "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", "dev": true, "requires": { "is-glob": "^3.1.0", @@ -1144,12 +8010,6 @@ } } }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -1179,12 +8039,6 @@ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true }, - "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "dev": true - }, "cliui": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", @@ -1208,15 +8062,6 @@ "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", "dev": true }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, "clone-stats": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", @@ -1315,20 +8160,6 @@ "typedarray": "^0.0.6" } }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - } - }, "convert-source-map": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", @@ -1388,12 +8219,6 @@ "which": "^2.0.1" } }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true - }, "d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", @@ -1414,12 +8239,12 @@ } }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "decamelize": { @@ -1434,21 +8259,6 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, "default-compare": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", @@ -1472,12 +8282,6 @@ "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", "dev": true }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -1579,35 +8383,12 @@ } } }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - }, - "dependencies": { - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - } - } - }, "duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, "duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -1640,12 +8421,6 @@ "safer-buffer": "^2.1.0" } }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -1738,12 +8513,6 @@ "es6-symbol": "^3.1.1" } }, - "escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true - }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -2278,27 +9047,6 @@ "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", "dev": true }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - }, - "dependencies": { - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, "get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -2350,7 +9098,7 @@ "glob-stream": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "integrity": "sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==", "dev": true, "requires": { "extend": "^3.0.0", @@ -2368,7 +9116,7 @@ "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", "dev": true, "requires": { "is-glob": "^3.1.0", @@ -2401,23 +9149,6 @@ "object.defaults": "^1.1.0" } }, - "global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", - "dev": true, - "requires": { - "ini": "2.0.0" - }, - "dependencies": { - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true - } - } - }, "global-modules": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", @@ -2478,25 +9209,6 @@ "sparkles": "^1.0.0" } }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - } - }, "graceful-fs": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", @@ -2677,9 +9389,9 @@ } }, "gulp-msbuild": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/gulp-msbuild/-/gulp-msbuild-0.9.0.tgz", - "integrity": "sha512-N2kP0wkxBf5JXmgvjQhQAZiroPEqA7Y6I9mtVP5viRbuovSsvO+cJYS+lkNx5Zp8W1vTvEW7p1CUQ/YjicI4+w==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/gulp-msbuild/-/gulp-msbuild-0.10.0.tgz", + "integrity": "sha512-MvLl64B1bI5212Q8lYMeZBx/sqh232iZI38lzKc01drZLbBTHP4SGmWYGIBgiCwEGdqwFn++ReBnV1BcOT8hqA==", "dev": true, "requires": { "chalk": "^4.0.0", @@ -2925,12 +9637,6 @@ } } }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true - }, "homedir-polyfill": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", @@ -2946,12 +9652,6 @@ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -2969,24 +9669,6 @@ "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", "dev": true }, - "ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", - "dev": true - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, "indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", @@ -3120,15 +9802,6 @@ "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", "dev": true }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -3204,16 +9877,6 @@ "is-extglob": "^2.1.1" } }, - "is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "requires": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - } - }, "is-negated-glob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", @@ -3226,12 +9889,6 @@ "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true }, - "is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", - "dev": true - }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -3364,12 +10021,6 @@ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -3400,12 +10051,6 @@ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -3454,15 +10099,6 @@ "integrity": "sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==", "dev": true }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "requires": { - "json-buffer": "3.0.0" - } - }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -3475,17 +10111,8 @@ "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", "dev": true, "requires": { - "default-resolution": "^2.0.0", - "es6-weak-map": "^2.0.1" - } - }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "requires": { - "package-json": "^6.3.0" + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" } }, "lazystream": { @@ -3546,13 +10173,13 @@ "lodash._reinterpolate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", "dev": true }, "lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", "dev": true }, "lodash.defaultsdeep": { @@ -3564,7 +10191,7 @@ "lodash.intersection": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.intersection/-/lodash.intersection-4.4.0.tgz", - "integrity": "sha1-ChG6Yx0OlcI8fy9Mu5ppLtF45wU=", + "integrity": "sha512-N+L0cCfnqMv6mxXtSPeKt+IavbOBBSiAEkKyLasZ8BVcP9YXQgxLO12oPR8OyURwKV8l5vJKiE1M8aS70heuMg==", "dev": true }, "lodash.isfunction": { @@ -3598,12 +10225,6 @@ "lodash._reinterpolate": "^3.0.0" } }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, "lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", @@ -3614,23 +10235,6 @@ "yallist": "^2.1.2" } }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, "make-iterator": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", @@ -3836,12 +10440,6 @@ "mime-db": "1.51.0" } }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true - }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -3953,101 +10551,6 @@ "integrity": "sha512-ma6oU4Sk0qOoKEAymVoTvk8EdXEobdS7m/mAGhDJ8Rouugho48crHBORAmy5BoOcv8wraPM6xumapQp5hl4iIQ==", "dev": true }, - "nodemon": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz", - "integrity": "sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==", - "dev": true, - "requires": { - "chokidar": "^3.5.2", - "debug": "^3.2.7", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.0.4", - "pstree.remy": "^1.1.8", - "semver": "^5.7.1", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5", - "update-notifier": "^5.1.0" - }, - "dependencies": { - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - } - } - }, - "nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", - "dev": true, - "requires": { - "abbrev": "1" - } - }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -4066,12 +10569,6 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true - }, "now-and-later": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", @@ -4293,12 +10790,6 @@ "lcid": "^1.0.0" } }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true - }, "p-map": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", @@ -4308,26 +10799,6 @@ "aggregate-error": "^3.0.0" } }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, "parse-filepath": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", @@ -4510,12 +10981,6 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", "dev": true }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true - }, "pretty-hrtime": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", @@ -4546,12 +11011,6 @@ "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, - "pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true - }, "pump": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", @@ -4579,15 +11038,6 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, - "pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dev": true, - "requires": { - "escape-goat": "^2.0.0" - } - }, "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", @@ -4600,18 +11050,6 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, "read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -4850,24 +11288,6 @@ "safe-regex": "^1.1.0" } }, - "registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, "remove-bom-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", @@ -5022,15 +11442,6 @@ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, - "requires": { - "lowercase-keys": "^1.0.0" - } - }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -5182,23 +11593,6 @@ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "requires": { - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, "semver-greatest-satisfied-range": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", @@ -5277,21 +11671,15 @@ } } }, - "signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", - "dev": true - }, "simple-git": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-2.20.1.tgz", - "integrity": "sha512-aa9s2ZLjXlHCVGbDXQLInMLvLkxKEclqMU9X5HMXi3tLWLxbWObz1UgtyZha6ocHarQtFp0OjQW9KHVR1g6wbA==", + "version": "2.48.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-2.48.0.tgz", + "integrity": "sha512-z4qtrRuaAFJS4PUd0g+xy7aN4y+RvEt/QTJpR184lhJguBA1S/LsVlvE/CM95RsYMOFJG3NGGDjqFCzKU19S/A==", "dev": true, "requires": { "@kwsites/file-exists": "^1.1.1", "@kwsites/promise-deferred": "^1.1.1", - "debug": "^4.1.1" + "debug": "^4.3.2" } }, "slash": { @@ -5591,6 +11979,15 @@ } } }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -5654,15 +12051,6 @@ "es-abstract": "^1.17.5" } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, "stringify-object": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", @@ -5689,12 +12077,6 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -5827,12 +12209,6 @@ } } }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true - }, "to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", @@ -5875,15 +12251,6 @@ } } }, - "touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "dev": true, - "requires": { - "nopt": "~1.0.10" - } - }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -5915,27 +12282,12 @@ "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", "dev": true }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, "unbox-primitive": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", @@ -5962,12 +12314,6 @@ "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", "dev": true }, - "undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true - }, "undertaker": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz", @@ -6023,15 +12369,6 @@ "through2-filter": "^3.0.0" } }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "requires": { - "crypto-random-string": "^2.0.0" - } - }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -6078,103 +12415,6 @@ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", "dev": true }, - "update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "dev": true, - "requires": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -6190,15 +12430,6 @@ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "requires": { - "prepend-http": "^2.0.0" - } - }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -6358,49 +12589,6 @@ "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", "dev": true }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "requires": { - "string-width": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, "wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", @@ -6417,24 +12605,6 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true - }, "xml2js": { "version": "0.4.23", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", @@ -6516,9 +12686,9 @@ } }, "zarro": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/zarro/-/zarro-1.95.0.tgz", - "integrity": "sha512-AqRGXmFvQrIix3ZcLs881pEkaIwa89X1JYMtn47ne1Ni4n6BwCexuvLJOJseClfS/XQs6Boesyf0ayP/sOtQYQ==", + "version": "1.106.0", + "resolved": "https://registry.npmjs.org/zarro/-/zarro-1.106.0.tgz", + "integrity": "sha512-AYj4+Sjz5L1HfzUXs4Uo/hZ0xi36WEumzLmH8EJLNLTq370SBad1TcEH3780EEzoJv57cqlbaXNCVU7L1OTpFg==", "dev": true, "requires": { "ansi-colors": "^4.1.1", @@ -6533,9 +12703,8 @@ "gulp-dotnet-cli": "^1.1.0", "gulp-edit-xml": "^3.1.1", "gulp-filter": "^6.0.0", - "gulp-msbuild": "^0.9.0", + "gulp-msbuild": "^0.10.0", "mkdirp": "^1.0.4", - "nodemon": "^2.0.7", "npm-run-all": "^4.1.5", "plugin-error": "^1.0.1", "readline": "^1.3.0", @@ -6545,7 +12714,7 @@ "rimraf": "^3.0.2", "run-sequence": "^2.2.1", "sax": "^1.2.4", - "simple-git": "^1.132.0", + "simple-git": "^3.4.0", "temp": "^0.9.4", "through2": "^3.0.2", "undertaker-forward-reference": "^1.0.2", @@ -6563,22 +12732,15 @@ "cross-spawn": "^7.0.1" } }, - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, "simple-git": { - "version": "1.132.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.132.0.tgz", - "integrity": "sha512-xauHm1YqCTom1sC9eOjfq3/9RKiUA9iPnxBbrY2DdL8l4ADMu0jjM5l5lphQP5YWNqAL2aXC/OeuQ76vHtW5fg==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.10.0.tgz", + "integrity": "sha512-2w35xrS5rVtAW0g67LqtxCZN5cdddz/woQRfS0OJXaljXEoTychZ4jnE+CQgra/wX4ZvHeiChTUMenCwfIYEYw==", "dev": true, "requires": { - "debug": "^4.0.1" + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.3.4" } }, "vinyl": { diff --git a/package.json b/package.json index 96a46e6e3..c84969558 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,6 @@ "simple-git": "^2.20.1", "which": "^2.0.2", "yafs": "^1.5.0", - "zarro": "^1.95.0" + "zarro": "^1.106.0" } } diff --git a/src/log4net.Tests/log4net.Tests.csproj b/src/log4net.Tests/log4net.Tests.csproj index 58e1b90c4..78ea07e57 100644 --- a/src/log4net.Tests/log4net.Tests.csproj +++ b/src/log4net.Tests/log4net.Tests.csproj @@ -28,7 +28,7 @@ true ..\..\log4net.snk bin\$(Configuration) - Debug;Release;CrossPlatform + Debug;Release AnyCPU diff --git a/src/log4net.sln b/src/log4net.sln index ae6d168ae..eeaf125d5 100644 --- a/src/log4net.sln +++ b/src/log4net.sln @@ -32,27 +32,20 @@ Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU - CrossPlatform|Any CPU = CrossPlatform|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {181FE707-E161-4722-9F38-6AAAB6FAA106}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {181FE707-E161-4722-9F38-6AAAB6FAA106}.Debug|Any CPU.Build.0 = Debug|Any CPU {181FE707-E161-4722-9F38-6AAAB6FAA106}.Release|Any CPU.ActiveCfg = Release|Any CPU {181FE707-E161-4722-9F38-6AAAB6FAA106}.Release|Any CPU.Build.0 = Release|Any CPU - {181FE707-E161-4722-9F38-6AAAB6FAA106}.CrossPlatform|Any CPU.ActiveCfg = CrossPlatform|Any CPU - {181FE707-E161-4722-9F38-6AAAB6FAA106}.CrossPlatform|Any CPU.Build.0 = CrossPlatform|Any CPU {B0530F10-0238-49A9-93B0-8EF412E90BCF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B0530F10-0238-49A9-93B0-8EF412E90BCF}.Debug|Any CPU.Build.0 = Debug|Any CPU {B0530F10-0238-49A9-93B0-8EF412E90BCF}.Release|Any CPU.ActiveCfg = Release|Any CPU {B0530F10-0238-49A9-93B0-8EF412E90BCF}.Release|Any CPU.Build.0 = Release|Any CPU - {B0530F10-0238-49A9-93B0-8EF412E90BCF}.CrossPlatform|Any CPU.ActiveCfg = CrossPlatform|Any CPU - {B0530F10-0238-49A9-93B0-8EF412E90BCF}.CrossPlatform|Any CPU.Build.0 = CrossPlatform|Any CPU {9050922E-E22E-4FF5-A1B0-2F21745C6882}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9050922E-E22E-4FF5-A1B0-2F21745C6882}.Debug|Any CPU.Build.0 = Debug|Any CPU {9050922E-E22E-4FF5-A1B0-2F21745C6882}.Release|Any CPU.ActiveCfg = Release|Any CPU {9050922E-E22E-4FF5-A1B0-2F21745C6882}.Release|Any CPU.Build.0 = Release|Any CPU - {9050922E-E22E-4FF5-A1B0-2F21745C6882}.CrossPlatform|Any CPU.ActiveCfg = Debug|Any CPU - {9050922E-E22E-4FF5-A1B0-2F21745C6882}.CrossPlatform|Any CPU.Build.0 = Debug|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/log4net/log4net.csproj b/src/log4net/log4net.csproj index 24ffd912e..27707b669 100644 --- a/src/log4net/log4net.csproj +++ b/src/log4net/log4net.csproj @@ -30,15 +30,8 @@ https://github.com/apache/logging-log4net false AnyCPU - - - net20;net35;net35-client;net40;net40-client;net45;netstandard1.3;netstandard2.0 - - - net40;net45;netstandard1.3;netstandard2.0 - - - Debug;Release;CrossPlatform + net20;net35;net40;net40-client;net45;netstandard1.3;netstandard2.0 + Debug;Release latest log4net log4net @@ -153,7 +146,7 @@ - + @@ -203,6 +196,10 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + From cd73c0f25fec8686cf8263dd197ed51ecbcc1934 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Fri, 22 Jul 2022 12:59:29 +0200 Subject: [PATCH 059/122] :wrench: don't sign the test project - there's no need and it prevents using unsigned dependencies like NExpect --- src/log4net.Tests/log4net.Tests.csproj | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/log4net.Tests/log4net.Tests.csproj b/src/log4net.Tests/log4net.Tests.csproj index 78ea07e57..6a056714f 100644 --- a/src/log4net.Tests/log4net.Tests.csproj +++ b/src/log4net.Tests/log4net.Tests.csproj @@ -1,6 +1,6 @@  - net462;netcoreapp1.0;netcoreapp2.1;netcoreapp3.1 + net462;netcoreapp3.1 NETSDK1138;CS1701 Local JScript @@ -25,7 +25,6 @@ false true false - true ..\..\log4net.snk bin\$(Configuration) Debug;Release @@ -67,23 +66,24 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + + - - + + - - + + - - + + From 84a4d0c851e8c7dc47bbd7d8264a5260d75138c3 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Fri, 22 Jul 2022 12:59:48 +0200 Subject: [PATCH 060/122] :white_check_mark: prove that FixingFlags.All contains all other valid fixing flags --- src/log4net.Tests/Core/FixingTest.cs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/log4net.Tests/Core/FixingTest.cs b/src/log4net.Tests/Core/FixingTest.cs index eb28150c8..d122344f5 100644 --- a/src/log4net.Tests/Core/FixingTest.cs +++ b/src/log4net.Tests/Core/FixingTest.cs @@ -18,11 +18,14 @@ #endregion using System; +using System.Linq; using System.Threading; using log4net.Core; using NUnit.Framework; +using static NExpect.Expectations; +using NExpect; namespace log4net.Tests.Core { @@ -57,6 +60,22 @@ public void CreateRepository() } } + [Test] + public void All_ShouldContainAllFlags() + { + // Arrange + // Act + var allFlags = Enum.GetValues(typeof(FixFlags)).Cast() + .Except(new[] { FixFlags.None }) + .ToArray(); + // Assert + foreach (var flag in allFlags) + { + Expect(FixFlags.All & flag) + .To.Equal(flag, () => $"FixFlags.All does not contain {flag}"); + } + } + [Test] public void TestUnfixedValues() { From 2c44d647ff94fbc42b0785ab2e03d3ac31f7e229 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Fri, 22 Jul 2022 13:09:14 +0200 Subject: [PATCH 061/122] :bug: should lock hashtables for write (LOG4NET-646) --- src/log4net/ObjectRenderer/RendererMap.cs | 51 +++++++++++------------ 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/src/log4net/ObjectRenderer/RendererMap.cs b/src/log4net/ObjectRenderer/RendererMap.cs index c785e27ee..a20ae198d 100644 --- a/src/log4net/ObjectRenderer/RendererMap.cs +++ b/src/log4net/ObjectRenderer/RendererMap.cs @@ -22,7 +22,7 @@ #if NETSTANDARD1_3 using System.Reflection; #endif - +using System.Collections; using log4net.Util; namespace log4net.ObjectRenderer @@ -49,30 +49,13 @@ public class RendererMap #region Member Variables - private System.Collections.Hashtable m_map; - private System.Collections.Hashtable m_cache = new System.Collections.Hashtable(); + private readonly Hashtable m_map = new(); + private readonly Hashtable m_cache = new(); private static IObjectRenderer s_defaultRenderer = new DefaultRenderer(); #endregion - #region Constructors - - /// - /// Default Constructor - /// - /// - /// - /// Default constructor. - /// - /// - public RendererMap() - { - m_map = System.Collections.Hashtable.Synchronized(new System.Collections.Hashtable()); - } - - #endregion - /// /// Render using the appropriate renderer. /// @@ -137,7 +120,7 @@ public void FindAndRender(object obj, TextWriter writer) catch(Exception ex) { // Exception rendering the object - log4net.Util.LogLog.Error(declaringType, "Exception while rendering object of type ["+obj.GetType().FullName+"]", ex); + LogLog.Error(declaringType, "Exception while rendering object of type ["+obj.GetType().FullName+"]", ex); // return default message string objectTypeName = ""; @@ -241,7 +224,10 @@ public IObjectRenderer Get(Type type) } // Add to cache - m_cache[type] = result; + lock (m_cache) + { + m_cache[type] = result; + } } return result; @@ -299,8 +285,15 @@ public IObjectRenderer DefaultRenderer /// public void Clear() { - m_map.Clear(); - m_cache.Clear(); + lock (m_map) + { + m_map.Clear(); + } + + lock (m_cache) + { + m_cache.Clear(); + } } /// @@ -317,7 +310,10 @@ public void Clear() /// public void Put(Type typeToRender, IObjectRenderer renderer) { - m_cache.Clear(); + lock (m_cache) + { + m_cache.Clear(); + } if (typeToRender == null) { @@ -328,7 +324,10 @@ public void Put(Type typeToRender, IObjectRenderer renderer) throw new ArgumentNullException("renderer"); } - m_map[typeToRender] = renderer; + lock (m_map) + { + m_map[typeToRender] = renderer; + } } } } From dd6e40acf8e53c507cd1d22a352a53495f3c44f8 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Fri, 22 Jul 2022 14:35:32 +0200 Subject: [PATCH 062/122] :white_check_mark: add test trying to repro LOG4NET-684, but the issue doesn't repro --- .../Context/ThreadContextTest.cs | 352 ++++++++++-------- 1 file changed, 203 insertions(+), 149 deletions(-) diff --git a/src/log4net.Tests/Context/ThreadContextTest.cs b/src/log4net.Tests/Context/ThreadContextTest.cs index e489efc43..951d32d26 100644 --- a/src/log4net.Tests/Context/ThreadContextTest.cs +++ b/src/log4net.Tests/Context/ThreadContextTest.cs @@ -1,4 +1,5 @@ #region Apache License + // // Licensed to the Apache Software Foundation (ASF) under one or more // contributor license agreements. See the NOTICE file distributed with @@ -15,213 +16,266 @@ // See the License for the specific language governing permissions and // limitations under the License. // + #endregion using System; +using System.Collections.Generic; using System.Threading; - using log4net.Config; using log4net.Layout; using log4net.Repository; using log4net.Tests.Appender; using log4net.Util; - using NUnit.Framework; +using static NExpect.Expectations; +using NExpect; namespace log4net.Tests.Context { - /// - /// Used for internal unit testing the class. - /// - /// - /// Used for internal unit testing the class. - /// - [TestFixture] - public class ThreadContextTest - { + /// + /// Used for internal unit testing the class. + /// + /// + /// Used for internal unit testing the class. + /// + [TestFixture] + public class ThreadContextTest + { [TearDown] - public void TearDown() { + public void TearDown() + { Utils.RemovePropertyFromAllContexts(); } [Test] - public void TestThreadPropertiesPattern() - { - StringAppender stringAppender = new StringAppender(); - stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}"); + public void TestThreadPropertiesPattern() + { + StringAppender stringAppender = new StringAppender(); + stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}"); - ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString()); - BasicConfigurator.Configure(rep, stringAppender); + ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString()); + BasicConfigurator.Configure(rep, stringAppender); - ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadProperiesPattern"); + ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadProperiesPattern"); - log1.Info("TestMessage"); - Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no thread properties value set"); - stringAppender.Reset(); + log1.Info("TestMessage"); + Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no thread properties value set"); + stringAppender.Reset(); - ThreadContext.Properties[Utils.PROPERTY_KEY] = "val1"; + ThreadContext.Properties[Utils.PROPERTY_KEY] = "val1"; - log1.Info("TestMessage"); - Assert.AreEqual("val1", stringAppender.GetString(), "Test thread properties value set"); - stringAppender.Reset(); + log1.Info("TestMessage"); + Assert.AreEqual("val1", stringAppender.GetString(), "Test thread properties value set"); + stringAppender.Reset(); - ThreadContext.Properties.Remove(Utils.PROPERTY_KEY); + ThreadContext.Properties.Remove(Utils.PROPERTY_KEY); - log1.Info("TestMessage"); - Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test thread properties value removed"); - stringAppender.Reset(); - } + log1.Info("TestMessage"); + Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test thread properties value removed"); + stringAppender.Reset(); + } - [Test] - public void TestThreadStackPattern() - { - StringAppender stringAppender = new StringAppender(); + [Test] + public void TestThreadStackPattern() + { + StringAppender stringAppender = new StringAppender(); stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}"); - ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString()); - BasicConfigurator.Configure(rep, stringAppender); + ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString()); + BasicConfigurator.Configure(rep, stringAppender); - ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadStackPattern"); + ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadStackPattern"); - log1.Info("TestMessage"); - Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no thread stack value set"); - stringAppender.Reset(); + log1.Info("TestMessage"); + Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no thread stack value set"); + stringAppender.Reset(); - using(ThreadContext.Stacks[Utils.PROPERTY_KEY].Push("val1")) - { - log1.Info("TestMessage"); - Assert.AreEqual("val1", stringAppender.GetString(), "Test thread stack value set"); - stringAppender.Reset(); - } + using (ThreadContext.Stacks[Utils.PROPERTY_KEY].Push("val1")) + { + log1.Info("TestMessage"); + Assert.AreEqual("val1", stringAppender.GetString(), "Test thread stack value set"); + stringAppender.Reset(); + } - log1.Info("TestMessage"); - Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test thread stack value removed"); - stringAppender.Reset(); - } + log1.Info("TestMessage"); + Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test thread stack value removed"); + stringAppender.Reset(); + } - [Test] - public void TestThreadStackPattern2() - { - StringAppender stringAppender = new StringAppender(); + [Test] + public void TestThreadStackPattern2() + { + StringAppender stringAppender = new StringAppender(); stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}"); - ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString()); - BasicConfigurator.Configure(rep, stringAppender); - - ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadStackPattern"); - - log1.Info("TestMessage"); - Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no thread stack value set"); - stringAppender.Reset(); - - using(ThreadContext.Stacks[Utils.PROPERTY_KEY].Push("val1")) - { - log1.Info("TestMessage"); - Assert.AreEqual("val1", stringAppender.GetString(), "Test thread stack value set"); - stringAppender.Reset(); - - using(ThreadContext.Stacks[Utils.PROPERTY_KEY].Push("val2")) - { - log1.Info("TestMessage"); - Assert.AreEqual("val1 val2", stringAppender.GetString(), "Test thread stack value pushed 2nd val"); - stringAppender.Reset(); - } - } - - log1.Info("TestMessage"); - Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test thread stack value removed"); - stringAppender.Reset(); - } - - [Test] - public void TestThreadStackPatternNullVal() - { - StringAppender stringAppender = new StringAppender(); + ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString()); + BasicConfigurator.Configure(rep, stringAppender); + + ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadStackPattern"); + + log1.Info("TestMessage"); + Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no thread stack value set"); + stringAppender.Reset(); + + using (ThreadContext.Stacks[Utils.PROPERTY_KEY].Push("val1")) + { + log1.Info("TestMessage"); + Assert.AreEqual("val1", stringAppender.GetString(), "Test thread stack value set"); + stringAppender.Reset(); + + using (ThreadContext.Stacks[Utils.PROPERTY_KEY].Push("val2")) + { + log1.Info("TestMessage"); + Assert.AreEqual("val1 val2", stringAppender.GetString(), "Test thread stack value pushed 2nd val"); + stringAppender.Reset(); + } + } + + log1.Info("TestMessage"); + Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test thread stack value removed"); + stringAppender.Reset(); + } + + [Test] + public void TestThreadStackPatternNullVal() + { + StringAppender stringAppender = new StringAppender(); stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}"); - ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString()); - BasicConfigurator.Configure(rep, stringAppender); + ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString()); + BasicConfigurator.Configure(rep, stringAppender); - ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadStackPattern"); + ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadStackPattern"); - log1.Info("TestMessage"); - Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no thread stack value set"); - stringAppender.Reset(); + log1.Info("TestMessage"); + Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no thread stack value set"); + stringAppender.Reset(); - using(ThreadContext.Stacks[Utils.PROPERTY_KEY].Push(null)) - { - log1.Info("TestMessage"); - Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test thread stack value set"); - stringAppender.Reset(); - } + using (ThreadContext.Stacks[Utils.PROPERTY_KEY].Push(null)) + { + log1.Info("TestMessage"); + Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test thread stack value set"); + stringAppender.Reset(); + } - log1.Info("TestMessage"); - Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test thread stack value removed"); - stringAppender.Reset(); - } + log1.Info("TestMessage"); + Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test thread stack value removed"); + stringAppender.Reset(); + } - [Test] - public void TestThreadStackPatternNullVal2() - { - StringAppender stringAppender = new StringAppender(); + [Test] + public void TestThreadStackPatternNullVal2() + { + StringAppender stringAppender = new StringAppender(); stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}"); - ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString()); - BasicConfigurator.Configure(rep, stringAppender); + ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString()); + BasicConfigurator.Configure(rep, stringAppender); - ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadStackPattern"); + ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadStackPattern"); - log1.Info("TestMessage"); - Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no thread stack value set"); - stringAppender.Reset(); + log1.Info("TestMessage"); + Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no thread stack value set"); + stringAppender.Reset(); - using(ThreadContext.Stacks[Utils.PROPERTY_KEY].Push("val1")) - { - log1.Info("TestMessage"); - Assert.AreEqual("val1", stringAppender.GetString(), "Test thread stack value set"); - stringAppender.Reset(); + using (ThreadContext.Stacks[Utils.PROPERTY_KEY].Push("val1")) + { + log1.Info("TestMessage"); + Assert.AreEqual("val1", stringAppender.GetString(), "Test thread stack value set"); + stringAppender.Reset(); - using(ThreadContext.Stacks[Utils.PROPERTY_KEY].Push(null)) - { - log1.Info("TestMessage"); - Assert.AreEqual("val1 ", stringAppender.GetString(), "Test thread stack value pushed null"); - stringAppender.Reset(); - } - } + using (ThreadContext.Stacks[Utils.PROPERTY_KEY].Push(null)) + { + log1.Info("TestMessage"); + Assert.AreEqual("val1 ", stringAppender.GetString(), "Test thread stack value pushed null"); + stringAppender.Reset(); + } + } - log1.Info("TestMessage"); - Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test thread stack value removed"); - stringAppender.Reset(); - } + log1.Info("TestMessage"); + Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test thread stack value removed"); + stringAppender.Reset(); + } private static string TestBackgroundThreadContextPropertyRepository; - [Test] - public void TestBackgroundThreadContextProperty() - { - StringAppender stringAppender = new StringAppender(); - stringAppender.Layout = new PatternLayout("%property{DateTimeTodayToString}"); + [Test] + public void TestBackgroundThreadContextProperty() + { + StringAppender stringAppender = new StringAppender(); + stringAppender.Layout = new PatternLayout("%property{DateTimeTodayToString}"); - ILoggerRepository rep = LogManager.CreateRepository(TestBackgroundThreadContextPropertyRepository = "TestBackgroundThreadContextPropertyRepository" + Guid.NewGuid().ToString()); - BasicConfigurator.Configure(rep, stringAppender); + ILoggerRepository rep = LogManager.CreateRepository(TestBackgroundThreadContextPropertyRepository = + "TestBackgroundThreadContextPropertyRepository" + Guid.NewGuid().ToString()); + BasicConfigurator.Configure(rep, stringAppender); - Thread thread = new Thread(new ThreadStart(ExecuteBackgroundThread)); - thread.Start(); + Thread thread = new Thread(new ThreadStart(ExecuteBackgroundThread)); + thread.Start(); - Thread.CurrentThread.Join(2000); - } + Thread.CurrentThread.Join(2000); + } - private static void ExecuteBackgroundThread() - { + private static void ExecuteBackgroundThread() + { ILog log = LogManager.GetLogger(TestBackgroundThreadContextPropertyRepository, "ExecuteBackGroundThread"); - ThreadContext.Properties["DateTimeTodayToString"] = DateTime.Today.ToString(); + ThreadContext.Properties["DateTimeTodayToString"] = DateTime.Today.ToString(); - log.Info("TestMessage"); + log.Info("TestMessage"); - Repository.Hierarchy.Hierarchy hierarchyLoggingRepository = (Repository.Hierarchy.Hierarchy)log.Logger.Repository; - StringAppender stringAppender = (StringAppender)hierarchyLoggingRepository.Root.Appenders[0]; + Repository.Hierarchy.Hierarchy hierarchyLoggingRepository = + (Repository.Hierarchy.Hierarchy) log.Logger.Repository; + StringAppender stringAppender = (StringAppender) hierarchyLoggingRepository.Root.Appenders[0]; - Assert.AreEqual(DateTime.Today.ToString(), stringAppender.GetString()); - } - } + Assert.AreEqual(DateTime.Today.ToString(), stringAppender.GetString()); + } + + [Test] + public void PropertiesShouldBeThreadSafe() + { + // Arrange + var threads = new List(); + var flags = new List(); + + // Act + for (var i = 0; i < 256; i++) + { + var t = new Thread(SpinAndCheck); + var flag = new FlagContainer(); + t.Start(flag); + flags.Add(flag); + threads.Add(t); + } + + foreach (var t in threads) + { + t.Join(); + } + + // Assert + Expect(flags) + .To.Contain.All.Matched.By(o => o.Flag == false); + } + + public class FlagContainer + { + public bool Flag { get; set; } + } + + private void SpinAndCheck(object obj) + { + var container = obj as FlagContainer; + var threadid = Thread.CurrentThread.ManagedThreadId; + for (var i = 0; i < 100000; i++) + { + ThreadContext.Properties["threadid"] = threadid; + Thread.Sleep(0); + if ((int) ThreadContext.Properties["threadid"] != threadid) + { + container.Flag = true; + break; + } + } + } + } } \ No newline at end of file From 730d7bf695f4a02a9b7e1ffc10f5e2928df5bcc6 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Fri, 22 Jul 2022 14:36:54 +0200 Subject: [PATCH 063/122] :white_check_mark: try to repro LOG4NET-611, but no go --- .../log4net-611-lib/DerivedAppender.cs | 8 ++++ .../log4net-611-lib/log4net-611-lib.csproj | 15 ++++++ .../log4net-611-main/Program.cs | 48 +++++++++++++++++++ .../log4net-611-main/log4net-611-main.csproj | 21 ++++++++ .../log4net-611-main/log4net.config | 28 +++++++++++ src/log4net.sln | 14 ++++++ 6 files changed, 134 insertions(+) create mode 100644 src/integration-testing/log4net-611-lib/DerivedAppender.cs create mode 100644 src/integration-testing/log4net-611-lib/log4net-611-lib.csproj create mode 100644 src/integration-testing/log4net-611-main/Program.cs create mode 100644 src/integration-testing/log4net-611-main/log4net-611-main.csproj create mode 100644 src/integration-testing/log4net-611-main/log4net.config diff --git a/src/integration-testing/log4net-611-lib/DerivedAppender.cs b/src/integration-testing/log4net-611-lib/DerivedAppender.cs new file mode 100644 index 000000000..a22b42675 --- /dev/null +++ b/src/integration-testing/log4net-611-lib/DerivedAppender.cs @@ -0,0 +1,8 @@ +using log4net.Appender; +using log4net.Layout; + +namespace log4net_611_lib; + +public class DerivedAppender: RollingFileAppender +{ +} \ No newline at end of file diff --git a/src/integration-testing/log4net-611-lib/log4net-611-lib.csproj b/src/integration-testing/log4net-611-lib/log4net-611-lib.csproj new file mode 100644 index 000000000..07a87a152 --- /dev/null +++ b/src/integration-testing/log4net-611-lib/log4net-611-lib.csproj @@ -0,0 +1,15 @@ + + + + netstandard2.0 + log4net_611_lib + disable + disable + latest + + + + + + + diff --git a/src/integration-testing/log4net-611-main/Program.cs b/src/integration-testing/log4net-611-main/Program.cs new file mode 100644 index 000000000..b0a7815c6 --- /dev/null +++ b/src/integration-testing/log4net-611-main/Program.cs @@ -0,0 +1,48 @@ +// See https://aka.ms/new-console-template for more information + +using System.Reflection; +using log4net; +using log4net.Config; +using log4net_611_lib; + +var appPath = new Uri(Assembly.GetExecutingAssembly().Location).LocalPath; +var appFolder = Path.GetDirectoryName(appPath); +// force loading the assembly, otherwise the appender type isn't found later +Assembly.LoadFile(Path.Combine(appFolder, "log4net-611-lib.dll")); + +var configFile = Path.Combine(appFolder, "log4net.config"); +if (!File.Exists(configFile)) +{ + throw new InvalidOperationException($"log4net.config not found at {configFile}"); +} + +if (Directory.Exists("Logs")) +{ + Console.WriteLine("Clearing out old logs..."); + foreach (var file in Directory.EnumerateFiles("Logs")) + { + File.Delete(file); + } +} + +var info = new FileInfo(configFile); +var logRepo = LogManager.GetRepository(Assembly.GetExecutingAssembly()); +XmlConfigurator.ConfigureAndWatch( + logRepo, + info +); + +var logger = LogManager.GetLogger(typeof(Program)); + +Console.WriteLine("logging..."); +for (var i = 0; i < 10; i++) +{ + logger.Info($"test log {i}"); +} + + +foreach (var file in Directory.EnumerateFiles("Logs")) +{ + Console.WriteLine($"log file: {file}"); + Console.WriteLine(File.ReadAllText(file)); +} \ No newline at end of file diff --git a/src/integration-testing/log4net-611-main/log4net-611-main.csproj b/src/integration-testing/log4net-611-main/log4net-611-main.csproj new file mode 100644 index 000000000..e6e8da91d --- /dev/null +++ b/src/integration-testing/log4net-611-main/log4net-611-main.csproj @@ -0,0 +1,21 @@ + + + + Exe + net6.0 + log4net_611_main + enable + enable + + + + + + + + + Always + + + + diff --git a/src/integration-testing/log4net-611-main/log4net.config b/src/integration-testing/log4net-611-main/log4net.config new file mode 100644 index 000000000..08611e899 --- /dev/null +++ b/src/integration-testing/log4net-611-main/log4net.config @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/log4net.sln b/src/log4net.sln index eeaf125d5..44750e9ce 100644 --- a/src/log4net.sln +++ b/src/log4net.sln @@ -28,6 +28,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "integration-testing", "inte EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "log4net-672", "integration-testing\log4net-672\log4net-672.csproj", "{9050922E-E22E-4FF5-A1B0-2F21745C6882}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "log4net-611-main", "integration-testing\log4net-611-main\log4net-611-main.csproj", "{2087EDC5-689F-406C-947C-06C5F321CA8C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "log4net-611-lib", "integration-testing\log4net-611-lib\log4net-611-lib.csproj", "{D818035F-0345-49EF-9AB9-021583986CE2}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -46,11 +50,21 @@ Global {9050922E-E22E-4FF5-A1B0-2F21745C6882}.Debug|Any CPU.Build.0 = Debug|Any CPU {9050922E-E22E-4FF5-A1B0-2F21745C6882}.Release|Any CPU.ActiveCfg = Release|Any CPU {9050922E-E22E-4FF5-A1B0-2F21745C6882}.Release|Any CPU.Build.0 = Release|Any CPU + {2087EDC5-689F-406C-947C-06C5F321CA8C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2087EDC5-689F-406C-947C-06C5F321CA8C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2087EDC5-689F-406C-947C-06C5F321CA8C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2087EDC5-689F-406C-947C-06C5F321CA8C}.Release|Any CPU.Build.0 = Release|Any CPU + {D818035F-0345-49EF-9AB9-021583986CE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D818035F-0345-49EF-9AB9-021583986CE2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D818035F-0345-49EF-9AB9-021583986CE2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D818035F-0345-49EF-9AB9-021583986CE2}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution {9050922E-E22E-4FF5-A1B0-2F21745C6882} = {8953473C-EEE8-4740-993D-B8E10FA876CD} + {2087EDC5-689F-406C-947C-06C5F321CA8C} = {8953473C-EEE8-4740-993D-B8E10FA876CD} + {D818035F-0345-49EF-9AB9-021583986CE2} = {8953473C-EEE8-4740-993D-B8E10FA876CD} EndGlobalSection EndGlobal From 96e28740555effaaae0c460981487674d7e5b4fd Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Fri, 22 Jul 2022 14:43:08 +0200 Subject: [PATCH 064/122] :alembic: try net462 target, still no go --- src/integration-testing/log4net-611-main/Program.cs | 5 +++++ .../log4net-611-main/log4net-611-main.csproj | 3 ++- src/integration-testing/log4net-611-main/log4net.config | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/integration-testing/log4net-611-main/Program.cs b/src/integration-testing/log4net-611-main/Program.cs index b0a7815c6..365af1bf3 100644 --- a/src/integration-testing/log4net-611-main/Program.cs +++ b/src/integration-testing/log4net-611-main/Program.cs @@ -8,6 +8,11 @@ var appPath = new Uri(Assembly.GetExecutingAssembly().Location).LocalPath; var appFolder = Path.GetDirectoryName(appPath); // force loading the assembly, otherwise the appender type isn't found later +if (appFolder is null) +{ + throw new InvalidOperationException("Can't find myself"); +} + Assembly.LoadFile(Path.Combine(appFolder, "log4net-611-lib.dll")); var configFile = Path.Combine(appFolder, "log4net.config"); diff --git a/src/integration-testing/log4net-611-main/log4net-611-main.csproj b/src/integration-testing/log4net-611-main/log4net-611-main.csproj index e6e8da91d..a3474a3c7 100644 --- a/src/integration-testing/log4net-611-main/log4net-611-main.csproj +++ b/src/integration-testing/log4net-611-main/log4net-611-main.csproj @@ -2,10 +2,11 @@ Exe - net6.0 + net462;net6.0 log4net_611_main enable enable + latest diff --git a/src/integration-testing/log4net-611-main/log4net.config b/src/integration-testing/log4net-611-main/log4net.config index 08611e899..77e850bbb 100644 --- a/src/integration-testing/log4net-611-main/log4net.config +++ b/src/integration-testing/log4net-611-main/log4net.config @@ -10,7 +10,7 @@ - + From b04703397e3bdc246e9d5746f2f3ecee2012e625 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Fri, 22 Jul 2022 14:50:21 +0200 Subject: [PATCH 065/122] :sparkles: make it obvious that the derived appender is being used --- src/integration-testing/log4net-611-lib/DerivedAppender.cs | 6 ++++++ src/integration-testing/log4net-611-main/log4net.config | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/integration-testing/log4net-611-lib/DerivedAppender.cs b/src/integration-testing/log4net-611-lib/DerivedAppender.cs index a22b42675..2b1faebd9 100644 --- a/src/integration-testing/log4net-611-lib/DerivedAppender.cs +++ b/src/integration-testing/log4net-611-lib/DerivedAppender.cs @@ -1,8 +1,14 @@ using log4net.Appender; +using log4net.Core; using log4net.Layout; namespace log4net_611_lib; public class DerivedAppender: RollingFileAppender { + protected override void Append(LoggingEvent loggingEvent) + { + loggingEvent.Properties["appender-class-name"] = nameof(DerivedAppender); + base.Append(loggingEvent); + } } \ No newline at end of file diff --git a/src/integration-testing/log4net-611-main/log4net.config b/src/integration-testing/log4net-611-main/log4net.config index 77e850bbb..5b444093c 100644 --- a/src/integration-testing/log4net-611-main/log4net.config +++ b/src/integration-testing/log4net-611-main/log4net.config @@ -10,7 +10,7 @@ - + From 87c4950c98eacb3bdee636e19edd68e5c620867a Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Fri, 22 Jul 2022 15:23:39 +0200 Subject: [PATCH 066/122] :alembic: try to repro LOG4NET-673 (unsuccessfully) --- .../log4net-673/Program.cs | 77 ++++++++++++++++++ .../log4net-673/log4net-673.csproj | 19 +++++ .../log4net-673/log4net.config | 81 +++++++++++++++++++ src/log4net.sln | 7 ++ 4 files changed, 184 insertions(+) create mode 100644 src/integration-testing/log4net-673/Program.cs create mode 100644 src/integration-testing/log4net-673/log4net-673.csproj create mode 100644 src/integration-testing/log4net-673/log4net.config diff --git a/src/integration-testing/log4net-673/Program.cs b/src/integration-testing/log4net-673/Program.cs new file mode 100644 index 000000000..fb9108982 --- /dev/null +++ b/src/integration-testing/log4net-673/Program.cs @@ -0,0 +1,77 @@ +using System; +using System.IO; +using System.Reflection; +using System.Threading; +using log4net; +using log4net.Config; + +var appPath = new Uri(Assembly.GetExecutingAssembly().Location).LocalPath; +var appFolder = Path.GetDirectoryName(appPath); +// force loading the assembly, otherwise the appender type isn't found later +if (appFolder is null) +{ + throw new InvalidOperationException("Can't find myself"); +} + +var configFile = Path.Combine(appFolder, "log4net.config"); +if (!File.Exists(configFile)) +{ + throw new InvalidOperationException($"log4net.config not found at {configFile}"); +} + +if (Directory.Exists("log")) +{ + Console.WriteLine("Clearing out old logs..."); + foreach (var file in Directory.EnumerateFiles("log")) + { + File.Delete(file); + } +} + +var info = new FileInfo(configFile); +var logRepo = LogManager.GetRepository(Assembly.GetExecutingAssembly()); +XmlConfigurator.ConfigureAndWatch( + logRepo, + info +); + +var logger = LogManager.GetLogger(typeof(Program)); + +Console.WriteLine("logging..."); +for (var i = 0; i < 10; i++) +{ + logger.Info($"test log {i}"); + logger.Error($"error log {i}"); + logger.Warn($"warning log {i}"); +} + + +foreach (var file in Directory.EnumerateFiles("log")) +{ + Console.WriteLine($"log file: {file}"); + TryDumpFile(file); +} + +void TryDumpFile(string at) +{ + if (!File.Exists(at)) + { + Console.WriteLine($"File not found: {at}"); + return; + } + + for (var i = 0; i < 10; i++) + { + try + { + Console.WriteLine(File.ReadAllText(at)); + return; + } + catch + { + Thread.Sleep(100); + } + } + + Console.WriteLine($"Unable to read file at {at}"); +} diff --git a/src/integration-testing/log4net-673/log4net-673.csproj b/src/integration-testing/log4net-673/log4net-673.csproj new file mode 100644 index 000000000..a799926f2 --- /dev/null +++ b/src/integration-testing/log4net-673/log4net-673.csproj @@ -0,0 +1,19 @@ + + + + Exe + net6.0 + log4net_673 + disable + disable + + + + + + + Always + + + + diff --git a/src/integration-testing/log4net-673/log4net.config b/src/integration-testing/log4net-673/log4net.config new file mode 100644 index 000000000..05fd0e3e9 --- /dev/null +++ b/src/integration-testing/log4net-673/log4net.config @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/log4net.sln b/src/log4net.sln index 44750e9ce..4a51f83b7 100644 --- a/src/log4net.sln +++ b/src/log4net.sln @@ -32,6 +32,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "log4net-611-main", "integra EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "log4net-611-lib", "integration-testing\log4net-611-lib\log4net-611-lib.csproj", "{D818035F-0345-49EF-9AB9-021583986CE2}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "log4net-673", "integration-testing\log4net-673\log4net-673.csproj", "{169118A6-CAC3-4E83-ABEE-9E884B75B294}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -58,6 +60,10 @@ Global {D818035F-0345-49EF-9AB9-021583986CE2}.Debug|Any CPU.Build.0 = Debug|Any CPU {D818035F-0345-49EF-9AB9-021583986CE2}.Release|Any CPU.ActiveCfg = Release|Any CPU {D818035F-0345-49EF-9AB9-021583986CE2}.Release|Any CPU.Build.0 = Release|Any CPU + {169118A6-CAC3-4E83-ABEE-9E884B75B294}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {169118A6-CAC3-4E83-ABEE-9E884B75B294}.Debug|Any CPU.Build.0 = Debug|Any CPU + {169118A6-CAC3-4E83-ABEE-9E884B75B294}.Release|Any CPU.ActiveCfg = Release|Any CPU + {169118A6-CAC3-4E83-ABEE-9E884B75B294}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -66,5 +72,6 @@ Global {9050922E-E22E-4FF5-A1B0-2F21745C6882} = {8953473C-EEE8-4740-993D-B8E10FA876CD} {2087EDC5-689F-406C-947C-06C5F321CA8C} = {8953473C-EEE8-4740-993D-B8E10FA876CD} {D818035F-0345-49EF-9AB9-021583986CE2} = {8953473C-EEE8-4740-993D-B8E10FA876CD} + {169118A6-CAC3-4E83-ABEE-9E884B75B294} = {8953473C-EEE8-4740-993D-B8E10FA876CD} EndGlobalSection EndGlobal From 2c123639aacf89bb73df2ca9bb1d689506f955b8 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Fri, 22 Jul 2022 15:26:31 +0200 Subject: [PATCH 067/122] :wrench: apply minimal lock so that the files can be read by the program creating them --- src/integration-testing/log4net-673/log4net.config | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/integration-testing/log4net-673/log4net.config b/src/integration-testing/log4net-673/log4net.config index 05fd0e3e9..9d1b0b2ff 100644 --- a/src/integration-testing/log4net-673/log4net.config +++ b/src/integration-testing/log4net-673/log4net.config @@ -31,6 +31,7 @@ + @@ -45,6 +46,7 @@ + @@ -63,6 +65,7 @@ + From 71aa522d07eddf3754758177407bf42a51148899 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Fri, 22 Jul 2022 15:37:53 +0200 Subject: [PATCH 068/122] :bug: removed the forced load by accident --- src/integration-testing/log4net-611-main/Program.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/integration-testing/log4net-611-main/Program.cs b/src/integration-testing/log4net-611-main/Program.cs index 365af1bf3..21d86e9b0 100644 --- a/src/integration-testing/log4net-611-main/Program.cs +++ b/src/integration-testing/log4net-611-main/Program.cs @@ -8,6 +8,7 @@ var appPath = new Uri(Assembly.GetExecutingAssembly().Location).LocalPath; var appFolder = Path.GetDirectoryName(appPath); // force loading the assembly, otherwise the appender type isn't found later +Assembly.LoadFile("log4net-611-lib.dll"); if (appFolder is null) { throw new InvalidOperationException("Can't find myself"); From 692eee8a6ca99bf6b1a8cd6b44d48614fe0e7b64 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Fri, 22 Jul 2022 16:03:37 +0200 Subject: [PATCH 069/122] :alembic: try to repro LOG4NET-681, without success --- .../log4net-611-main/Program.cs | 4 +- .../log4net-681/Program.cs | 62 +++++++++++++++++++ .../log4net-681/log4net-681.csproj | 21 +++++++ .../log4net-681/log4net.config | 20 ++++++ src/log4net.sln | 7 +++ 5 files changed, 111 insertions(+), 3 deletions(-) create mode 100644 src/integration-testing/log4net-681/Program.cs create mode 100644 src/integration-testing/log4net-681/log4net-681.csproj create mode 100644 src/integration-testing/log4net-681/log4net.config diff --git a/src/integration-testing/log4net-611-main/Program.cs b/src/integration-testing/log4net-611-main/Program.cs index 21d86e9b0..36f097623 100644 --- a/src/integration-testing/log4net-611-main/Program.cs +++ b/src/integration-testing/log4net-611-main/Program.cs @@ -1,6 +1,4 @@ -// See https://aka.ms/new-console-template for more information - -using System.Reflection; +using System.Reflection; using log4net; using log4net.Config; using log4net_611_lib; diff --git a/src/integration-testing/log4net-681/Program.cs b/src/integration-testing/log4net-681/Program.cs new file mode 100644 index 000000000..20d6bc12d --- /dev/null +++ b/src/integration-testing/log4net-681/Program.cs @@ -0,0 +1,62 @@ +using System.Reflection; +using log4net; +using log4net.Config; + +var appPath = new Uri(Assembly.GetExecutingAssembly().Location).LocalPath; +var appFolder = Path.GetDirectoryName(appPath); + +if (appFolder is null) +{ + throw new InvalidOperationException("Can't find myself"); +} + +var configFile = Path.Combine(appFolder, "log4net.config"); +if (!File.Exists(configFile)) +{ + throw new InvalidOperationException($"log4net.config not found at {configFile}"); +} + +if (Directory.Exists("Logs")) +{ + Console.WriteLine("Clearing out old logs..."); + foreach (var file in Directory.EnumerateFiles("Logs")) + { + File.Delete(file); + } +} + +var info = new FileInfo(configFile); +var logRepo = LogManager.GetRepository(Assembly.GetExecutingAssembly()); +XmlConfigurator.ConfigureAndWatch( + logRepo, + info +); + +var logger = LogManager.GetLogger(typeof(Program)); + +Console.WriteLine("logging..."); +var threads = new List(); +for (var i = 0; i < 128; i++) +{ + var thread = new Thread(LogABit); + thread.Start(); + threads.Add(thread); +} + +foreach (var t in threads) +{ + t.Join(); +} + +foreach (var file in Directory.EnumerateFiles("Logs")) +{ + Console.WriteLine($"found log file: {file}"); +} + +void LogABit() +{ + for (var i = 0; i < 100; i++) + { + logger.Info($"test log {i}"); + } +} \ No newline at end of file diff --git a/src/integration-testing/log4net-681/log4net-681.csproj b/src/integration-testing/log4net-681/log4net-681.csproj new file mode 100644 index 000000000..5abd45f23 --- /dev/null +++ b/src/integration-testing/log4net-681/log4net-681.csproj @@ -0,0 +1,21 @@ + + + + Exe + net6.0 + log4net_681 + enable + enable + + + + + + + + + Always + + + + diff --git a/src/integration-testing/log4net-681/log4net.config b/src/integration-testing/log4net-681/log4net.config new file mode 100644 index 000000000..897756fbb --- /dev/null +++ b/src/integration-testing/log4net-681/log4net.config @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/log4net.sln b/src/log4net.sln index 4a51f83b7..ad2070aa1 100644 --- a/src/log4net.sln +++ b/src/log4net.sln @@ -34,6 +34,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "log4net-611-lib", "integrat EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "log4net-673", "integration-testing\log4net-673\log4net-673.csproj", "{169118A6-CAC3-4E83-ABEE-9E884B75B294}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "log4net-681", "integration-testing\log4net-681\log4net-681.csproj", "{A4F9E417-2250-4075-9118-B4FF1C58B6C5}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -64,6 +66,10 @@ Global {169118A6-CAC3-4E83-ABEE-9E884B75B294}.Debug|Any CPU.Build.0 = Debug|Any CPU {169118A6-CAC3-4E83-ABEE-9E884B75B294}.Release|Any CPU.ActiveCfg = Release|Any CPU {169118A6-CAC3-4E83-ABEE-9E884B75B294}.Release|Any CPU.Build.0 = Release|Any CPU + {A4F9E417-2250-4075-9118-B4FF1C58B6C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A4F9E417-2250-4075-9118-B4FF1C58B6C5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A4F9E417-2250-4075-9118-B4FF1C58B6C5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A4F9E417-2250-4075-9118-B4FF1C58B6C5}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -73,5 +79,6 @@ Global {2087EDC5-689F-406C-947C-06C5F321CA8C} = {8953473C-EEE8-4740-993D-B8E10FA876CD} {D818035F-0345-49EF-9AB9-021583986CE2} = {8953473C-EEE8-4740-993D-B8E10FA876CD} {169118A6-CAC3-4E83-ABEE-9E884B75B294} = {8953473C-EEE8-4740-993D-B8E10FA876CD} + {A4F9E417-2250-4075-9118-B4FF1C58B6C5} = {8953473C-EEE8-4740-993D-B8E10FA876CD} EndGlobalSection EndGlobal From b6cbe140e827fde38515f6a77b12c8930efbeb89 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Fri, 22 Jul 2022 16:26:41 +0200 Subject: [PATCH 070/122] :bookmark: update versioning to 2.0.15.0 --- src/log4net/AssemblyInfo.cs | 46 +++++++++++++++--------------- src/log4net/AssemblyVersionInfo.cs | 4 +-- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/src/log4net/AssemblyInfo.cs b/src/log4net/AssemblyInfo.cs index 311d0c4ff..44905c3ff 100644 --- a/src/log4net/AssemblyInfo.cs +++ b/src/log4net/AssemblyInfo.cs @@ -53,77 +53,77 @@ // #if (CLI_1_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-.CLI 1.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-.CLI 1.0")] [assembly: AssemblyTitle("Apache log4net for CLI 1.0 Compatible Frameworks")] #elif (NET_1_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-.NET 1.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-.NET 1.0")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 1.0")] #elif (NET_1_1) -[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-.NET 1.1")] +[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-.NET 1.1")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 1.1")] #elif (NET_4_5) -[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-.NET 4.5")] +[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-.NET 4.5")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 4.5")] #elif (NET_4_0) #if CLIENT_PROFILE -[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-.NET 4.0 CP")] +[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-.NET 4.0 CP")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 4.0 Client Profile")] #else -[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-.NET 4.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-.NET 4.0")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 4.0")] #endif // Client Profile #elif (NET_3_5) #if CLIENT_PROFILE -[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-.NET 3.5 CP")] +[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-.NET 3.5 CP")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 3.5 Client Profile")] #else -[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-.NET 3.5")] +[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-.NET 3.5")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 3.5")] #endif // Client Profile #elif (NET_2_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-.NET 2.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-.NET 2.0")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 2.0")] #elif (NETCF_1_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-.NETCF 1.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-.NETCF 1.0")] [assembly: AssemblyTitle("Apache log4net for .NET Compact Framework 1.0")] #elif (NETCF_2_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-.NETCF 2.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-.NETCF 2.0")] [assembly: AssemblyTitle("Apache log4net for .NET Compact Framework 2.0")] #elif (MONO_1_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-Mono 1.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-Mono 1.0")] [assembly: AssemblyTitle("Apache log4net for Mono 1.0")] #elif (MONO_2_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-Mono 2.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-Mono 2.0")] [assembly: AssemblyTitle("Apache log4net for Mono 2.0")] #elif (MONO_3_5) -[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-Mono 3.5")] +[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-Mono 3.5")] [assembly: AssemblyTitle("Apache log4net for Mono 3.5")] #elif (MONO_4_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-Mono 4.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-Mono 4.0")] [assembly: AssemblyTitle("Apache log4net for Mono 4.0")] #elif (SSCLI_1_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-SSCLI 1.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-SSCLI 1.0")] [assembly: AssemblyTitle("Apache log4net for Shared Source CLI 1.0")] #elif (NET) -[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-.NET")] +[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-.NET")] [assembly: AssemblyTitle("Apache log4net for .NET Framework")] #elif (NETSTANDARD1_3) -[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-.NET Standard 1.3")] +[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-.NET Standard 1.3")] [assembly: AssemblyTitle("Apache log4net for .NET Standard 1.3")] #elif (NETSTANDARD2_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-.NET Standard 2.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-.NET Standard 2.0")] [assembly: AssemblyTitle("Apache log4net for .NET Standard 2.0")] #elif (NETCF) -[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-.NETCF")] +[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-.NETCF")] [assembly: AssemblyTitle("Apache log4net for .NET Compact Framework")] #elif (MONO) -[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-Mono")] +[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-Mono")] [assembly: AssemblyTitle("Apache log4net for Mono")] #elif (SSCLI) -[assembly: AssemblyInformationalVersionAttribute("2.0.14.0-SSCLI")] +[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-SSCLI")] [assembly: AssemblyTitle("Apache log4net for Shared Source CLI")] #else -[assembly: AssemblyInformationalVersionAttribute("2.0.14.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.15.0")] [assembly: AssemblyTitle("Apache log4net")] #endif diff --git a/src/log4net/AssemblyVersionInfo.cs b/src/log4net/AssemblyVersionInfo.cs index fd0b3defd..1c27d5799 100644 --- a/src/log4net/AssemblyVersionInfo.cs +++ b/src/log4net/AssemblyVersionInfo.cs @@ -28,11 +28,11 @@ // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: System.Reflection.AssemblyVersion("2.0.14.0")] +[assembly: System.Reflection.AssemblyVersion("2.0.15.0")] #if !NETCF #if !SSCLI -[assembly: System.Reflection.AssemblyFileVersion("2.0.14.0")] +[assembly: System.Reflection.AssemblyFileVersion("2.0.15.0")] #endif #endif From c6689a7f71d77443923da45d0f573c6efbecf7ac Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Fri, 22 Jul 2022 16:40:57 +0200 Subject: [PATCH 071/122] :truck: pull file out so it can be referenced from documentation --- src/log4net/Core/FixFlags.cs | 104 +++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 src/log4net/Core/FixFlags.cs diff --git a/src/log4net/Core/FixFlags.cs b/src/log4net/Core/FixFlags.cs new file mode 100644 index 000000000..b2e94454e --- /dev/null +++ b/src/log4net/Core/FixFlags.cs @@ -0,0 +1,104 @@ +using System; + +namespace log4net.Core +{ + /// + /// Flags passed to the property + /// + /// + /// + /// Flags passed to the property + /// + /// + /// Nicko Cadell + [Flags] + public enum FixFlags + { + /// + /// Fix the MDC + /// + [Obsolete("Replaced by composite Properties")] + Mdc = 0x01, + + /// + /// Fix the NDC + /// + Ndc = 0x02, + + /// + /// Fix the rendered message + /// + Message = 0x04, + + /// + /// Fix the thread name + /// + ThreadName = 0x08, + + /// + /// Fix the callers location information + /// + /// + /// CAUTION: Very slow to generate + /// + LocationInfo = 0x10, + + /// + /// Fix the callers windows user name + /// + /// + /// CAUTION: Slow to generate + /// + UserName = 0x20, + + /// + /// Fix the domain friendly name + /// + Domain = 0x40, + + /// + /// Fix the callers principal name + /// + /// + /// CAUTION: May be slow to generate + /// + Identity = 0x80, + + /// + /// Fix the exception text + /// + Exception = 0x100, + + /// + /// Fix the event properties. Active properties must implement in order to be eligible for fixing. + /// + Properties = 0x200, + + /// + /// No fields fixed + /// + None = 0x0, + + /// + /// All fields fixed + /// + All = 0xFFFFFFF, + + /// + /// Partial fields fixed + /// + /// + /// + /// This set of partial fields gives good performance. The following fields are fixed: + /// + /// + /// + /// + /// + /// + /// + /// + /// + Partial = Message | ThreadName | Exception | Domain | Properties, + } +} \ No newline at end of file From 3f2b32ca3259f0099358107dfcb032d15a56cdb8 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Fri, 22 Jul 2022 17:06:53 +0200 Subject: [PATCH 072/122] :construction: preparing a release (need to pick up from step 5 of the release guide) --- doc/sign-log4net-libraries.sh | 2 +- local-tasks/build-site.js | 2 +- .../log4net-672/log4net.config | 13 +++ src/log4net/Core/LoggingEvent.cs | 100 ------------------ src/log4net/log4net.csproj | 2 +- src/site/xdoc/download_log4net.xml | 20 ++-- src/site/xdoc/release/config-examples.xml | 19 ++++ src/site/xdoc/release/release-notes.xml | 27 +++++ 8 files changed, 72 insertions(+), 113 deletions(-) diff --git a/doc/sign-log4net-libraries.sh b/doc/sign-log4net-libraries.sh index 55d5767b0..59702f74d 100644 --- a/doc/sign-log4net-libraries.sh +++ b/doc/sign-log4net-libraries.sh @@ -1,7 +1,7 @@ #!/bin/bash # see https://infra.apache.org/release-signing#openpgp-ascii-detach-sig DID_SOMETHING=0 -for f in log4net*.nupkg log4net*.zip; do +for f in *log4net*.nupkg *log4net*.zip; do DID_SOMETHING=1 echo "signing: $f" gpg --armor --output $f.asc --detach-sig $f diff --git a/local-tasks/build-site.js b/local-tasks/build-site.js index f87fe82a7..8e27cf03f 100644 --- a/local-tasks/build-site.js +++ b/local-tasks/build-site.js @@ -13,7 +13,7 @@ gulp.task("build-site", async () => { let extra; switch (os.platform()) { case "win32": - extra = "You may install maven via scoop (https://scoop.sh/)"; + extra = "You may install maven via chocolatey (https://chocolatey.org)"; break; case "darwin": extra = "You may install maven via homebrew"; diff --git a/src/integration-testing/log4net-672/log4net.config b/src/integration-testing/log4net-672/log4net.config index 0e685d603..42ed1b609 100644 --- a/src/integration-testing/log4net-672/log4net.config +++ b/src/integration-testing/log4net-672/log4net.config @@ -10,9 +10,22 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/log4net/Core/LoggingEvent.cs b/src/log4net/Core/LoggingEvent.cs index cf228a717..9dd9a12af 100644 --- a/src/log4net/Core/LoggingEvent.cs +++ b/src/log4net/Core/LoggingEvent.cs @@ -199,106 +199,6 @@ public DateTime TimeStampUtc #endregion Public Instance Fields } - /// - /// Flags passed to the property - /// - /// - /// - /// Flags passed to the property - /// - /// - /// Nicko Cadell - [Flags] - public enum FixFlags - { - /// - /// Fix the MDC - /// - [Obsolete("Replaced by composite Properties")] - Mdc = 0x01, - - /// - /// Fix the NDC - /// - Ndc = 0x02, - - /// - /// Fix the rendered message - /// - Message = 0x04, - - /// - /// Fix the thread name - /// - ThreadName = 0x08, - - /// - /// Fix the callers location information - /// - /// - /// CAUTION: Very slow to generate - /// - LocationInfo = 0x10, - - /// - /// Fix the callers windows user name - /// - /// - /// CAUTION: Slow to generate - /// - UserName = 0x20, - - /// - /// Fix the domain friendly name - /// - Domain = 0x40, - - /// - /// Fix the callers principal name - /// - /// - /// CAUTION: May be slow to generate - /// - Identity = 0x80, - - /// - /// Fix the exception text - /// - Exception = 0x100, - - /// - /// Fix the event properties. Active properties must implement in order to be eligible for fixing. - /// - Properties = 0x200, - - /// - /// No fields fixed - /// - None = 0x0, - - /// - /// All fields fixed - /// - All = 0xFFFFFFF, - - /// - /// Partial fields fixed - /// - /// - /// - /// This set of partial fields gives good performance. The following fields are fixed: - /// - /// - /// - /// - /// - /// - /// - /// - /// - Partial = Message | ThreadName | Exception | Domain | Properties, - } - /// /// The internal representation of logging events. /// diff --git a/src/log4net/log4net.csproj b/src/log4net/log4net.csproj index 27707b669..e034b6ac7 100644 --- a/src/log4net/log4net.csproj +++ b/src/log4net/log4net.csproj @@ -1,7 +1,7 @@  log4net - 2.0.14 + 2.0.15 Codestin Search App Apache log4net diff --git a/src/site/xdoc/download_log4net.xml b/src/site/xdoc/download_log4net.xml index 0ce385268..1ae3e4e5a 100644 --- a/src/site/xdoc/download_log4net.xml +++ b/src/site/xdoc/download_log4net.xml @@ -36,14 +36,14 @@ limitations under the License. -
    +
    - - - + + +
    apache-log4net-source-2.0.14.zipsha512pgpapache-log4net-source-2.0.15.zipsha512pgp
    @@ -52,14 +52,14 @@ limitations under the License.

    Binaries are available in a zip file or nupkg, which is also available from nuget.org

    - - - + + + - - - + + +
    log4net-binaries-2.0.14.zipsha512pgplog4net-binaries-2.0.15.zipsha512pgp
    log4net-2.0.14.nupkgsha512pgplog4net-2.0.15.nupkgsha512pgp
    diff --git a/src/site/xdoc/release/config-examples.xml b/src/site/xdoc/release/config-examples.xml index 9d6287952..c5a2ec32f 100644 --- a/src/site/xdoc/release/config-examples.xml +++ b/src/site/xdoc/release/config-examples.xml @@ -44,6 +44,7 @@ limitations under the License.

    For full details see the SDK Reference entry: log4net.Appender.AdoNetAppender. + Please see notes on the BufferingForwardingAppender about performance and data fixing

    The configuration of the AdoNetAppender depends on the @@ -476,6 +477,17 @@ CREATE TABLE Log ( + + ]]> @@ -572,6 +584,10 @@ CREATE TABLE Log (

    For full details see the SDK Reference entry: log4net.Appender.EventLogAppender. + Please note that this appender is not natively available in log4net for dotnet standard, as + it would bring in windows dependencies for non-windows consumers. Please see + https://www.nuget.org/packages/log4net.appenders.netcore + for an alternative if you still require EventLog logging for netstandard targets.

    The following example shows how to configure the EventLogAppender to log @@ -805,6 +821,7 @@ CREATE TABLE Log (

    For full details see the SDK Reference entry: log4net.Appender.RemotingAppender. + Please see notes on the BufferingForwardingAppender about performance and data fixing

    The following example shows how to configure the RemotingAppender @@ -935,6 +952,7 @@ CREATE TABLE Log (

    For full details see the SDK Reference entry: log4net.Appender.SmtpAppender. + Please see notes on the BufferingForwardingAppender about performance and data fixing

    The following example shows how to configure the SmtpAppender @@ -1004,6 +1022,7 @@ CREATE TABLE Log (

    For full details see the SDK Reference entry: log4net.Appender.SmtpPickupDirAppender. + Please see notes on the BufferingForwardingAppender about performance and data fixing

    The SmtpPickupDirAppender is configured similarly diff --git a/src/site/xdoc/release/release-notes.xml b/src/site/xdoc/release/release-notes.xml index fe410cef2..08018c764 100644 --- a/src/site/xdoc/release/release-notes.xml +++ b/src/site/xdoc/release/release-notes.xml @@ -27,6 +27,33 @@ limitations under the License.

    +
    + Attention: .NET 3.5 Client Profile is no longer supported. I'm really sorry, I've tried + to keep as many of the legacy targets available as possible, but after spending another 4 or so + hours trying to get net35-client to build on any machine, I've given up - as far as I'm aware, + this should only affect Windows XP clients. I'm afraid 2.0.14 was the end of the road for you. + + Apache log4net 2.0.15 addresses reported issues: +
    +
      +
    • Improper usage of xml namespacing for netfx targets after a netstandard update ( + LOG4NET-685, + related LOG4NET-683)
    • +
    • Locking hashtables during write in RenderMap calls to make them thread-safe ( + LOG4NET-646)
    • +
    • An issue where RollingFilAppender would sometimes overwrite files instead of rolling them ( + LOG4NET-672)
    • +
    +
    +
    + +
    +
    Apache log4net 2.0.14 is a minor release to address some reported issues and accept a pull request provided by a community member: From 95e0e30cdb7a8225844308ecdbe1755826b943ab Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Mon, 25 Jul 2022 09:14:57 +0200 Subject: [PATCH 073/122] :memo: add more notes to release docs --- doc/RELEASING.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/RELEASING.md b/doc/RELEASING.md index 4858d5217..77434e9ef 100644 --- a/doc/RELEASING.md +++ b/doc/RELEASING.md @@ -30,6 +30,10 @@ release version 2.0.123: - currently, this _must_ happen on a windows machine because of older .net framework requirements which cannot be met on a Linux machine (or at least, I haven't figured out how - in particular CF) + - TODO: the following are still manual and need to be built into the `release` script: + - log4net.build: update package.version property + - log4net.shfbproj: update HtmlHelpName + - pom.xml: update version 4. Sign release artifacts (zips & nupkg) under `build/artifacts` - eg `gpg --argmor --output log4net-2.0.123.nupkg.asc --detach-sig log4net-2.0.123.nupkg` - there is an accompanying `sign-log4net-libraries.sh` which you could invoke if you cd @@ -40,6 +44,7 @@ release version 2.0.123: - check out the `asf-staging` branch - create a folder which includes the version, eg `log4net-2.0.123` 6. Copy the contents of `target/site` from this repo into the folder created in (5) + - remember to either update or link in sdk docs from a prior release 7. Update the symlinks in the base of the docs repo, ie: - 2.0.x -> 2.0.123 - 2.x -> 2.0.123 From d29c8f2557a09a1c5a0ae0a066fd9cd88783eec7 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Mon, 25 Jul 2022 09:42:34 +0200 Subject: [PATCH 074/122] :memo: minor update to release docs --- doc/RELEASING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/RELEASING.md b/doc/RELEASING.md index 77434e9ef..1caf52e39 100644 --- a/doc/RELEASING.md +++ b/doc/RELEASING.md @@ -64,7 +64,7 @@ release version 2.0.123: - `cd apache-dist-logging-dev` - `svn up log4net` - copy in source & binary artifacts to respective locations - - `svn delete` old items + - `svn delete` old items (or defer this until after the vote completes) - `svn commit` 13. raise a vote on the log4net mailing list (dev@logging.apache.org) 14. wait From f1a28ff534cc4d68adac208ca802e04adbe4d939 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Mon, 25 Jul 2022 08:52:30 +0200 Subject: [PATCH 075/122] :package: bump version numbers --- log4net.build | 2 +- log4net.shfbproj | 2 +- pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/log4net.build b/log4net.build index 230d6a80b..0bb50afd0 100644 --- a/log4net.build +++ b/log4net.build @@ -20,7 +20,7 @@ limitations under the License. - + diff --git a/log4net.shfbproj b/log4net.shfbproj index 7f91938ab..d8e22eb66 100644 --- a/log4net.shfbproj +++ b/log4net.shfbproj @@ -33,7 +33,7 @@ limitations under the License. .NET Framework 3.5 doc\sdk\net\4.0\ - log4net-sdk-2.0.9 + log4net-sdk-2.0.15 en-US Standard Blank diff --git a/pom.xml b/pom.xml index 36c4c2b49..86918c59e 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ log4net apache-log4net pom - 2.0.9-SNAPSHOT + 2.0.15 Apache log4net Logging framework for Microsoft .NET Framework. http://logging.apache.org/log4net/ From 3495ffbf819d6ec262e54efc23c9a80eda842aab Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Mon, 25 Jul 2022 09:32:56 +0200 Subject: [PATCH 076/122] :memo: update copyright date in NOTICE --- NOTICE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NOTICE b/NOTICE index 35c2b634c..468a2f549 100644 --- a/NOTICE +++ b/NOTICE @@ -1,5 +1,5 @@ Apache log4net - Copyright 2004-2021 The Apache Software Foundation + Copyright 2004-2022 The Apache Software Foundation This product includes software developed at The Apache Software Foundation (https://www.apache.org/). From 7a1a5f0e297404105bc9bc7072eebe8b24695e7f Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Mon, 25 Jul 2022 09:38:27 +0200 Subject: [PATCH 077/122] :memo: add apache license headers --- build-with-docker-for-windows.bat | 17 +++++++++++++++++ install-dotnet-core-sdk-1.1.ps1 | 17 +++++++++++++++++ install-net-framework-sdk-3.5.ps1 | 17 +++++++++++++++++ local-tasks/build-site.js | 17 +++++++++++++++++ local-tasks/hash-build-artifacts.js | 17 +++++++++++++++++ local-tasks/prefix-build-artifacts.js | 19 ++++++++++++++++++- local-tasks/prepare-build-artifacts.js | 17 +++++++++++++++++ local-tasks/update-version-info.js | 17 +++++++++++++++++ local-tasks/zip.js | 17 +++++++++++++++++ old-log4net.snk.gpg | Bin 2535 -> 0 bytes 10 files changed, 154 insertions(+), 1 deletion(-) delete mode 100644 old-log4net.snk.gpg diff --git a/build-with-docker-for-windows.bat b/build-with-docker-for-windows.bat index a5cdf9c10..9db90c95f 100644 --- a/build-with-docker-for-windows.bat +++ b/build-with-docker-for-windows.bat @@ -1 +1,18 @@ +rem Licensed to the Apache Software Foundation (ASF) under one +rem or more contributor license agreements. See the NOTICE file +rem distributed with this work for additional information +rem regarding copyright ownership. The ASF licenses this file +rem to you under the Apache License, Version 2.0 (the +rem "License"); you may not use this file except in compliance +rem with the License. You may obtain a copy of the License at +rem +rem http://www.apache.org/licenses/LICENSE-2.0 +rem +rem Unless required by applicable law or agreed to in writing, +rem software distributed under the License is distributed on an +rem "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +rem KIND, either express or implied. See the License for the +rem specific language governing permissions and limitations +rem under the License. + docker run -v %~dp0%:C:\dev -v %USERPROFILE%\.nuget\packages:C:\packages -t davydm/net-build-tools:vs2019 "npm ci && npm run build" diff --git a/install-dotnet-core-sdk-1.1.ps1 b/install-dotnet-core-sdk-1.1.ps1 index 038d9d629..08282ff90 100644 --- a/install-dotnet-core-sdk-1.1.ps1 +++ b/install-dotnet-core-sdk-1.1.ps1 @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + #Enforce TLS 1.2 as Microsoft is deprecating all old TLS versions [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12; diff --git a/install-net-framework-sdk-3.5.ps1 b/install-net-framework-sdk-3.5.ps1 index 7858dc987..e49ce0bf7 100644 --- a/install-net-framework-sdk-3.5.ps1 +++ b/install-net-framework-sdk-3.5.ps1 @@ -1,3 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# #Enforce TLS 1.2 as Microsoft is deprecating all old TLS versions [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12; diff --git a/local-tasks/build-site.js b/local-tasks/build-site.js index 8e27cf03f..d63d91cd2 100644 --- a/local-tasks/build-site.js +++ b/local-tasks/build-site.js @@ -1,3 +1,20 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + const gulp = requireModule("gulp"), spawn = requireModule("spawn"), diff --git a/local-tasks/hash-build-artifacts.js b/local-tasks/hash-build-artifacts.js index 91fea9180..1af07dfa8 100644 --- a/local-tasks/hash-build-artifacts.js +++ b/local-tasks/hash-build-artifacts.js @@ -1,3 +1,20 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + const gulp = requireModule("gulp"); diff --git a/local-tasks/prefix-build-artifacts.js b/local-tasks/prefix-build-artifacts.js index 4f34ae969..886890b73 100644 --- a/local-tasks/prefix-build-artifacts.js +++ b/local-tasks/prefix-build-artifacts.js @@ -1,3 +1,20 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + const { renameSync } = require("fs"); const gulp = requireModule("gulp"); @@ -20,4 +37,4 @@ gulp.task("prefix-build-artifacts", async () => { ); await rename(item, newName, true); } -}); \ No newline at end of file +}); diff --git a/local-tasks/prepare-build-artifacts.js b/local-tasks/prepare-build-artifacts.js index 3c22504ec..b658f0886 100644 --- a/local-tasks/prepare-build-artifacts.js +++ b/local-tasks/prepare-build-artifacts.js @@ -1,3 +1,20 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + const gulp = requireModule("gulp"); diff --git a/local-tasks/update-version-info.js b/local-tasks/update-version-info.js index 314bf5cc3..c1e0353f7 100644 --- a/local-tasks/update-version-info.js +++ b/local-tasks/update-version-info.js @@ -1,3 +1,20 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + const gulp = requireModule("gulp"); diff --git a/local-tasks/zip.js b/local-tasks/zip.js index 3876fb864..3e2ec0265 100644 --- a/local-tasks/zip.js +++ b/local-tasks/zip.js @@ -1,3 +1,20 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + const gulp = requireModule("gulp"), promisify = requireModule("promisify-stream"), diff --git a/old-log4net.snk.gpg b/old-log4net.snk.gpg deleted file mode 100644 index 57126212f156159fe1855a8c49e6fc742c4dd790..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2535 zcmVIwKeVLnvAD$At;IZrg&+c%Imyjp)a z-DJDI+I0AIJuSWd!bOd&b@_CEkj6x;$r_Ft#MvYB=0X|M<_aCkne+z$72^HinO8jc z_s}rAA13d=Etfj~9&fB55K%JSHGKa6$0Hwxo{p0UEa3_Jot>_qtrmN8pq`3u9-wRY zROT4Hbb9Q07{j<&1E`V0#oh<~5m)U>MfJa{l7XEHIJ@2}BW!Y6`Y=_FzCU^p@qa)t z9+;RwaR?eCpS_I8OmknT*je+_|I4xCRp2srCvH)?xN;+l|CrV6K@|87l=9%S^t~b} zAF2NVcz7xkUeP}Cl;vk{?oQwD4qh8tX5&DN{<%{{iIjsD0=}*cRTMI#LMAQ-O?Lqj zHK$vp#LPWQC6M5VVDBy)bVUmlN1_pyg&*fyCNlL==lA#MwQbqf+BK{cS^-@{g0g28 z*rN5f^jCt zqsu}B0H7Dsy;N(4hou@=@F!lpKVsC676d-=IMaHx?B7VnIy&>()whW01dqbE+U!$3dX$|x7k`bm9?&S^GP z>3{3j908#6+M5UZ_f7xudIO!K9Zrecji%_rTVrnFjxzA+DJ?LjgCY+ZiVIdX1a;*c z_OOdSH(j%uKZOouJxib~b;{5bLWTFue_p=aAoq<{i9RHla4}c;t-gH7b>6ieM1s*g zz~SvzjwL;BV_bbAU+(osgRD^wuBv@5E}YtZ?P$p-#bFM!4FW?%d!7}B88B;yOXjP! zKv_bH2yDg0NBg37j`}}W5pM~0bedWbueBX=^|eYLK?e#kX+kZdqt($eOT@e!>&WL4 zhMtdEE%f2eH~gU_kfHu$wgr{rl~T8hcAh#mNz{v?!CD~QtnuC|2mpW}`R(>5|Dky6 zsYPq=Le&K?^Cz`HoV0VMh5Q81!(bl%r$|c~6qz+oxPQ;5!4!FcQ6fPJUAK#zhNs9)KB+)r!d$nq)lKKT z$=e!iGHedsk8#Sm5s%YndCDRum-Yc=4NFefv5lX#9!BVcgDn+?3m?CKD7J><5Nz~7 zS(r(Nq8dSdA7!>OVKJk%15cl8=tI8d=u?gQBkmPiQJWP|NXn>+(Lv#19Ya-Ib+}N^ z3r#>~OZ6~|mhM5;g_m3!14*Jej8C5+kRu;bV8i~=8*S-QOM729P8=6IEC*SLtvWXwlr z7&Hd^fw5Xsq|f98Y6#Qc22;erNX++L2<`nIha`O&gQFQ5fL3Ig_8v(_d zzs?I9h-#{EmgFJpWlwGoMRUJy*|(Tv9K=K=q#++VxgUD=&gZ{@XF3uTJvPW|6Q3hC z`gAD5RJA4qSGrjI0-K@7y!(nF=~X2mfm~m$X;80R0wi^SuAv!-nL*%#NXm~V)V`D{ zu6lCKQfFrz~p&@qFhqezCP z|0XJ273CiRqX4e@lOEP233;4ZVy83`m`Y?}j}yr(I*-#3uWcf{YBW-LrAt}RLQERn zdgGia^g$!?{oTT%BlzbY_N1TP^Ip}$>J_<2(9f4ve3SME7x1YRFGOh9n@ue0ucrQ; zv%PS~h%w?`nk~IhtSK8`2P4EN);*EN?D)oJzI`N!ys zUe!YPinib`tU1o)R4+QBjswvfN2=QaRuBN{J@Q=koI6y&s<|CQ8k7336|OKpzRlu- zM#|P~1uElByzgGRX@%6Q{{fkFBuUWavpQ_z}W6hOTft ze=e%|;2q}pX3$GY*jpNKt0%x$HR>L>#Oe0;GRtI2SdjES-7cF7eFT_2sKSfxJ^GNrQ zJ8hyX2Uuker03ffOi+O!Z^1Ek$-%ai`iPlA3wM4OOk{{Y7p7XG&AjW!-Jt}31taY^ zF4@Tth2Y;6Nj$1Qv4>3wG_s1Y0_$DY~6EG*ZKg9`ZjpI zczrVR&)%9+NCZ=eKz@_YVo2LVA5m$pe|v5Qc_hlD=H~k;Y;{0@RC`XUr)I<;?7}pf xwds#Ca;zQ$k_e_xq4$XqMUVSnu%uZzzH~lLasRXy)QS96X^t)z^aZ&a&482O&#eFe From e26e1dd8de26daccb4cf34a8698d7965fe52528a Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Wed, 3 Aug 2022 16:31:28 +0200 Subject: [PATCH 078/122] :white_check_mark: ensure that the log4net assembly is always signed --- src/log4net.Tests/Signing.cs | 23 +++++++++++++++++++++++ src/log4net/AssemblyInfo.cs | 2 ++ 2 files changed, 25 insertions(+) create mode 100644 src/log4net.Tests/Signing.cs diff --git a/src/log4net.Tests/Signing.cs b/src/log4net.Tests/Signing.cs new file mode 100644 index 000000000..865167404 --- /dev/null +++ b/src/log4net.Tests/Signing.cs @@ -0,0 +1,23 @@ +using log4net.Repository; +using NUnit.Framework; +using NExpect; +using static NExpect.Expectations; + +namespace log4net.Tests +{ + [TestFixture] + public class Signing + { + [Test] + public void AssemblyShouldBeSigned() + { + // Arrange + var asm = typeof(LoggerRepositorySkeleton).Assembly; + // Act + var result = asm.GetName().GetPublicKey(); + // Assert + Expect(result) + .Not.To.Be.Empty(); + } + } +} \ No newline at end of file diff --git a/src/log4net/AssemblyInfo.cs b/src/log4net/AssemblyInfo.cs index 44905c3ff..a767ff7a2 100644 --- a/src/log4net/AssemblyInfo.cs +++ b/src/log4net/AssemblyInfo.cs @@ -20,6 +20,8 @@ using System.Reflection; using System.Runtime.CompilerServices; +// [assembly:AssemblyKeyFile("log4net.snk")] + #if (!SSCLI) // // log4net makes use of static methods which cannot be made com visible From e14be4395ac93dfa8d36b469541f5d83e8ea46fd Mon Sep 17 00:00:00 2001 From: Jan Friedrich Date: Mon, 8 Aug 2022 15:30:19 +0200 Subject: [PATCH 079/122] SystemInfo.EntryAssemblyLocation writable to adjust location for config-files in unit test projects --- .gitignore | 1 + src/log4net/Util/SystemInfo.cs | 237 +++++++++++++++++---------------- 2 files changed, 122 insertions(+), 116 deletions(-) diff --git a/.gitignore b/.gitignore index e260d61e2..ad029ec8f 100644 --- a/.gitignore +++ b/.gitignore @@ -243,3 +243,4 @@ buildreports vs_buildtools.exe dotnetfx35.exe *.exe +/src/Binaries/* diff --git a/src/log4net/Util/SystemInfo.cs b/src/log4net/Util/SystemInfo.cs index 92e2c60cd..c63850bab 100644 --- a/src/log4net/Util/SystemInfo.cs +++ b/src/log4net/Util/SystemInfo.cs @@ -59,7 +59,7 @@ public sealed class SystemInfo /// Only static methods are exposed from this type. /// /// - private SystemInfo() + private SystemInfo() { } @@ -142,7 +142,7 @@ public static string NewLine /// public static string ApplicationBaseDirectory { - get + get { #if NETCF - return System.IO.Path.GetDirectoryName(SystemInfo.EntryAssemblyLocation) + System.IO.Path.DirectorySeparatorChar; @@ -170,7 +170,7 @@ public static string ApplicationBaseDirectory /// public static string ConfigurationFileLocation { - get + get { #if NETCF || NETSTANDARD return SystemInfo.EntryAssemblyLocation+".config"; @@ -180,6 +180,8 @@ public static string ConfigurationFileLocation } } + private static string entryAssemblyLocation; + /// /// Gets the path to the file that first executed in the current . /// @@ -191,16 +193,19 @@ public static string ConfigurationFileLocation /// public static string EntryAssemblyLocation { - get + get { + if (entryAssemblyLocation != null) + return entryAssemblyLocation; #if NETCF - return SystemInfo.NativeEntryAssemblyLocation; + return entryAssemblyLocation = SystemInfo.NativeEntryAssemblyLocation; #elif NETSTANDARD1_3 // TODO GetEntryAssembly is available for netstandard1.5 - return AppContext.BaseDirectory; + return entryAssemblyLocation = AppContext.BaseDirectory; #else - return System.Reflection.Assembly.GetEntryAssembly().Location; + return entryAssemblyLocation = System.Reflection.Assembly.GetEntryAssembly().Location; #endif } + set => entryAssemblyLocation = value; } /// @@ -227,7 +232,7 @@ public static string EntryAssemblyLocation /// public static int CurrentThreadId { - get + get { #if NETCF_1_0 return System.Threading.Thread.CurrentThread.GetHashCode(); @@ -295,10 +300,10 @@ public static string HostName s_hostName = Environment.MachineName; #endif } - catch(InvalidOperationException) + catch (InvalidOperationException) { } - catch(System.Security.SecurityException) + catch (System.Security.SecurityException) { // We may get a security exception looking up the machine name // You must have Unrestricted EnvironmentPermission to access resource @@ -343,7 +348,7 @@ public static string ApplicationFriendlyName s_appFriendlyName = AppDomain.CurrentDomain.FriendlyName; #endif } - catch(System.Security.SecurityException) + catch (System.Security.SecurityException) { // This security exception will occur if the caller does not have // some undefined set of SecurityPermission flags. @@ -357,7 +362,7 @@ public static string ApplicationFriendlyName string assemblyLocation = SystemInfo.EntryAssemblyLocation; s_appFriendlyName = System.IO.Path.GetFileName(assemblyLocation); } - catch(System.Security.SecurityException) + catch (System.Security.SecurityException) { // Caller needs path discovery permission } @@ -392,35 +397,35 @@ public static string ApplicationFriendlyName /// will be set per AppDomain. /// /// - [Obsolete("Use ProcessStartTimeUtc and convert to local time if needed.")] + [Obsolete("Use ProcessStartTimeUtc and convert to local time if needed.")] public static DateTime ProcessStartTime { get { return s_processStartTimeUtc.ToLocalTime(); } } - /// - /// Get the UTC start time for the current process. - /// - /// - /// - /// This is the UTC time at which the log4net library was loaded into the - /// AppDomain. Due to reports of a hang in the call to System.Diagnostics.Process.StartTime - /// this is not the start time for the current process. - /// - /// - /// The log4net library should be loaded by an application early during its - /// startup, therefore this start time should be a good approximation for - /// the actual start time. - /// - /// - /// Note that AppDomains may be loaded and unloaded within the - /// same process without the process terminating, however this start time - /// will be set per AppDomain. - /// - /// - public static DateTime ProcessStartTimeUtc - { - get { return s_processStartTimeUtc; } + /// + /// Get the UTC start time for the current process. + /// + /// + /// + /// This is the UTC time at which the log4net library was loaded into the + /// AppDomain. Due to reports of a hang in the call to System.Diagnostics.Process.StartTime + /// this is not the start time for the current process. + /// + /// + /// The log4net library should be loaded by an application early during its + /// startup, therefore this start time should be a good approximation for + /// the actual start time. + /// + /// + /// Note that AppDomains may be loaded and unloaded within the + /// same process without the process terminating, however this start time + /// will be set per AppDomain. + /// + /// + public static DateTime ProcessStartTimeUtc + { + get { return s_processStartTimeUtc; } } /// @@ -483,7 +488,7 @@ public static string AssemblyLocationInfo(Assembly myAssembly) #if NETCF return "Not supported on Microsoft .NET Compact Framework"; #elif NETSTANDARD1_3 - return "Not supported on .NET Core"; + return "Not supported on .NET Core"; #else if (myAssembly.GlobalAssemblyCache) { @@ -665,7 +670,7 @@ public static Type GetTypeFromString(Type relativeType, string typeName, bool th return GetTypeFromString(relativeType.Assembly, typeName, throwOnError, ignoreCase); #endif } - + #if !NETSTANDARD1_3 /// /// Loads the type specified in the type string. @@ -715,7 +720,7 @@ public static Type GetTypeFromString(string typeName, bool throwOnError, bool ig public static Type GetTypeFromString(Assembly relativeAssembly, string typeName, bool throwOnError, bool ignoreCase) { // Check if the type name specifies the assembly name - if(typeName.IndexOf(',') == -1) + if (typeName.IndexOf(',') == -1) { //LogLog.Debug(declaringType, "SystemInfo: Loading type ["+typeName+"] from assembly ["+relativeAssembly.FullName+"]"); #if NETSTANDARD1_3 @@ -737,7 +742,7 @@ public static Type GetTypeFromString(Assembly relativeAssembly, string typeName, { loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies(); } - catch(System.Security.SecurityException) + catch (System.Security.SecurityException) { // Insufficient permissions to get the list of loaded assemblies } @@ -746,33 +751,33 @@ public static Type GetTypeFromString(Assembly relativeAssembly, string typeName, { Type fallback = null; // Search the loaded assemblies for the type - foreach (Assembly assembly in loadedAssemblies) + foreach (Assembly assembly in loadedAssemblies) { Type t = assembly.GetType(typeName, false, ignoreCase); if (t != null) { // Found type in loaded assembly - LogLog.Debug(declaringType, "Loaded type ["+typeName+"] from assembly ["+assembly.FullName+"] by searching loaded assemblies."); - if (assembly.GlobalAssemblyCache) - { - fallback = t; - } - else - { - return t; - } + LogLog.Debug(declaringType, "Loaded type [" + typeName + "] from assembly [" + assembly.FullName + "] by searching loaded assemblies."); + if (assembly.GlobalAssemblyCache) + { + fallback = t; + } + else + { + return t; + } } } - if (fallback != null) - { - return fallback; - } + if (fallback != null) + { + return fallback; + } } // Didn't find the type if (throwOnError) { - throw new TypeLoadException("Could not load type ["+typeName+"]. Tried assembly ["+relativeAssembly.FullName+"] and all loaded assemblies"); + throw new TypeLoadException("Could not load type [" + typeName + "]. Tried assembly [" + relativeAssembly.FullName + "] and all loaded assemblies"); } return null; #endif @@ -938,20 +943,20 @@ public static bool TryParse(string s, out long val) #endif } - /// - /// Parse a string into an value - /// - /// the string to parse - /// out param where the parsed value is placed - /// true if the string was able to be parsed into an integer - /// - /// - /// Attempts to parse the string into an integer. If the string cannot - /// be parsed then this method returns false. The method does not throw an exception. - /// - /// - public static bool TryParse(string s, out short val) - { + /// + /// Parse a string into an value + /// + /// the string to parse + /// out param where the parsed value is placed + /// true if the string was able to be parsed into an integer + /// + /// + /// Attempts to parse the string into an integer. If the string cannot + /// be parsed then this method returns false. The method does not throw an exception. + /// + /// + public static bool TryParse(string s, out short val) + { #if NETCF val = 0; try @@ -965,28 +970,28 @@ public static bool TryParse(string s, out short val) return false; #else - // Initialise out param - val = 0; - - try - { - double doubleVal; - if (Double.TryParse(s, System.Globalization.NumberStyles.Integer, System.Globalization.CultureInfo.InvariantCulture, out doubleVal)) - { - val = Convert.ToInt16(doubleVal); - return true; - } - } - catch - { - // Ignore exception, just return false - } - - return false; + // Initialise out param + val = 0; + + try + { + double doubleVal; + if (Double.TryParse(s, System.Globalization.NumberStyles.Integer, System.Globalization.CultureInfo.InvariantCulture, out doubleVal)) + { + val = Convert.ToInt16(doubleVal); + return true; + } + } + catch + { + // Ignore exception, just return false + } + + return false; #endif - } + } - /// + /// /// Lookup an application setting /// /// the application settings key to lookup @@ -1008,7 +1013,7 @@ public static string GetAppSetting(string key) return ConfigurationSettings.AppSettings[key]; #endif } - catch(Exception ex) + catch (Exception ex) { // If an exception is thrown here then it looks like the config file does not parse correctly. LogLog.Error(declaringType, "Exception while reading ConfigurationSettings. Check your .config file is well formed XML.", ex); @@ -1086,28 +1091,28 @@ public static Hashtable CreateCaseInsensitiveHashtable() #endif } - /// - /// Tests two strings for equality, the ignoring case. - /// - /// - /// If the platform permits, culture information is ignored completely (ordinal comparison). - /// The aim of this method is to provide a fast comparison that deals with null and ignores different casing. - /// It is not supposed to deal with various, culture-specific habits. - /// Use it to compare against pure ASCII constants, like keywords etc. - /// - /// The one string. - /// The other string. - /// true if the strings are equal, false otherwise. - public static Boolean EqualsIgnoringCase(String a, String b) - { + /// + /// Tests two strings for equality, the ignoring case. + /// + /// + /// If the platform permits, culture information is ignored completely (ordinal comparison). + /// The aim of this method is to provide a fast comparison that deals with null and ignores different casing. + /// It is not supposed to deal with various, culture-specific habits. + /// Use it to compare against pure ASCII constants, like keywords etc. + /// + /// The one string. + /// The other string. + /// true if the strings are equal, false otherwise. + public static Boolean EqualsIgnoringCase(String a, String b) + { #if NET_1_0 || NET_1_1 || NETCF_1_0 - return string.Compare(a, b, true, System.Globalization.CultureInfo.InvariantCulture) == 0 + return string.Compare(a, b, true, System.Globalization.CultureInfo.InvariantCulture) == 0 #elif NETSTANDARD1_3 - return CultureInfo.InvariantCulture.CompareInfo.Compare(a, b, CompareOptions.IgnoreCase) == 0; + return CultureInfo.InvariantCulture.CompareInfo.Compare(a, b, CompareOptions.IgnoreCase) == 0; #else // >= .NET-2.0 - return String.Equals(a, b, StringComparison.OrdinalIgnoreCase); + return String.Equals(a, b, StringComparison.OrdinalIgnoreCase); #endif - } + } #endregion Public Static Methods @@ -1169,14 +1174,14 @@ private static extern Int32 GetModuleFileName( #region Private Static Fields - /// - /// The fully qualified type of the SystemInfo class. - /// - /// - /// Used by the internal logger to record the Type of the - /// log message. - /// - private static readonly Type declaringType = typeof(SystemInfo); + /// + /// The fully qualified type of the SystemInfo class. + /// + /// + /// Used by the internal logger to record the Type of the + /// log message. + /// + private static readonly Type declaringType = typeof(SystemInfo); /// /// Cache the host name for the current machine From 4b027beb384b6c933e18670972c2a5d365f394a2 Mon Sep 17 00:00:00 2001 From: Jan Friedrich Date: Mon, 8 Aug 2022 15:46:10 +0200 Subject: [PATCH 080/122] New locking model for single log file in native applications with managed parts --- src/log4net/Appender/FileAppender.cs | 117 ++++++++++++++++++++++++++- 1 file changed, 115 insertions(+), 2 deletions(-) diff --git a/src/log4net/Appender/FileAppender.cs b/src/log4net/Appender/FileAppender.cs index dbade37f7..8853a8cca 100644 --- a/src/log4net/Appender/FileAppender.cs +++ b/src/log4net/Appender/FileAppender.cs @@ -160,7 +160,7 @@ public LockStateException(string message, Exception innerException) : base(messa } #if !NETCR && !NETSTANDARD1_3 - private LockStateException(SerializationInfo info, StreamingContext context) : base(info, context) + private LockStateException(SerializationInfo info, StreamingContext context) : base(info, context) { } #endif @@ -494,6 +494,7 @@ public FileAppender CurrentAppender /// protected Stream CreateStream(string filename, bool append, FileShare fileShare) { + filename = Environment.ExpandEnvironmentVariables(filename); using (CurrentAppender.SecurityContext.Impersonate(this)) { // Ensure that the directory structure exists @@ -896,6 +897,118 @@ public override void OnClose() } #endif + /// + /// Hold no lock on the output file + /// + /// + /// + /// Open the file once and hold it open until is called. + /// Maintains no lock on the file during this time. + /// + /// + public class NoLock : LockingModelBase + { + private Stream m_stream = null; + + /// + /// Open the file specified and prepare for logging. + /// + /// The filename to use + /// Whether to append to the file, or overwrite + /// The encoding to use + /// + /// + /// Open the file specified and prepare for logging. + /// No writes will be made until is called. + /// Must be called before any calls to , + /// and . + /// + /// + public override void OpenFile(string filename, bool append, Encoding encoding) + { + try + { + // no lock + m_stream = CreateStream(filename, append, FileShare.ReadWrite); + } + catch (Exception e1) + { + CurrentAppender.ErrorHandler.Error("Unable to acquire lock on file " + filename + ". " + e1.Message); + } + } + + /// + /// Close the file + /// + /// + /// + /// Close the file. No further writes will be made. + /// + /// + public override void CloseFile() + { + CloseStream(m_stream); + m_stream = null; + } + + /// + /// Acquire the lock on the file + /// + /// A stream that is ready to be written to. + /// + /// + /// Does nothing. The lock is already taken + /// + /// + public override Stream AcquireLock() + { + return m_stream; + } + + /// + /// Release the lock on the file + /// + /// + /// + /// Does nothing. The lock will be released when the file is closed. + /// + /// + public override void ReleaseLock() + { + // NOP + } + + /// + /// Initializes all resources used by this locking model. + /// + public override void ActivateOptions() + { + // NOP + } + + /// + /// Disposes all resources that were initialized by this locking model. + /// + public override void OnClose() + { + // NOP + } + } + + /// + /// Default locking model (when no locking model was configured) + /// + private static Type defaultLockingModelType = typeof(ExclusiveLock); + + /// + /// Specify default locking model + /// + /// Type of LockingModel + public static void SetDefaultLockingModelType() where TLockingModel : LockingModelBase + { + defaultLockingModelType = typeof(TLockingModel); + } + #endregion Locking Models #region Public Instance Constructors @@ -1112,7 +1225,7 @@ public override void ActivateOptions() if (m_lockingModel == null) { - m_lockingModel = new FileAppender.ExclusiveLock(); + m_lockingModel = (LockingModelBase)Activator.CreateInstance(defaultLockingModelType); } m_lockingModel.CurrentAppender = this; From 091b652f913c2fa4ce942374f932c0879d6acbb1 Mon Sep 17 00:00:00 2001 From: Jan Friedrich Date: Mon, 8 Aug 2022 16:04:32 +0200 Subject: [PATCH 081/122] Extension point for handling new lines in RemoteSysLogAppender added --- src/log4net/Appender/RemoteSyslogAppender.cs | 166 ++++++++++--------- 1 file changed, 88 insertions(+), 78 deletions(-) diff --git a/src/log4net/Appender/RemoteSyslogAppender.cs b/src/log4net/Appender/RemoteSyslogAppender.cs index 675d6f970..b67abd328 100644 --- a/src/log4net/Appender/RemoteSyslogAppender.cs +++ b/src/log4net/Appender/RemoteSyslogAppender.cs @@ -344,88 +344,98 @@ public void AddMapping(LevelSeverity mapping) /// protected override void Append(LoggingEvent loggingEvent) { - try - { - // Priority - int priority = GeneratePriority(m_facility, GetSeverity(loggingEvent.Level)); - - // Identity - string identity; - - if (m_identity != null) - { - identity = m_identity.Format(loggingEvent); - } - else - { - identity = loggingEvent.Domain; - } - - // Message. The message goes after the tag/identity - string message = RenderLoggingEvent(loggingEvent); - - Byte[] buffer; - int i = 0; - char c; - - StringBuilder builder = new StringBuilder(); - - while (i < message.Length) - { - // Clear StringBuilder - builder.Length = 0; - - // Write priority - builder.Append('<'); - builder.Append(priority); - builder.Append('>'); - - // Write identity - builder.Append(identity); - builder.Append(": "); - - for (; i < message.Length; i++) - { - c = message[i]; - - // Accept only visible ASCII characters and space. See RFC 3164 section 4.1.3 - if (((int)c >= 32) && ((int)c <= 126)) - { - builder.Append(c); - } - // If character is newline, break and send the current line - else if ((c == '\r') || (c == '\n')) - { - // Check the next character to handle \r\n or \n\r - if ((message.Length > i + 1) && ((message[i + 1] == '\r') || (message[i + 1] == '\n'))) - { - i++; - } - i++; - break; - } - } - - // Grab as a byte array - buffer = this.Encoding.GetBytes(builder.ToString()); + try + { + // Priority + int priority = GeneratePriority(m_facility, GetSeverity(loggingEvent.Level)); + + // Identity + string identity; + + if (m_identity != null) + { + identity = m_identity.Format(loggingEvent); + } + else + { + identity = loggingEvent.Domain; + } + + // Message. The message goes after the tag/identity + string message = RenderLoggingEvent(loggingEvent); + + byte[] buffer; + int i = 0; + + StringBuilder builder = new StringBuilder(); + + while (i < message.Length) + { + // Clear StringBuilder + builder.Length = 0; + + // Write priority + builder.Append('<'); + builder.Append(priority); + builder.Append('>'); + + // Write identity + builder.Append(identity); + builder.Append(": "); + + AppendMessage(message, ref i, builder); + + // Grab as a byte array + buffer = this.Encoding.GetBytes(builder.ToString()); #if NET_4_5 || NETSTANDARD - Client.SendAsync(buffer, buffer.Length, RemoteEndPoint).Wait(); + Client.SendAsync(buffer, buffer.Length, RemoteEndPoint).Wait(); #else - this.Client.Send(buffer, buffer.Length, this.RemoteEndPoint); + this.Client.Send(buffer, buffer.Length, this.RemoteEndPoint); #endif - } - } - catch (Exception e) - { - ErrorHandler.Error( - "Unable to send logging event to remote syslog " + - this.RemoteAddress.ToString() + - " on port " + - this.RemotePort + ".", - e, - ErrorCode.WriteFailure); - } + } + } + catch (Exception e) + { + ErrorHandler.Error( + "Unable to send logging event to remote syslog " + + this.RemoteAddress.ToString() + + " on port " + + this.RemotePort + ".", + e, + ErrorCode.WriteFailure); + } + } + + /// + /// Appends the rendered message to the buffer + /// + /// rendered message + /// index of the current character in the message + /// buffer + protected virtual void AppendMessage(string message, ref int characterIndex, StringBuilder builder) + { + for (; characterIndex < message.Length; characterIndex++) + { + char c = message[characterIndex]; + + // Accept only visible ASCII characters and space. See RFC 3164 section 4.1.3 + if (((int)c >= 32) && ((int)c <= 126)) + { + builder.Append(c); + } + // If character is newline, break and send the current line + else if ((c == '\r') || (c == '\n')) + { + // Check the next character to handle \r\n or \n\r + if ((message.Length > characterIndex + 1) && ((message[characterIndex + 1] == '\r') || (message[characterIndex + 1] == '\n'))) + { + characterIndex++; + } + characterIndex++; + break; + } + } } /// From 9ba9452b1721d488c51071bea99745b0ddb7c350 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Sun, 21 Aug 2022 16:05:38 +0200 Subject: [PATCH 082/122] :bug: Assembly.GetEntryAssembly() can return null - instead of failing with a null-deref, rather fail explicitly with an hint on how to work around the problem --- src/log4net/Util/SystemInfo.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/log4net/Util/SystemInfo.cs b/src/log4net/Util/SystemInfo.cs index c63850bab..821a23073 100644 --- a/src/log4net/Util/SystemInfo.cs +++ b/src/log4net/Util/SystemInfo.cs @@ -202,7 +202,8 @@ public static string EntryAssemblyLocation #elif NETSTANDARD1_3 // TODO GetEntryAssembly is available for netstandard1.5 return entryAssemblyLocation = AppContext.BaseDirectory; #else - return entryAssemblyLocation = System.Reflection.Assembly.GetEntryAssembly().Location; + return entryAssemblyLocation = Assembly.GetEntryAssembly()?.Location + ?? throw new InvalidOperationException($"Unable to determine EntryAssembly location: EntryAssembly is null. Try explicitly setting {nameof(SystemInfo)}.{nameof(EntryAssemblyLocation)}"); #endif } set => entryAssemblyLocation = value; From 963c29eb3b020668f048e156947b7584f2fe8213 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Sun, 21 Aug 2022 16:14:38 +0200 Subject: [PATCH 083/122] :recycle: prefer string interpolation over concatenation --- src/log4net/Appender/FileAppender.cs | 2993 +++++++++++++------------- 1 file changed, 1516 insertions(+), 1477 deletions(-) diff --git a/src/log4net/Appender/FileAppender.cs b/src/log4net/Appender/FileAppender.cs index 8853a8cca..bf782713e 100644 --- a/src/log4net/Appender/FileAppender.cs +++ b/src/log4net/Appender/FileAppender.cs @@ -1,4 +1,5 @@ #region Apache License + // // Licensed to the Apache Software Foundation (ASF) under one or more // contributor license agreements. See the NOTICE file distributed with @@ -15,6 +16,7 @@ // See the License for the specific language governing permissions and // limitations under the License. // + #endregion using System; @@ -34,54 +36,54 @@ namespace log4net.Appender { #if !NETCF - /// - /// Appends logging events to a file. - /// - /// - /// - /// Logging events are sent to the file specified by - /// the property. - /// - /// - /// The file can be opened in either append or overwrite mode - /// by specifying the property. - /// If the file path is relative it is taken as relative from - /// the application base directory. The file encoding can be - /// specified by setting the property. - /// - /// - /// The layout's and - /// values will be written each time the file is opened and closed - /// respectively. If the property is - /// then the file may contain multiple copies of the header and footer. - /// - /// - /// This appender will first try to open the file for writing when - /// is called. This will typically be during configuration. - /// If the file cannot be opened for writing the appender will attempt - /// to open the file again each time a message is logged to the appender. - /// If the file cannot be opened for writing when a message is logged then - /// the message will be discarded by this appender. - /// - /// - /// The supports pluggable file locking models via - /// the property. - /// The default behavior, implemented by - /// is to obtain an exclusive write lock on the file until this appender is closed. - /// The alternative models only hold a - /// write lock while the appender is writing a logging event () - /// or synchronize by using a named system wide Mutex (). - /// - /// - /// All locking strategies have issues and you should seriously consider using a different strategy that - /// avoids having multiple processes logging to the same file. - /// - /// - /// Nicko Cadell - /// Gert Driesen - /// Rodrigo B. de Oliveira - /// Douglas de la Torre - /// Niall Daley + /// + /// Appends logging events to a file. + /// + /// + /// + /// Logging events are sent to the file specified by + /// the property. + /// + /// + /// The file can be opened in either append or overwrite mode + /// by specifying the property. + /// If the file path is relative it is taken as relative from + /// the application base directory. The file encoding can be + /// specified by setting the property. + /// + /// + /// The layout's and + /// values will be written each time the file is opened and closed + /// respectively. If the property is + /// then the file may contain multiple copies of the header and footer. + /// + /// + /// This appender will first try to open the file for writing when + /// is called. This will typically be during configuration. + /// If the file cannot be opened for writing the appender will attempt + /// to open the file again each time a message is logged to the appender. + /// If the file cannot be opened for writing when a message is logged then + /// the message will be discarded by this appender. + /// + /// + /// The supports pluggable file locking models via + /// the property. + /// The default behavior, implemented by + /// is to obtain an exclusive write lock on the file until this appender is closed. + /// The alternative models only hold a + /// write lock while the appender is writing a logging event () + /// or synchronize by using a named system wide Mutex (). + /// + /// + /// All locking strategies have issues and you should seriously consider using a different strategy that + /// avoids having multiple processes logging to the same file. + /// + /// + /// Nicko Cadell + /// Gert Driesen + /// Rodrigo B. de Oliveira + /// Douglas de la Torre + /// Niall Daley #else /// /// Appends logging events to a file. @@ -131,56 +133,57 @@ namespace log4net.Appender /// Douglas de la Torre /// Niall Daley #endif - public class FileAppender : TextWriterAppender - { - #region LockingStream Inner Class - - /// - /// Write only that uses the - /// to manage access to an underlying resource. - /// - private sealed class LockingStream : Stream, IDisposable - { + public class FileAppender : TextWriterAppender + { + #region LockingStream Inner Class + + /// + /// Write only that uses the + /// to manage access to an underlying resource. + /// + private sealed class LockingStream : Stream, IDisposable + { #if !NETCR - [Serializable] + [Serializable] #endif - public sealed class LockStateException : LogException - { - public LockStateException(string message) - : base(message) - { - } + public sealed class LockStateException : LogException + { + public LockStateException(string message) + : base(message) + { + } - public LockStateException() - { - } + public LockStateException() + { + } - public LockStateException(string message, Exception innerException) : base(message, innerException) - { - } + public LockStateException(string message, Exception innerException) : base(message, innerException) + { + } #if !NETCR && !NETSTANDARD1_3 - private LockStateException(SerializationInfo info, StreamingContext context) : base(info, context) - { - } + private LockStateException(SerializationInfo info, StreamingContext context) : base(info, context) + { + } #endif - } + } - private Stream m_realStream = null; - private LockingModelBase m_lockingModel = null; - private int m_lockLevel = 0; + private Stream m_realStream = null; + private LockingModelBase m_lockingModel = null; + private int m_lockLevel = 0; - public LockingStream(LockingModelBase locking) - : base() - { - if (locking == null) - { - throw new ArgumentException("Locking model may not be null", "locking"); - } - m_lockingModel = locking; - } + public LockingStream(LockingModelBase locking) + : base() + { + if (locking == null) + { + throw new ArgumentException("Locking model may not be null", "locking"); + } + + m_lockingModel = locking; + } - #region Override Implementation of Stream + #region Override Implementation of Stream #if NETSTANDARD protected override void Dispose(bool disposing) @@ -190,42 +193,51 @@ protected override void Dispose(bool disposing) } #else - private int m_readTotal = -1; - - // Methods - public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) - { - AssertLocked(); - IAsyncResult ret = m_realStream.BeginRead(buffer, offset, count, callback, state); - m_readTotal = EndRead(ret); - return ret; - } - - /// - /// True asynchronous writes are not supported, the implementation forces a synchronous write. - /// - public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) - { - AssertLocked(); - IAsyncResult ret = m_realStream.BeginWrite(buffer, offset, count, callback, state); - EndWrite(ret); - return ret; - } - - public override void Close() - { - m_lockingModel.CloseFile(); - } - - public override int EndRead(IAsyncResult asyncResult) - { - AssertLocked(); - return m_readTotal; - } - public override void EndWrite(IAsyncResult asyncResult) - { - //No-op, it has already been handled - } + private int m_readTotal = -1; + + // Methods + public override IAsyncResult BeginRead(byte[] buffer, + int offset, + int count, + AsyncCallback callback, + object state) + { + AssertLocked(); + IAsyncResult ret = m_realStream.BeginRead(buffer, offset, count, callback, state); + m_readTotal = EndRead(ret); + return ret; + } + + /// + /// True asynchronous writes are not supported, the implementation forces a synchronous write. + /// + public override IAsyncResult BeginWrite(byte[] buffer, + int offset, + int count, + AsyncCallback callback, + object state) + { + AssertLocked(); + IAsyncResult ret = m_realStream.BeginWrite(buffer, offset, count, callback, state); + EndWrite(ret); + return ret; + } + + public override void Close() + { + m_lockingModel.CloseFile(); + } + + public override int EndRead(IAsyncResult asyncResult) + { + AssertLocked(); + return m_readTotal; + } + + public override void EndWrite(IAsyncResult asyncResult) + { + //No-op, it has already been handled + } #endif #if NET_4_5 || NETSTANDARD @@ -242,905 +254,928 @@ public override Task WriteAsync(byte[] buffer, int offset, int count, Cancellati } #endif - public override void Flush() - { - AssertLocked(); - m_realStream.Flush(); - } - public override int Read(byte[] buffer, int offset, int count) - { - return m_realStream.Read(buffer, offset, count); - } - public override int ReadByte() - { - return m_realStream.ReadByte(); - } - public override long Seek(long offset, SeekOrigin origin) - { - AssertLocked(); - return m_realStream.Seek(offset, origin); - } - public override void SetLength(long value) - { - AssertLocked(); - m_realStream.SetLength(value); - } - void IDisposable.Dispose() - { + public override void Flush() + { + AssertLocked(); + m_realStream.Flush(); + } + + public override int Read(byte[] buffer, int offset, int count) + { + return m_realStream.Read(buffer, offset, count); + } + + public override int ReadByte() + { + return m_realStream.ReadByte(); + } + + public override long Seek(long offset, SeekOrigin origin) + { + AssertLocked(); + return m_realStream.Seek(offset, origin); + } + + public override void SetLength(long value) + { + AssertLocked(); + m_realStream.SetLength(value); + } + + void IDisposable.Dispose() + { #if NETSTANDARD Dispose(true); #else - Close(); + Close(); #endif - } - public override void Write(byte[] buffer, int offset, int count) - { - AssertLocked(); - m_realStream.Write(buffer, offset, count); - } - public override void WriteByte(byte value) - { - AssertLocked(); - m_realStream.WriteByte(value); - } - - // Properties - public override bool CanRead - { - get { return false; } - } - public override bool CanSeek - { - get - { - AssertLocked(); - return m_realStream.CanSeek; - } - } - public override bool CanWrite - { - get - { - AssertLocked(); - return m_realStream.CanWrite; - } - } - public override long Length - { - get - { - AssertLocked(); - return m_realStream.Length; - } - } - public override long Position - { - get - { - AssertLocked(); - return m_realStream.Position; - } - set - { - AssertLocked(); - m_realStream.Position = value; - } - } - - #endregion Override Implementation of Stream - - #region Locking Methods - - private void AssertLocked() - { - if (m_realStream == null) - { - throw new LockStateException("The file is not currently locked"); - } - } - - public bool AcquireLock() - { - bool ret = false; - lock (this) - { - if (m_lockLevel == 0) - { - // If lock is already acquired, nop - m_realStream = m_lockingModel.AcquireLock(); - } - if (m_realStream != null) - { - m_lockLevel++; - ret = true; - } - } - return ret; - } - - public void ReleaseLock() - { - lock (this) - { - m_lockLevel--; - if (m_lockLevel == 0) - { - // If already unlocked, nop - m_lockingModel.ReleaseLock(); - m_realStream = null; - } - } - } - - #endregion Locking Methods - } - - #endregion LockingStream Inner Class - - #region Locking Models - - /// - /// Locking model base class - /// - /// - /// - /// Base class for the locking models available to the derived loggers. - /// - /// - public abstract class LockingModelBase - { - private FileAppender m_appender = null; - - /// - /// Open the output file - /// - /// The filename to use - /// Whether to append to the file, or overwrite - /// The encoding to use - /// - /// - /// Open the file specified and prepare for logging. - /// No writes will be made until is called. - /// Must be called before any calls to , - /// and . - /// - /// - public abstract void OpenFile(string filename, bool append, Encoding encoding); - - /// - /// Close the file - /// - /// - /// - /// Close the file. No further writes will be made. - /// - /// - public abstract void CloseFile(); - - /// - /// Initializes all resources used by this locking model. - /// - public abstract void ActivateOptions(); - - /// - /// Disposes all resources that were initialized by this locking model. - /// - public abstract void OnClose(); - - /// - /// Acquire the lock on the file - /// - /// A stream that is ready to be written to. - /// - /// - /// Acquire the lock on the file in preparation for writing to it. - /// Return a stream pointing to the file. - /// must be called to release the lock on the output file. - /// - /// - public abstract Stream AcquireLock(); - - /// - /// Release the lock on the file - /// - /// - /// - /// Release the lock on the file. No further writes will be made to the - /// stream until is called again. - /// - /// - public abstract void ReleaseLock(); - - /// - /// Gets or sets the for this LockingModel - /// - /// - /// The for this LockingModel - /// - /// - /// - /// The file appender this locking model is attached to and working on - /// behalf of. - /// - /// - /// The file appender is used to locate the security context and the error handler to use. - /// - /// - /// The value of this property will be set before is - /// called. - /// - /// - public FileAppender CurrentAppender - { - get { return m_appender; } - set { m_appender = value; } - } - - /// - /// Helper method that creates a FileStream under CurrentAppender's SecurityContext. - /// - /// - /// - /// Typically called during OpenFile or AcquireLock. - /// - /// - /// If the directory portion of the does not exist, it is created - /// via Directory.CreateDirecctory. - /// - /// - /// - /// - /// - /// - protected Stream CreateStream(string filename, bool append, FileShare fileShare) - { - filename = Environment.ExpandEnvironmentVariables(filename); - using (CurrentAppender.SecurityContext.Impersonate(this)) - { - // Ensure that the directory structure exists - string directoryFullName = Path.GetDirectoryName(filename); - - // Only create the directory if it does not exist - // doing this check here resolves some permissions failures - if (!Directory.Exists(directoryFullName)) - { - Directory.CreateDirectory(directoryFullName); - } - - FileMode fileOpenMode = append ? FileMode.Append : FileMode.Create; - return new FileStream(filename, fileOpenMode, FileAccess.Write, fileShare); - } - } - - /// - /// Helper method to close under CurrentAppender's SecurityContext. - /// - /// - /// Does not set to null. - /// - /// - protected void CloseStream(Stream stream) - { - using (CurrentAppender.SecurityContext.Impersonate(this)) - { - stream.Dispose(); - } - } - } - - /// - /// Hold an exclusive lock on the output file - /// - /// - /// - /// Open the file once for writing and hold it open until is called. - /// Maintains an exclusive lock on the file during this time. - /// - /// - public class ExclusiveLock : LockingModelBase - { - private Stream m_stream = null; - - /// - /// Open the file specified and prepare for logging. - /// - /// The filename to use - /// Whether to append to the file, or overwrite - /// The encoding to use - /// - /// - /// Open the file specified and prepare for logging. - /// No writes will be made until is called. - /// Must be called before any calls to , - /// and . - /// - /// - public override void OpenFile(string filename, bool append, Encoding encoding) - { - try - { - m_stream = CreateStream(filename, append, FileShare.Read); - } - catch (Exception e1) - { - CurrentAppender.ErrorHandler.Error("Unable to acquire lock on file " + filename + ". " + e1.Message); - } - } - - /// - /// Close the file - /// - /// - /// - /// Close the file. No further writes will be made. - /// - /// - public override void CloseFile() - { - CloseStream(m_stream); - m_stream = null; - } - - /// - /// Acquire the lock on the file - /// - /// A stream that is ready to be written to. - /// - /// - /// Does nothing. The lock is already taken - /// - /// - public override Stream AcquireLock() - { - return m_stream; - } - - /// - /// Release the lock on the file - /// - /// - /// - /// Does nothing. The lock will be released when the file is closed. - /// - /// - public override void ReleaseLock() - { - //NOP - } - - /// - /// Initializes all resources used by this locking model. - /// - public override void ActivateOptions() - { - //NOP - } - - /// - /// Disposes all resources that were initialized by this locking model. - /// - public override void OnClose() - { - //NOP - } - } - - /// - /// Acquires the file lock for each write - /// - /// - /// - /// Opens the file once for each / cycle, - /// thus holding the lock for the minimal amount of time. This method of locking - /// is considerably slower than but allows - /// other processes to move/delete the log file whilst logging continues. - /// - /// - public class MinimalLock : LockingModelBase - { - private string m_filename; - private bool m_append; - private Stream m_stream = null; - - /// - /// Prepares to open the file when the first message is logged. - /// - /// The filename to use - /// Whether to append to the file, or overwrite - /// The encoding to use - /// - /// - /// Open the file specified and prepare for logging. - /// No writes will be made until is called. - /// Must be called before any calls to , - /// and . - /// - /// - public override void OpenFile(string filename, bool append, Encoding encoding) - { - m_filename = filename; - m_append = append; - } - - /// - /// Close the file - /// - /// - /// - /// Close the file. No further writes will be made. - /// - /// - public override void CloseFile() - { - // NOP - } - - /// - /// Acquire the lock on the file - /// - /// A stream that is ready to be written to. - /// - /// - /// Acquire the lock on the file in preparation for writing to it. - /// Return a stream pointing to the file. - /// must be called to release the lock on the output file. - /// - /// - public override Stream AcquireLock() - { - if (m_stream == null) - { - try - { - m_stream = CreateStream(m_filename, m_append, FileShare.Read); - m_append = true; - } - catch (Exception e1) - { - CurrentAppender.ErrorHandler.Error("Unable to acquire lock on file " + m_filename + ". " + e1.Message); - } - } - return m_stream; - } - - /// - /// Release the lock on the file - /// - /// - /// - /// Release the lock on the file. No further writes will be made to the - /// stream until is called again. - /// - /// - public override void ReleaseLock() - { - CloseStream(m_stream); - m_stream = null; - } - - /// - /// Initializes all resources used by this locking model. - /// - public override void ActivateOptions() - { - //NOP - } - - /// - /// Disposes all resources that were initialized by this locking model. - /// - public override void OnClose() - { - //NOP - } - } + } + + public override void Write(byte[] buffer, int offset, int count) + { + AssertLocked(); + m_realStream.Write(buffer, offset, count); + } + + public override void WriteByte(byte value) + { + AssertLocked(); + m_realStream.WriteByte(value); + } + + // Properties + public override bool CanRead + { + get { return false; } + } + + public override bool CanSeek + { + get + { + AssertLocked(); + return m_realStream.CanSeek; + } + } + + public override bool CanWrite + { + get + { + AssertLocked(); + return m_realStream.CanWrite; + } + } + + public override long Length + { + get + { + AssertLocked(); + return m_realStream.Length; + } + } + + public override long Position + { + get + { + AssertLocked(); + return m_realStream.Position; + } + set + { + AssertLocked(); + m_realStream.Position = value; + } + } + + #endregion Override Implementation of Stream + + #region Locking Methods + + private void AssertLocked() + { + if (m_realStream == null) + { + throw new LockStateException("The file is not currently locked"); + } + } + + public bool AcquireLock() + { + bool ret = false; + lock (this) + { + if (m_lockLevel == 0) + { + // If lock is already acquired, nop + m_realStream = m_lockingModel.AcquireLock(); + } + + if (m_realStream != null) + { + m_lockLevel++; + ret = true; + } + } + + return ret; + } + + public void ReleaseLock() + { + lock (this) + { + m_lockLevel--; + if (m_lockLevel == 0) + { + // If already unlocked, nop + m_lockingModel.ReleaseLock(); + m_realStream = null; + } + } + } + + #endregion Locking Methods + } + + #endregion LockingStream Inner Class + + #region Locking Models + + /// + /// Locking model base class + /// + /// + /// + /// Base class for the locking models available to the derived loggers. + /// + /// + public abstract class LockingModelBase + { + private FileAppender m_appender = null; + + /// + /// Open the output file + /// + /// The filename to use + /// Whether to append to the file, or overwrite + /// The encoding to use + /// + /// + /// Open the file specified and prepare for logging. + /// No writes will be made until is called. + /// Must be called before any calls to , + /// and . + /// + /// + public abstract void OpenFile(string filename, bool append, Encoding encoding); + + /// + /// Close the file + /// + /// + /// + /// Close the file. No further writes will be made. + /// + /// + public abstract void CloseFile(); + + /// + /// Initializes all resources used by this locking model. + /// + public abstract void ActivateOptions(); + + /// + /// Disposes all resources that were initialized by this locking model. + /// + public abstract void OnClose(); + + /// + /// Acquire the lock on the file + /// + /// A stream that is ready to be written to. + /// + /// + /// Acquire the lock on the file in preparation for writing to it. + /// Return a stream pointing to the file. + /// must be called to release the lock on the output file. + /// + /// + public abstract Stream AcquireLock(); + + /// + /// Release the lock on the file + /// + /// + /// + /// Release the lock on the file. No further writes will be made to the + /// stream until is called again. + /// + /// + public abstract void ReleaseLock(); + + /// + /// Gets or sets the for this LockingModel + /// + /// + /// The for this LockingModel + /// + /// + /// + /// The file appender this locking model is attached to and working on + /// behalf of. + /// + /// + /// The file appender is used to locate the security context and the error handler to use. + /// + /// + /// The value of this property will be set before is + /// called. + /// + /// + public FileAppender CurrentAppender + { + get { return m_appender; } + set { m_appender = value; } + } + + /// + /// Helper method that creates a FileStream under CurrentAppender's SecurityContext. + /// + /// + /// + /// Typically called during OpenFile or AcquireLock. + /// + /// + /// If the directory portion of the does not exist, it is created + /// via Directory.CreateDirecctory. + /// + /// + /// + /// + /// + /// + protected Stream CreateStream(string filename, bool append, FileShare fileShare) + { + filename = Environment.ExpandEnvironmentVariables(filename); + using (CurrentAppender.SecurityContext.Impersonate(this)) + { + // Ensure that the directory structure exists + string directoryFullName = Path.GetDirectoryName(filename); + + // Only create the directory if it does not exist + // doing this check here resolves some permissions failures + if (!Directory.Exists(directoryFullName)) + { + Directory.CreateDirectory(directoryFullName); + } + + FileMode fileOpenMode = append + ? FileMode.Append + : FileMode.Create; + return new FileStream(filename, fileOpenMode, FileAccess.Write, fileShare); + } + } + + /// + /// Helper method to close under CurrentAppender's SecurityContext. + /// + /// + /// Does not set to null. + /// + /// + protected void CloseStream(Stream stream) + { + using (CurrentAppender.SecurityContext.Impersonate(this)) + { + stream.Dispose(); + } + } + } + + /// + /// Hold an exclusive lock on the output file + /// + /// + /// + /// Open the file once for writing and hold it open until is called. + /// Maintains an exclusive lock on the file during this time. + /// + /// + public class ExclusiveLock : LockingModelBase + { + private Stream m_stream = null; + + /// + /// Open the file specified and prepare for logging. + /// + /// The filename to use + /// Whether to append to the file, or overwrite + /// The encoding to use + /// + /// + /// Open the file specified and prepare for logging. + /// No writes will be made until is called. + /// Must be called before any calls to , + /// and . + /// + /// + public override void OpenFile(string filename, bool append, Encoding encoding) + { + try + { + m_stream = CreateStream(filename, append, FileShare.Read); + } + catch (Exception e1) + { + CurrentAppender.ErrorHandler.Error("Unable to acquire lock on file " + filename + ". " + + e1.Message); + } + } + + /// + /// Close the file + /// + /// + /// + /// Close the file. No further writes will be made. + /// + /// + public override void CloseFile() + { + CloseStream(m_stream); + m_stream = null; + } + + /// + /// Acquire the lock on the file + /// + /// A stream that is ready to be written to. + /// + /// + /// Does nothing. The lock is already taken + /// + /// + public override Stream AcquireLock() + { + return m_stream; + } + + /// + /// Release the lock on the file + /// + /// + /// + /// Does nothing. The lock will be released when the file is closed. + /// + /// + public override void ReleaseLock() + { + //NOP + } + + /// + /// Initializes all resources used by this locking model. + /// + public override void ActivateOptions() + { + //NOP + } + + /// + /// Disposes all resources that were initialized by this locking model. + /// + public override void OnClose() + { + //NOP + } + } + + /// + /// Acquires the file lock for each write + /// + /// + /// + /// Opens the file once for each / cycle, + /// thus holding the lock for the minimal amount of time. This method of locking + /// is considerably slower than but allows + /// other processes to move/delete the log file whilst logging continues. + /// + /// + public class MinimalLock : LockingModelBase + { + private string m_filename; + private bool m_append; + private Stream m_stream = null; + + /// + /// Prepares to open the file when the first message is logged. + /// + /// The filename to use + /// Whether to append to the file, or overwrite + /// The encoding to use + /// + /// + /// Open the file specified and prepare for logging. + /// No writes will be made until is called. + /// Must be called before any calls to , + /// and . + /// + /// + public override void OpenFile(string filename, bool append, Encoding encoding) + { + m_filename = filename; + m_append = append; + } + + /// + /// Close the file + /// + /// + /// + /// Close the file. No further writes will be made. + /// + /// + public override void CloseFile() + { + // NOP + } + + /// + /// Acquire the lock on the file + /// + /// A stream that is ready to be written to. + /// + /// + /// Acquire the lock on the file in preparation for writing to it. + /// Return a stream pointing to the file. + /// must be called to release the lock on the output file. + /// + /// + public override Stream AcquireLock() + { + if (m_stream == null) + { + try + { + m_stream = CreateStream(m_filename, m_append, FileShare.Read); + m_append = true; + } + catch (Exception e1) + { + CurrentAppender.ErrorHandler.Error("Unable to acquire lock on file " + m_filename + ". " + + e1.Message); + } + } + + return m_stream; + } + + /// + /// Release the lock on the file + /// + /// + /// + /// Release the lock on the file. No further writes will be made to the + /// stream until is called again. + /// + /// + public override void ReleaseLock() + { + CloseStream(m_stream); + m_stream = null; + } + + /// + /// Initializes all resources used by this locking model. + /// + public override void ActivateOptions() + { + //NOP + } + + /// + /// Disposes all resources that were initialized by this locking model. + /// + public override void OnClose() + { + //NOP + } + } #if !NETCF - /// - /// Provides cross-process file locking. - /// - /// Ron Grabowski - /// Steve Wranovsky - public class InterProcessLock : LockingModelBase - { - private Mutex m_mutex = null; - private Stream m_stream = null; - private int m_recursiveWatch = 0; - - /// - /// Open the file specified and prepare for logging. - /// - /// The filename to use - /// Whether to append to the file, or overwrite - /// The encoding to use - /// - /// - /// Open the file specified and prepare for logging. - /// No writes will be made until is called. - /// Must be called before any calls to , - /// - and . - /// - /// + /// + /// Provides cross-process file locking. + /// + /// Ron Grabowski + /// Steve Wranovsky + public class InterProcessLock : LockingModelBase + { + private Mutex m_mutex = null; + private Stream m_stream = null; + private int m_recursiveWatch = 0; + + /// + /// Open the file specified and prepare for logging. + /// + /// The filename to use + /// Whether to append to the file, or overwrite + /// The encoding to use + /// + /// + /// Open the file specified and prepare for logging. + /// No writes will be made until is called. + /// Must be called before any calls to , + /// - and . + /// + /// #if NET_4_0 || MONO_4_0 || NETSTANDARD [System.Security.SecuritySafeCritical] #endif - public override void OpenFile(string filename, bool append, Encoding encoding) - { - try - { - m_stream = CreateStream(filename, append, FileShare.ReadWrite); - } - catch (Exception e1) - { - CurrentAppender.ErrorHandler.Error("Unable to acquire lock on file " + filename + ". " + e1.Message); - } - } - - /// - /// Close the file - /// - /// - /// - /// Close the file. No further writes will be made. - /// - /// - public override void CloseFile() - { - try - { - CloseStream(m_stream); - m_stream = null; - } - finally - { - ReleaseLock(); - } - } - - /// - /// Acquire the lock on the file - /// - /// A stream that is ready to be written to. - /// - /// - /// Does nothing. The lock is already taken - /// - /// - public override Stream AcquireLock() - { - if (m_mutex != null) - { - // TODO: add timeout? - m_mutex.WaitOne(); - - // increment recursive watch - m_recursiveWatch++; - - // should always be true (and fast) for FileStream - if (m_stream != null) - { - if (m_stream.CanSeek) - { - m_stream.Seek(0, SeekOrigin.End); - } - } - else - { - // this can happen when the file appender cannot open a file for writing - } - } - else - { - CurrentAppender.ErrorHandler.Error("Programming error, no mutex available to acquire lock! From here on things will be dangerous!"); - } - return m_stream; - } - - /// - /// Releases the lock and allows others to acquire a lock. - /// - public override void ReleaseLock() - { - if (m_mutex != null) - { - if (m_recursiveWatch > 0) - { - m_recursiveWatch--; - m_mutex.ReleaseMutex(); - } - } - else - { - CurrentAppender.ErrorHandler.Error("Programming error, no mutex available to release the lock!"); - } - } - - /// - /// Initializes all resources used by this locking model. - /// - public override void ActivateOptions() - { - if (m_mutex == null) - { - string mutexFriendlyFilename = CurrentAppender.File - .Replace("\\", "_") - .Replace(":", "_") - .Replace("/", "_"); - - m_mutex = new Mutex(false, mutexFriendlyFilename); - } - else - { - CurrentAppender.ErrorHandler.Error("Programming error, mutex already initialized!"); - } - } - - /// - /// Disposes all resources that were initialized by this locking model. - /// - public override void OnClose() - { - if (m_mutex != null) - { + public override void OpenFile(string filename, bool append, Encoding encoding) + { + try + { + m_stream = CreateStream(filename, append, FileShare.ReadWrite); + } + catch (Exception e1) + { + CurrentAppender.ErrorHandler.Error("Unable to acquire lock on file " + filename + ". " + + e1.Message); + } + } + + /// + /// Close the file + /// + /// + /// + /// Close the file. No further writes will be made. + /// + /// + public override void CloseFile() + { + try + { + CloseStream(m_stream); + m_stream = null; + } + finally + { + ReleaseLock(); + } + } + + /// + /// Acquire the lock on the file + /// + /// A stream that is ready to be written to. + /// + /// + /// Does nothing. The lock is already taken + /// + /// + public override Stream AcquireLock() + { + if (m_mutex != null) + { + // TODO: add timeout? + m_mutex.WaitOne(); + + // increment recursive watch + m_recursiveWatch++; + + // should always be true (and fast) for FileStream + if (m_stream != null) + { + if (m_stream.CanSeek) + { + m_stream.Seek(0, SeekOrigin.End); + } + } + else + { + // this can happen when the file appender cannot open a file for writing + } + } + else + { + CurrentAppender.ErrorHandler.Error( + "Programming error, no mutex available to acquire lock! From here on things will be dangerous!"); + } + + return m_stream; + } + + /// + /// Releases the lock and allows others to acquire a lock. + /// + public override void ReleaseLock() + { + if (m_mutex != null) + { + if (m_recursiveWatch > 0) + { + m_recursiveWatch--; + m_mutex.ReleaseMutex(); + } + } + else + { + CurrentAppender.ErrorHandler.Error("Programming error, no mutex available to release the lock!"); + } + } + + /// + /// Initializes all resources used by this locking model. + /// + public override void ActivateOptions() + { + if (m_mutex == null) + { + string mutexFriendlyFilename = CurrentAppender.File + .Replace("\\", "_") + .Replace(":", "_") + .Replace("/", "_"); + + m_mutex = new Mutex(false, mutexFriendlyFilename); + } + else + { + CurrentAppender.ErrorHandler.Error("Programming error, mutex already initialized!"); + } + } + + /// + /// Disposes all resources that were initialized by this locking model. + /// + public override void OnClose() + { + if (m_mutex != null) + { #if NET_4_0 || MONO_4_0 || NETSTANDARD m_mutex.Dispose(); #else - m_mutex.Close(); + m_mutex.Close(); #endif - m_mutex = null; - } - else - { - CurrentAppender.ErrorHandler.Error("Programming error, mutex not initialized!"); - } - } - } + m_mutex = null; + } + else + { + CurrentAppender.ErrorHandler.Error("Programming error, mutex not initialized!"); + } + } + } #endif - /// - /// Hold no lock on the output file - /// - /// - /// - /// Open the file once and hold it open until is called. - /// Maintains no lock on the file during this time. - /// - /// - public class NoLock : LockingModelBase - { - private Stream m_stream = null; - - /// - /// Open the file specified and prepare for logging. - /// - /// The filename to use - /// Whether to append to the file, or overwrite - /// The encoding to use - /// - /// - /// Open the file specified and prepare for logging. - /// No writes will be made until is called. - /// Must be called before any calls to , - /// and . - /// - /// - public override void OpenFile(string filename, bool append, Encoding encoding) - { - try - { - // no lock - m_stream = CreateStream(filename, append, FileShare.ReadWrite); - } - catch (Exception e1) - { - CurrentAppender.ErrorHandler.Error("Unable to acquire lock on file " + filename + ". " + e1.Message); - } - } - - /// - /// Close the file - /// - /// - /// - /// Close the file. No further writes will be made. - /// - /// - public override void CloseFile() - { - CloseStream(m_stream); - m_stream = null; - } - - /// - /// Acquire the lock on the file - /// - /// A stream that is ready to be written to. - /// - /// - /// Does nothing. The lock is already taken - /// - /// - public override Stream AcquireLock() - { - return m_stream; - } - - /// - /// Release the lock on the file - /// - /// - /// - /// Does nothing. The lock will be released when the file is closed. - /// - /// - public override void ReleaseLock() - { - // NOP - } - - /// - /// Initializes all resources used by this locking model. - /// - public override void ActivateOptions() - { - // NOP - } - - /// - /// Disposes all resources that were initialized by this locking model. - /// - public override void OnClose() - { - // NOP - } - } - - /// - /// Default locking model (when no locking model was configured) - /// - private static Type defaultLockingModelType = typeof(ExclusiveLock); - - /// - /// Specify default locking model - /// - /// Type of LockingModel - public static void SetDefaultLockingModelType() where TLockingModel : LockingModelBase - { - defaultLockingModelType = typeof(TLockingModel); - } - - #endregion Locking Models - - #region Public Instance Constructors - - /// - /// Default constructor - /// - /// - /// - /// Default constructor - /// - /// - public FileAppender() - { - } - - /// - /// Construct a new appender using the layout, file and append mode. - /// - /// the layout to use with this appender - /// the full path to the file to write to - /// flag to indicate if the file should be appended to - /// - /// - /// Obsolete constructor. - /// - /// - [Obsolete("Instead use the default constructor and set the Layout, File & AppendToFile properties")] - public FileAppender(ILayout layout, string filename, bool append) - { - Layout = layout; - File = filename; - AppendToFile = append; - ActivateOptions(); - } - - /// - /// Construct a new appender using the layout and file specified. - /// The file will be appended to. - /// - /// the layout to use with this appender - /// the full path to the file to write to - /// - /// - /// Obsolete constructor. - /// - /// - [Obsolete("Instead use the default constructor and set the Layout & File properties")] - public FileAppender(ILayout layout, string filename) - : this(layout, filename, true) - { - } - - #endregion Public Instance Constructors - - #region Public Instance Properties - - /// - /// Gets or sets the path to the file that logging will be written to. - /// - /// - /// The path to the file that logging will be written to. - /// - /// - /// - /// If the path is relative it is taken as relative from - /// the application base directory. - /// - /// - public virtual string File - { - get { return m_fileName; } - set { m_fileName = value; } - } - - /// - /// Gets or sets a flag that indicates whether the file should be - /// appended to or overwritten. - /// - /// - /// Indicates whether the file should be appended to or overwritten. - /// - /// - /// - /// If the value is set to false then the file will be overwritten, if - /// it is set to true then the file will be appended to. - /// - /// The default value is true. - /// - public bool AppendToFile - { - get { return m_appendToFile; } - set { m_appendToFile = value; } - } - - /// - /// Gets or sets used to write to the file. - /// - /// - /// The used to write to the file. - /// - /// - /// - /// The default encoding set is - /// which is the encoding for the system's current ANSI code page. - /// - /// - public Encoding Encoding - { - get { return m_encoding; } - set { m_encoding = value; } - } - - /// - /// Gets or sets the used to write to the file. - /// - /// - /// The used to write to the file. - /// - /// - /// - /// Unless a specified here for this appender - /// the is queried for the - /// security context to use. The default behavior is to use the security context - /// of the current thread. - /// - /// - public SecurityContext SecurityContext - { - get { return m_securityContext; } - set { m_securityContext = value; } - } + /// + /// Hold no lock on the output file + /// + /// + /// + /// Open the file once and hold it open until is called. + /// Maintains no lock on the file during this time. + /// + /// + public class NoLock : LockingModelBase + { + private Stream m_stream = null; + + /// + /// Open the file specified and prepare for logging. + /// + /// The filename to use + /// Whether to append to the file, or overwrite + /// The encoding to use + /// + /// + /// Open the file specified and prepare for logging. + /// No writes will be made until is called. + /// Must be called before any calls to , + /// and . + /// + /// + public override void OpenFile(string filename, bool append, Encoding encoding) + { + try + { + // no lock + m_stream = CreateStream(filename, append, FileShare.ReadWrite); + } + catch (Exception e1) + { + CurrentAppender.ErrorHandler.Error( + $"Unable to acquire lock on file {filename}. {e1.Message}" + ); + } + } + + /// + /// Close the file + /// + /// + /// + /// Close the file. No further writes will be made. + /// + /// + public override void CloseFile() + { + CloseStream(m_stream); + m_stream = null; + } + + /// + /// Acquire the lock on the file + /// + /// A stream that is ready to be written to. + /// + /// + /// Does nothing. The lock is already taken + /// + /// + public override Stream AcquireLock() + { + return m_stream; + } + + /// + /// Release the lock on the file + /// + /// + /// + /// Does nothing. The lock will be released when the file is closed. + /// + /// + public override void ReleaseLock() + { + // NOP + } + + /// + /// Initializes all resources used by this locking model. + /// + public override void ActivateOptions() + { + // NOP + } + + /// + /// Disposes all resources that were initialized by this locking model. + /// + public override void OnClose() + { + // NOP + } + } + + /// + /// Default locking model (when no locking model was configured) + /// + private static Type defaultLockingModelType = typeof(ExclusiveLock); + + /// + /// Specify default locking model + /// + /// Type of LockingModel + public static void SetDefaultLockingModelType() where TLockingModel : LockingModelBase + { + defaultLockingModelType = typeof(TLockingModel); + } + + #endregion Locking Models + + #region Public Instance Constructors + + /// + /// Default constructor + /// + /// + /// + /// Default constructor + /// + /// + public FileAppender() + { + } + + /// + /// Construct a new appender using the layout, file and append mode. + /// + /// the layout to use with this appender + /// the full path to the file to write to + /// flag to indicate if the file should be appended to + /// + /// + /// Obsolete constructor. + /// + /// + [Obsolete("Instead use the default constructor and set the Layout, File & AppendToFile properties")] + public FileAppender(ILayout layout, string filename, bool append) + { + Layout = layout; + File = filename; + AppendToFile = append; + ActivateOptions(); + } + + /// + /// Construct a new appender using the layout and file specified. + /// The file will be appended to. + /// + /// the layout to use with this appender + /// the full path to the file to write to + /// + /// + /// Obsolete constructor. + /// + /// + [Obsolete("Instead use the default constructor and set the Layout & File properties")] + public FileAppender(ILayout layout, string filename) + : this(layout, filename, true) + { + } + + #endregion Public Instance Constructors + + #region Public Instance Properties + + /// + /// Gets or sets the path to the file that logging will be written to. + /// + /// + /// The path to the file that logging will be written to. + /// + /// + /// + /// If the path is relative it is taken as relative from + /// the application base directory. + /// + /// + public virtual string File + { + get { return m_fileName; } + set { m_fileName = value; } + } + + /// + /// Gets or sets a flag that indicates whether the file should be + /// appended to or overwritten. + /// + /// + /// Indicates whether the file should be appended to or overwritten. + /// + /// + /// + /// If the value is set to false then the file will be overwritten, if + /// it is set to true then the file will be appended to. + /// + /// The default value is true. + /// + public bool AppendToFile + { + get { return m_appendToFile; } + set { m_appendToFile = value; } + } + + /// + /// Gets or sets used to write to the file. + /// + /// + /// The used to write to the file. + /// + /// + /// + /// The default encoding set is + /// which is the encoding for the system's current ANSI code page. + /// + /// + public Encoding Encoding + { + get { return m_encoding; } + set { m_encoding = value; } + } + + /// + /// Gets or sets the used to write to the file. + /// + /// + /// The used to write to the file. + /// + /// + /// + /// Unless a specified here for this appender + /// the is queried for the + /// security context to use. The default behavior is to use the security context + /// of the current thread. + /// + /// + public SecurityContext SecurityContext + { + get { return m_securityContext; } + set { m_securityContext = value; } + } #if NETCF /// @@ -1164,475 +1199,479 @@ public SecurityContext SecurityContext /// /// #else - /// - /// Gets or sets the used to handle locking of the file. - /// - /// - /// The used to lock the file. - /// - /// - /// - /// Gets or sets the used to handle locking of the file. - /// - /// - /// There are three built in locking models, , and . - /// The first locks the file from the start of logging to the end, the - /// second locks only for the minimal amount of time when logging each message - /// and the last synchronizes processes using a named system wide Mutex. - /// - /// - /// The default locking model is the . - /// - /// + /// + /// Gets or sets the used to handle locking of the file. + /// + /// + /// The used to lock the file. + /// + /// + /// + /// Gets or sets the used to handle locking of the file. + /// + /// + /// There are three built in locking models, , and . + /// The first locks the file from the start of logging to the end, the + /// second locks only for the minimal amount of time when logging each message + /// and the last synchronizes processes using a named system wide Mutex. + /// + /// + /// The default locking model is the . + /// + /// #endif - public FileAppender.LockingModelBase LockingModel - { - get { return m_lockingModel; } - set { m_lockingModel = value; } - } - - #endregion Public Instance Properties - - #region Override implementation of AppenderSkeleton - - /// - /// Activate the options on the file appender. - /// - /// - /// - /// This is part of the delayed object - /// activation scheme. The method must - /// be called on this object after the configuration properties have - /// been set. Until is called this - /// object is in an undefined state and must not be used. - /// - /// - /// If any of the configuration properties are modified then - /// must be called again. - /// - /// - /// This will cause the file to be opened. - /// - /// - public override void ActivateOptions() - { - base.ActivateOptions(); - - if (m_securityContext == null) - { - m_securityContext = SecurityContextProvider.DefaultProvider.CreateSecurityContext(this); - } - - if (m_lockingModel == null) - { - m_lockingModel = (LockingModelBase)Activator.CreateInstance(defaultLockingModelType); - } - - m_lockingModel.CurrentAppender = this; - m_lockingModel.ActivateOptions(); - - if (m_fileName != null) - { - using (SecurityContext.Impersonate(this)) - { - m_fileName = ConvertToFullPath(m_fileName.Trim()); - } - SafeOpenFile(m_fileName, m_appendToFile); - } - else - { - LogLog.Warn(declaringType, "FileAppender: File option not set for appender [" + Name + "]."); - LogLog.Warn(declaringType, "FileAppender: Are you using FileAppender instead of ConsoleAppender?"); - } - } - - #endregion Override implementation of AppenderSkeleton - - #region Override implementation of TextWriterAppender - - /// - /// Closes any previously opened file and calls the parent's . - /// - /// - /// - /// Resets the filename and the file stream. - /// - /// - protected override void Reset() - { - base.Reset(); - m_fileName = null; - } - - /// - /// Close this appender instance. The underlying stream or writer is also closed. - /// - protected override void OnClose() - { - base.OnClose(); - m_lockingModel.OnClose(); - } - - /// - /// Called to initialize the file writer - /// - /// - /// - /// Will be called for each logged message until the file is - /// successfully opened. - /// - /// - protected override void PrepareWriter() - { - SafeOpenFile(m_fileName, m_appendToFile); - } - - /// - /// This method is called by the - /// method. - /// - /// The event to log. - /// - /// - /// Writes a log statement to the output stream if the output stream exists - /// and is writable. - /// - /// - /// The format of the output will depend on the appender's layout. - /// - /// - protected override void Append(LoggingEvent loggingEvent) - { - if (m_stream.AcquireLock()) - { - try - { - base.Append(loggingEvent); - } - finally - { - m_stream.ReleaseLock(); - } - } - } - - /// - /// This method is called by the - /// method. - /// - /// The array of events to log. - /// - /// - /// Acquires the output file locks once before writing all the events to - /// the stream. - /// - /// - protected override void Append(LoggingEvent[] loggingEvents) - { - if (m_stream.AcquireLock()) - { - try - { - base.Append(loggingEvents); - } - finally - { - m_stream.ReleaseLock(); - } - } - } - - /// - /// Writes a footer as produced by the embedded layout's property. - /// - /// - /// - /// Writes a footer as produced by the embedded layout's property. - /// - /// - protected override void WriteFooter() - { - if (m_stream != null) - { - //WriteFooter can be called even before a file is opened - m_stream.AcquireLock(); - try - { - base.WriteFooter(); - } - finally - { - m_stream.ReleaseLock(); - } - } - } - - /// - /// Writes a header produced by the embedded layout's property. - /// - /// - /// - /// Writes a header produced by the embedded layout's property. - /// - /// - protected override void WriteHeader() - { - if (m_stream != null) - { - if (m_stream.AcquireLock()) - { - try - { - base.WriteHeader(); - } - finally - { - m_stream.ReleaseLock(); - } - } - } - } - - /// - /// Closes the underlying . - /// - /// - /// - /// Closes the underlying . - /// - /// - protected override void CloseWriter() - { - if (m_stream != null) - { - m_stream.AcquireLock(); - try - { - base.CloseWriter(); - } - finally - { - m_stream.ReleaseLock(); - } - } - } - - #endregion Override implementation of TextWriterAppender - - #region Public Instance Methods - - /// - /// Closes the previously opened file. - /// - /// - /// - /// Writes the to the file and then - /// closes the file. - /// - /// - protected void CloseFile() - { - WriteFooterAndCloseWriter(); - } - - #endregion Public Instance Methods - - #region Protected Instance Methods - - /// - /// Sets and opens the file where the log output will go. The specified file must be writable. - /// - /// The path to the log file. Must be a fully qualified path. - /// If true will append to fileName. Otherwise will truncate fileName - /// - /// - /// Calls but guarantees not to throw an exception. - /// Errors are passed to the . - /// - /// - protected virtual void SafeOpenFile(string fileName, bool append) - { - try - { - OpenFile(fileName, append); - } - catch (Exception e) - { - ErrorHandler.Error("OpenFile(" + fileName + "," + append + ") call failed.", e, ErrorCode.FileOpenFailure); - } - } - - /// - /// Sets and opens the file where the log output will go. The specified file must be writable. - /// - /// The path to the log file. Must be a fully qualified path. - /// If true will append to fileName. Otherwise will truncate fileName - /// - /// - /// If there was already an opened file, then the previous file - /// is closed first. - /// - /// - /// This method will ensure that the directory structure - /// for the specified exists. - /// - /// - protected virtual void OpenFile(string fileName, bool append) - { - if (LogLog.IsErrorEnabled) - { - // Internal check that the fileName passed in is a rooted path - bool isPathRooted = false; - using (SecurityContext.Impersonate(this)) - { - isPathRooted = Path.IsPathRooted(fileName); - } - if (!isPathRooted) - { - LogLog.Error(declaringType, "INTERNAL ERROR. OpenFile(" + fileName + "): File name is not fully qualified."); - } - } - - lock (this) - { - Reset(); - - LogLog.Debug(declaringType, "Opening file for writing [" + fileName + "] append [" + append + "]"); - - // Save these for later, allowing retries if file open fails - m_fileName = fileName; - m_appendToFile = append; - - LockingModel.CurrentAppender = this; - LockingModel.OpenFile(fileName, append, m_encoding); - m_stream = new LockingStream(LockingModel); - - if (m_stream != null) - { - m_stream.AcquireLock(); - try - { - SetQWForFiles(m_stream); - } - finally - { - m_stream.ReleaseLock(); - } - } - - WriteHeader(); - } - } - - /// - /// Sets the quiet writer used for file output - /// - /// the file stream that has been opened for writing - /// - /// - /// This implementation of creates a - /// over the and passes it to the - /// method. - /// - /// - /// This method can be overridden by sub classes that want to wrap the - /// in some way, for example to encrypt the output - /// data using a System.Security.Cryptography.CryptoStream. - /// - /// - protected virtual void SetQWForFiles(Stream fileStream) - { + public FileAppender.LockingModelBase LockingModel + { + get { return m_lockingModel; } + set { m_lockingModel = value; } + } + + #endregion Public Instance Properties + + #region Override implementation of AppenderSkeleton + + /// + /// Activate the options on the file appender. + /// + /// + /// + /// This is part of the delayed object + /// activation scheme. The method must + /// be called on this object after the configuration properties have + /// been set. Until is called this + /// object is in an undefined state and must not be used. + /// + /// + /// If any of the configuration properties are modified then + /// must be called again. + /// + /// + /// This will cause the file to be opened. + /// + /// + public override void ActivateOptions() + { + base.ActivateOptions(); + + if (m_securityContext == null) + { + m_securityContext = SecurityContextProvider.DefaultProvider.CreateSecurityContext(this); + } + + if (m_lockingModel == null) + { + m_lockingModel = (LockingModelBase) Activator.CreateInstance(defaultLockingModelType); + } + + m_lockingModel.CurrentAppender = this; + m_lockingModel.ActivateOptions(); + + if (m_fileName != null) + { + using (SecurityContext.Impersonate(this)) + { + m_fileName = ConvertToFullPath(m_fileName.Trim()); + } + + SafeOpenFile(m_fileName, m_appendToFile); + } + else + { + LogLog.Warn(declaringType, "FileAppender: File option not set for appender [" + Name + "]."); + LogLog.Warn(declaringType, "FileAppender: Are you using FileAppender instead of ConsoleAppender?"); + } + } + + #endregion Override implementation of AppenderSkeleton + + #region Override implementation of TextWriterAppender + + /// + /// Closes any previously opened file and calls the parent's . + /// + /// + /// + /// Resets the filename and the file stream. + /// + /// + protected override void Reset() + { + base.Reset(); + m_fileName = null; + } + + /// + /// Close this appender instance. The underlying stream or writer is also closed. + /// + protected override void OnClose() + { + base.OnClose(); + m_lockingModel.OnClose(); + } + + /// + /// Called to initialize the file writer + /// + /// + /// + /// Will be called for each logged message until the file is + /// successfully opened. + /// + /// + protected override void PrepareWriter() + { + SafeOpenFile(m_fileName, m_appendToFile); + } + + /// + /// This method is called by the + /// method. + /// + /// The event to log. + /// + /// + /// Writes a log statement to the output stream if the output stream exists + /// and is writable. + /// + /// + /// The format of the output will depend on the appender's layout. + /// + /// + protected override void Append(LoggingEvent loggingEvent) + { + if (m_stream.AcquireLock()) + { + try + { + base.Append(loggingEvent); + } + finally + { + m_stream.ReleaseLock(); + } + } + } + + /// + /// This method is called by the + /// method. + /// + /// The array of events to log. + /// + /// + /// Acquires the output file locks once before writing all the events to + /// the stream. + /// + /// + protected override void Append(LoggingEvent[] loggingEvents) + { + if (m_stream.AcquireLock()) + { + try + { + base.Append(loggingEvents); + } + finally + { + m_stream.ReleaseLock(); + } + } + } + + /// + /// Writes a footer as produced by the embedded layout's property. + /// + /// + /// + /// Writes a footer as produced by the embedded layout's property. + /// + /// + protected override void WriteFooter() + { + if (m_stream != null) + { + //WriteFooter can be called even before a file is opened + m_stream.AcquireLock(); + try + { + base.WriteFooter(); + } + finally + { + m_stream.ReleaseLock(); + } + } + } + + /// + /// Writes a header produced by the embedded layout's property. + /// + /// + /// + /// Writes a header produced by the embedded layout's property. + /// + /// + protected override void WriteHeader() + { + if (m_stream != null) + { + if (m_stream.AcquireLock()) + { + try + { + base.WriteHeader(); + } + finally + { + m_stream.ReleaseLock(); + } + } + } + } + + /// + /// Closes the underlying . + /// + /// + /// + /// Closes the underlying . + /// + /// + protected override void CloseWriter() + { + if (m_stream != null) + { + m_stream.AcquireLock(); + try + { + base.CloseWriter(); + } + finally + { + m_stream.ReleaseLock(); + } + } + } + + #endregion Override implementation of TextWriterAppender + + #region Public Instance Methods + + /// + /// Closes the previously opened file. + /// + /// + /// + /// Writes the to the file and then + /// closes the file. + /// + /// + protected void CloseFile() + { + WriteFooterAndCloseWriter(); + } + + #endregion Public Instance Methods + + #region Protected Instance Methods + + /// + /// Sets and opens the file where the log output will go. The specified file must be writable. + /// + /// The path to the log file. Must be a fully qualified path. + /// If true will append to fileName. Otherwise will truncate fileName + /// + /// + /// Calls but guarantees not to throw an exception. + /// Errors are passed to the . + /// + /// + protected virtual void SafeOpenFile(string fileName, bool append) + { + try + { + OpenFile(fileName, append); + } + catch (Exception e) + { + ErrorHandler.Error("OpenFile(" + fileName + "," + append + ") call failed.", e, + ErrorCode.FileOpenFailure); + } + } + + /// + /// Sets and opens the file where the log output will go. The specified file must be writable. + /// + /// The path to the log file. Must be a fully qualified path. + /// If true will append to fileName. Otherwise will truncate fileName + /// + /// + /// If there was already an opened file, then the previous file + /// is closed first. + /// + /// + /// This method will ensure that the directory structure + /// for the specified exists. + /// + /// + protected virtual void OpenFile(string fileName, bool append) + { + if (LogLog.IsErrorEnabled) + { + // Internal check that the fileName passed in is a rooted path + bool isPathRooted = false; + using (SecurityContext.Impersonate(this)) + { + isPathRooted = Path.IsPathRooted(fileName); + } + + if (!isPathRooted) + { + LogLog.Error(declaringType, + "INTERNAL ERROR. OpenFile(" + fileName + "): File name is not fully qualified."); + } + } + + lock (this) + { + Reset(); + + LogLog.Debug(declaringType, "Opening file for writing [" + fileName + "] append [" + append + "]"); + + // Save these for later, allowing retries if file open fails + m_fileName = fileName; + m_appendToFile = append; + + LockingModel.CurrentAppender = this; + LockingModel.OpenFile(fileName, append, m_encoding); + m_stream = new LockingStream(LockingModel); + + if (m_stream != null) + { + m_stream.AcquireLock(); + try + { + SetQWForFiles(m_stream); + } + finally + { + m_stream.ReleaseLock(); + } + } + + WriteHeader(); + } + } + + /// + /// Sets the quiet writer used for file output + /// + /// the file stream that has been opened for writing + /// + /// + /// This implementation of creates a + /// over the and passes it to the + /// method. + /// + /// + /// This method can be overridden by sub classes that want to wrap the + /// in some way, for example to encrypt the output + /// data using a System.Security.Cryptography.CryptoStream. + /// + /// + protected virtual void SetQWForFiles(Stream fileStream) + { #pragma warning disable CA2000 // Dispose objects before losing scope - StreamWriter writer = new StreamWriter(fileStream, m_encoding); + StreamWriter writer = new StreamWriter(fileStream, m_encoding); #pragma warning restore CA2000 // Dispose objects before losing scope - SetQWForFiles(writer); - } - - /// - /// Sets the quiet writer being used. - /// - /// the writer over the file stream that has been opened for writing - /// - /// - /// This method can be overridden by sub classes that want to - /// wrap the in some way. - /// - /// - protected virtual void SetQWForFiles(TextWriter writer) - { - QuietWriter = new QuietTextWriter(writer, ErrorHandler); - } - - #endregion Protected Instance Methods - - #region Protected Static Methods - - /// - /// Convert a path into a fully qualified path. - /// - /// The path to convert. - /// The fully qualified path. - /// - /// - /// Converts the path specified to a fully - /// qualified path. If the path is relative it is - /// taken as relative from the application base - /// directory. - /// - /// - protected static string ConvertToFullPath(string path) - { - return SystemInfo.ConvertToFullPath(path); - } - - #endregion Protected Static Methods - - #region Private Instance Fields - - /// - /// Flag to indicate if we should append to the file - /// or overwrite the file. The default is to append. - /// - private bool m_appendToFile = true; - - /// - /// The name of the log file. - /// - private string m_fileName = null; - - /// - /// The encoding to use for the file stream. - /// - private Encoding m_encoding = Encoding.GetEncoding(0); - - /// - /// The security context to use for privileged calls - /// - private SecurityContext m_securityContext; - - /// - /// The stream to log to. Has added locking semantics - /// - private FileAppender.LockingStream m_stream = null; - - /// - /// The locking model to use - /// - private FileAppender.LockingModelBase m_lockingModel = new FileAppender.ExclusiveLock(); - - #endregion Private Instance Fields - - #region Private Static Fields - - /// - /// The fully qualified type of the FileAppender class. - /// - /// - /// Used by the internal logger to record the Type of the - /// log message. - /// - private static readonly Type declaringType = typeof(FileAppender); - - #endregion Private Static Fields - } -} + SetQWForFiles(writer); + } + + /// + /// Sets the quiet writer being used. + /// + /// the writer over the file stream that has been opened for writing + /// + /// + /// This method can be overridden by sub classes that want to + /// wrap the in some way. + /// + /// + protected virtual void SetQWForFiles(TextWriter writer) + { + QuietWriter = new QuietTextWriter(writer, ErrorHandler); + } + + #endregion Protected Instance Methods + + #region Protected Static Methods + + /// + /// Convert a path into a fully qualified path. + /// + /// The path to convert. + /// The fully qualified path. + /// + /// + /// Converts the path specified to a fully + /// qualified path. If the path is relative it is + /// taken as relative from the application base + /// directory. + /// + /// + protected static string ConvertToFullPath(string path) + { + return SystemInfo.ConvertToFullPath(path); + } + + #endregion Protected Static Methods + + #region Private Instance Fields + + /// + /// Flag to indicate if we should append to the file + /// or overwrite the file. The default is to append. + /// + private bool m_appendToFile = true; + + /// + /// The name of the log file. + /// + private string m_fileName = null; + + /// + /// The encoding to use for the file stream. + /// + private Encoding m_encoding = Encoding.GetEncoding(0); + + /// + /// The security context to use for privileged calls + /// + private SecurityContext m_securityContext; + + /// + /// The stream to log to. Has added locking semantics + /// + private FileAppender.LockingStream m_stream = null; + + /// + /// The locking model to use + /// + private FileAppender.LockingModelBase m_lockingModel = new FileAppender.ExclusiveLock(); + + #endregion Private Instance Fields + + #region Private Static Fields + + /// + /// The fully qualified type of the FileAppender class. + /// + /// + /// Used by the internal logger to record the Type of the + /// log message. + /// + private static readonly Type declaringType = typeof(FileAppender); + + #endregion Private Static Fields + } +} \ No newline at end of file From cf2d2bdfa5a33b0991b172de5fd534991e30aa8e Mon Sep 17 00:00:00 2001 From: Craig Douglas French Date: Mon, 29 Aug 2022 12:38:40 -0400 Subject: [PATCH 084/122] Fix typo in RemotingServer App.Config Config file had sppendToFile element name instead of appendToFile. --- examples/net/2.0/Remoting/RemotingServer/cs/src/App.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/net/2.0/Remoting/RemotingServer/cs/src/App.config b/examples/net/2.0/Remoting/RemotingServer/cs/src/App.config index 52b699d96..9a8b39195 100644 --- a/examples/net/2.0/Remoting/RemotingServer/cs/src/App.config +++ b/examples/net/2.0/Remoting/RemotingServer/cs/src/App.config @@ -34,7 +34,7 @@ - +
    From bafbbe0fd6990756de86c2642a78b6f3511da32c Mon Sep 17 00:00:00 2001 From: Jan Friedrich Date: Mon, 24 Oct 2022 10:03:00 +0200 Subject: [PATCH 085/122] defer creation of locking model to ActivateOptions --- src/log4net/Appender/FileAppender.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/log4net/Appender/FileAppender.cs b/src/log4net/Appender/FileAppender.cs index bf782713e..af0b387be 100644 --- a/src/log4net/Appender/FileAppender.cs +++ b/src/log4net/Appender/FileAppender.cs @@ -1657,7 +1657,7 @@ protected static string ConvertToFullPath(string path) /// /// The locking model to use /// - private FileAppender.LockingModelBase m_lockingModel = new FileAppender.ExclusiveLock(); + private FileAppender.LockingModelBase m_lockingModel; #endregion Private Instance Fields From 702184c961a321f04766814ede45f64687e0e7ec Mon Sep 17 00:00:00 2001 From: Jan Friedrich Date: Mon, 24 Oct 2022 10:12:01 +0200 Subject: [PATCH 086/122] include pdb in nuget --- src/log4net/log4net.csproj | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/log4net/log4net.csproj b/src/log4net/log4net.csproj index e034b6ac7..b8c8b3fed 100644 --- a/src/log4net/log4net.csproj +++ b/src/log4net/log4net.csproj @@ -6,9 +6,9 @@ Apache log4net log4net is a tool to help the programmer output log statements to a variety of output targets. - In case of problems with an application, it is helpful to enable logging so that the problem + In case of problems with an application, it is helpful to enable logging so that the problem can be located. With log4net it is possible to enable logging at runtime without modifying the - application binary. The log4net package is designed so that log statements can remain in + application binary. The log4net package is designed so that log statements can remain in shipped code without incurring a high performance cost. It follows that the speed of logging (or rather not logging) is crucial. @@ -64,6 +64,7 @@ ..\..\build\$(Configuration) ..\..\build\artifacts ..\..\build\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml + $(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb 285212672 @@ -203,4 +204,12 @@ - + + + + + + + + + \ No newline at end of file From 236bbff825d7c887a0f9ef6b529d6d4052165ed1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Dec 2022 13:23:34 +0000 Subject: [PATCH 087/122] :arrow_up: Bump decode-uri-component from 0.2.0 to 0.2.2 Bumps [decode-uri-component](https://github.com/SamVerschueren/decode-uri-component) from 0.2.0 to 0.2.2. - [Release notes](https://github.com/SamVerschueren/decode-uri-component/releases) - [Commits](https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.0...v0.2.2) --- updated-dependencies: - dependency-name: decode-uri-component dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 702c89bd2..a0ee020c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1473,9 +1473,9 @@ } }, "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true, "engines": { "node": ">=0.10" @@ -8254,9 +8254,9 @@ "dev": true }, "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true }, "default-compare": { From 7a9a68c040ffb3730e5038cb4cc236b00faa53e5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 11 Dec 2022 13:31:27 +0000 Subject: [PATCH 088/122] :arrow_up: Bump qs from 6.5.2 to 6.5.3 Bumps [qs](https://github.com/ljharb/qs) from 6.5.2 to 6.5.3. - [Release notes](https://github.com/ljharb/qs/releases) - [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md) - [Commits](https://github.com/ljharb/qs/compare/v6.5.2...v6.5.3) --- updated-dependencies: - dependency-name: qs dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 702c89bd2..ebc69005d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4957,9 +4957,9 @@ } }, "node_modules/qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "dev": true, "engines": { "node": ">=0.6" @@ -11039,9 +11039,9 @@ "dev": true }, "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "dev": true }, "queue-microtask": { From 7b1bf7972c8bf5f9e40fd604fa199e27fe908ead Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Jan 2023 03:40:37 +0000 Subject: [PATCH 089/122] :arrow_up: Bump simple-git from 2.48.0 to 3.16.0 Bumps [simple-git](https://github.com/steveukx/git-js/tree/HEAD/simple-git) from 2.48.0 to 3.16.0. - [Release notes](https://github.com/steveukx/git-js/releases) - [Changelog](https://github.com/steveukx/git-js/blob/main/simple-git/CHANGELOG.md) - [Commits](https://github.com/steveukx/git-js/commits/simple-git@3.16.0/simple-git) --- updated-dependencies: - dependency-name: simple-git dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- package-lock.json | 46 ++++++++++------------------------------------ package.json | 2 +- 2 files changed, 11 insertions(+), 37 deletions(-) diff --git a/package-lock.json b/package-lock.json index 702c89bd2..caeb585cc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "gulp-zip": "^5.0.2", "npm-run-all": "^4.1.5", "rimraf": "^3.0.2", - "simple-git": "^2.20.1", + "simple-git": "^3.16.0", "which": "^2.0.2", "yafs": "^1.5.0", "zarro": "^1.106.0" @@ -5772,18 +5772,18 @@ } }, "node_modules/simple-git": { - "version": "2.48.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-2.48.0.tgz", - "integrity": "sha512-z4qtrRuaAFJS4PUd0g+xy7aN4y+RvEt/QTJpR184lhJguBA1S/LsVlvE/CM95RsYMOFJG3NGGDjqFCzKU19S/A==", + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.16.0.tgz", + "integrity": "sha512-zuWYsOLEhbJRWVxpjdiXl6eyAyGo/KzVW+KFhhw9MqEEJttcq+32jTWSGyxTdf9e/YCohxRE+9xpWFj9FdiJNw==", "dev": true, "dependencies": { "@kwsites/file-exists": "^1.1.1", "@kwsites/promise-deferred": "^1.1.1", - "debug": "^4.3.2" + "debug": "^4.3.4" }, "funding": { "type": "github", - "url": "https://github.com/sponsors/steveukx/" + "url": "https://github.com/steveukx/git-js?sponsor=1" } }, "node_modules/slash": { @@ -7058,21 +7058,6 @@ "yarn": ">=1" } }, - "node_modules/zarro/node_modules/simple-git": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.10.0.tgz", - "integrity": "sha512-2w35xrS5rVtAW0g67LqtxCZN5cdddz/woQRfS0OJXaljXEoTychZ4jnE+CQgra/wX4ZvHeiChTUMenCwfIYEYw==", - "dev": true, - "dependencies": { - "@kwsites/file-exists": "^1.1.1", - "@kwsites/promise-deferred": "^1.1.1", - "debug": "^4.3.4" - }, - "funding": { - "type": "github", - "url": "https://github.com/steveukx/git-js?sponsor=1" - } - }, "node_modules/zarro/node_modules/vinyl": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", @@ -11672,14 +11657,14 @@ } }, "simple-git": { - "version": "2.48.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-2.48.0.tgz", - "integrity": "sha512-z4qtrRuaAFJS4PUd0g+xy7aN4y+RvEt/QTJpR184lhJguBA1S/LsVlvE/CM95RsYMOFJG3NGGDjqFCzKU19S/A==", + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.16.0.tgz", + "integrity": "sha512-zuWYsOLEhbJRWVxpjdiXl6eyAyGo/KzVW+KFhhw9MqEEJttcq+32jTWSGyxTdf9e/YCohxRE+9xpWFj9FdiJNw==", "dev": true, "requires": { "@kwsites/file-exists": "^1.1.1", "@kwsites/promise-deferred": "^1.1.1", - "debug": "^4.3.2" + "debug": "^4.3.4" } }, "slash": { @@ -12732,17 +12717,6 @@ "cross-spawn": "^7.0.1" } }, - "simple-git": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.10.0.tgz", - "integrity": "sha512-2w35xrS5rVtAW0g67LqtxCZN5cdddz/woQRfS0OJXaljXEoTychZ4jnE+CQgra/wX4ZvHeiChTUMenCwfIYEYw==", - "dev": true, - "requires": { - "@kwsites/file-exists": "^1.1.1", - "@kwsites/promise-deferred": "^1.1.1", - "debug": "^4.3.4" - } - }, "vinyl": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", diff --git a/package.json b/package.json index c84969558..e5fb5113f 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "gulp-zip": "^5.0.2", "npm-run-all": "^4.1.5", "rimraf": "^3.0.2", - "simple-git": "^2.20.1", + "simple-git": "^3.16.0", "which": "^2.0.2", "yafs": "^1.5.0", "zarro": "^1.106.0" From ea29f17ed045e43d63fcf84be537158896923147 Mon Sep 17 00:00:00 2001 From: Andrei Chasovskikh Date: Wed, 26 Apr 2023 10:25:17 +0200 Subject: [PATCH 090/122] Add Peek() method to ThreadContextStack and LogicalThreadContextStack. --- src/log4net/Util/LogicalThreadContextStack.cs | 36 ++++++++++++++----- src/log4net/Util/ThreadContextStack.cs | 20 +++++++++++ 2 files changed, 48 insertions(+), 8 deletions(-) diff --git a/src/log4net/Util/LogicalThreadContextStack.cs b/src/log4net/Util/LogicalThreadContextStack.cs index 005b6c1f0..6496db9bc 100644 --- a/src/log4net/Util/LogicalThreadContextStack.cs +++ b/src/log4net/Util/LogicalThreadContextStack.cs @@ -198,15 +198,35 @@ public IDisposable Push(string message) return new AutoPopStackFrame(contextStack, stack.Count - 1); } - #endregion Public Methods - - #region Internal Methods + /// + /// Returns the top context from this stack. + /// + /// The message in the context from the top of this stack. + /// + /// + /// Returns the top context from this stack. If this stack is empty then an + /// empty string (not ) is returned. + /// + /// + public string Peek() + { + Stack stack = m_stack; + if (stack.Count > 0) + { + return ((StackFrame)stack.Peek()).Message; + } + return ""; + } + + #endregion Public Methods + + #region Internal Methods - /// - /// Gets the current context information for this stack. - /// - /// The current context information. - internal string GetFullMessage() + /// + /// Gets the current context information for this stack. + /// + /// The current context information. + internal string GetFullMessage() { Stack stack = m_stack; if (stack.Count > 0) diff --git a/src/log4net/Util/ThreadContextStack.cs b/src/log4net/Util/ThreadContextStack.cs index d723dca44..468efa2f7 100644 --- a/src/log4net/Util/ThreadContextStack.cs +++ b/src/log4net/Util/ThreadContextStack.cs @@ -159,6 +159,26 @@ public IDisposable Push(string message) return new AutoPopStackFrame(stack, stack.Count - 1); } + /// + /// Returns the top context from this stack. + /// + /// The message in the context from the top of this stack. + /// + /// + /// Returns the top context from this stack. If this stack is empty then an + /// empty string (not ) is returned. + /// + /// + public string Peek() + { + Stack stack = m_stack; + if (stack.Count > 0) + { + return ((StackFrame)stack.Peek()).Message; + } + return ""; + } + #endregion Public Methods #region Internal Methods From eb9ea3ffe04f2bc32cd57160fc95c46dd605796b Mon Sep 17 00:00:00 2001 From: Andrei Chasovskikh Date: Wed, 26 Apr 2023 10:43:11 +0200 Subject: [PATCH 091/122] Use tabs. --- src/log4net/Util/LogicalThreadContextStack.cs | 72 +++++++++---------- src/log4net/Util/ThreadContextStack.cs | 36 +++++----- 2 files changed, 54 insertions(+), 54 deletions(-) diff --git a/src/log4net/Util/LogicalThreadContextStack.cs b/src/log4net/Util/LogicalThreadContextStack.cs index 6496db9bc..29597b381 100644 --- a/src/log4net/Util/LogicalThreadContextStack.cs +++ b/src/log4net/Util/LogicalThreadContextStack.cs @@ -26,16 +26,16 @@ namespace log4net.Util { - /// + /// /// Delegate type used for LogicalThreadContextStack's callbacks. /// - #if NET_2_0 || MONO_2_0 || NETSTANDARD + #if NET_2_0 || MONO_2_0 || NETSTANDARD public delegate void TwoArgAction(T1 t1, T2 t2); - #else + #else public delegate void TwoArgAction(string t1, LogicalThreadContextStack t2); - #endif + #endif - /// + /// /// Implementation of Stack for the /// /// @@ -65,7 +65,7 @@ public sealed class LogicalThreadContextStack : IFixingRequired /// #if NET_2_0 || MONO_2_0 || NETSTANDARD private TwoArgAction m_registerNew; - #else + #else private TwoArgAction m_registerNew; #endif @@ -83,7 +83,7 @@ public sealed class LogicalThreadContextStack : IFixingRequired /// #if NET_2_0 || MONO_2_0 || NETSTANDARD internal LogicalThreadContextStack(string propertyKey, TwoArgAction registerNew) - #else + #else internal LogicalThreadContextStack(string propertyKey, TwoArgAction registerNew) #endif { @@ -198,35 +198,35 @@ public IDisposable Push(string message) return new AutoPopStackFrame(contextStack, stack.Count - 1); } - /// - /// Returns the top context from this stack. - /// - /// The message in the context from the top of this stack. - /// - /// - /// Returns the top context from this stack. If this stack is empty then an - /// empty string (not ) is returned. - /// - /// - public string Peek() - { - Stack stack = m_stack; - if (stack.Count > 0) - { - return ((StackFrame)stack.Peek()).Message; - } - return ""; - } - - #endregion Public Methods - - #region Internal Methods - - /// - /// Gets the current context information for this stack. - /// - /// The current context information. - internal string GetFullMessage() + /// + /// Returns the top context from this stack. + /// + /// The message in the context from the top of this stack. + /// + /// + /// Returns the top context from this stack. If this stack is empty then an + /// empty string (not ) is returned. + /// + /// + public string Peek() + { + Stack stack = m_stack; + if (stack.Count > 0) + { + return ((StackFrame)stack.Peek()).Message; + } + return ""; + } + + #endregion Public Methods + + #region Internal Methods + + /// + /// Gets the current context information for this stack. + /// + /// The current context information. + internal string GetFullMessage() { Stack stack = m_stack; if (stack.Count > 0) diff --git a/src/log4net/Util/ThreadContextStack.cs b/src/log4net/Util/ThreadContextStack.cs index 468efa2f7..53d6fbae5 100644 --- a/src/log4net/Util/ThreadContextStack.cs +++ b/src/log4net/Util/ThreadContextStack.cs @@ -159,25 +159,25 @@ public IDisposable Push(string message) return new AutoPopStackFrame(stack, stack.Count - 1); } - /// - /// Returns the top context from this stack. - /// - /// The message in the context from the top of this stack. - /// - /// - /// Returns the top context from this stack. If this stack is empty then an - /// empty string (not ) is returned. - /// - /// - public string Peek() + /// + /// Returns the top context from this stack. + /// + /// The message in the context from the top of this stack. + /// + /// + /// Returns the top context from this stack. If this stack is empty then an + /// empty string (not ) is returned. + /// + /// + public string Peek() { - Stack stack = m_stack; - if (stack.Count > 0) - { - return ((StackFrame)stack.Peek()).Message; - } - return ""; - } + Stack stack = m_stack; + if (stack.Count > 0) + { + return ((StackFrame)stack.Peek()).Message; + } + return ""; + } #endregion Public Methods From 3899635104f40f0d9fbeea25008e4d237a05f7c1 Mon Sep 17 00:00:00 2001 From: Andrei Chasovskikh Date: Wed, 26 Apr 2023 10:47:37 +0200 Subject: [PATCH 092/122] Tab fixes. --- src/log4net/Util/LogicalThreadContextStack.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/log4net/Util/LogicalThreadContextStack.cs b/src/log4net/Util/LogicalThreadContextStack.cs index 29597b381..dbad39a20 100644 --- a/src/log4net/Util/LogicalThreadContextStack.cs +++ b/src/log4net/Util/LogicalThreadContextStack.cs @@ -35,7 +35,7 @@ namespace log4net.Util public delegate void TwoArgAction(string t1, LogicalThreadContextStack t2); #endif - /// + /// /// Implementation of Stack for the /// /// @@ -65,7 +65,7 @@ public sealed class LogicalThreadContextStack : IFixingRequired /// #if NET_2_0 || MONO_2_0 || NETSTANDARD private TwoArgAction m_registerNew; - #else + #else private TwoArgAction m_registerNew; #endif @@ -83,7 +83,7 @@ public sealed class LogicalThreadContextStack : IFixingRequired /// #if NET_2_0 || MONO_2_0 || NETSTANDARD internal LogicalThreadContextStack(string propertyKey, TwoArgAction registerNew) - #else + #else internal LogicalThreadContextStack(string propertyKey, TwoArgAction registerNew) #endif { From ab74a0a3c0d90e8736bff29fca74e858947c0d24 Mon Sep 17 00:00:00 2001 From: Erik Mavrinac Date: Fri, 12 Jan 2024 10:32:39 -0800 Subject: [PATCH 093/122] Support converting '.NET TP Worker' to the numeric thread ID on .NET 8+ --- src/log4net/Core/LoggingEvent.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/log4net/Core/LoggingEvent.cs b/src/log4net/Core/LoggingEvent.cs index 9dd9a12af..d6b2fb392 100644 --- a/src/log4net/Core/LoggingEvent.cs +++ b/src/log4net/Core/LoggingEvent.cs @@ -736,17 +736,18 @@ public string ThreadName m_data.ThreadName = SystemInfo.CurrentThreadId.ToString(System.Globalization.NumberFormatInfo.InvariantInfo); #else - // '.NET ThreadPool Worker' appears as a default thread pool name in .NET 6+. + // '.NET ThreadPool Worker' appears as a default thread name in the .NET 6-7 thread pool. + // '.NET TP Worker' is the default thread name in the .NET 8+ thread pool. // Prefer the numeric thread ID instead. string threadName = System.Threading.Thread.CurrentThread.Name; - if (!string.IsNullOrEmpty(threadName) && threadName != ".NET ThreadPool Worker") + if (!string.IsNullOrEmpty(threadName) && threadName != ".NET TP Worker" && threadName != ".NET ThreadPool Worker") { m_data.ThreadName = threadName; } else { // The thread name is not available or unsuitable. Therefore we - // go the the AppDomain to get the ID of the + // go to the AppDomain to get the ID of the // current thread. (Why don't Threads know their own ID?) try { From d6e81b35c781a8125a1253f91c214801cdb9fcaa Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Wed, 31 Jan 2024 14:39:53 +0200 Subject: [PATCH 094/122] :memo: update RELEASING.md with explicit nuget publish instructions --- doc/RELEASING.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/RELEASING.md b/doc/RELEASING.md index 1caf52e39..919d81e91 100644 --- a/doc/RELEASING.md +++ b/doc/RELEASING.md @@ -77,6 +77,8 @@ release version 2.0.123: - `svn delete` old items - `svn commit` 16. push the .nupkg to nuget.org + - via `dotnet`: `dotnet nuget push -s nuget.org -k ` + - via `nuget`: `nuget push -Source nuget.org -ApiKey ` 17. don't forget to make the docs live: in the logging-log4net-site folder: - `git checkout asf-site` - `git pull --rebase` From 84917ab1c71643c567842eace6d945d99f8ecc29 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Fri, 9 Feb 2024 13:52:08 +0200 Subject: [PATCH 095/122] :alembic: port & modify .asf.yaml from log4j apparently this is how I get issues enabled at github... --- .asf.yaml | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 .asf.yaml diff --git a/.asf.yaml b/.asf.yaml new file mode 100644 index 000000000..aff1cfa5e --- /dev/null +++ b/.asf.yaml @@ -0,0 +1,58 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to you under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# `.asf.yaml` is a branch-specific YAML configuration file for Git repositories to control features such as notifications, GitHub settings, etc. +# See its documentation for details: https://cwiki.apache.org/confluence/display/INFRA/Git+-+.asf.yaml+features + +notifications: + # GitHub already provides notifications for PRs and issues. + # Please don't duplicate that noise here! + commits: commits@logging.apache.org + pullrequests_bot_dependabot: robots@logging.apache.org +github: + description: "Apache Log4net is a versatile, feature-rich, efficient logging API and backend for .NET" + homepage: https://logging.apache.org/log4net + features: + issues: true + del_branch_on_merge: true + autolink_jira: + - LOG4JNET + labels: + - apache + - dotnet + - .NET + - api + - library + - log4net + - logging + - logger + - api + - syslog + #protected_branches: + # main: {} + # 2.x: {} + # Attempt to make the auto-generated github emails more easily readable in email clients. + custom_subjects: + new_pr: "[PR] {title} ({repository})" + close_pr: "Re: [PR] {title} ({repository})" + comment_pr: "Re: [PR] {title} ({repository})" + diffcomment: "Re: [PR] {title} ({repository})" + merge_pr: "Re: [PR] {title} ({repository})" + new_issue: "[I] {title} ({repository})" + comment_issue: "Re: [I] {title} ({repository})" + close_issue: "Re: [I] {title} ({repository})" + catchall: "[GH] {title} ({repository})" From 48fe03e4ace270cb3cd4a7d0d7222e5f0eac6658 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Fri, 9 Feb 2024 15:15:39 +0200 Subject: [PATCH 096/122] :wrench: a little configuration and an update to zarro reconfiguring for newly-supported zarro syntax makes the package.json easier to read (: --- .zarro-defaults | 17 + package-lock.json | 1855 ++++++++++++++++- package.json | 22 +- .../Util/PropertiesDictionaryTest.cs | 2 +- src/log4net.Tests/log4net.Tests.csproj | 19 +- src/log4net/log4net.csproj | 2 +- 6 files changed, 1832 insertions(+), 85 deletions(-) create mode 100644 .zarro-defaults diff --git a/.zarro-defaults b/.zarro-defaults new file mode 100644 index 000000000..43b612c04 --- /dev/null +++ b/.zarro-defaults @@ -0,0 +1,17 @@ +# zarro defaults file: +# place one VARIABLE=VALUE per line below +# variables here will not override existing environment variables +# unless prepended with a bang, ie +# !VARIABLE=Value +# so this means anything you set in your package.json, eg with +# cross-env, will override what's in here unless you've specifically +# marked the setting in here as forced with ! + +# instruct nunit console runner to run in a single process +NUNIT_PROCESS=Single + +# determines how many tests can run in parallel - 1 is fine +MAX_CONCURRENCY=1 + +# specify what to build (prevents accidental build of any other sln) +BUILD_INCLUDE=src/log4net.sln diff --git a/package-lock.json b/package-lock.json index fea594aee..1044a25f2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ "simple-git": "^3.16.0", "which": "^2.0.2", "yafs": "^1.5.0", - "zarro": "^1.106.0" + "zarro": "^1.169.0" } }, "node_modules/@kwsites/file-exists": { @@ -71,6 +71,161 @@ "node": ">= 8" } }, + "node_modules/@octokit/auth-token": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", + "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", + "dev": true, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/core": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.1.0.tgz", + "integrity": "sha512-BDa2VAMLSh3otEiaMJ/3Y36GU4qf6GI+VivQ/P41NC6GHcdxpKlqV0ikSZ5gdQsmS3ojXeRx5vasgNTinF0Q4g==", + "dev": true, + "dependencies": { + "@octokit/auth-token": "^4.0.0", + "@octokit/graphql": "^7.0.0", + "@octokit/request": "^8.0.2", + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^12.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/endpoint": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.4.tgz", + "integrity": "sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw==", + "dev": true, + "dependencies": { + "@octokit/types": "^12.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/graphql": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.0.2.tgz", + "integrity": "sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==", + "dev": true, + "dependencies": { + "@octokit/request": "^8.0.1", + "@octokit/types": "^12.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/openapi-types": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-19.1.0.tgz", + "integrity": "sha512-6G+ywGClliGQwRsjvqVYpklIfa7oRPA0vyhPQG/1Feh+B+wU0vGH1JiJ5T25d3g1JZYBHzR2qefLi9x8Gt+cpw==", + "dev": true + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "9.1.5", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.1.5.tgz", + "integrity": "sha512-WKTQXxK+bu49qzwv4qKbMMRXej1DU2gq017euWyKVudA6MldaSSQuxtz+vGbhxV4CjxpUxjZu6rM2wfc1FiWVg==", + "dev": true, + "dependencies": { + "@octokit/types": "^12.4.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=5" + } + }, + "node_modules/@octokit/plugin-request-log": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-4.0.0.tgz", + "integrity": "sha512-2uJI1COtYCq8Z4yNSnM231TgH50bRkheQ9+aH8TnZanB6QilOnx8RMD2qsnamSOXtDj0ilxvevf5fGsBhBBzKA==", + "dev": true, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=5" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.2.0.tgz", + "integrity": "sha512-ePbgBMYtGoRNXDyKGvr9cyHjQ163PbwD0y1MkDJCpkO2YH4OeXX40c4wYHKikHGZcpGPbcRLuy0unPUuafco8Q==", + "dev": true, + "dependencies": { + "@octokit/types": "^12.3.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=5" + } + }, + "node_modules/@octokit/request": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.2.0.tgz", + "integrity": "sha512-exPif6x5uwLqv1N1irkLG1zZNJkOtj8bZxuVHd71U5Ftuxf2wGNvAJyNBcPbPC+EBzwYEbBDdSFb8EPcjpYxPQ==", + "dev": true, + "dependencies": { + "@octokit/endpoint": "^9.0.0", + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^12.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/request-error": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.1.tgz", + "integrity": "sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==", + "dev": true, + "dependencies": { + "@octokit/types": "^12.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/rest": { + "version": "20.0.2", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.0.2.tgz", + "integrity": "sha512-Ux8NDgEraQ/DMAU1PlAohyfBBXDwhnX2j33Z1nJNziqAfHi70PuxkFYIcIt8aIAxtRE7KVuKp8lSR8pA0J5iOQ==", + "dev": true, + "dependencies": { + "@octokit/core": "^5.0.0", + "@octokit/plugin-paginate-rest": "^9.0.0", + "@octokit/plugin-request-log": "^4.0.0", + "@octokit/plugin-rest-endpoint-methods": "^10.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/types": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.4.0.tgz", + "integrity": "sha512-FLWs/AvZllw/AGVs+nJ+ELCDZZJk+kY0zMen118xhL2zD0s1etIUHm1odgjP7epxYU1ln7SZxEUWYop5bhsdgQ==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^19.1.0" + } + }, "node_modules/@types/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", @@ -102,6 +257,15 @@ "@types/node": "*" } }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -869,6 +1033,26 @@ "node": ">=0.10.0" } }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -878,6 +1062,23 @@ "tweetnacl": "^0.14.3" } }, + "node_modules/before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "dev": true + }, + "node_modules/bent": { + "version": "7.3.12", + "resolved": "https://registry.npmjs.org/bent/-/bent-7.3.12.tgz", + "integrity": "sha512-T3yrKnVGB63zRuoco/7Ybl7BwwGZR0lceoVG5XmQyMIH9s19SV5m+a8qam4if0zQuAmOQTyPTPmsQBdAorGK3w==", + "dev": true, + "dependencies": { + "bytesish": "^0.4.1", + "caseless": "~0.12.0", + "is-stream": "^2.0.0" + } + }, "node_modules/binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", @@ -897,6 +1098,16 @@ "file-uri-to-path": "1.0.0" } }, + "node_modules/bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "dev": true, + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -919,6 +1130,46 @@ "node": ">=8" } }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "dependencies": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "node_modules/buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, "node_modules/buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", @@ -937,12 +1188,24 @@ "node": ">=0.4.0" } }, + "node_modules/buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", + "dev": true + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "node_modules/bytesish": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/bytesish/-/bytesish-0.4.4.tgz", + "integrity": "sha512-i4uu6M4zuMUiyfZN4RU2+i9+peJh//pXhd9x1oSe1LBkZ3LEbCoygu8W0bXTukU1Jme2txKuotpCZRaC3FLxcQ==", + "dev": true + }, "node_modules/cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -1322,6 +1585,12 @@ "node": ">= 0.8" } }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "node_modules/component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", @@ -1410,6 +1679,15 @@ "yarn": ">=1" } }, + "node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "dev": true, + "dependencies": { + "node-fetch": "^2.6.12" + } + }, "node_modules/cross-spawn": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", @@ -1481,6 +1759,147 @@ "node": ">=0.10" } }, + "node_modules/decompress": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", + "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", + "dev": true, + "dependencies": { + "decompress-tar": "^4.0.0", + "decompress-tarbz2": "^4.0.0", + "decompress-targz": "^4.0.0", + "decompress-unzip": "^4.0.1", + "graceful-fs": "^4.1.10", + "make-dir": "^1.0.0", + "pify": "^2.3.0", + "strip-dirs": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tar": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "dev": true, + "dependencies": { + "file-type": "^5.2.0", + "is-stream": "^1.1.0", + "tar-stream": "^1.5.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tar/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-tarbz2": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", + "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "dev": true, + "dependencies": { + "decompress-tar": "^4.1.0", + "file-type": "^6.1.0", + "is-stream": "^1.1.0", + "seek-bzip": "^1.0.5", + "unbzip2-stream": "^1.0.9" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tarbz2/node_modules/file-type": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tarbz2/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-targz": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "dev": true, + "dependencies": { + "decompress-tar": "^4.1.1", + "file-type": "^5.2.0", + "is-stream": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-targz/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-unzip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==", + "dev": true, + "dependencies": { + "file-type": "^3.8.0", + "get-stream": "^2.2.0", + "pify": "^2.3.0", + "yauzl": "^2.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-unzip/node_modules/file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-unzip/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/default-compare": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", @@ -1602,6 +2021,12 @@ "node": ">=0.4.0" } }, + "node_modules/deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true + }, "node_modules/detect-file": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", @@ -1676,6 +2101,12 @@ "safer-buffer": "^2.1.0" } }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -1780,6 +2211,15 @@ "es6-symbol": "^3.1.1" } }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -1804,6 +2244,15 @@ "through": "^2.3.8" } }, + "node_modules/exec-step": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/exec-step/-/exec-step-0.8.0.tgz", + "integrity": "sha512-iqNBbeX1rsFmjH5B1rc5CtfJ66NYftsXuJ2AsaKcmY212Ha7Jcj6MGlxTNIKTRjOWY0sjspKpFA3A61VIbpdMA==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + } + }, "node_modules/expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -2067,6 +2516,24 @@ "reusify": "^1.0.4" } }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -2332,6 +2799,12 @@ "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", "dev": true }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, "node_modules/fs-mkdirp-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", @@ -2412,6 +2885,19 @@ "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", "dev": true }, + "node_modules/get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==", + "dev": true, + "dependencies": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -3199,6 +3685,26 @@ "npm": ">=1.3.7" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/ignore": { "version": "5.1.9", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", @@ -3208,6 +3714,12 @@ "node": ">= 4" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, "node_modules/indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", @@ -3482,6 +3994,12 @@ "node": ">=0.10.0" } }, + "node_modules/is-natural-number": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", + "integrity": "sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==", + "dev": true + }, "node_modules/is-negated-glob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", @@ -3611,6 +4129,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", @@ -3773,6 +4303,18 @@ "node": ">=0.6.0" } }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, "node_modules/just-debounce": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.1.0.tgz", @@ -3837,6 +4379,15 @@ "node": ">= 0.10" } }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/liftoff": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", @@ -3907,6 +4458,12 @@ "integrity": "sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0=", "dev": true }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true + }, "node_modules/lodash.template": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", @@ -3936,6 +4493,18 @@ "yallist": "^2.1.2" } }, + "node_modules/make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/make-iterator": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", @@ -4233,18 +4802,6 @@ "node": ">=0.10.0" } }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -4305,17 +4862,245 @@ "node": ">=0.10.0" } }, - "node_modules/next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true + "node_modules/next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-nuget-client": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/node-nuget-client/-/node-nuget-client-0.12.0.tgz", + "integrity": "sha512-dr+EmAhlvCkyZTGh+7qXqJhNNNuZCnL97RQt9n9I7IrGKIFyiOd5SjUjE75s1szQrk+mf9ZmeDZytRO6EyIgag==", + "dev": true, + "dependencies": { + "@xmldom/xmldom": "^0.8.10", + "bent": "^7.3.0", + "chalk": "^4.1.0", + "jszip": "^3.10.1", + "rimraf": "^3.0.2", + "yafs": "^1.36.0", + "yargs": "^17.7.2" + }, + "bin": { + "node-nuget": "dist/nuget-client-cli.js" + } + }, + "node_modules/node-nuget-client/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-nuget-client/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/node-nuget-client/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/node-nuget-client/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/node-nuget-client/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/node-nuget-client/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/node-nuget-client/node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/node-nuget-client/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-nuget-client/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-nuget-client/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-nuget-client/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-nuget-client/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-nuget-client/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/node-nuget-client/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-nuget-client/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/node-nuget-client/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } }, "node_modules/node-version": { "version": "1.2.0", @@ -4460,6 +5245,15 @@ "node": "*" } }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", @@ -4647,6 +5441,12 @@ "node": ">=8" } }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, "node_modules/parse-filepath": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", @@ -4785,6 +5585,12 @@ "through": "~2.3" } }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -5667,6 +6473,19 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, + "node_modules/seek-bzip": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", + "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", + "dev": true, + "dependencies": { + "commander": "^2.8.1" + }, + "bin": { + "seek-bunzip": "bin/seek-bunzip", + "seek-table": "bin/seek-bzip-table" + } + }, "node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -5721,6 +6540,12 @@ "node": ">=0.10.0" } }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -6277,6 +7102,15 @@ "node": ">=4" } }, + "node_modules/strip-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", + "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", + "dev": true, + "dependencies": { + "is-natural-number": "^4.0.1" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -6299,6 +7133,24 @@ "es6-symbol": "^3.1.1" } }, + "node_modules/tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dev": true, + "dependencies": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/temp": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", @@ -6406,6 +7258,12 @@ "node": ">=0.10.0" } }, + "node_modules/to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "dev": true + }, "node_modules/to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -6492,6 +7350,12 @@ "node": ">=0.8" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -6549,6 +7413,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, "node_modules/unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", @@ -6600,6 +7474,12 @@ "node": ">= 0.10" } }, + "node_modules/unfetch": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-5.0.0.tgz", + "integrity": "sha512-3xM2c89siXg0nHvlmYsQ2zkLASvVMBisZm5lF3gFDqfF2xonNStDJyMpvaOBe0a1Edxmqrf2E0HBdmy9QyZaeg==", + "dev": true + }, "node_modules/union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -6625,6 +7505,12 @@ "through2-filter": "^3.0.0" } }, + "node_modules/universal-user-agent": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", + "dev": true + }, "node_modules/unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -6854,6 +7740,22 @@ "node": ">=0.10.0" } }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -6948,9 +7850,9 @@ "dev": true }, "node_modules/yafs": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/yafs/-/yafs-1.5.0.tgz", - "integrity": "sha512-FRrHCUDPZw4UEAi53wJhXXGdWHdd9/cZUpoh8kBGI/JCWkSIMB2UifeU2AD6GXaRd4wwrQYzEDrX1HTrSoup5w==", + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/yafs/-/yafs-1.36.0.tgz", + "integrity": "sha512-6n1KkWmhyFNV56Hrr4o+TzEjUDzUlVdMdv8hA8yNirOzzRFfeig9o/Kd1SkboVA4dqWWhHk4ggCe6zOP8I9tDw==", "dev": true }, "node_modules/yallist": { @@ -6990,6 +7892,16 @@ "object.assign": "^4.1.0" } }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "node_modules/yazl": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", @@ -7000,17 +7912,22 @@ } }, "node_modules/zarro": { - "version": "1.106.0", - "resolved": "https://registry.npmjs.org/zarro/-/zarro-1.106.0.tgz", - "integrity": "sha512-AYj4+Sjz5L1HfzUXs4Uo/hZ0xi36WEumzLmH8EJLNLTq370SBad1TcEH3780EEzoJv57cqlbaXNCVU7L1OTpFg==", + "version": "1.169.0", + "resolved": "https://registry.npmjs.org/zarro/-/zarro-1.169.0.tgz", + "integrity": "sha512-2k89dREJ3XKVefgB7PoXZAjnrRZ8f9RwLLuo3SnXabb9PZb3P1fVCC5S3wjGNsD/LoG7CtI27AUOp3uWg+buhQ==", "dev": true, "dependencies": { + "@octokit/rest": "^20.0.1", "ansi-colors": "^4.1.1", "array.prototype.flatmap": "^1.2.4", + "bent": "^7.3.12", "cross-env": "^7.0.3", + "cross-fetch": "^4.0.0", "debug": "^4.3.1", + "decompress": "^4.2.1", "del": "^5.1.0", "event-stream": "^4.0.1", + "exec-step": "^0.8.0", "fancy-log": "^1.3.3", "gulp": "^4.0.2", "gulp-debug": "^4.0.0", @@ -7018,7 +7935,8 @@ "gulp-edit-xml": "^3.1.1", "gulp-filter": "^6.0.0", "gulp-msbuild": "^0.10.0", - "mkdirp": "^1.0.4", + "lodash.kebabcase": "^4.1.1", + "node-nuget-client": "^0.12.0", "npm-run-all": "^4.1.5", "plugin-error": "^1.0.1", "readline": "^1.3.0", @@ -7028,13 +7946,16 @@ "rimraf": "^3.0.2", "run-sequence": "^2.2.1", "sax": "^1.2.4", - "simple-git": "^3.4.0", + "semver": "^7.5.4", + "simple-git": "^3.15.0", "temp": "^0.9.4", "through2": "^3.0.2", "undertaker-forward-reference": "^1.0.2", + "unfetch": "^5.0.0", "vinyl": "^2.2.1", "which": "^2.0.2", - "xml2js": "^0.4.23" + "xml2js": "^0.6.2", + "yafs": "^1.35.0" }, "bin": { "zarro": "index.js" @@ -7058,6 +7979,33 @@ "yarn": ">=1" } }, + "node_modules/zarro/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/zarro/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/zarro/node_modules/vinyl": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", @@ -7074,6 +8022,25 @@ "engines": { "node": ">= 0.10" } + }, + "node_modules/zarro/node_modules/xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "dev": true, + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/zarro/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } }, "dependencies": { @@ -7118,6 +8085,123 @@ "fastq": "^1.6.0" } }, + "@octokit/auth-token": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", + "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", + "dev": true + }, + "@octokit/core": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.1.0.tgz", + "integrity": "sha512-BDa2VAMLSh3otEiaMJ/3Y36GU4qf6GI+VivQ/P41NC6GHcdxpKlqV0ikSZ5gdQsmS3ojXeRx5vasgNTinF0Q4g==", + "dev": true, + "requires": { + "@octokit/auth-token": "^4.0.0", + "@octokit/graphql": "^7.0.0", + "@octokit/request": "^8.0.2", + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^12.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/endpoint": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.4.tgz", + "integrity": "sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw==", + "dev": true, + "requires": { + "@octokit/types": "^12.0.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/graphql": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.0.2.tgz", + "integrity": "sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==", + "dev": true, + "requires": { + "@octokit/request": "^8.0.1", + "@octokit/types": "^12.0.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/openapi-types": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-19.1.0.tgz", + "integrity": "sha512-6G+ywGClliGQwRsjvqVYpklIfa7oRPA0vyhPQG/1Feh+B+wU0vGH1JiJ5T25d3g1JZYBHzR2qefLi9x8Gt+cpw==", + "dev": true + }, + "@octokit/plugin-paginate-rest": { + "version": "9.1.5", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.1.5.tgz", + "integrity": "sha512-WKTQXxK+bu49qzwv4qKbMMRXej1DU2gq017euWyKVudA6MldaSSQuxtz+vGbhxV4CjxpUxjZu6rM2wfc1FiWVg==", + "dev": true, + "requires": { + "@octokit/types": "^12.4.0" + } + }, + "@octokit/plugin-request-log": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-4.0.0.tgz", + "integrity": "sha512-2uJI1COtYCq8Z4yNSnM231TgH50bRkheQ9+aH8TnZanB6QilOnx8RMD2qsnamSOXtDj0ilxvevf5fGsBhBBzKA==", + "dev": true, + "requires": {} + }, + "@octokit/plugin-rest-endpoint-methods": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.2.0.tgz", + "integrity": "sha512-ePbgBMYtGoRNXDyKGvr9cyHjQ163PbwD0y1MkDJCpkO2YH4OeXX40c4wYHKikHGZcpGPbcRLuy0unPUuafco8Q==", + "dev": true, + "requires": { + "@octokit/types": "^12.3.0" + } + }, + "@octokit/request": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.2.0.tgz", + "integrity": "sha512-exPif6x5uwLqv1N1irkLG1zZNJkOtj8bZxuVHd71U5Ftuxf2wGNvAJyNBcPbPC+EBzwYEbBDdSFb8EPcjpYxPQ==", + "dev": true, + "requires": { + "@octokit/endpoint": "^9.0.0", + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^12.0.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/request-error": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.1.tgz", + "integrity": "sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==", + "dev": true, + "requires": { + "@octokit/types": "^12.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } + }, + "@octokit/rest": { + "version": "20.0.2", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.0.2.tgz", + "integrity": "sha512-Ux8NDgEraQ/DMAU1PlAohyfBBXDwhnX2j33Z1nJNziqAfHi70PuxkFYIcIt8aIAxtRE7KVuKp8lSR8pA0J5iOQ==", + "dev": true, + "requires": { + "@octokit/core": "^5.0.0", + "@octokit/plugin-paginate-rest": "^9.0.0", + "@octokit/plugin-request-log": "^4.0.0", + "@octokit/plugin-rest-endpoint-methods": "^10.0.0" + } + }, + "@octokit/types": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.4.0.tgz", + "integrity": "sha512-FLWs/AvZllw/AGVs+nJ+ELCDZZJk+kY0zMen118xhL2zD0s1etIUHm1odgjP7epxYU1ln7SZxEUWYop5bhsdgQ==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^19.1.0" + } + }, "@types/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", @@ -7149,6 +8233,12 @@ "@types/node": "*" } }, + "@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "dev": true + }, "aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -7741,6 +8831,12 @@ } } }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -7750,6 +8846,23 @@ "tweetnacl": "^0.14.3" } }, + "before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "dev": true + }, + "bent": { + "version": "7.3.12", + "resolved": "https://registry.npmjs.org/bent/-/bent-7.3.12.tgz", + "integrity": "sha512-T3yrKnVGB63zRuoco/7Ybl7BwwGZR0lceoVG5XmQyMIH9s19SV5m+a8qam4if0zQuAmOQTyPTPmsQBdAorGK3w==", + "dev": true, + "requires": { + "bytesish": "^0.4.1", + "caseless": "~0.12.0", + "is-stream": "^2.0.0" + } + }, "binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", @@ -7766,6 +8879,16 @@ "file-uri-to-path": "1.0.0" } }, + "bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "dev": true, + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -7785,6 +8908,32 @@ "fill-range": "^7.0.1" } }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", @@ -7797,12 +8946,24 @@ "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", "dev": true }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", + "dev": true + }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "bytesish": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/bytesish/-/bytesish-0.4.4.tgz", + "integrity": "sha512-i4uu6M4zuMUiyfZN4RU2+i9+peJh//pXhd9x1oSe1LBkZ3LEbCoygu8W0bXTukU1Jme2txKuotpCZRaC3FLxcQ==", + "dev": true + }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -8121,6 +9282,12 @@ "delayed-stream": "~1.0.0" } }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", @@ -8193,6 +9360,15 @@ "cross-spawn": "^7.0.1" } }, + "cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "dev": true, + "requires": { + "node-fetch": "^2.6.12" + } + }, "cross-spawn": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", @@ -8223,27 +9399,142 @@ "assert-plus": "^1.0.0" } }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true + }, + "decompress": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", + "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", + "dev": true, + "requires": { + "decompress-tar": "^4.0.0", + "decompress-tarbz2": "^4.0.0", + "decompress-targz": "^4.0.0", + "decompress-unzip": "^4.0.1", + "graceful-fs": "^4.1.10", + "make-dir": "^1.0.0", + "pify": "^2.3.0", + "strip-dirs": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + } + } + }, + "decompress-tar": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "dev": true, + "requires": { + "file-type": "^5.2.0", + "is-stream": "^1.1.0", + "tar-stream": "^1.5.2" + }, + "dependencies": { + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true + } + } + }, + "decompress-tarbz2": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", + "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "dev": true, + "requires": { + "decompress-tar": "^4.1.0", + "file-type": "^6.1.0", + "is-stream": "^1.1.0", + "seek-bzip": "^1.0.5", + "unbzip2-stream": "^1.0.9" + }, + "dependencies": { + "file-type": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true + } + } + }, + "decompress-targz": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "dev": true, + "requires": { + "decompress-tar": "^4.1.1", + "file-type": "^5.2.0", + "is-stream": "^1.1.0" + }, + "dependencies": { + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true + } + } + }, + "decompress-unzip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==", "dev": true, "requires": { - "ms": "2.1.2" + "file-type": "^3.8.0", + "get-stream": "^2.2.0", + "pify": "^2.3.0", + "yauzl": "^2.4.2" + }, + "dependencies": { + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + } } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "dev": true - }, "default-compare": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", @@ -8339,6 +9630,12 @@ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, + "deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true + }, "detect-file": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", @@ -8406,6 +9703,12 @@ "safer-buffer": "^2.1.0" } }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -8498,6 +9801,12 @@ "es6-symbol": "^3.1.1" } }, + "escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -8519,6 +9828,15 @@ "through": "^2.3.8" } }, + "exec-step": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/exec-step/-/exec-step-0.8.0.tgz", + "integrity": "sha512-iqNBbeX1rsFmjH5B1rc5CtfJ66NYftsXuJ2AsaKcmY212Ha7Jcj6MGlxTNIKTRjOWY0sjspKpFA3A61VIbpdMA==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -8745,6 +10063,21 @@ "reusify": "^1.0.4" } }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", + "dev": true + }, "file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -8964,6 +10297,12 @@ "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", "dev": true }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, "fs-mkdirp-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", @@ -9032,6 +10371,16 @@ "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", "dev": true }, + "get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + } + }, "get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -9648,12 +10997,24 @@ "sshpk": "^1.7.0" } }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, "ignore": { "version": "5.1.9", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", "dev": true }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, "indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", @@ -9862,6 +11223,12 @@ "is-extglob": "^2.1.1" } }, + "is-natural-number": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", + "integrity": "sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==", + "dev": true + }, "is-negated-glob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", @@ -9946,6 +11313,12 @@ "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", "dev": true }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, "is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", @@ -10078,6 +11451,18 @@ "verror": "1.10.0" } }, + "jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, "just-debounce": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.1.0.tgz", @@ -10127,6 +11512,15 @@ "flush-write-stream": "^1.0.2" } }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, "liftoff": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", @@ -10191,6 +11585,12 @@ "integrity": "sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0=", "dev": true }, + "lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true + }, "lodash.template": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", @@ -10220,6 +11620,15 @@ "yallist": "^2.1.2" } }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, "make-iterator": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", @@ -10461,12 +11870,6 @@ } } }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -10530,6 +11933,168 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "node-nuget-client": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/node-nuget-client/-/node-nuget-client-0.12.0.tgz", + "integrity": "sha512-dr+EmAhlvCkyZTGh+7qXqJhNNNuZCnL97RQt9n9I7IrGKIFyiOd5SjUjE75s1szQrk+mf9ZmeDZytRO6EyIgag==", + "dev": true, + "requires": { + "@xmldom/xmldom": "^0.8.10", + "bent": "^7.3.0", + "chalk": "^4.1.0", + "jszip": "^3.10.1", + "rimraf": "^3.0.2", + "yafs": "^1.36.0", + "yargs": "^17.7.2" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + } + } + }, "node-version": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/node-version/-/node-version-1.2.0.tgz", @@ -10637,6 +12202,12 @@ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", @@ -10784,6 +12355,12 @@ "aggregate-error": "^3.0.0" } }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, "parse-filepath": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", @@ -10889,6 +12466,12 @@ "through": "~2.3" } }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -11572,6 +13155,15 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, + "seek-bzip": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", + "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", + "dev": true, + "requires": { + "commander": "^2.8.1" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -11616,6 +13208,12 @@ } } }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -12062,6 +13660,15 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, + "strip-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", + "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", + "dev": true, + "requires": { + "is-natural-number": "^4.0.1" + } + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -12081,6 +13688,21 @@ "es6-symbol": "^3.1.1" } }, + "tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dev": true, + "requires": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + } + }, "temp": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", @@ -12174,6 +13796,12 @@ "is-negated-glob": "^1.0.0" } }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "dev": true + }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -12246,6 +13874,12 @@ "punycode": "^2.1.1" } }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -12293,6 +13927,16 @@ } } }, + "unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, + "requires": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, "unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", @@ -12332,6 +13976,12 @@ "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", "dev": true }, + "unfetch": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-5.0.0.tgz", + "integrity": "sha512-3xM2c89siXg0nHvlmYsQ2zkLASvVMBisZm5lF3gFDqfF2xonNStDJyMpvaOBe0a1Edxmqrf2E0HBdmy9QyZaeg==", + "dev": true + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -12354,6 +14004,12 @@ "through2-filter": "^3.0.0" } }, + "universal-user-agent": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", + "dev": true + }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -12546,6 +14202,22 @@ } } }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -12619,9 +14291,9 @@ "dev": true }, "yafs": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/yafs/-/yafs-1.5.0.tgz", - "integrity": "sha512-FRrHCUDPZw4UEAi53wJhXXGdWHdd9/cZUpoh8kBGI/JCWkSIMB2UifeU2AD6GXaRd4wwrQYzEDrX1HTrSoup5w==", + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/yafs/-/yafs-1.36.0.tgz", + "integrity": "sha512-6n1KkWmhyFNV56Hrr4o+TzEjUDzUlVdMdv8hA8yNirOzzRFfeig9o/Kd1SkboVA4dqWWhHk4ggCe6zOP8I9tDw==", "dev": true }, "yallist": { @@ -12661,6 +14333,16 @@ "object.assign": "^4.1.0" } }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "yazl": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", @@ -12671,17 +14353,22 @@ } }, "zarro": { - "version": "1.106.0", - "resolved": "https://registry.npmjs.org/zarro/-/zarro-1.106.0.tgz", - "integrity": "sha512-AYj4+Sjz5L1HfzUXs4Uo/hZ0xi36WEumzLmH8EJLNLTq370SBad1TcEH3780EEzoJv57cqlbaXNCVU7L1OTpFg==", + "version": "1.169.0", + "resolved": "https://registry.npmjs.org/zarro/-/zarro-1.169.0.tgz", + "integrity": "sha512-2k89dREJ3XKVefgB7PoXZAjnrRZ8f9RwLLuo3SnXabb9PZb3P1fVCC5S3wjGNsD/LoG7CtI27AUOp3uWg+buhQ==", "dev": true, "requires": { + "@octokit/rest": "^20.0.1", "ansi-colors": "^4.1.1", "array.prototype.flatmap": "^1.2.4", + "bent": "^7.3.12", "cross-env": "^7.0.3", + "cross-fetch": "^4.0.0", "debug": "^4.3.1", + "decompress": "^4.2.1", "del": "^5.1.0", "event-stream": "^4.0.1", + "exec-step": "^0.8.0", "fancy-log": "^1.3.3", "gulp": "^4.0.2", "gulp-debug": "^4.0.0", @@ -12689,7 +14376,8 @@ "gulp-edit-xml": "^3.1.1", "gulp-filter": "^6.0.0", "gulp-msbuild": "^0.10.0", - "mkdirp": "^1.0.4", + "lodash.kebabcase": "^4.1.1", + "node-nuget-client": "^0.12.0", "npm-run-all": "^4.1.5", "plugin-error": "^1.0.1", "readline": "^1.3.0", @@ -12699,13 +14387,16 @@ "rimraf": "^3.0.2", "run-sequence": "^2.2.1", "sax": "^1.2.4", - "simple-git": "^3.4.0", + "semver": "^7.5.4", + "simple-git": "^3.15.0", "temp": "^0.9.4", "through2": "^3.0.2", "undertaker-forward-reference": "^1.0.2", + "unfetch": "^5.0.0", "vinyl": "^2.2.1", "which": "^2.0.2", - "xml2js": "^0.4.23" + "xml2js": "^0.6.2", + "yafs": "^1.35.0" }, "dependencies": { "cross-env": { @@ -12717,6 +14408,24 @@ "cross-spawn": "^7.0.1" } }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, "vinyl": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", @@ -12730,6 +14439,22 @@ "remove-trailing-separator": "^1.0.1", "replace-ext": "^1.0.0" } + }, + "xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } } diff --git a/package.json b/package.json index e5fb5113f..5f0607724 100644 --- a/package.json +++ b/package.json @@ -3,19 +3,21 @@ "version": "2.0.12", "description": "Log4Net is a logging framework for .NET", "scripts": { - "test": "cross-env NUNIT_PROCESS=Single MAX_CONCURRENCY=1 run-s clean-build \"zarro test-dotnet\" run-dotnet-core-tests", + "test": "run-s clean-build test-dotnet run-dotnet-core-tests", "test-xplatform": "run-s build-xplatform run-dotnet-core-tests", - "build-xplatform": "cross-env DOTNET_CORE=1 BUILD_CONFIGURATION=CrossPlatform run-s build", - "run-dotnet-core-tests": "cross-env DOTNET_CORE=1 run-s \"zarro quick-test-dotnet\"", + "build-xplatform": "cross-env DOTNET_CORE=1 BUILD_CONFIGURATION=CrossPlatform zarro build", + "run-dotnet-core-tests": "cross-env DOTNET_CORE=1 zarro quick-test-dotnet", "clean-build": "rimraf build", - "build": "run-s clean-build \"zarro build\"", - "build-release": "cross-env BUILD_CONFIGURATION=Release run-s clean-build \"zarro build\"", - "build-site": "run-s \"zarro build-site\"", - "prepare-build-artifacts": "run-s \"zarro prepare-build-artifacts\"", + "prebuild": "run-s clean-build", + "build": "zarro @", + "build-release": "cross-env BUILD_CONFIGURATION=Release run-s clean-build build", + "build-site": "zarro @", + "test-dotnet": "zarro @", + "prepare-build-artifacts": "zarro @", "dump-env": "node -e \"console.log(process.env);\"", "release": "run-s update-version-info build-release prepare-build-artifacts build-site", - "zarro": "cross-env BUILD_INCLUDE=src/log4net.sln zarro", - "update-version-info": "run-s \"zarro update-version-info\"" + "zarro": "zarro", + "update-version-info": "zarro @" }, "repository": { "type": "git", @@ -37,6 +39,6 @@ "simple-git": "^3.16.0", "which": "^2.0.2", "yafs": "^1.5.0", - "zarro": "^1.106.0" + "zarro": "^1.169.0" } } diff --git a/src/log4net.Tests/Util/PropertiesDictionaryTest.cs b/src/log4net.Tests/Util/PropertiesDictionaryTest.cs index b3d78f27e..e44f4a8c4 100644 --- a/src/log4net.Tests/Util/PropertiesDictionaryTest.cs +++ b/src/log4net.Tests/Util/PropertiesDictionaryTest.cs @@ -17,7 +17,7 @@ // #endregion -#if !NETSTANDARD1_3 +#if NETFRAMEWORK using System.IO; using System.Runtime.Serialization.Formatters.Binary; diff --git a/src/log4net.Tests/log4net.Tests.csproj b/src/log4net.Tests/log4net.Tests.csproj index 6a056714f..a6a07979a 100644 --- a/src/log4net.Tests/log4net.Tests.csproj +++ b/src/log4net.Tests/log4net.Tests.csproj @@ -1,6 +1,6 @@  - net462;netcoreapp3.1 + net462;net7.0 NETSDK1138;CS1701 Local JScript @@ -29,6 +29,8 @@ bin\$(Configuration) Debug;Release AnyCPU + + CS8032 285212672 @@ -66,24 +68,25 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + + - - + + - - + + - - + + diff --git a/src/log4net/log4net.csproj b/src/log4net/log4net.csproj index b8c8b3fed..be9355b4f 100644 --- a/src/log4net/log4net.csproj +++ b/src/log4net/log4net.csproj @@ -197,7 +197,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive From f0771d0da0e11a27a9385ce40e4e36c48dbd918d Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Fri, 9 Feb 2024 15:40:34 +0200 Subject: [PATCH 097/122] :fire: remove .NET label - automation doesn't accept it --- .asf.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.asf.yaml b/.asf.yaml index aff1cfa5e..4f62ba8e0 100644 --- a/.asf.yaml +++ b/.asf.yaml @@ -34,7 +34,6 @@ github: labels: - apache - dotnet - - .NET - api - library - log4net From 2a013ea2888288df969f70f76e9a3e84eb22450a Mon Sep 17 00:00:00 2001 From: Justin Michaels Date: Tue, 23 Jan 2024 20:31:31 -0500 Subject: [PATCH 098/122] Removing username and password in SQL connection string to prevent CodeQL rule id cs/password-in-configuration false positive --- examples/mono/1.0/Tutorials/ConsoleApp/cs/src/App.config | 2 +- examples/net/1.1/Tutorials/ConsoleApp/cpp/src/App.config | 2 +- examples/net/1.1/Tutorials/ConsoleApp/js/src/App.config | 2 +- examples/net/2.0/Appenders/SampleAppendersApp/cs/src/App.config | 2 +- examples/net/2.0/Tutorials/ConsoleApp/cs/src/App.config | 2 +- examples/net/2.0/Tutorials/ConsoleApp/vb/src/App.config | 2 +- src/log4net/Appender/AdoNetAppender.cs | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/examples/mono/1.0/Tutorials/ConsoleApp/cs/src/App.config b/examples/mono/1.0/Tutorials/ConsoleApp/cs/src/App.config index f312d5f2b..93ce61107 100644 --- a/examples/mono/1.0/Tutorials/ConsoleApp/cs/src/App.config +++ b/examples/mono/1.0/Tutorials/ConsoleApp/cs/src/App.config @@ -145,7 +145,7 @@ - + diff --git a/examples/net/1.1/Tutorials/ConsoleApp/cpp/src/App.config b/examples/net/1.1/Tutorials/ConsoleApp/cpp/src/App.config index de78cf098..82dc979be 100644 --- a/examples/net/1.1/Tutorials/ConsoleApp/cpp/src/App.config +++ b/examples/net/1.1/Tutorials/ConsoleApp/cpp/src/App.config @@ -150,7 +150,7 @@ - + diff --git a/examples/net/1.1/Tutorials/ConsoleApp/js/src/App.config b/examples/net/1.1/Tutorials/ConsoleApp/js/src/App.config index dca56a769..4b7bba229 100644 --- a/examples/net/1.1/Tutorials/ConsoleApp/js/src/App.config +++ b/examples/net/1.1/Tutorials/ConsoleApp/js/src/App.config @@ -150,7 +150,7 @@ - + diff --git a/examples/net/2.0/Appenders/SampleAppendersApp/cs/src/App.config b/examples/net/2.0/Appenders/SampleAppendersApp/cs/src/App.config index 7016b3c67..33e306e9d 100644 --- a/examples/net/2.0/Appenders/SampleAppendersApp/cs/src/App.config +++ b/examples/net/2.0/Appenders/SampleAppendersApp/cs/src/App.config @@ -96,7 +96,7 @@ - + diff --git a/examples/net/2.0/Tutorials/ConsoleApp/cs/src/App.config b/examples/net/2.0/Tutorials/ConsoleApp/cs/src/App.config index f3d710252..a96ed7c49 100644 --- a/examples/net/2.0/Tutorials/ConsoleApp/cs/src/App.config +++ b/examples/net/2.0/Tutorials/ConsoleApp/cs/src/App.config @@ -150,7 +150,7 @@ - + diff --git a/examples/net/2.0/Tutorials/ConsoleApp/vb/src/App.config b/examples/net/2.0/Tutorials/ConsoleApp/vb/src/App.config index f3d710252..a96ed7c49 100644 --- a/examples/net/2.0/Tutorials/ConsoleApp/vb/src/App.config +++ b/examples/net/2.0/Tutorials/ConsoleApp/vb/src/App.config @@ -150,7 +150,7 @@ - + diff --git a/src/log4net/Appender/AdoNetAppender.cs b/src/log4net/Appender/AdoNetAppender.cs index b5d05842d..c4e3e358b 100644 --- a/src/log4net/Appender/AdoNetAppender.cs +++ b/src/log4net/Appender/AdoNetAppender.cs @@ -89,7 +89,7 @@ namespace log4net.Appender /// /// /// - /// + /// /// /// /// From 2640e822052a66c7ece486a33e21066a8bbab50e Mon Sep 17 00:00:00 2001 From: Jan Friedrich Date: Fri, 1 Mar 2024 11:24:11 +0100 Subject: [PATCH 099/122] - added release notes for 2.0.16 - changed csproj for deterministic builds --- src/log4net.Tests/log4net.Tests.csproj | 2 +- src/log4net/log4net.csproj | 6 +- src/site/xdoc/download_log4net.xml | 20 +- src/site/xdoc/release/release-notes.xml | 4147 ++++++++++++----------- 4 files changed, 2230 insertions(+), 1945 deletions(-) diff --git a/src/log4net.Tests/log4net.Tests.csproj b/src/log4net.Tests/log4net.Tests.csproj index a6a07979a..414b2a2d5 100644 --- a/src/log4net.Tests/log4net.Tests.csproj +++ b/src/log4net.Tests/log4net.Tests.csproj @@ -8,7 +8,6 @@ IE50 false Library - 3.5 publish\ true Disk @@ -29,6 +28,7 @@ bin\$(Configuration) Debug;Release AnyCPU + true CS8032 diff --git a/src/log4net/log4net.csproj b/src/log4net/log4net.csproj index be9355b4f..31f93b662 100644 --- a/src/log4net/log4net.csproj +++ b/src/log4net/log4net.csproj @@ -1,7 +1,7 @@  log4net - 2.0.15 + 2.0.16 Codestin Search App Apache log4net @@ -24,7 +24,7 @@ Apache-2.0 https://logging.apache.org/log4net/ package-icon.png - Copyright 2004-2017 The Apache Software Foundation + Copyright 2004-2024 The Apache Software Foundation logging log tracing logfiles git https://github.com/apache/logging-log4net @@ -41,7 +41,6 @@ IE50 false Library - 3.5 publish\ true Disk @@ -71,6 +70,7 @@ 4096 false false + true .NETFramework diff --git a/src/site/xdoc/download_log4net.xml b/src/site/xdoc/download_log4net.xml index 1ae3e4e5a..0a3430924 100644 --- a/src/site/xdoc/download_log4net.xml +++ b/src/site/xdoc/download_log4net.xml @@ -36,14 +36,14 @@ limitations under the License.
    -
    +
    - - - + + +
    apache-log4net-source-2.0.15.zipsha512pgpapache-log4net-source-2.0.16.zipsha512pgp
    @@ -52,14 +52,14 @@ limitations under the License.

    Binaries are available in a zip file or nupkg, which is also available from nuget.org

    - - - + + + - - - + + +
    log4net-binaries-2.0.15.zipsha512pgplog4net-binaries-2.0.16.zipsha512pgp
    log4net-2.0.15.nupkgsha512pgplog4net-2.0.16.nupkgsha512pgp
    diff --git a/src/site/xdoc/release/release-notes.xml b/src/site/xdoc/release/release-notes.xml index 08018c764..4bb166de9 100644 --- a/src/site/xdoc/release/release-notes.xml +++ b/src/site/xdoc/release/release-notes.xml @@ -17,1940 +17,2225 @@ limitations under the License. --> - - Nicko Cadell - Codestin Search App - - - - - - -
    -
    - Attention: .NET 3.5 Client Profile is no longer supported. I'm really sorry, I've tried - to keep as many of the legacy targets available as possible, but after spending another 4 or so - hours trying to get net35-client to build on any machine, I've given up - as far as I'm aware, - this should only affect Windows XP clients. I'm afraid 2.0.14 was the end of the road for you. - - Apache log4net 2.0.15 addresses reported issues: -
    -
      -
    • Improper usage of xml namespacing for netfx targets after a netstandard update ( - LOG4NET-685, - related LOG4NET-683)
    • -
    • Locking hashtables during write in RenderMap calls to make them thread-safe ( - LOG4NET-646)
    • -
    • An issue where RollingFilAppender would sometimes overwrite files instead of rolling them ( - LOG4NET-672)
    • -
    -
    -
    - -
    -
    -
    - Apache log4net 2.0.14 is a minor release to address some reported issues - and accept a pull request provided by a community member: -
    -
      -
    • Pull request by @NicholasNoise to address issues with logging via ado appender to PostgreSQL
    • -
    • Community request to correctly handle null data in ReadOnlyPropertiesDictionary
    • -
    • Pull request by @erikma to use the numeric thread id for .net worker pool threads - (LOG4NET-680)
    • -
    • Pull request by @erikma to dispose of WindowsIdentity retrieved in TryGetCurrentUserName() - (LOG4NET-671)
    • -
    -
    -
    -
    - Apache log4net 2.0.13 is a minor release to address some reported issues - and accept some pull requests provided by community members: -
    -
      -
    • Addresses issue [LOG4NET-583] with proposed solution by Emmo Emminghaus, - namely to provide an unique mutex identifier for the file rolling logic.
    • -
    • Accepts pull request 76 by @dschwartzni - to allow the netstandard2.0 library to be used within net472 web services
    • -
    • Accepts pull request 18 by @dmarlow - to update the xml layout mimicking log4j
    • -
    -
    -
    -
    -

    - Apache log4net 2.0.12 is a minor fix release to address reported issues on - non-windows platforms. -

    -
    -
      -
    • Addresses the issues reported in - [LOG4NET-652] - and [LOG4NET-653] whereby - logging could throw a PlatformNotSupported exception when the username - is required within logs on non-Windows platforms. The implemented - behavior is to fall back, where possible, on Environment.UserName - or provide text that the facility is not supported. -
    • -
    -
    -
    -
    - Apache log4net 2.0.11 fixes incorrect version strings within the released - binaries and contains some minor fixes to correctly dispose of StreamWriters - used during log flushing, thanks to community member @NicholasNoise -
    -
    -

    - Apache log4net 2.0.10 improves netstandard2.0 support - thanks to community member @NicholasNoise. -

    -
    -
      -
    • - [LOG4NET-575] - Addresses CVE-2018-1285 by cherry-picking the fix from - Dominik Psenner, reported by Karthik Balasundaram, as it already - existed in the the develop branch -
    • -
    -
    -
    - -
    -

    - Apache log4net 2.0.9 adds netstandard2.0 support - and restructures the project to enable easier build as well as build - at AppVeyer. Project files have been updated to the modern Sdk format. -

    -
    -
      -
    • [LOG4NET-559] Add null - checkes to avoid issues thrown by custom appenders -
    • -
    • [LOG4NET-563] Site styling - copied from log4j -
    • -
    -
    -
    -
    -

    - Apache log4net 2.0.8 fixes a - LockRecursionException - that could happen - inside the FileAppender under certain - circumstances. It also adds support for - LogicalThreadContext - to the .NET Standard - build based on AsyncLocal rather than - CallContext. -

    - -
    -
      -
    • [LOG4NET-466] - "LockRecursionException: - A read lock may not be acquired with the write lock held in this mode." exception -
    • -
    • [LOG4NET-550] - Logging - recursively from an Appender not supported for NET_4_0 and MONO_4_0 -
    • -
    • [LOG4NET-551] - - LockRecursionException when using File Appenders -
    • -
    • [LOG4NET-554] - - LogicalThreadContext was removed in .NETStandard -
    • -
    -
    - -
    -
      -
    • [LOG4NET-553] - - DebugAppender - configuration should give the possibility to disable outputting loggerName as category -
    • -
    -
    -
    - -
    -

    - Apache log4net 2.0.7 fixes a glitch in nuget packaging and - is otherwise identical to 2.0.6 (apart from the copyright - year and assembly version). If you are not using the nuget - package there is no reason to upgrade. -

    - -
    -
      -
    • [LOG4NET-540] - nuget - dependencies for .NET Standard leak into net46 -
    • -
    -
    -
    - -
    - -

    - The Apache log4net team is now responsible for the nuget - package, we've changed the version number of this release - to align the version numbers. Release 2.0.6 is supposed to - be compatible with 1.2.15. -

    - -

    - The binary distributions no longer contain assemblies - built for the .NET Framework 1.x or Mono 1.x - you can - build those yourself using the source distribution. -

    - -

    - Starting with 2.0.6 .NET Core - or more precisely - .NET Standard 1.3 - has become a supported platform. Please - note that several features of log4net are not available - when using the .NET Core version, see framework - support - for details. -

    - -
    -
      -
    • [LOG4NET-508] - NAnt release - build is not optimized -
    • -
    • [LOG4NET-512] - Thread - safety - issue in Hierarchy.cs -
    • -
    • [LOG4NET-527] - broken link - on - config-examples.html -
    • -
    • [LOG4NET-529] - Possible - thread-safety bug in LoggingEvent -
    • -
    • [LOG4NET-536] - Can't - build - for NETCF-2.0 -
    • -
    -
    -
    -
      -
    • [LOG4NET-530] - Use UTC - internally to avoid ambiguous timestamps -
    • -
    -
    - -
    -
      -
    • [LOG4NET-467] - Is .NET - Core, - will be supported in the near future, or not -
    • -
    • [LOG4NET-511] - API to flush - appenders -
    • -
    • [LOG4NET-526] - Add - appSetting - conversion pattern to PatternString -
    • -
    -
    -
    - -
    -
    -
      -
    • [LOG4NET-462] - - ReadOnlyPropertiesDictionary not thread safe -
    • -
    • [LOG4NET-488] - Fix tests - build -
    • -
    • [LOG4NET-489] - - AdoNetAppender - fails after upgrade to 2.0.4 -
    • -
    • [LOG4NET-490] - - InterProcessLock - Tests fail -
    • -
    • [LOG4NET-493] - Log4net - 1.2.14/ADO.NET appender throws exception when starting (1.2.13 with same config works fine) -
    • -
    • [LOG4NET-494] - - ArgumentOutOfRange with SQLite -
    • -
    • [LOG4NET-495] - Error when - BufferSize is >1, parameter already defined -
    • -
    -
    -
    - -
    -
    -
      -
    • [LOG4NET-408] - Correction - on - InterProcessLock -
    • -
    • [LOG4NET-443] - - Logger.CallAppenders -
    • -
    • [LOG4NET-447] - - MemoryAppender - class is not thread safe -
    • -
    • [LOG4NET-455] - - LogicalThreadContext does not flow correctly through async/await -
    • -
    • [LOG4NET-479] - Cannot - compile - log4net.vs2008 -
    • -
    • [LOG4NET-484] - - System.ObjectDisposedException with FileAppender+InterProcessLock -
    • -
    • [LOG4NET-485] - - RollingFileAppender cannot be used by multiple process -
    • -
    • [LOG4NET-486] - Rolling File - Appender with 'maxSizeRollBackups' and 'datePattern' does not detect - existing - logs initially -
    • -
    -
    - -
    -
      -
    • [LOG4NET-456] - Include - debug - symbol files in release packages -
    • -
    • [LOG4NET-457] - SMTP - Appender - should trim leading and trailing separators from address fields -
    • -
    -
    - -
    -
      -
    • [LOG4NET-473] - Option for - file - extension in SmtpPickupDirAppender -
    • -
    -
    -
    - -
    - -
    -
      -
    • [LOG4NET-132] - Environment - variables are mistakenly case sensitive on windows -
    • -
    • [LOG4NET-376] - Race - condition - in AbsoluteTimeDateFormatter -
    • -
    • [LOG4NET-393] - Using - dynamic - methods with log4net causes NullReferenceException in StackFrameItem -
    • -
    • [LOG4NET-399] - Does not - build - for Compact Framework 2.0 -
    • -
    • [LOG4NET-404] - assemblies - for - .NET 3.5 are missing ILogExtensions -
    • -
    • [LOG4NET-405] - SmtpAppender - encoding changes -
    • -
    - -
    - -
    - -
      -
    • [LOG4NET-394] - Lambda-based - ILog-Extensions should catch errors -
    • -
    - -
    -
    - -
    - -

    - The binary distributions no longer contain assemblies - built for the Compact Framework 2.0 - you can build - those yourself using the source distribution. -

    - -
    -
      -
    • [LOG4NET-148] - - ThreadContext - uses LocalDataStore to store ThreadSpecific data instead should be using [ThreadStatic] - variables. -
    • -
    • [LOG4NET-178] - Log4Net - stops - logging after appdomain recycle of ASP.NET2.0 application -
    • -
    • [LOG4NET-202] - - AdoNetAppenderParameter.Size Property is not optional -
    • -
    • [LOG4NET-218] - Test - StringFormatTest.TestFormatString fails -
    • -
    • [LOG4NET-220] - multiple - users - overwrite existing log file when RollingFileAppender is rolling over date and minimal - locking is - used -
    • -
    • [LOG4NET-228] - - log4net.Util.HostName may throw System.Configuration.ConfigurationErrorsException in - System.Net.Dns.GetHostName(). The exception should be ignored. -
    • -
    • [LOG4NET-266] - - AdoNetAppender - does not work on a IIS 7 website using Windows authentication -
    • -
    • [LOG4NET-277] - Registering - a - custom Object Renderer in configuration file -
    • -
    • [LOG4NET-284] - In a - multithreaded application, duplicate messages are output. -
    • -
    • [LOG4NET-294] - Exception - rendering object type [System.OutOfMemoryException] -
    • -
    • [LOG4NET-317] - - LogicalThreadContext sometimes doesn't follow CallContext's logical thread -
    • -
    • [LOG4NET-322] - Conditional - compilation symbols for .net4 Release -
    • -
    • [LOG4NET-323] - - AbsoluteTimeDateFormatter caches string representation of now too aggressively -
    • -
    • [LOG4NET-331] - - AdoNetAppender - errors when writing Asp.net item when Request object is null -
    • -
    • [LOG4NET-335] - Lost the - ability - to monitor changes to logger config files when you call ConfigureAndWatch multiple times - with - different Config File Names - worked fine on 1.2.10.0 -
    • -
    • [LOG4NET-341] - - RemotingAppender - Error -
    • -
    • [LOG4NET-343] - - ArgumentOutOfRangeException in log4net hierarchy on "." logger name -
    • -
    • [LOG4NET-347] - Log4net not - working in an ASP.Net environment with medium trust -
    • -
    • [LOG4NET-348] - - System.IndexOutOfRangeException when StackFrameLevel is greater then StackFrames length -
    • -
    • [LOG4NET-352] - CS0419 - during - build with Mono >2.6 -
    • -
    • [LOG4NET-360] - - EventLogAppender - can corrupt the event log on Windows Vista and higher if the string is longer than 31839 - bytes -
    • -
    • [LOG4NET-361] - - RollingLogFileAppender does not correctly initialize the backup index when style is date or - composite -
    • -
    • [LOG4NET-369] - - preserveLogFileNameExtension is not considered when rolling over time after an application - restart -
    • -
    • [LOG4NET-370] - - RemoteSyslogAppender doesn't properly handle newline in log message -
    • -
    • [LOG4NET-371] - Log with - formatting doesn't call custom renderers (IObjectRenderer) -
    • -
    • [LOG4NET-375] - typo / - misspelling in log message -
    • -
    • [LOG4NET-378] - Rolling log - file - is overwritten when application is restarted -
    • -
    • [LOG4NET-379] - - NullReferenceException in FileAppender when file is not filled. -
    • -
    • [LOG4NET-382] - - TargetInvocationException occurs because MESSAGE_SIZE fields in EventLogAppender are - initialized - in wrong order -
    • -
    -
    - -
    -
      -
    • [LOG4NET-222] - [PATCH] - Improve - AnsiColorTerminalAppender to support marking colors as Light -
    • -
    • [LOG4NET-223] - [PATCH] - Improve - AnsiColorTerminalAppender to support marking colors as Light -
    • -
    • [LOG4NET-232] - Use - ReaderWriterLockSlim instead of ReaderWriterLock. -
    • -
    • [LOG4NET-259] - Log4Net does - not - create a new tab in Chainsaw -
    • -
    • [LOG4NET-283] - - OnlyOnceErrorHandler is not subclass-friendly -
    • -
    • [LOG4NET-292] - Managed - ColoredConsoleAppender for .NET2/Mono. -
    • -
    • [LOG4NET-315] - SmtpAppender - - - Add support for ignoring certificate errors -
    • -
    • [LOG4NET-316] - Provide a - Layout - Pattern that is re-evaluated on each use -
    • -
    • [LOG4NET-318] - log4net - doesn't - pass verification -
    • -
    • [LOG4NET-334] - Appender - Faill - over -
    • -
    • [LOG4NET-354] - E-mail - encoding - configuration setting for SmtpAppender -
    • -
    • [LOG4NET-362] - [PATCH] - SystemInfo.AssemblyLocationInfo throws unhandled ArgumentException "Absolute path - required" - when exe is started via UNC path -
    • -
    • [LOG4NET-386] - Can't - access - ThreadContext properties -
    • -
    -
    - -
    -
      -
    • [LOG4NET-290] - Add - Lambda-based - ILog-Extensions (embedded log.IsEnabled) -
    • -
    • [LOG4NET-342] - Add a way to - prevent silent failure -
    • -
    -
    -
    - -
    -

    - log4net 1.2.11 is not only a bugfix release, it also - adds support for Microsoft® .NET 4.0 as well as the client profiles - of .NET 3.5 and .NET 4.0. -

    - -

    - Starting with this release log4net uses a new strong - name key but we also provide a binary distribution using - the "old" strong name key of log4net 1.2.10 and earlier. - See the FAQ for details. -

    - -

    - The binary distributions no longer contain assemblies - built for the Compact Framework 1.0 or the Shared Source - CLI - you can build those yourself using the source - distribution. -

    - -
    -

    - The signature of - ILoggerFactory.CreateLogger - has changed. -

    -
    - -
    -
      -
    • [LOG4NET-76] - - TextWriterAdapter - is not thread safe -
    • -
    • [LOG4NET-79] - - SecurityException - thrown in LogicalThreadContextProperties GetProperties -
    • -
    • [LOG4NET-81] - - LoggerRepositorySkeleton's OnConfigurationChanged method always raises its event with - EventArgs.Empty instead of passing through its EventArgs parameter. -
    • -
    • [LOG4NET-93] - Typos for node - name in tutorial, excess quote, invalid XML -
    • -
    • [LOG4NET-94] - Incorrect - config - file for ..\examples\net\1.0\Tutorials\ConsoleApp -
    • -
    • [LOG4NET-95] - - Level.CompareTo() - may result a wrong Value -> sorting of Levels does not work -
    • -
    • [LOG4NET-113] - - SystemInfo.GetTypeFromString() raises NotSupportedException -
    • -
    • [LOG4NET-123] - - EnvironmentPatternConverter does not expand User or System level environment variables under - Windows -
    • -
    • [LOG4NET-126] - Links on the - log4net Examples page do not work, including the overview link explaining why the other - links do - not work -
    • -
    • [LOG4NET-128] - Either - documentation is incorrect or a bug in SmtpAppender -
    • -
    • [LOG4NET-129] - - EventLogAppender - EventID parsing does not handle Active Properties properly -
    • -
    • [LOG4NET-135] - Bad example - code - in documentation -
    • -
    • [LOG4NET-137] - - log4net.Filter.LevelMatchFilter does not work anymore -
    • -
    • [LOG4NET-143] - Invalid - Repository Config Uri composition from "log4net.Config" application setting -
    • -
    • [LOG4NET-146] - - System.NullReferenceException on FindAndRender object -
    • -
    • [LOG4NET-158] - - XMLConfigurator.ConfigureAndWatch() leaks resources if called multiple times -
    • -
    • [LOG4NET-167] - - ArrayOutOfBounds - Exception in MemoryAppender.getEvents() -
    • -
    • [LOG4NET-212] - Threading - bug in - the PatternConverter.cs -
    • -
    • [LOG4NET-214] - - EventLogAppender - should also use config file to set EventId -
    • -
    • [LOG4NET-215] - Exception on - Convert for return %class{1} name -
    • -
    • [LOG4NET-229] - Japanese - characters get garbled with log4net.Layout.XmlLayoutSchemaLog4j -
    • -
    • [LOG4NET-241] - Issue - tracking - page does not link to project -
    • -
    • [LOG4NET-242] - Download - page - does not have link to KEYS file -
    • -
    • [LOG4NET-243] - broken link - on - http://logging.apache.org/log4net/release/example-apps.html -
    • -
    • [LOG4NET-244] - - SmtpAppender.To - Property has incorrect delimiter -
    • -
    • [LOG4NET-257] - Visual - Studio - 2010 .NET 4.0 Application does not copy log4net lib to bin directory -
    • -
    • [LOG4NET-265] - - RemoteFileAppender Tests fail on Windows 7 -
    • -
    • [LOG4NET-274] - log4net - doesn't - log when running a .Net 4.0 Windows application built in Release mode -
    • -
    • [LOG4NET-297] - - AppenderSkeleton.RequiresLayout docs and implementation don't match -
    • -
    • [LOG4NET-300] - FilterTest - doesn't - compile for .Net 2.0 -
    • -
    • [LOG4NET-301] - Unit tests - fail - on a clean checkout on .NET 2.0 using NAnt -
    • -
    • [LOG4NET-310] - - EventLogAppender's - ActivateOptions throws SecurityException on Vista/Win2k3 and later when not run as - administrator -
    • -
    • [LOG4NET-311] - MinimalLock - and - AppendToFile=false don't work together in trunk's FileAppender -
    • -
    -
    - -
    -
      -
    • [LOG4NET-31] - Allow user to - pass - in additional parameters to <converter> node via some kind of <property> tag -
    • -
    • [LOG4NET-38] - - EventLogAppender: - Add support for setting the Category on Event Log messages. -
    • -
    • [LOG4NET-66] - - PreserveFileExtension with StaticFileName -
    • -
    • [LOG4NET-77] - A small - improvement of log4net.Layout.Pattern.ExceptionPatternConverter - added 'Option' - propery - support -
    • -
    • [LOG4NET-88] - support .NET - 2.0 - connectionStrings configuration section -
    • -
    • [LOG4NET-96] - Expose the - Message, Exception, and ErrorCode properties of OnlyOnceErrorHandler. -
    • -
    • [LOG4NET-97] - Make Hierarchy's - ILoggerFactory aware of the repository's LevelMap -
    • -
    • [LOG4NET-98] - Update header - comment in files to be compliant with new Apache header requirements: - http://www.apache.org/legal/src-headers.html for 11/1/2006 deadline -
    • -
    • [LOG4NET-100] - - IPAddressConverter improvement for .NET 2 or .NET 3 -
    • -
    • [LOG4NET-106] - - TraceAppender : - Add switch to disable using logger name as trace category -
    • -
    • [LOG4NET-112] - Add support - to - the UdpAppender for IP v6 remote addresses -
    • -
    • [LOG4NET-131] - Add Cc and - Bcc - support to SmtpAppender -
    • -
    • [LOG4NET-141] - Add - CreateConnection method to AdoNetAppender to allow subclasses to have control of - IDbConnection. -
    • -
    • [LOG4NET-153] - Make it - easier - to configure multiple appenders in code using BasicConfigurator -
    • -
    • [LOG4NET-157] - FAQ for - getting - the fully-qualified name of a class -
    • -
    • [LOG4NET-164] - using a - named - mutex for file appenders -
    • -
    • [LOG4NET-170] - - Documentation - improvement re: fixing and active properties -
    • -
    • [LOG4NET-246] - Make it - possible - to choose whether or not to watch configuration files specified using the "log4net.Config" - appsetting key -
    • -
    - -
    -
    -
      -
    • The various static Configure methods of the Configurator classes - now - return collections of configuration messages rather than void. -
    • -
    • [LOG4NET-59] - add the - ability to - roll files based on universal time (UTC). -
    • -
    • [LOG4NET-64] - add the - ability to - preserve the log file name extension when rolling the log file. -
    • -
    • [LOG4NET-87] - Support - ASP.Net - related PatternConverters to allow items from the HttpContext.Current.Session, Cache, - Request, - etc. to be captured. -
    • [LOG4NET-92] - Build for - Compact Framework 2.0 -
    • -
    • [LOG4NET-107] - Added - ExceptionEvaluator -
    • -
    • [LOG4NET-115] - Expand - UserAppDataPath in filename -
    • -
    • [LOG4NET-116] - allow - smtp - to ssl authenticate and with certificates. -
    • -
    • [LOG4NET-154] - Add a - StackTracePatternConverter to display method calls leading up to log message -
    • -
    • [LOG4NET-155] - Add - TimeEvaluator -
    • -
    • [LOG4NET-168] - New - property - ReplyTo address for the SmtpAppender required -
    • -
    • [LOG4NET-176] - - Buildable - with VS 2008 and .NET FW 3.5 -
    • -
    • [LOG4NET-233] - Support - .NET - 4.0 including Client Profile -
    • - -
    -
    - -
    - -
    - -
    -
      -
    • [LOG4NET-21] - - RemotingAppender - fails once NDC becomes empty -
    • -
    • [LOG4NET-22] - XmlLayout - allows - output of invalid control characters -
    • -
    • [LOG4NET-23] - - example-apps.html - links are off by one folder level -
    • -
    • [LOG4NET-25] - - RollingFileAppender - can fail if RollOverIfDateBoundaryCrossing required -
    • -
    • [LOG4NET-28] - AdoNetAppender - does - not support inserting NULL into columns -
    • -
    • [LOG4NET-29] - - LevelMatchFilter - should return Neutral when no match is found -
    • -
    • [LOG4NET-32] - AdoNetAppender - losing first entry -
    • -
    • [LOG4NET-35] - Exception - rendering - ThreadContextStack if null value pushed into stack -
    • -
    • [LOG4NET-36] - - System.Diagnostics.Trace may throw exception if AppDomain does not have config file -
    • -
    • [LOG4NET-40] - - RollingFileAppender - does not limit files to MaxSizeRollBackups when CountDirection is 1 -
    • -
    • [LOG4NET-41] - - RollingFileAppender - roll over date fail -
    • -
    • [LOG4NET-42] - Serialised - LoggingEvent does not preserve the Fix flags -
    • -
    • [LOG4NET-43] - Specifying an - empty - string as a property in the config file results in an error -
    • -
    • [LOG4NET-44] - XmlLayout emits - all - properties under a node named global-properties, rather than just properties. -
    • -
    • [LOG4NET-49] - - CountingQuietTextWriter does not count strings written with WriteLine -
    • -
    • [LOG4NET-50] - - Process.StartTime - hangs on some systems -
    • -
    • [LOG4NET-60] - Bug in - RollingFileAppender.cs causing failure to timely roll files on monthly interval -
    • -
    • [LOG4NET-63] - 1.2.9.0 - Documentation typos -
    • -
    • [LOG4NET-65] - Unhandled - SecurityException exception for FileIOPermission while loading configuration file -
    • -
    • [LOG4NET-67] - CVE-2006-0743 - Security vulnerability in LocalSyslogAppender -
    • -
    • [LOG4NET-69] - Exception - thrown - when *Format methods are given a malformed format string -
    • -
    • [LOG4NET-70] - CoreDll.dll - referenced with different capitalisation -
    • -
    • [LOG4NET-73] - - ADONetAppender.ActivateOptions() leaks database connection when called multiple times -
    • -
    -
    - -
    -
      -
    • [LOG4NET-11] - Add Flush - command - to API -
    • -
    • [LOG4NET-24] - Programmatic - flush - of BufferingAppenderSkeleton buffer -
    • -
    • [LOG4NET-37] - Allow the - RepositorySelector type to be specified using the AppSettings config -
    • -
    • [LOG4NET-46] - Support - appenders - that can output multiple events efficiently -
    • -
    • [LOG4NET-51] - WmiAppender -
    • -
    -
    - -
    -
      -
    • [LOG4NET-3] - Support per event - patterns in FileAppender File name -
    • -
    • [LOG4NET-13] - Allow - SMTPAppender - to have replaceable parameters in Subject -
    • -
    • [LOG4NET-15] - Email high - "importance" priority setting with SmtpAppender -
    • -
    • [LOG4NET-17] - Line-wrapping - Appender Layouts -
    • -
    • [LOG4NET-33] - Ability to use - global property to point to log4net configuration file -
    • -
    • [LOG4NET-34] - Allow xml - config - values to be set via XmlNodeType.CDATA or XmlNodeType.Text rather than just value="foo" -
    • -
    • [LOG4NET-45] - PluginAttribute - does not allow plugin type to be specified as a Type, only as a string -
    • -
    • [LOG4NET-52] - Allow XML - configurator to set properties of type Object -
    • -
    • [LOG4NET-53] - Allow - repository - properties to be set in the config file -
    • -
    • [LOG4NET-56] - Support - rendering - IEnumerator objects as well as ICollections -
    • -
    • [LOG4NET-58] - Support clean - build - on .NET 2.0 -
    • -
    • [LOG4NET-72] - Performance of - ILog.xxxFormat methods -
    • -
    • [LOG4NET-74] - Change - MemoryAppender member variables to protected -
    • -
    -
    - -
    - -
    - -
    -

    Renamed namespaces

    -

    - Renamed namespace log4net.spi to - log4net.Core. - Renamed namespace log4net.helpers to - log4net.Util. -

    -

    Renamed config classes and attributes

    -

    - In the log4net.Config namespace the - DOMConfigurator, - DOMConfiguratorAttribute, DomainAttribute, - and AliasDomainAttribute have been marked as obsolete. These types are - still available and functional in this release. -

    -

    - The XmlConfigurator and - XmlConfiguratorAttribute - types replace DOMConfigurator and - DOMConfiguratorAttribute. The - RepositoryAttribute - and AliasRepositoryAttribute types replace - DomainAttribute - and AliasDomainAttribute. -

    -

    Fixed pascal casing of type names

    -

    - Renamed AdoNetAppender, AspNetTraceAppender, - SmtpAppender, Iso8601DateFormatter, - MdcFilter, and NdcFilter. - Note that the config file type resolver is case insensitive so this is only a breaking change - for code that programmatically creates a type that has been renamed. -

    -

    Layouts changed to stream their output to a - TextWriter -

    -

    - Layouts have been changed to format their output to a - TextWriter - rather than return a string. This increases performance and reduces temporary object creation. -

    -

    C style string escapes no longer supported by config parser

    -

    - The XML config parser no longer supports decoding C style escape sequences in strings. - Previously sequences like \n and - \\ - where decoded. Instead use the appropriate XML encodings as required. -

    -
    - -
    -

    New CLI build

    -

    - A new log4net assembly is built that targets all CLI 1.0 compatible runtimes. - This build is essentially a common subset of the Mono 1.0 and .NET 1.0 builds. - It is built using the MS .NET 1.0 compiler and libraries but does not use any - platform specific APIs. -

    -

    - This build is only available in release configuration and can be found at - bin\cli\1.0\release. -

    -

    Logging contexts

    -

    - Logging contexts can be used to record contextual data that is relevant to the current - process. Logging contexts are both an extension of the concepts embodied in the - MDC - and NDC and a replacement for - them. The MDC and NDC have been - reimplemented to use the ThreadContext as storage. -

    -

    - The logging contexts provide a single unified view that cuts across different - scopes within an application. - The contexts are layered in the following order of narrowing scope: - GlobalContext, ThreadContext, - LogicalThreadContext, and LoggingEvent. - Context values specified in a narrower scope hide the matching value in a wider scope. -

    -

    - PatternLayout - customization and long pattern names -

    -

    - The PatternLayout now supports long pattern names. - These pattern names are significantly more readable than the single character patterns. -

    -

    - The PatternLayout now supports custom patterns. New patterns - can be defined in the config file: -

    -
    -
    -                            <layout type="log4net.Layout.PatternLayout">
    -
    -                            <converter>
    -                            <name value="myConverter" />
    -                            <type value="TestApp.MyPatternConverter, TestApp" />
    -                            </converter>
    -
    -                            <conversionPattern value="%-5level %logger - %myConverter - %message%newline" />
    -                            </layout>
    -                        
    -
    -

    - The above config defines a custom pattern called - myConverter - which is bound to the - TestApp.MyPatternConverter, TestApp - type. This type must extend the - log4net.Util.PatternConverter - base class. The custom pattern can then be used in the pattern string. -

    -

    - For full details see the SDK Reference entry: + Nicko Cadell + Codestin Search App + + + + + + +

    +
    + Apache log4net 2.0.16 addresses reported issues: +
    + +
    +
    + +
    +
    +
    + Attention: .NET 3.5 Client Profile is no longer supported. I'm really sorry, I've tried + to keep as many of the legacy targets available as possible, but after spending another 4 or so + hours trying to get net35-client to build on any machine, I've given up - as far as I'm aware, + this should only affect Windows XP clients. I'm afraid 2.0.14 was the end of the road for you. + + Apache log4net 2.0.15 addresses reported issues: +
    +
      +
    • + Improper usage of xml namespacing for netfx targets after a netstandard update ( + LOG4NET-685, + related LOG4NET-683) +
    • +
    • + Locking hashtables during write in RenderMap calls to make them thread-safe ( + LOG4NET-646) +
    • +
    • + An issue where RollingFilAppender would sometimes overwrite files instead of rolling them ( + LOG4NET-672) +
    • +
    +
    +
    + +
    +
    +
    + Apache log4net 2.0.14 is a minor release to address some reported issues + and accept a pull request provided by a community member: +
    +
      +
    • + Pull request by @NicholasNoise to address issues with logging via ado appender to PostgreSQL +
    • +
    • Community request to correctly handle null data in ReadOnlyPropertiesDictionary
    • +
    • + Pull request by @erikma to use the numeric thread id for .net worker pool threads + (LOG4NET-680) +
    • +
    • + Pull request by @erikma to dispose of WindowsIdentity retrieved in TryGetCurrentUserName() + (LOG4NET-671) +
    • +
    +
    +
    +
    + Apache log4net 2.0.13 is a minor release to address some reported issues + and accept some pull requests provided by community members: +
    +
      +
    • + Addresses issue [LOG4NET-583] with proposed solution by Emmo Emminghaus, + namely to provide an unique mutex identifier for the file rolling logic. +
    • +
    • + Accepts pull request 76 by @dschwartzni + to allow the netstandard2.0 library to be used within net472 web services +
    • +
    • + Accepts pull request 18 by @dmarlow + to update the xml layout mimicking log4j +
    • +
    +
    +
    +
    +

    + Apache log4net 2.0.12 is a minor fix release to address reported issues on + non-windows platforms. +

    +
    +
      +
    • + Addresses the issues reported in + [LOG4NET-652] + and [LOG4NET-653] whereby + logging could throw a PlatformNotSupported exception when the username + is required within logs on non-Windows platforms. The implemented + behavior is to fall back, where possible, on Environment.UserName + or provide text that the facility is not supported. +
    • +
    +
    +
    +
    + Apache log4net 2.0.11 fixes incorrect version strings within the released + binaries and contains some minor fixes to correctly dispose of StreamWriters + used during log flushing, thanks to community member @NicholasNoise +
    +
    +

    + Apache log4net 2.0.10 improves netstandard2.0 support + thanks to community member @NicholasNoise. +

    +
    +
      +
    • + [LOG4NET-575] + Addresses CVE-2018-1285 by cherry-picking the fix from + Dominik Psenner, reported by Karthik Balasundaram, as it already + existed in the the develop branch +
    • +
    +
    +
    + +
    +

    + Apache log4net 2.0.9 adds netstandard2.0 support + and restructures the project to enable easier build as well as build + at AppVeyer. Project files have been updated to the modern Sdk format. +

    +
    +
      +
    • + [LOG4NET-559] Add null + checkes to avoid issues thrown by custom appenders +
    • +
    • + [LOG4NET-563] Site styling + copied from log4j +
    • +
    +
    +
    +
    +

    + Apache log4net 2.0.8 fixes a + LockRecursionException + that could happen + inside the FileAppender under certain + circumstances. It also adds support for + LogicalThreadContext + to the .NET Standard + build based on AsyncLocal rather than + CallContext. +

    + +
    +
      +
    • + [LOG4NET-466] - "LockRecursionException: + A read lock may not be acquired with the write lock held in this mode." exception +
    • +
    • + [LOG4NET-550] - Logging + recursively from an Appender not supported for NET_4_0 and MONO_4_0 +
    • +
    • + [LOG4NET-551] - + LockRecursionException when using File Appenders +
    • +
    • + [LOG4NET-554] - + LogicalThreadContext was removed in .NETStandard +
    • +
    +
    + +
    +
      +
    • + [LOG4NET-553] - + DebugAppender + configuration should give the possibility to disable outputting loggerName as category +
    • +
    +
    +
    + +
    +

    + Apache log4net 2.0.7 fixes a glitch in nuget packaging and + is otherwise identical to 2.0.6 (apart from the copyright + year and assembly version). If you are not using the nuget + package there is no reason to upgrade. +

    + +
    +
      +
    • + [LOG4NET-540] - nuget + dependencies for .NET Standard leak into net46 +
    • +
    +
    +
    + +
    + +

    + The Apache log4net team is now responsible for the nuget + package, we've changed the version number of this release + to align the version numbers. Release 2.0.6 is supposed to + be compatible with 1.2.15. +

    + +

    + The binary distributions no longer contain assemblies + built for the .NET Framework 1.x or Mono 1.x - you can + build those yourself using the source distribution. +

    + +

    + Starting with 2.0.6 .NET Core - or more precisely + .NET Standard 1.3 - has become a supported platform. Please + note that several features of log4net are not available + when using the .NET Core version, see + framework + support + for details. +

    + +
    +
      +
    • + [LOG4NET-508] - NAnt release + build is not optimized +
    • +
    • + [LOG4NET-512] - Thread + safety + issue in Hierarchy.cs +
    • +
    • + [LOG4NET-527] - broken link + on + config-examples.html +
    • +
    • + [LOG4NET-529] - Possible + thread-safety bug in LoggingEvent +
    • +
    • + [LOG4NET-536] - Can't + build + for NETCF-2.0 +
    • +
    +
    +
    +
      +
    • + [LOG4NET-530] - Use UTC + internally to avoid ambiguous timestamps +
    • +
    +
    + +
    +
      +
    • + [LOG4NET-467] - Is .NET + Core, + will be supported in the near future, or not +
    • +
    • + [LOG4NET-511] - API to flush + appenders +
    • +
    • + [LOG4NET-526] - Add + appSetting + conversion pattern to PatternString +
    • +
    +
    +
    + +
    +
    +
      +
    • + [LOG4NET-462] - + ReadOnlyPropertiesDictionary not thread safe +
    • +
    • + [LOG4NET-488] - Fix tests + build +
    • +
    • + [LOG4NET-489] - + AdoNetAppender + fails after upgrade to 2.0.4 +
    • +
    • + [LOG4NET-490] - + InterProcessLock + Tests fail +
    • +
    • + [LOG4NET-493] - Log4net + 1.2.14/ADO.NET appender throws exception when starting (1.2.13 with same config works fine) +
    • +
    • + [LOG4NET-494] - + ArgumentOutOfRange with SQLite +
    • +
    • + [LOG4NET-495] - Error when + BufferSize is >1, parameter already defined +
    • +
    +
    +
    + +
    +
    +
      +
    • + [LOG4NET-408] - Correction + on + InterProcessLock +
    • +
    • + [LOG4NET-443] - + Logger.CallAppenders +
    • +
    • + [LOG4NET-447] - + MemoryAppender + class is not thread safe +
    • +
    • + [LOG4NET-455] - + LogicalThreadContext does not flow correctly through async/await +
    • +
    • + [LOG4NET-479] - Cannot + compile + log4net.vs2008 +
    • +
    • + [LOG4NET-484] - + System.ObjectDisposedException with FileAppender+InterProcessLock +
    • +
    • + [LOG4NET-485] - + RollingFileAppender cannot be used by multiple process +
    • +
    • + [LOG4NET-486] - Rolling File + Appender with 'maxSizeRollBackups' and 'datePattern' does not detect + existing + logs initially +
    • +
    +
    + +
    +
      +
    • + [LOG4NET-456] - Include + debug + symbol files in release packages +
    • +
    • + [LOG4NET-457] - SMTP + Appender + should trim leading and trailing separators from address fields +
    • +
    +
    + +
    +
      +
    • + [LOG4NET-473] - Option for + file + extension in SmtpPickupDirAppender +
    • +
    +
    +
    + +
    + +
    +
      +
    • + [LOG4NET-132] - Environment + variables are mistakenly case sensitive on windows +
    • +
    • + [LOG4NET-376] - Race + condition + in AbsoluteTimeDateFormatter +
    • +
    • + [LOG4NET-393] - Using + dynamic + methods with log4net causes NullReferenceException in StackFrameItem +
    • +
    • + [LOG4NET-399] - Does not + build + for Compact Framework 2.0 +
    • +
    • + [LOG4NET-404] - assemblies + for + .NET 3.5 are missing ILogExtensions +
    • +
    • + [LOG4NET-405] - SmtpAppender + encoding changes +
    • +
    + +
    + +
    + +
      +
    • + [LOG4NET-394] - Lambda-based + ILog-Extensions should catch errors +
    • +
    + +
    +
    + +
    + +

    + The binary distributions no longer contain assemblies + built for the Compact Framework 2.0 - you can build + those yourself using the source distribution. +

    + +
    +
      +
    • + [LOG4NET-148] - + ThreadContext + uses LocalDataStore to store ThreadSpecific data instead should be using [ThreadStatic] + variables. +
    • +
    • + [LOG4NET-178] - Log4Net + stops + logging after appdomain recycle of ASP.NET2.0 application +
    • +
    • + [LOG4NET-202] - + AdoNetAppenderParameter.Size Property is not optional +
    • +
    • + [LOG4NET-218] - Test + StringFormatTest.TestFormatString fails +
    • +
    • + [LOG4NET-220] - multiple + users + overwrite existing log file when RollingFileAppender is rolling over date and minimal + locking is + used +
    • +
    • + [LOG4NET-228] - + log4net.Util.HostName may throw System.Configuration.ConfigurationErrorsException in + System.Net.Dns.GetHostName(). The exception should be ignored. +
    • +
    • + [LOG4NET-266] - + AdoNetAppender + does not work on a IIS 7 website using Windows authentication +
    • +
    • + [LOG4NET-277] - Registering + a + custom Object Renderer in configuration file +
    • +
    • + [LOG4NET-284] - In a + multithreaded application, duplicate messages are output. +
    • +
    • + [LOG4NET-294] - Exception + rendering object type [System.OutOfMemoryException] +
    • +
    • + [LOG4NET-317] - + LogicalThreadContext sometimes doesn't follow CallContext's logical thread +
    • +
    • + [LOG4NET-322] - Conditional + compilation symbols for .net4 Release +
    • +
    • + [LOG4NET-323] - + AbsoluteTimeDateFormatter caches string representation of now too aggressively +
    • +
    • + [LOG4NET-331] - + AdoNetAppender + errors when writing Asp.net item when Request object is null +
    • +
    • + [LOG4NET-335] - Lost the + ability + to monitor changes to logger config files when you call ConfigureAndWatch multiple times + with + different Config File Names - worked fine on 1.2.10.0 +
    • +
    • + [LOG4NET-341] - + RemotingAppender + Error +
    • +
    • + [LOG4NET-343] - + ArgumentOutOfRangeException in log4net hierarchy on "." logger name +
    • +
    • + [LOG4NET-347] - Log4net not + working in an ASP.Net environment with medium trust +
    • +
    • + [LOG4NET-348] - + System.IndexOutOfRangeException when StackFrameLevel is greater then StackFrames length +
    • +
    • + [LOG4NET-352] - CS0419 + during + build with Mono >2.6 +
    • +
    • + [LOG4NET-360] - + EventLogAppender + can corrupt the event log on Windows Vista and higher if the string is longer than 31839 + bytes +
    • +
    • + [LOG4NET-361] - + RollingLogFileAppender does not correctly initialize the backup index when style is date or + composite +
    • +
    • + [LOG4NET-369] - + preserveLogFileNameExtension is not considered when rolling over time after an application + restart +
    • +
    • + [LOG4NET-370] - + RemoteSyslogAppender doesn't properly handle newline in log message +
    • +
    • + [LOG4NET-371] - Log with + formatting doesn't call custom renderers (IObjectRenderer) +
    • +
    • + [LOG4NET-375] - typo / + misspelling in log message +
    • +
    • + [LOG4NET-378] - Rolling log + file + is overwritten when application is restarted +
    • +
    • + [LOG4NET-379] - + NullReferenceException in FileAppender when file is not filled. +
    • +
    • + [LOG4NET-382] - + TargetInvocationException occurs because MESSAGE_SIZE fields in EventLogAppender are + initialized + in wrong order +
    • +
    +
    + +
    +
      +
    • + [LOG4NET-222] - [PATCH] + Improve + AnsiColorTerminalAppender to support marking colors as Light +
    • +
    • + [LOG4NET-223] - [PATCH] + Improve + AnsiColorTerminalAppender to support marking colors as Light +
    • +
    • + [LOG4NET-232] - Use + ReaderWriterLockSlim instead of ReaderWriterLock. +
    • +
    • + [LOG4NET-259] - Log4Net does + not + create a new tab in Chainsaw +
    • +
    • + [LOG4NET-283] - + OnlyOnceErrorHandler is not subclass-friendly +
    • +
    • + [LOG4NET-292] - Managed + ColoredConsoleAppender for .NET2/Mono. +
    • +
    • + [LOG4NET-315] - SmtpAppender + - + Add support for ignoring certificate errors +
    • +
    • + [LOG4NET-316] - Provide a + Layout + Pattern that is re-evaluated on each use +
    • +
    • + [LOG4NET-318] - log4net + doesn't + pass verification +
    • +
    • + [LOG4NET-334] - Appender + Faill + over +
    • +
    • + [LOG4NET-354] - E-mail + encoding + configuration setting for SmtpAppender +
    • +
    • + [LOG4NET-362] - [PATCH] + SystemInfo.AssemblyLocationInfo throws unhandled ArgumentException "Absolute path + required" + when exe is started via UNC path +
    • +
    • + [LOG4NET-386] - Can't + access + ThreadContext properties +
    • +
    +
    + +
    +
      +
    • + [LOG4NET-290] - Add + Lambda-based + ILog-Extensions (embedded log.IsEnabled) +
    • +
    • + [LOG4NET-342] - Add a way to + prevent silent failure +
    • +
    +
    +
    + +
    +

    + log4net 1.2.11 is not only a bugfix release, it also + adds support for Microsoft® .NET 4.0 as well as the client profiles + of .NET 3.5 and .NET 4.0. +

    + +

    + Starting with this release log4net uses a new strong + name key but we also provide a binary distribution using + the "old" strong name key of log4net 1.2.10 and earlier. + See the FAQ for details. +

    + +

    + The binary distributions no longer contain assemblies + built for the Compact Framework 1.0 or the Shared Source + CLI - you can build those yourself using the source + distribution. +

    + +
    +

    + The signature of + ILoggerFactory.CreateLogger + has changed. +

    +
    + +
    +
      +
    • + [LOG4NET-76] - + TextWriterAdapter + is not thread safe +
    • +
    • + [LOG4NET-79] - + SecurityException + thrown in LogicalThreadContextProperties GetProperties +
    • +
    • + [LOG4NET-81] - + LoggerRepositorySkeleton's OnConfigurationChanged method always raises its event with + EventArgs.Empty instead of passing through its EventArgs parameter. +
    • +
    • + [LOG4NET-93] - Typos for node + name in tutorial, excess quote, invalid XML +
    • +
    • + [LOG4NET-94] - Incorrect + config + file for ..\examples\net\1.0\Tutorials\ConsoleApp +
    • +
    • + [LOG4NET-95] - + Level.CompareTo() + may result a wrong Value -> sorting of Levels does not work +
    • +
    • + [LOG4NET-113] - + SystemInfo.GetTypeFromString() raises NotSupportedException +
    • +
    • + [LOG4NET-123] - + EnvironmentPatternConverter does not expand User or System level environment variables under + Windows +
    • +
    • + [LOG4NET-126] - Links on the + log4net Examples page do not work, including the overview link explaining why the other + links do + not work +
    • +
    • + [LOG4NET-128] - Either + documentation is incorrect or a bug in SmtpAppender +
    • +
    • + [LOG4NET-129] - + EventLogAppender + EventID parsing does not handle Active Properties properly +
    • +
    • + [LOG4NET-135] - Bad example + code + in documentation +
    • +
    • + [LOG4NET-137] - + log4net.Filter.LevelMatchFilter does not work anymore +
    • +
    • + [LOG4NET-143] - Invalid + Repository Config Uri composition from "log4net.Config" application setting +
    • +
    • + [LOG4NET-146] - + System.NullReferenceException on FindAndRender object +
    • +
    • + [LOG4NET-158] - + XMLConfigurator.ConfigureAndWatch() leaks resources if called multiple times +
    • +
    • + [LOG4NET-167] - + ArrayOutOfBounds + Exception in MemoryAppender.getEvents() +
    • +
    • + [LOG4NET-212] - Threading + bug in + the PatternConverter.cs +
    • +
    • + [LOG4NET-214] - + EventLogAppender + should also use config file to set EventId +
    • +
    • + [LOG4NET-215] - Exception on + Convert for return %class{1} name +
    • +
    • + [LOG4NET-229] - Japanese + characters get garbled with log4net.Layout.XmlLayoutSchemaLog4j +
    • +
    • + [LOG4NET-241] - Issue + tracking + page does not link to project +
    • +
    • + [LOG4NET-242] - Download + page + does not have link to KEYS file +
    • +
    • + [LOG4NET-243] - broken link + on + http://logging.apache.org/log4net/release/example-apps.html +
    • +
    • + [LOG4NET-244] - + SmtpAppender.To + Property has incorrect delimiter +
    • +
    • + [LOG4NET-257] - Visual + Studio + 2010 .NET 4.0 Application does not copy log4net lib to bin directory +
    • +
    • + [LOG4NET-265] - + RemoteFileAppender Tests fail on Windows 7 +
    • +
    • + [LOG4NET-274] - log4net + doesn't + log when running a .Net 4.0 Windows application built in Release mode +
    • +
    • + [LOG4NET-297] - + AppenderSkeleton.RequiresLayout docs and implementation don't match +
    • +
    • + [LOG4NET-300] - FilterTest + doesn't + compile for .Net 2.0 +
    • +
    • + [LOG4NET-301] - Unit tests + fail + on a clean checkout on .NET 2.0 using NAnt +
    • +
    • + [LOG4NET-310] - + EventLogAppender's + ActivateOptions throws SecurityException on Vista/Win2k3 and later when not run as + administrator +
    • +
    • + [LOG4NET-311] - MinimalLock + and + AppendToFile=false don't work together in trunk's FileAppender +
    • +
    +
    + +
    +
      +
    • + [LOG4NET-31] - Allow user to + pass + in additional parameters to <converter> node via some kind of <property> tag +
    • +
    • + [LOG4NET-38] - + EventLogAppender: + Add support for setting the Category on Event Log messages. +
    • +
    • + [LOG4NET-66] - + PreserveFileExtension with StaticFileName +
    • +
    • + [LOG4NET-77] - A small + improvement of log4net.Layout.Pattern.ExceptionPatternConverter - added 'Option' + propery + support +
    • +
    • + [LOG4NET-88] - support .NET + 2.0 + connectionStrings configuration section +
    • +
    • + [LOG4NET-96] - Expose the + Message, Exception, and ErrorCode properties of OnlyOnceErrorHandler. +
    • +
    • + [LOG4NET-97] - Make Hierarchy's + ILoggerFactory aware of the repository's LevelMap +
    • +
    • + [LOG4NET-98] - Update header + comment in files to be compliant with new Apache header requirements: + http://www.apache.org/legal/src-headers.html for 11/1/2006 deadline +
    • +
    • + [LOG4NET-100] - + IPAddressConverter improvement for .NET 2 or .NET 3 +
    • +
    • + [LOG4NET-106] - + TraceAppender : + Add switch to disable using logger name as trace category +
    • +
    • + [LOG4NET-112] - Add support + to + the UdpAppender for IP v6 remote addresses +
    • +
    • + [LOG4NET-131] - Add Cc and + Bcc + support to SmtpAppender +
    • +
    • + [LOG4NET-141] - Add + CreateConnection method to AdoNetAppender to allow subclasses to have control of + IDbConnection. +
    • +
    • + [LOG4NET-153] - Make it + easier + to configure multiple appenders in code using BasicConfigurator +
    • +
    • + [LOG4NET-157] - FAQ for + getting + the fully-qualified name of a class +
    • +
    • + [LOG4NET-164] - using a + named + mutex for file appenders +
    • +
    • + [LOG4NET-170] - + Documentation + improvement re: fixing and active properties +
    • +
    • + [LOG4NET-246] - Make it + possible + to choose whether or not to watch configuration files specified using the "log4net.Config" + appsetting key +
    • +
    + +
    +
    +
      +
    • + The various static Configure methods of the Configurator classes + now + return collections of configuration messages rather than void. +
    • +
    • + [LOG4NET-59] - add the + ability to + roll files based on universal time (UTC). +
    • +
    • + [LOG4NET-64] - add the + ability to + preserve the log file name extension when rolling the log file. +
    • +
    • + [LOG4NET-87] - Support + ASP.Net + related PatternConverters to allow items from the HttpContext.Current.Session, Cache, + Request, + etc. to be captured. +
    • + [LOG4NET-92] - Build for + Compact Framework 2.0 +
    • +
    • + [LOG4NET-107] - Added + ExceptionEvaluator +
    • +
    • + [LOG4NET-115] - Expand + UserAppDataPath in filename +
    • +
    • + [LOG4NET-116] - allow + smtp + to ssl authenticate and with certificates. +
    • +
    • + [LOG4NET-154] - Add a + StackTracePatternConverter to display method calls leading up to log message +
    • +
    • + [LOG4NET-155] - Add + TimeEvaluator +
    • +
    • + [LOG4NET-168] - New + property + ReplyTo address for the SmtpAppender required +
    • +
    • + [LOG4NET-176] - + Buildable + with VS 2008 and .NET FW 3.5 +
    • +
    • + [LOG4NET-233] - Support + .NET + 4.0 including Client Profile +
    • + +
    +
    + +
    + +
    + +
    +
      +
    • + [LOG4NET-21] - + RemotingAppender + fails once NDC becomes empty +
    • +
    • + [LOG4NET-22] - XmlLayout + allows + output of invalid control characters +
    • +
    • + [LOG4NET-23] - + example-apps.html + links are off by one folder level +
    • +
    • + [LOG4NET-25] - + RollingFileAppender + can fail if RollOverIfDateBoundaryCrossing required +
    • +
    • + [LOG4NET-28] - AdoNetAppender + does + not support inserting NULL into columns +
    • +
    • + [LOG4NET-29] - + LevelMatchFilter + should return Neutral when no match is found +
    • +
    • + [LOG4NET-32] - AdoNetAppender + losing first entry +
    • +
    • + [LOG4NET-35] - Exception + rendering + ThreadContextStack if null value pushed into stack +
    • +
    • + [LOG4NET-36] - + System.Diagnostics.Trace may throw exception if AppDomain does not have config file +
    • +
    • + [LOG4NET-40] - + RollingFileAppender + does not limit files to MaxSizeRollBackups when CountDirection is 1 +
    • +
    • + [LOG4NET-41] - + RollingFileAppender + roll over date fail +
    • +
    • + [LOG4NET-42] - Serialised + LoggingEvent does not preserve the Fix flags +
    • +
    • + [LOG4NET-43] - Specifying an + empty + string as a property in the config file results in an error +
    • +
    • + [LOG4NET-44] - XmlLayout emits + all + properties under a node named global-properties, rather than just properties. +
    • +
    • + [LOG4NET-49] - + CountingQuietTextWriter does not count strings written with WriteLine +
    • +
    • + [LOG4NET-50] - + Process.StartTime + hangs on some systems +
    • +
    • + [LOG4NET-60] - Bug in + RollingFileAppender.cs causing failure to timely roll files on monthly interval +
    • +
    • + [LOG4NET-63] - 1.2.9.0 + Documentation typos +
    • +
    • + [LOG4NET-65] - Unhandled + SecurityException exception for FileIOPermission while loading configuration file +
    • +
    • + [LOG4NET-67] - CVE-2006-0743 + Security vulnerability in LocalSyslogAppender +
    • +
    • + [LOG4NET-69] - Exception + thrown + when *Format methods are given a malformed format string +
    • +
    • + [LOG4NET-70] - CoreDll.dll + referenced with different capitalisation +
    • +
    • + [LOG4NET-73] - + ADONetAppender.ActivateOptions() leaks database connection when called multiple times +
    • +
    +
    + +
    +
      +
    • + [LOG4NET-11] - Add Flush + command + to API +
    • +
    • + [LOG4NET-24] - Programmatic + flush + of BufferingAppenderSkeleton buffer +
    • +
    • + [LOG4NET-37] - Allow the + RepositorySelector type to be specified using the AppSettings config +
    • +
    • + [LOG4NET-46] - Support + appenders + that can output multiple events efficiently +
    • +
    • + [LOG4NET-51] - WmiAppender +
    • +
    +
    + +
    +
      +
    • + [LOG4NET-3] - Support per event + patterns in FileAppender File name +
    • +
    • + [LOG4NET-13] - Allow + SMTPAppender + to have replaceable parameters in Subject +
    • +
    • + [LOG4NET-15] - Email high + "importance" priority setting with SmtpAppender +
    • +
    • + [LOG4NET-17] - Line-wrapping + Appender Layouts +
    • +
    • + [LOG4NET-33] - Ability to use + global property to point to log4net configuration file +
    • +
    • + [LOG4NET-34] - Allow xml + config + values to be set via XmlNodeType.CDATA or XmlNodeType.Text rather than just value="foo" +
    • +
    • + [LOG4NET-45] - PluginAttribute + does not allow plugin type to be specified as a Type, only as a string +
    • +
    • + [LOG4NET-52] - Allow XML + configurator to set properties of type Object +
    • +
    • + [LOG4NET-53] - Allow + repository + properties to be set in the config file +
    • +
    • + [LOG4NET-56] - Support + rendering + IEnumerator objects as well as ICollections +
    • +
    • + [LOG4NET-58] - Support clean + build + on .NET 2.0 +
    • +
    • + [LOG4NET-72] - Performance of + ILog.xxxFormat methods +
    • +
    • + [LOG4NET-74] - Change + MemoryAppender member variables to protected +
    • +
    +
    + +
    + +
    + +
    +

    Renamed namespaces

    +

    + Renamed namespace log4net.spi to + log4net.Core + . + Renamed namespace log4net.helpers to + log4net.Util + . +

    +

    Renamed config classes and attributes

    +

    + In the log4net.Config namespace the + DOMConfigurator + , + DOMConfiguratorAttribute, DomainAttribute, + and AliasDomainAttribute have been marked as obsolete. These types are + still available and functional in this release. +

    +

    + The XmlConfigurator and + XmlConfiguratorAttribute + types replace DOMConfigurator and + DOMConfiguratorAttribute. The + RepositoryAttribute + and AliasRepositoryAttribute types replace + DomainAttribute + and AliasDomainAttribute. +

    +

    Fixed pascal casing of type names

    +

    + Renamed AdoNetAppender, AspNetTraceAppender, + SmtpAppender, Iso8601DateFormatter, + MdcFilter, and NdcFilter. + Note that the config file type resolver is case insensitive so this is only a breaking change + for code that programmatically creates a type that has been renamed. +

    +

    + Layouts changed to stream their output to a + TextWriter +

    +

    + Layouts have been changed to format their output to a + TextWriter + rather than return a string. This increases performance and reduces temporary object creation. +

    +

    C style string escapes no longer supported by config parser

    +

    + The XML config parser no longer supports decoding C style escape sequences in strings. + Previously sequences like \n and + \\ + where decoded. Instead use the appropriate XML encodings as required. +

    +
    + +
    +

    New CLI build

    +

    + A new log4net assembly is built that targets all CLI 1.0 compatible runtimes. + This build is essentially a common subset of the Mono 1.0 and .NET 1.0 builds. + It is built using the MS .NET 1.0 compiler and libraries but does not use any + platform specific APIs. +

    +

    + This build is only available in release configuration and can be found at + bin\cli\1.0\release. +

    +

    Logging contexts

    +

    + Logging contexts can be used to record contextual data that is relevant to the current + process. Logging contexts are both an extension of the concepts embodied in the + MDC + and NDC and a replacement for + them. The MDC and NDC have been + reimplemented to use the ThreadContext as storage. +

    +

    + The logging contexts provide a single unified view that cuts across different + scopes within an application. + The contexts are layered in the following order of narrowing scope: + GlobalContext, ThreadContext, + LogicalThreadContext, and LoggingEvent. + Context values specified in a narrower scope hide the matching value in a wider scope. +

    +

    + PatternLayout + customization and long pattern names +

    +

    + The PatternLayout now supports long pattern names. + These pattern names are significantly more readable than the single character patterns. +

    +

    + The PatternLayout now supports custom patterns. New patterns + can be defined in the config file: +

    +
    +
    +              <layout type="log4net.Layout.PatternLayout">
    +
    +              <converter>
    +              <name value="myConverter" />
    +              <type value="TestApp.MyPatternConverter, TestApp" />
    +              </converter>
    +
    +              <conversionPattern value="%-5level %logger - %myConverter - %message%newline" />
    +              </layout>
    +            
    +
    +

    + The above config defines a custom pattern called + myConverter + which is bound to the + TestApp.MyPatternConverter, TestApp + type. This type must extend the + log4net.Util.PatternConverter + base class. The custom pattern can then be used in the pattern string. +

    +

    + For full details see the SDK Reference entry: - log4net.Layout.PatternLayout. -

    -

    - PatternString - for pattern based configuration -

    -

    - A new pattern based type, PatternString, can be used in - the config file to set string properties using a pattern syntax. For example the - File property of the FileAppender could be set as follows: -

    -
    -
    -                            <file type="log4net.Util.PatternString">
    -
    -                            <converter>
    -                            <name value="folder" />
    -                            <type value="TestApp.SpecialFolderPatternConverter,TestApp" />
    -                            </converter>
    -
    -                            <conversionPattern value="%folder{LocalApplicationData}\log-file.txt" />
    -                            </file>
    -                        
    -
    -

    - The code for the - SpecialFolderPatternConverter - is as follows: -

    -
    -
    -                            public class SpecialFolderPatternConverter : log4net.Util.PatternConverter
    -                            {
    -                            override protected void Convert(System.IO.TextWriter writer, object state)
    -                            {
    -                            Environment.SpecialFolder specialFolder =
    -                            (Environment.SpecialFolder)Enum.Parse(typeof(Environment.SpecialFolder), base.Option, true);
    -
    -                            writer.Write(Environment.GetFolderPath(specialFolder));
    -                            }
    -                            }
    -                        
    -
    -

    - For full details see the SDK Reference entry: . +

    +

    + PatternString + for pattern based configuration +

    +

    + A new pattern based type, PatternString, can be used in + the config file to set string properties using a pattern syntax. For example the + File property of the FileAppender could be set as follows: +

    +
    +
    +              <file type="log4net.Util.PatternString">
    +
    +              <converter>
    +              <name value="folder" />
    +              <type value="TestApp.SpecialFolderPatternConverter,TestApp" />
    +              </converter>
    +
    +              <conversionPattern value="%folder{LocalApplicationData}\log-file.txt" />
    +              </file>
    +            
    +
    +

    + The code for the + SpecialFolderPatternConverter + is as follows: +

    +
    +
    +              public class SpecialFolderPatternConverter : log4net.Util.PatternConverter
    +              {
    +              override protected void Convert(System.IO.TextWriter writer, object state)
    +              {
    +              Environment.SpecialFolder specialFolder =
    +              (Environment.SpecialFolder)Enum.Parse(typeof(Environment.SpecialFolder), base.Option, true);
    +
    +              writer.Write(Environment.GetFolderPath(specialFolder));
    +              }
    +              }
    +            
    +
    +

    + For full details see the SDK Reference entry: - log4net.Util.PatternString. -

    -

    Loading configuration from a URI

    -

    - The XmlConfigurator methods now support loading the - configuration data from a URI. Config can be loaded from any URI supported by the - System.Net.WebRequest - class. -

    -

    Support for No-Touch deployment

    -

    - Log4net supports configuring No-Touch deployment applications using the - XmlConfiguratorAttribute. If a relative config file - or extension is specified then this is resolved relative to the deployment - URI. -

    -

    Config file parser enhancements

    -

    - The config file parser has been enhanced to support specifying the property subtype, or - intermediate - type, - directly on the property element, for example: -

    -
    -
    -                            <layout type="log4net.Layout.PatternLayout" value="%message%newline"
    -                            />
    -                        
    -
    -

    - Implicit conversion will be attempted between the value string and the type specified, - and then again between the type and the target property type. -

    -

    .NET string formatting syntax

    -

    - Added .NET String.Format style formatting syntax methods to - the ILog interface. The new methods are: - DebugFormat, InfoFormat, - WarnFormat, - ErrorFormat - and FatalFormat. -

    -

    Customizable levels

    -

    - Levels are defined by the repository LevelMap. The defined - levels, the relative ordering of levels and level display names can be configured on - a per-repository basis. -

    -

    Per-appender security contexts

    -

    - Appenders that interact with controlled platform resources, e.g. files, can be - configured to use a separate security context when accessing these resources. - The calling thread may not have appropriate privileges to access the resource a - custom SecurityContext can be used to elevate the - privileges of the appender. The - WindowsSecurityContext - is used to specify alternative credentials on the Windows platform. -

    -

    Added new appenders

    -
    -
    - AnsiColorTerminalAppender -
    -
    -

    - The AnsiColorTerminalAppender writes events to - the application's ANSI terminal window. It can be configured to specify - the text and background colors for different level events. Note that Console - applications running on Windows do not have an ANSI terminal window and - should use the ColoredConsoleAppender instead. -

    -
    -
    - LocalSyslogAppender -
    -
    -

    - Logs events to a local syslog service. This appender uses the POSIX libc syslog - library functions. If these functions are not available on the local system then - this appender will not work! -

    -
    -
    - RemoteSyslogAppender -
    -
    -

    - The RemoteSyslogAppender uses the BSD syslog protocol to - log to a syslog daemon. The syslogd listens for for messages on UDP port 514. -

    -
    -
    - TelnetAppender -
    -
    -

    - The TelnetAppender accepts socket connections and streams - logging messages back to the client. The output is provided in a telnet-friendly way - so that a log can be monitored over a TCP/IP socket. - This allows simple remote monitoring of application logging. -

    -
    -
    -

    Added new LoggerMatchFilter filter -

    -

    - Added LoggerMatchFilter which matches a string against - the event's logger name. -

    -

    Pluggable file locking models for the - FileAppender -

    -

    - The FileAppender (and by extension the - RollingFileAppender) now support pluggable file - locking models. The default model, ExclusiveLock, - maintains the current exclusive file locking behavior. An alternative - model, MinimalLock, can be used to support writing to - a single output file from multiple processes. -

    -

    - For full details see the SDK Reference entry: . +

    +

    Loading configuration from a URI

    +

    + The XmlConfigurator methods now support loading the + configuration data from a URI. Config can be loaded from any URI supported by the + System.Net.WebRequest + class. +

    +

    Support for No-Touch deployment

    +

    + Log4net supports configuring No-Touch deployment applications using the + XmlConfiguratorAttribute. If a relative config file + or extension is specified then this is resolved relative to the deployment + URI. +

    +

    Config file parser enhancements

    +

    + The config file parser has been enhanced to support specifying the property subtype, or + intermediate + type, + directly on the property element, for example: +

    +
    +
    +              <layout type="log4net.Layout.PatternLayout" value="%message%newline"
    +              />
    +            
    +
    +

    + Implicit conversion will be attempted between the value string and the type specified, + and then again between the type and the target property type. +

    +

    .NET string formatting syntax

    +

    + Added .NET String.Format style formatting syntax methods to + the ILog interface. The new methods are: + DebugFormat, InfoFormat, + WarnFormat, + ErrorFormat + and FatalFormat. +

    +

    Customizable levels

    +

    + Levels are defined by the repository LevelMap. The defined + levels, the relative ordering of levels and level display names can be configured on + a per-repository basis. +

    +

    Per-appender security contexts

    +

    + Appenders that interact with controlled platform resources, e.g. files, can be + configured to use a separate security context when accessing these resources. + The calling thread may not have appropriate privileges to access the resource a + custom SecurityContext can be used to elevate the + privileges of the appender. The + WindowsSecurityContext + is used to specify alternative credentials on the Windows platform. +

    +

    Added new appenders

    +
    +
    + AnsiColorTerminalAppender +
    +
    +

    + The AnsiColorTerminalAppender writes events to + the application's ANSI terminal window. It can be configured to specify + the text and background colors for different level events. Note that Console + applications running on Windows do not have an ANSI terminal window and + should use the ColoredConsoleAppender instead. +

    +
    +
    + LocalSyslogAppender +
    +
    +

    + Logs events to a local syslog service. This appender uses the POSIX libc syslog + library functions. If these functions are not available on the local system then + this appender will not work! +

    +
    +
    + RemoteSyslogAppender +
    +
    +

    + The RemoteSyslogAppender uses the BSD syslog protocol to + log to a syslog daemon. The syslogd listens for for messages on UDP port 514. +

    +
    +
    + TelnetAppender +
    +
    +

    + The TelnetAppender accepts socket connections and streams + logging messages back to the client. The output is provided in a telnet-friendly way + so that a log can be monitored over a TCP/IP socket. + This allows simple remote monitoring of application logging. +

    +
    +
    +

    + Added new LoggerMatchFilter filter +

    +

    + Added LoggerMatchFilter which matches a string against + the event's logger name. +

    +

    + Pluggable file locking models for the + FileAppender +

    +

    + The FileAppender (and by extension the + RollingFileAppender) now support pluggable file + locking models. The default model, ExclusiveLock, + maintains the current exclusive file locking behavior. An alternative + model, MinimalLock, can be used to support writing to + a single output file from multiple processes. +

    +

    + For full details see the SDK Reference entry: - log4net.Appender.FileAppender.LockingModel. -

    -

    - RollingFileAppender - roll once -

    -

    - The RollingFileAppender now supports a new - rolling style, Once. In this mode the appender - will roll the file once per run. -

    -

    - SmtpAppender - authentication -

    -

    - On the .NET 1.1 platform only, the SmtpAppender supports - authenticating - against the mail server using either username and password or integrated NTLM authentication. -

    -

    - AdoNetAppender - ReconnectOnError -

    -

    - Added new configuration property to AdoNetAppender. - Setting ReconnectOnError to - true - will force the appender to attempt to reconnect to the database if the connection - is lost. -

    -

    - UdpAppender - hostname support -

    -

    - The UdpAppender config property - RemoteAddress - can now be specified as a DNS hostname string. The hostname is resolved to an IP address. -

    -
    - -
    -

    FxCop compliance

    -

    - Updates to bring the internal code in line with the current FxCop rules. -

    -

    Separate NUnit tests

    -

    - Moved the NUnit tests into a separate project, log4net.Tests. -

    -

    Bug Fixes

    -
    -
    - RemotingAppender -
    -
    -

    - Sends events from a ThreadPool thread - rather than the calling thread to prevent transfer, - and potential loss, of the CallContext. -

    -
    -
    - RollingFileAppender -
    -
    -

    - Fixed date rolling period detection for non UTC timezones. -

    -
    -
    - ColoredConsoleAppender -
    -
    -

    - Updated to support writing more than 30,000 chars in a single message. - Fixed background color overspill if the console window needs to - scroll the contents. -

    -
    -
    -
    - -
    - -
    -

    Changed assembly name to - log4net -

    -

    - The build output is now - log4net.dll - for all frameworks. This is a breaking change. -

    -

    - To resolve cross platform and cross version issues we have - changed the log4net assembly to use a common name for all - frameworks. The assembly friendly name is now log4net. - The builds for each framework can now be differentiated - by the assembly title. This includes the name of the framework - that the assembly was built on. -

    -

    Combined Release and ReleaseStrong builds

    -

    - The Release and ReleaseStrong builds have been consolidated into - a single build called Release. This Release build is strongly named. -

    -

    New Appender: ColoredConsoleAppender

    -

    - The ColoredConsoleAppender writes events to the - application's console. It can be configured to specify the text and background - colors for different level events. -

    -

    New Appender: SmtpPickupDirAppender

    -

    - The SmtpPickupDirAppender generates SMTP compliant - messages and writes them to a local directory. These files can then be read - by an SMTP agent (e.g. the IIS SMTP Agent) and delivered. -

    -

    New Layout: XmlLayoutSchemaLog4j

    -

    - This new layout formats the logging events as XML which complies with - the Apache log4j™ event dtd. This can be used to transfer log event from log4net - to log4j. Currently the only appender that can communicate directly with - log4j is the UdpAppender. -

    -

    New PatternLayout conversion characters

    -

    - Added support for capturing the current thread principal name and the - app domain friendly name for each logging event. -

    -
    -
    %a
    -
    - Used to output the friendly name of the AppDomain where the - logging event was generated. -
    -
    %u
    -
    - Used to output the user name for the currently active user - (Principal.Identity.Name). -
    -
    -

    Types specified in the config file are now loaded ignoring case

    -

    - All types specified in the configuration files are now loaded - using a case insensitive method. -

    -

    Fine grained fixing for buffered events

    -

    - The LoggingEvent now supports fine grained - fixing of data that needs to be accessed outside the append context, - e.g. when an event is buffered. The new - Fix - property takes a combination of the - FixFlags - enumeration values. -

    -

    Code updated inline with FxCop 1.21

    -

    - In line with the FxCop 1.21 guidelines: - Sealed utility classes. Added serialization security demand to GetObjectData. - Renamed parameters. -

    -

    EventLogAppender 32K Limit

    -

    - There is a limit of 32K characters in an EventLog message. Added a - check that only logs the first 32000 characters from the rendered - message. -

    -
    - -
    -

    Updated to support the Microsoft .NET Framework 1.1 Final

    -

    - Updated to support the Microsoft .NET Framework 1.1 Final Beta (1.1.4322). -

    -

    Features document

    -

    - Added a new document that covers the main features of log4net. - See the - features - document for more information. -

    -

    Hierarchy disabled until it is configured

    -

    - The Hierarchy is now disabled until it has been configured. - All messages logged to the Hierarchy before it has been - configured will be ignored without an error message being - written to the console. -

    -

    - If you are configuring log4net programmatically (i.e. not using - one of the built-in configurators) you must set the - ILoggerRepository.Configured - property - to true once you have configured - the repository. -

    -

    - The no appenders defined for a logger message will no longer be - displayed on the console by default. This message will only be - displayed if internal debugging is enabled. -

    -

    New examples in VisualBasic.NET, JScript and Managed C++

    -

    - New examples in VisualBasic.NET, JScript and Managed C++. - TODO Link to document about examples. -

    -

    Code and Documentation Updates

    -

    - Code fixes. Documentation and manual updates. - See the ChangeLog for more information. -

    -

    Added document with example appender configurations

    -

    - See the - Example Appender Configuration - document for more information. -

    -
    - -
    -

    Added support for multiple frameworks

    -

    - log4net 1.2.0 beta 6 adds support for the the following frameworks: -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    - Framework - - Website -
    Microsoft .NET Framework 1.1 Final Beta (1.1.4322) - http://msdn.microsoft.com/net -
    Microsoft .NET Compact Framework 1.0 (1.0.5000) - - http://msdn.microsoft.com/vstudio/device/compactfx.asp - -
    Mono 0.23 - http://www.go-mono.org -
    Microsoft Shared Source CLI 1.0 - - http://msdn.microsoft.com/library/en-us/dndotnet/html/mssharsourcecli.asp - -
    -
    -
    -

    - Not all frameworks are created equal and some features have been excluded from - some of the builds. See the Framework Support document for more - information. -

    -

    New build system using NAnt

    -

    - The new build system allows log4net to be built for all supported frameworks and - in all build configurations in one go. -

    -

    New source code & distribution layout

    -

    - The source code & distribution layout has been updated to support the new - build environment and multiple target frameworks. -

    -

    Removed DomainAttribute.UseDefaultDomain property

    -

    - Updated default behavior of DefaultRepositorySelector. Assemblies - are now by default placed into the default domain. To specify another domain, - the DomainAttribute must be used. This is the opposite behavior - to what was previously available. If you were previously specifying the - DomainAttribute.UseDefaultDomain - property then you should remove it, and if the default behavior is now - sufficient, you do not need to specify the DomainAttribute at all. -

    -

    Updated configuration file parser

    -

    - Updated config file parser to use the element name as the property to set. Also - removed <object> tag, the type attribute can now be - specified on the property element directly. -

    -

    - For example: -

    -
    -
    -                        <appender>
    -                        <param name="Evaluator">
    -                        <object type="log4net.spi.LevelEvaluator">
    -                        <constructor>
    -                        <param type="log4net.spi.Level" value="DEBUG"/>
    -                        </constructor>
    -                        </object>
    -                        </param>
    -                        </appender>
    -                    
    -
    -

    - becomes: -

    -
    -
    -                        <appender>
    -                        <evaluator type="log4net.spi.LevelEvaluator">
    -                        <threshold value="DEBUG"/>
    -                        </evaluator>
    -                        </appender>
    -                    
    -
    -

    Support for event ID

    -

    - The EventLogAppender now supports setting the event ID in the - event log, this is taken from the EventID property from the per - event Properties map on the LoggingEvent. -

    -

    Updated ADONetAppender

    -

    -

      -
    • - Added support for prepared statements and stored procedures -
    • -
    • - Added RawTimeStampLayoutto correctly convert the timestamps into - database date time format -
    • -
    • - Added ExceptionLayout to render the exception data -
    • -
    -

    -

    Support for front-end extension

    -

    - This allows the logging API to be wrapped or adapted for specific purposes. Two - extension samples are included in the distribution: -

    -
    - - - - - - - - - - - - - - - - - -
    - Extension - - Description -
    log4net.Ext.TraceAdds trace logging methods
    log4net.Ext.EventIDAdds additional eventId parameter to all methods
    -
    -

    -

    Added ForwardingAppender

    -

    Forwards events to multiple sub appenders after applying filter rules.

    -

    Added BufferingForwardingAppender

    -

    Forward events to sub appenders after buffering them.

    -

    Added ASPNetTraceAppender

    -

    Logs events to the ASP.NET trace system.

    -

    Added NetSendAppender

    -

    Delivers logging events using the Windows Messenger service.

    -

    Added UdpAppender

    -

    Sends logging events as connectionless UDP datagrams to a remote host or a - multicast group. -

    -

    Removed obsolete methods

    -

    Lots of updates to improve our compliance with FxCop

    -

    Improved SDK documentation

    -
    - -
    -

    Fixed Exception thrown when DOM Configurator called with a null XML - Element. -

    -

    This occurred if the configuration file did not have a log4net section defined.

    -

    Made level lookup case insensitive

    -

    Prevented the Hierarchy's Threshold level from being set to a null reference

    -
    - -
    -

    Added event specific properties to the logging event object

    -

    - Appenders can add additional information to the events they are logging. The - RemotingAppender - and the SMTPAppender both add a 'hostname' property to the events. - These properties can be accessed using the PatternLayout with the - %P{name} syntax. -

    -

    Added a plugin framework

    -

    An IPlugin interface can be attached to any repository. -

    -

    A new RemoteLoggingServerPlugin plugin acts as the server for the - RemotingAppender -

    -

    Updated the core log4net framework to work in an environment with no - permissions -

    -

    Specific appenders still require additional permissions to log correctly

    -

    Added support for domain aliasing using the AliasDomainAttribute

    -

    This allows a parent assembly to take control of the logging domain for child - assemblies. -

    -

    Added events for repository creation, configuration change, configuration reset - and repository shutdown -

    -

    Added LevelMap to the ILoggerRepository interface

    -

    The mapping from level name to level object is now repository specific, - therefore each repository can have independent mappings. -

    -

    Moved hierarchy specific config file parser to new DOMHierarchyConfigurator class

    -

    This is controlled by the Hierarchy object and allows for better - encapsulation. -

    -

    Added OnlyFixPartialEventData property to the buffered appenders

    -

    This setting causes slow settings to be ignored. This significantly improves the - performance of the buffered appenders. -

    -

    XML entity references are supported in the XML config file.

    -

    Added support for expanding environment variables in <param> values

    -

    - The environment variables must be specified as ${FOO} where - FOO - is the name of the variable to expand. -

    -

    Upgraded to use NUnit 2.0

    -

    File appenders can specify the encoding to use for the file

    -

    Added strong named configuration

    -
    - -
    -

    Added log4net.Ext.Trace extension

    -

    This is a separate assembly that adds a trace level to log4net.

    -

    The default log file output directory is now the application base directory not - the current directory -

    -

    Added MemoryAppender

    -

    Stores all the logging events in an in-memory buffer.

    -

    Moved the Hierarchy implementation into a separate namespace

    -

    - The log4net.Repository.Hierarchy namespace now contains all the - code that is specific to the Hierarchy implementation. -

    -

    Refactored the DOMConfigurator and BasicConfigurator

    -

    - The Hierarchy specific data schema and implementation could be has - now been moved to the log4net.Repository.Hierarchy namespace. The - bootstrap code for these configurators remains in the - log4net.Config - namespace. -

    -

    Replaced the DOMConfiguratorAttribute UseExecutableDomain - property with UseDefaultDomain -

    -

    - This change to the implementation of the DOMConfiguratorAttribute should - allow the configuration of multiple assemblies to be accomplished more easily, - especially when developing web applications (ASP.NET). -

    -

    A few good bug fixes!

    -
    - -
    -

    Added ADONetAppender

    -

    Thanks to TechnologyOneCorp.com.

    -

    Added TraceLogAssembly extensibility example

    -

    Lots of bug fixes

    -
    - -
    -

    Added 6 new examples

    -

    Split Category class into Logger and LogManager classes

    -

    - The instance methods from Category have moved to the - Logger - class. The static methods from Category have moved to the - LogManager - class. The Category class still exists but for backward - compatibility only. Changed interface ICategoryFactory to - ILoggerFactory - and the implementation class DefaultCategoryFactory to - DefaultLoggerFactory. -

    -

    Replaced Priority class with Level class

    -

    - The Priority class has been replaced by the Level - class. - The Priority class still exists for backward compatibility only. - The Level class implements a static pool of Level - objects. - The Level class is sealed and serializable. -

    -

    Added ILoggerRepository interface implemented by Hierarchy

    -

    - The Hierarchy class implements the ILoggerRepository - interface. - This interface is used by the LogManager class and therefore - allows different implementations of ILoggerRepository to be used. -

    -

    Enhanced NUnit tests

    -

    - All the NUnit tests can be run using a single TestSuite: NUnitGUI - log4net.LogManager+AllTests,log4net.dll. -

    -

    Added support for serializing LoggingEvents

    -

    - The LoggingEvent class is serializable. All local state is - captured before serialization occurs. This now allows - LoggingEvent - objects to be serialized between applications or machines. -

    -

    Added RemotingAppender

    -

    - Delivers LoggingEvents to a remote interface. This can be used to - collect distributed logging into a single log file. There is an example - remoting sink that receives the logging events, see - examples\net\remoting\RemotingServer - for details. -

    -

    Added support for rendering composite objects

    -

    - The IObjectRenderer interface method DoRender now - takes a RendererMap argument. This allows the renderer to use the - appropriate renderer from the RendererMap to render any nested - objects. -

    -

    Added support for rendering exceptions

    -

    - The DefaultRenderer now has support for rendering exceptions to a - string. This includes nested exceptions. The RendererMap is now - used to render exceptions in the LoggingEvent. This allows the - rendering of specific exceptions to be enhanced by specific renderers. -

    -

    Added ITriggeringEventEvaluator interface

    -

    - This interface is used by SMTPAppender and - RemotingAppender - to determine if a LoggingEvent meets a set of user defined - criteria. These appenders use the interface to determine whether or not to - deliver the current buffer of events to their listener. The interface is - implemented by the LevelEvaluator class, which triggers above a - set level. -

    -

    Added regex matching to the MDCFilter, NDCFilter and StringMatchFilter

    -

    - The MDCFilter, NDCFilter and - StringMatchFilter - can now be configured to use regex matches in addition to substring matches. - Set the RegexToMatch property to use this feature. -

    -

    Added XMLLayout

    -

    - emits an XML element for each LoggingEvent. This allows logging - events to be stored and manipulated as XML. The DTD for the XML emitted is in - the - log4net-events.dtd -

    -

    Added support for <logger> and <level> elements in the - DOMConfigurator -

    -

    - As the Category and Priority classes have been - replaced by the Logger and Level classes. The - DOMConfigurator - has been updated to allow the <logger> and - <level> - elements to be used in place of the <category> and - <priority> - elements. The old elements are still accepted for backward compatibility. -

    -

    Added Threshold property to Hierarchy

    -

    - Changed DisableXXX() methods on Hierarchy to a - Threshold - property. -

    -

    Added support for logging domains

    -

    - The LogManager supports multiple logging domains. The - LogManager - uses an instance of the IRepositorySelector class to map from - domains to ILoggerRepository instances. The default implementation - is to have a separate ILoggerRepository for each domain. When a - call is made to the static methods on LogManager the domain can be - specified (as a string) or the domain can be inferred automatically from the - calling assembly. The default behavior is for each assembly loaded into the - process to have its own domain and ILoggerRepository. These can - each be configured separately. This allows standalone assemblies to use log4net - without conflicting with other modules in the process. The domain for the - assembly is configured using metadata attributes defined on the assembly. -

    -

    DOMConfigurator can set params to arbitrary objects

    -

    - Using a new <object> element, params can now be set to any - creatable object. -

    -
    + log4net.Appender.FileAppender.LockingModel + . +

    +

    + RollingFileAppender + roll once +

    +

    + The RollingFileAppender now supports a new + rolling style, Once. In this mode the appender + will roll the file once per run. +

    +

    + SmtpAppender + authentication +

    +

    + On the .NET 1.1 platform only, the SmtpAppender supports + authenticating + against the mail server using either username and password or integrated NTLM authentication. +

    +

    + AdoNetAppender + ReconnectOnError +

    +

    + Added new configuration property to AdoNetAppender. + Setting ReconnectOnError to + true + will force the appender to attempt to reconnect to the database if the connection + is lost. +

    +

    + UdpAppender + hostname support +

    +

    + The UdpAppender config property + RemoteAddress + can now be specified as a DNS hostname string. The hostname is resolved to an IP address. +

    +
    +
    +

    FxCop compliance

    +

    + Updates to bring the internal code in line with the current FxCop rules. +

    +

    Separate NUnit tests

    +

    + Moved the NUnit tests into a separate project, log4net.Tests. +

    +

    Bug Fixes

    +
    +
    + RemotingAppender +
    +
    +

    + Sends events from a ThreadPool thread + rather than the calling thread to prevent transfer, + and potential loss, of the CallContext. +

    +
    +
    + RollingFileAppender +
    +
    +

    + Fixed date rolling period detection for non UTC timezones. +

    +
    +
    + ColoredConsoleAppender +
    +
    +

    + Updated to support writing more than 30,000 chars in a single message. + Fixed background color overspill if the console window needs to + scroll the contents. +

    +
    +
    - + +
    + +
    +

    + Changed assembly name to + log4net +

    +

    + The build output is now + log4net.dll + for all frameworks. This is a breaking change. +

    +

    + To resolve cross platform and cross version issues we have + changed the log4net assembly to use a common name for all + frameworks. The assembly friendly name is now log4net. + The builds for each framework can now be differentiated + by the assembly title. This includes the name of the framework + that the assembly was built on. +

    +

    Combined Release and ReleaseStrong builds

    +

    + The Release and ReleaseStrong builds have been consolidated into + a single build called Release. This Release build is strongly named. +

    +

    New Appender: ColoredConsoleAppender

    +

    + The ColoredConsoleAppender writes events to the + application's console. It can be configured to specify the text and background + colors for different level events. +

    +

    New Appender: SmtpPickupDirAppender

    +

    + The SmtpPickupDirAppender generates SMTP compliant + messages and writes them to a local directory. These files can then be read + by an SMTP agent (e.g. the IIS SMTP Agent) and delivered. +

    +

    New Layout: XmlLayoutSchemaLog4j

    +

    + This new layout formats the logging events as XML which complies with + the Apache log4j™ event dtd. This can be used to transfer log event from log4net + to log4j. Currently the only appender that can communicate directly with + log4j is the UdpAppender. +

    +

    New PatternLayout conversion characters

    +

    + Added support for capturing the current thread principal name and the + app domain friendly name for each logging event. +

    +
    +
    %a
    +
    + Used to output the friendly name of the AppDomain where the + logging event was generated. +
    +
    %u
    +
    + Used to output the user name for the currently active user + (Principal.Identity.Name). +
    +
    +

    Types specified in the config file are now loaded ignoring case

    +

    + All types specified in the configuration files are now loaded + using a case insensitive method. +

    +

    Fine grained fixing for buffered events

    +

    + The LoggingEvent now supports fine grained + fixing of data that needs to be accessed outside the append context, + e.g. when an event is buffered. The new + Fix + property takes a combination of the + FixFlags + enumeration values. +

    +

    Code updated inline with FxCop 1.21

    +

    + In line with the FxCop 1.21 guidelines: + Sealed utility classes. Added serialization security demand to GetObjectData. + Renamed parameters. +

    +

    EventLogAppender 32K Limit

    +

    + There is a limit of 32K characters in an EventLog message. Added a + check that only logs the first 32000 characters from the rendered + message. +

    +
    + +
    +

    Updated to support the Microsoft .NET Framework 1.1 Final

    +

    + Updated to support the Microsoft .NET Framework 1.1 Final Beta (1.1.4322). +

    +

    Features document

    +

    + Added a new document that covers the main features of log4net. + See the + features + document for more information. +

    +

    Hierarchy disabled until it is configured

    +

    + The Hierarchy is now disabled until it has been configured. + All messages logged to the Hierarchy before it has been + configured will be ignored without an error message being + written to the console. +

    +

    + If you are configuring log4net programmatically (i.e. not using + one of the built-in configurators) you must set the + ILoggerRepository.Configured + property + to true once you have configured + the repository. +

    +

    + The no appenders defined for a logger message will no longer be + displayed on the console by default. This message will only be + displayed if internal debugging is enabled. +

    +

    New examples in VisualBasic.NET, JScript and Managed C++

    +

    + New examples in VisualBasic.NET, JScript and Managed C++. + TODO Link to document about examples. +

    +

    Code and Documentation Updates

    +

    + Code fixes. Documentation and manual updates. + See the ChangeLog for more information. +

    +

    Added document with example appender configurations

    +

    + See the + Example Appender Configuration + document for more information. +

    +
    + +
    +

    Added support for multiple frameworks

    +

    + log4net 1.2.0 beta 6 adds support for the the following frameworks: +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + Framework + + Website +
    Microsoft .NET Framework 1.1 Final Beta (1.1.4322) + http://msdn.microsoft.com/net +
    Microsoft .NET Compact Framework 1.0 (1.0.5000) + + http://msdn.microsoft.com/vstudio/device/compactfx.asp + +
    Mono 0.23 + http://www.go-mono.org +
    Microsoft Shared Source CLI 1.0 + + http://msdn.microsoft.com/library/en-us/dndotnet/html/mssharsourcecli.asp + +
    +
    +
    +

    + Not all frameworks are created equal and some features have been excluded from + some of the builds. See the Framework Support document for more + information. +

    +

    New build system using NAnt

    +

    + The new build system allows log4net to be built for all supported frameworks and + in all build configurations in one go. +

    +

    New source code & distribution layout

    +

    + The source code & distribution layout has been updated to support the new + build environment and multiple target frameworks. +

    +

    Removed DomainAttribute.UseDefaultDomain property

    +

    + Updated default behavior of DefaultRepositorySelector. Assemblies + are now by default placed into the default domain. To specify another domain, + the DomainAttribute must be used. This is the opposite behavior + to what was previously available. If you were previously specifying the + DomainAttribute.UseDefaultDomain + property then you should remove it, and if the default behavior is now + sufficient, you do not need to specify the DomainAttribute at all. +

    +

    Updated configuration file parser

    +

    + Updated config file parser to use the element name as the property to set. Also + removed <object> tag, the type attribute can now be + specified on the property element directly. +

    +

    + For example: +

    +
    +
    +            <appender>
    +            <param name="Evaluator">
    +            <object type="log4net.spi.LevelEvaluator">
    +            <constructor>
    +            <param type="log4net.spi.Level" value="DEBUG"/>
    +            </constructor>
    +            </object>
    +            </param>
    +            </appender>
    +          
    +
    +

    + becomes: +

    +
    +
    +            <appender>
    +            <evaluator type="log4net.spi.LevelEvaluator">
    +            <threshold value="DEBUG"/>
    +            </evaluator>
    +            </appender>
    +          
    +
    +

    Support for event ID

    +

    + The EventLogAppender now supports setting the event ID in the + event log, this is taken from the EventID property from the per + event Properties map on the LoggingEvent. +

    +

    Updated ADONetAppender

    +

    +

      +
    • + Added support for prepared statements and stored procedures +
    • +
    • + Added RawTimeStampLayoutto correctly convert the timestamps into + database date time format +
    • +
    • + Added ExceptionLayout to render the exception data +
    • +
    +

    +

    Support for front-end extension

    +

    + This allows the logging API to be wrapped or adapted for specific purposes. Two + extension samples are included in the distribution: +

    +
    + + + + + + + + + + + + + + + + + +
    + Extension + + Description +
    log4net.Ext.TraceAdds trace logging methods
    log4net.Ext.EventIDAdds additional eventId parameter to all methods
    +
    +

    +

    Added ForwardingAppender

    +

    Forwards events to multiple sub appenders after applying filter rules.

    +

    Added BufferingForwardingAppender

    +

    Forward events to sub appenders after buffering them.

    +

    Added ASPNetTraceAppender

    +

    Logs events to the ASP.NET trace system.

    +

    Added NetSendAppender

    +

    Delivers logging events using the Windows Messenger service.

    +

    Added UdpAppender

    +

    + Sends logging events as connectionless UDP datagrams to a remote host or a + multicast group. +

    +

    Removed obsolete methods

    +

    Lots of updates to improve our compliance with FxCop

    +

    Improved SDK documentation

    +
    + +
    +

    + Fixed Exception thrown when DOM Configurator called with a null XML + Element. +

    +

    This occurred if the configuration file did not have a log4net section defined.

    +

    Made level lookup case insensitive

    +

    Prevented the Hierarchy's Threshold level from being set to a null reference

    +
    + +
    +

    Added event specific properties to the logging event object

    +

    + Appenders can add additional information to the events they are logging. The + RemotingAppender + and the SMTPAppender both add a 'hostname' property to the events. + These properties can be accessed using the PatternLayout with the + %P{name} syntax. +

    +

    Added a plugin framework

    +

    + An IPlugin interface can be attached to any repository. +

    +

    + A new RemoteLoggingServerPlugin plugin acts as the server for the + RemotingAppender +

    +

    + Updated the core log4net framework to work in an environment with no + permissions +

    +

    Specific appenders still require additional permissions to log correctly

    +

    Added support for domain aliasing using the AliasDomainAttribute

    +

    + This allows a parent assembly to take control of the logging domain for child + assemblies. +

    +

    + Added events for repository creation, configuration change, configuration reset + and repository shutdown +

    +

    Added LevelMap to the ILoggerRepository interface

    +

    + The mapping from level name to level object is now repository specific, + therefore each repository can have independent mappings. +

    +

    Moved hierarchy specific config file parser to new DOMHierarchyConfigurator class

    +

    + This is controlled by the Hierarchy object and allows for better + encapsulation. +

    +

    Added OnlyFixPartialEventData property to the buffered appenders

    +

    + This setting causes slow settings to be ignored. This significantly improves the + performance of the buffered appenders. +

    +

    XML entity references are supported in the XML config file.

    +

    Added support for expanding environment variables in <param> values

    +

    + The environment variables must be specified as ${FOO} where + FOO + is the name of the variable to expand. +

    +

    Upgraded to use NUnit 2.0

    +

    File appenders can specify the encoding to use for the file

    +

    Added strong named configuration

    +
    + +
    +

    Added log4net.Ext.Trace extension

    +

    This is a separate assembly that adds a trace level to log4net.

    +

    + The default log file output directory is now the application base directory not + the current directory +

    +

    Added MemoryAppender

    +

    Stores all the logging events in an in-memory buffer.

    +

    Moved the Hierarchy implementation into a separate namespace

    +

    + The log4net.Repository.Hierarchy namespace now contains all the + code that is specific to the Hierarchy implementation. +

    +

    Refactored the DOMConfigurator and BasicConfigurator

    +

    + The Hierarchy specific data schema and implementation could be has + now been moved to the log4net.Repository.Hierarchy namespace. The + bootstrap code for these configurators remains in the + log4net.Config + namespace. +

    +

    + Replaced the DOMConfiguratorAttribute UseExecutableDomain + property with UseDefaultDomain +

    +

    + This change to the implementation of the DOMConfiguratorAttribute should + allow the configuration of multiple assemblies to be accomplished more easily, + especially when developing web applications (ASP.NET). +

    +

    A few good bug fixes!

    +
    + +
    +

    Added ADONetAppender

    +

    Thanks to TechnologyOneCorp.com.

    +

    Added TraceLogAssembly extensibility example

    +

    Lots of bug fixes

    +
    + +
    +

    Added 6 new examples

    +

    Split Category class into Logger and LogManager classes

    +

    + The instance methods from Category have moved to the + Logger + class. The static methods from Category have moved to the + LogManager + class. The Category class still exists but for backward + compatibility only. Changed interface ICategoryFactory to + ILoggerFactory + and the implementation class DefaultCategoryFactory to + DefaultLoggerFactory + . +

    +

    Replaced Priority class with Level class

    +

    + The Priority class has been replaced by the + Level + class. + The Priority class still exists for backward compatibility only. + The Level class implements a static pool of + Level + objects. + The Level class is sealed and serializable. +

    +

    Added ILoggerRepository interface implemented by Hierarchy

    +

    + The Hierarchy class implements the + ILoggerRepository + interface. + This interface is used by the LogManager class and therefore + allows different implementations of ILoggerRepository to be used. +

    +

    Enhanced NUnit tests

    +

    + All the NUnit tests can be run using a single TestSuite: NUnitGUI + log4net.LogManager+AllTests,log4net.dll. +

    +

    Added support for serializing LoggingEvents

    +

    + The LoggingEvent class is serializable. All local state is + captured before serialization occurs. This now allows + LoggingEvent + objects to be serialized between applications or machines. +

    +

    Added RemotingAppender

    +

    + Delivers LoggingEvents to a remote interface. This can be used to + collect distributed logging into a single log file. There is an example + remoting sink that receives the logging events, see + examples\net\remoting\RemotingServer + for details. +

    +

    Added support for rendering composite objects

    +

    + The IObjectRenderer interface method DoRender now + takes a RendererMap argument. This allows the renderer to use the + appropriate renderer from the RendererMap to render any nested + objects. +

    +

    Added support for rendering exceptions

    +

    + The DefaultRenderer now has support for rendering exceptions to a + string. This includes nested exceptions. The RendererMap is now + used to render exceptions in the LoggingEvent. This allows the + rendering of specific exceptions to be enhanced by specific renderers. +

    +

    Added ITriggeringEventEvaluator interface

    +

    + This interface is used by SMTPAppender and + RemotingAppender + to determine if a LoggingEvent meets a set of user defined + criteria. These appenders use the interface to determine whether or not to + deliver the current buffer of events to their listener. The interface is + implemented by the LevelEvaluator class, which triggers above a + set level. +

    +

    Added regex matching to the MDCFilter, NDCFilter and StringMatchFilter

    +

    + The MDCFilter, NDCFilter and + StringMatchFilter + can now be configured to use regex matches in addition to substring matches. + Set the RegexToMatch property to use this feature. +

    +

    Added XMLLayout

    +

    + emits an XML element for each LoggingEvent. This allows logging + events to be stored and manipulated as XML. The DTD for the XML emitted is in + the + log4net-events.dtd +

    +

    + Added support for <logger> and <level> elements in the + DOMConfigurator +

    +

    + As the Category and Priority classes have been + replaced by the Logger and Level classes. The + DOMConfigurator + has been updated to allow the <logger> and + <level> + elements to be used in place of the <category> and + <priority> + elements. The old elements are still accepted for backward compatibility. +

    +

    Added Threshold property to Hierarchy

    +

    + Changed DisableXXX() methods on Hierarchy to a + Threshold + property. +

    +

    Added support for logging domains

    +

    + The LogManager supports multiple logging domains. The + LogManager + uses an instance of the IRepositorySelector class to map from + domains to ILoggerRepository instances. The default implementation + is to have a separate ILoggerRepository for each domain. When a + call is made to the static methods on LogManager the domain can be + specified (as a string) or the domain can be inferred automatically from the + calling assembly. The default behavior is for each assembly loaded into the + process to have its own domain and ILoggerRepository. These can + each be configured separately. This allows standalone assemblies to use log4net + without conflicting with other modules in the process. The domain for the + assembly is configured using metadata attributes defined on the assembly. +

    +

    DOMConfigurator can set params to arbitrary objects

    +

    + Using a new <object> element, params can now be set to any + creatable object. +

    +
    + +
    + From d565df422dd7ba4fbb4b2b297582eb3437dc792c Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Fri, 1 Mar 2024 14:21:50 +0200 Subject: [PATCH 100/122] :wrench: upgrade update-version-info task and zarro --- .gitignore | 2 ++ ...version-info.js => update-version-info.ts} | 25 ++++++------- package-lock.json | 36 ++++++++++++++----- package.json | 8 +++-- 4 files changed, 48 insertions(+), 23 deletions(-) rename local-tasks/{update-version-info.js => update-version-info.ts} (81%) diff --git a/.gitignore b/.gitignore index ad029ec8f..32ccf02ca 100644 --- a/.gitignore +++ b/.gitignore @@ -244,3 +244,5 @@ vs_buildtools.exe dotnetfx35.exe *.exe /src/Binaries/* + +local-tasks/*.generated.js \ No newline at end of file diff --git a/local-tasks/update-version-info.js b/local-tasks/update-version-info.ts similarity index 81% rename from local-tasks/update-version-info.js rename to local-tasks/update-version-info.ts index c1e0353f7..8c48510aa 100644 --- a/local-tasks/update-version-info.js +++ b/local-tasks/update-version-info.ts @@ -1,3 +1,4 @@ +/// // Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information @@ -5,9 +6,9 @@ // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at -// +// // http://www.apache.org/licenses/LICENSE-2.0 -// +// // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -16,22 +17,22 @@ // under the License. const - gulp = requireModule("gulp"); + gulp = requireModule("gulp"); gulp.task("update-version-info", async () => { // the version as per the .csproj is the correct version, but there // are other places where the version string is set via [assembly] // attributes, so we need to re-align them all const - Git = require("simple-git/promise"), - readTextFile = requireModule("read-text-file"), - writeTextFile = requireModule("write-text-file"), - readCsProjVersion = requireModule("read-csproj-version"), - currentVersion = await readCsProjVersion("src/log4net/log4net.csproj"), + Git = require("simple-git"), + { readTextFile, writeTextFile } = require("yafs"), + { readProjectVersion } = requireModule("csproj-utils"), + currentVersion = await readProjectVersion("src/log4net/log4net.csproj"), assemblyInfo = "src/log4net/AssemblyInfo.cs", assemblyVersionInfo = "src/log4net/AssemblyVersionInfo.cs", versionString = sanitiseVersion(currentVersion); + await updateVersionsIn(assemblyInfo, versionString); await updateVersionsIn(assemblyVersionInfo, versionString); @@ -43,9 +44,9 @@ gulp.task("update-version-info", async () => { await git.commit(`:bookmark: update versioning to ${versionString}`); async function updateVersionsIn( - filePath, - newVersion - ) { + filePath: string, + newVersion: string + ): Promise { const contents = await readTextFile(filePath), updated = contents @@ -56,7 +57,7 @@ gulp.task("update-version-info", async () => { await writeTextFile(filePath, updated); } - function sanitiseVersion(version) { + function sanitiseVersion(version: string): string { const parts = version.split("."); while (parts.length < 4) { parts.push("0"); diff --git a/package-lock.json b/package-lock.json index 1044a25f2..04544316f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,9 +15,10 @@ "gulp-zip": "^5.0.2", "npm-run-all": "^4.1.5", "rimraf": "^3.0.2", - "simple-git": "^3.16.0", + "simple-git": "^3.22.0", + "typescript": "^5.3.3", "which": "^2.0.2", - "yafs": "^1.5.0", + "yafs": "^1.36.0", "zarro": "^1.169.0" } }, @@ -6597,9 +6598,9 @@ } }, "node_modules/simple-git": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.16.0.tgz", - "integrity": "sha512-zuWYsOLEhbJRWVxpjdiXl6eyAyGo/KzVW+KFhhw9MqEEJttcq+32jTWSGyxTdf9e/YCohxRE+9xpWFj9FdiJNw==", + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.22.0.tgz", + "integrity": "sha512-6JujwSs0ac82jkGjMHiCnTifvf1crOiY/+tfs/Pqih6iow7VrpNKRRNdWm6RtaXpvvv/JGNYhlUtLhGFqHF+Yw==", "dev": true, "dependencies": { "@kwsites/file-exists": "^1.1.1", @@ -7386,6 +7387,19 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/unbox-primitive": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", @@ -13255,9 +13269,9 @@ } }, "simple-git": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.16.0.tgz", - "integrity": "sha512-zuWYsOLEhbJRWVxpjdiXl6eyAyGo/KzVW+KFhhw9MqEEJttcq+32jTWSGyxTdf9e/YCohxRE+9xpWFj9FdiJNw==", + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.22.0.tgz", + "integrity": "sha512-6JujwSs0ac82jkGjMHiCnTifvf1crOiY/+tfs/Pqih6iow7VrpNKRRNdWm6RtaXpvvv/JGNYhlUtLhGFqHF+Yw==", "dev": true, "requires": { "@kwsites/file-exists": "^1.1.1", @@ -13907,6 +13921,12 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, + "typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true + }, "unbox-primitive": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", diff --git a/package.json b/package.json index 5f0607724..a3aa9a9aa 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,8 @@ "dump-env": "node -e \"console.log(process.env);\"", "release": "run-s update-version-info build-release prepare-build-artifacts build-site", "zarro": "zarro", - "update-version-info": "zarro @" + "update-version-info": "zarro @", + "this-is-an-example": "zarro @" }, "repository": { "type": "git", @@ -36,9 +37,10 @@ "gulp-zip": "^5.0.2", "npm-run-all": "^4.1.5", "rimraf": "^3.0.2", - "simple-git": "^3.16.0", + "simple-git": "^3.22.0", + "typescript": "^5.3.3", "which": "^2.0.2", - "yafs": "^1.5.0", + "yafs": "^1.36.0", "zarro": "^1.169.0" } } From 2f9666e209dcafe9a91a0395f9e280132e154e50 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Fri, 1 Mar 2024 14:22:03 +0200 Subject: [PATCH 101/122] :bookmark: update versioning to 2.0.16.0 --- log4net.build | 2 +- log4net.shfbproj | 2 +- pom.xml | 2 +- src/log4net/AssemblyInfo.cs | 46 +++++++++++++++--------------- src/log4net/AssemblyVersionInfo.cs | 4 +-- 5 files changed, 28 insertions(+), 28 deletions(-) diff --git a/log4net.build b/log4net.build index 0bb50afd0..7172d4f23 100644 --- a/log4net.build +++ b/log4net.build @@ -20,7 +20,7 @@ limitations under the License. - + diff --git a/log4net.shfbproj b/log4net.shfbproj index d8e22eb66..ae39e0377 100644 --- a/log4net.shfbproj +++ b/log4net.shfbproj @@ -33,7 +33,7 @@ limitations under the License. .NET Framework 3.5 doc\sdk\net\4.0\ - log4net-sdk-2.0.15 + log4net-sdk-2.0.16 en-US Standard Blank diff --git a/pom.xml b/pom.xml index f1787c14c..c7f190585 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ log4net apache-log4net pom - 2.0.15 + 2.0.16 Apache log4net Logging framework for Microsoft .NET Framework. http://logging.apache.org/log4net/ diff --git a/src/log4net/AssemblyInfo.cs b/src/log4net/AssemblyInfo.cs index a767ff7a2..2cae3b92b 100644 --- a/src/log4net/AssemblyInfo.cs +++ b/src/log4net/AssemblyInfo.cs @@ -55,77 +55,77 @@ // #if (CLI_1_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-.CLI 1.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.16.0-.CLI 1.0")] [assembly: AssemblyTitle("Apache log4net for CLI 1.0 Compatible Frameworks")] #elif (NET_1_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-.NET 1.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.16.0-.NET 1.0")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 1.0")] #elif (NET_1_1) -[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-.NET 1.1")] +[assembly: AssemblyInformationalVersionAttribute("2.0.16.0-.NET 1.1")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 1.1")] #elif (NET_4_5) -[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-.NET 4.5")] +[assembly: AssemblyInformationalVersionAttribute("2.0.16.0-.NET 4.5")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 4.5")] #elif (NET_4_0) #if CLIENT_PROFILE -[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-.NET 4.0 CP")] +[assembly: AssemblyInformationalVersionAttribute("2.0.16.0-.NET 4.0 CP")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 4.0 Client Profile")] #else -[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-.NET 4.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.16.0-.NET 4.0")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 4.0")] #endif // Client Profile #elif (NET_3_5) #if CLIENT_PROFILE -[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-.NET 3.5 CP")] +[assembly: AssemblyInformationalVersionAttribute("2.0.16.0-.NET 3.5 CP")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 3.5 Client Profile")] #else -[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-.NET 3.5")] +[assembly: AssemblyInformationalVersionAttribute("2.0.16.0-.NET 3.5")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 3.5")] #endif // Client Profile #elif (NET_2_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-.NET 2.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.16.0-.NET 2.0")] [assembly: AssemblyTitle("Apache log4net for .NET Framework 2.0")] #elif (NETCF_1_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-.NETCF 1.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.16.0-.NETCF 1.0")] [assembly: AssemblyTitle("Apache log4net for .NET Compact Framework 1.0")] #elif (NETCF_2_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-.NETCF 2.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.16.0-.NETCF 2.0")] [assembly: AssemblyTitle("Apache log4net for .NET Compact Framework 2.0")] #elif (MONO_1_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-Mono 1.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.16.0-Mono 1.0")] [assembly: AssemblyTitle("Apache log4net for Mono 1.0")] #elif (MONO_2_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-Mono 2.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.16.0-Mono 2.0")] [assembly: AssemblyTitle("Apache log4net for Mono 2.0")] #elif (MONO_3_5) -[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-Mono 3.5")] +[assembly: AssemblyInformationalVersionAttribute("2.0.16.0-Mono 3.5")] [assembly: AssemblyTitle("Apache log4net for Mono 3.5")] #elif (MONO_4_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-Mono 4.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.16.0-Mono 4.0")] [assembly: AssemblyTitle("Apache log4net for Mono 4.0")] #elif (SSCLI_1_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-SSCLI 1.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.16.0-SSCLI 1.0")] [assembly: AssemblyTitle("Apache log4net for Shared Source CLI 1.0")] #elif (NET) -[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-.NET")] +[assembly: AssemblyInformationalVersionAttribute("2.0.16.0-.NET")] [assembly: AssemblyTitle("Apache log4net for .NET Framework")] #elif (NETSTANDARD1_3) -[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-.NET Standard 1.3")] +[assembly: AssemblyInformationalVersionAttribute("2.0.16.0-.NET Standard 1.3")] [assembly: AssemblyTitle("Apache log4net for .NET Standard 1.3")] #elif (NETSTANDARD2_0) -[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-.NET Standard 2.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.16.0-.NET Standard 2.0")] [assembly: AssemblyTitle("Apache log4net for .NET Standard 2.0")] #elif (NETCF) -[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-.NETCF")] +[assembly: AssemblyInformationalVersionAttribute("2.0.16.0-.NETCF")] [assembly: AssemblyTitle("Apache log4net for .NET Compact Framework")] #elif (MONO) -[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-Mono")] +[assembly: AssemblyInformationalVersionAttribute("2.0.16.0-Mono")] [assembly: AssemblyTitle("Apache log4net for Mono")] #elif (SSCLI) -[assembly: AssemblyInformationalVersionAttribute("2.0.15.0-SSCLI")] +[assembly: AssemblyInformationalVersionAttribute("2.0.16.0-SSCLI")] [assembly: AssemblyTitle("Apache log4net for Shared Source CLI")] #else -[assembly: AssemblyInformationalVersionAttribute("2.0.15.0")] +[assembly: AssemblyInformationalVersionAttribute("2.0.16.0")] [assembly: AssemblyTitle("Apache log4net")] #endif diff --git a/src/log4net/AssemblyVersionInfo.cs b/src/log4net/AssemblyVersionInfo.cs index 1c27d5799..14524de48 100644 --- a/src/log4net/AssemblyVersionInfo.cs +++ b/src/log4net/AssemblyVersionInfo.cs @@ -28,11 +28,11 @@ // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: System.Reflection.AssemblyVersion("2.0.15.0")] +[assembly: System.Reflection.AssemblyVersion("2.0.16.0")] #if !NETCF #if !SSCLI -[assembly: System.Reflection.AssemblyFileVersion("2.0.15.0")] +[assembly: System.Reflection.AssemblyFileVersion("2.0.16.0")] #endif #endif From 66891fdde50c8ad16814ae7cd4867cdc9db1e687 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Fri, 1 Mar 2024 14:54:55 +0200 Subject: [PATCH 102/122] :bug: should delete old site before asking mvn to make a new one --- local-tasks/build-site.js | 53 ++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/local-tasks/build-site.js b/local-tasks/build-site.js index d63d91cd2..ec3524299 100644 --- a/local-tasks/build-site.js +++ b/local-tasks/build-site.js @@ -5,9 +5,9 @@ // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at -// +// // http://www.apache.org/licenses/LICENSE-2.0 -// +// // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -16,32 +16,33 @@ // under the License. const - gulp = requireModule("gulp"), - spawn = requireModule("spawn"), - env = requireModule("env"), - os = require("os"), - which = require("which"); + gulp = requireModule("gulp"), + spawn = requireModule("spawn"), + env = requireModule("env"), + os = require("os"), + which = require("which"); gulp.task("build-site", async () => { - let maven; - try { - maven = await which("mvn"); - } catch (e) { - let extra; - switch (os.platform()) { - case "win32": - extra = "You may install maven via chocolatey (https://chocolatey.org)"; - break; - case "darwin": - extra = "You may install maven via homebrew"; - break; - default: - extra = "You should install maven with your package manager"; - break; - } - throw new Error(`Unable to find mvn in your path. ${extra}`); + const { rm } = require("yafs"); + let maven; + try { + maven = await which("mvn"); + } catch (e) { + let extra; + switch (os.platform()) { + case "win32": + extra = "You may install maven via chocolatey (https://chocolatey.org)"; + break; + case "darwin": + extra = "You may install maven via homebrew"; + break; + default: + extra = "You should install maven with your package manager"; + break; } - - return spawn("mvn", [ "site" ]); + throw new Error(`Unable to find mvn in your path. ${ extra }`); + } + await rm("target"); + return spawn("mvn", [ "site" ]); }); From 77f016607ac1f2010868caf88059063691025033 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Fri, 1 Mar 2024 15:00:58 +0200 Subject: [PATCH 103/122] :fire: remove changelog item - it's not done yet! --- src/site/xdoc/release/release-notes.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/site/xdoc/release/release-notes.xml b/src/site/xdoc/release/release-notes.xml index 4bb166de9..928b2002e 100644 --- a/src/site/xdoc/release/release-notes.xml +++ b/src/site/xdoc/release/release-notes.xml @@ -62,9 +62,6 @@ limitations under the License.
  • Add Peek() method to ThreadContextStack and LogicalThreadContextStack (by @andreycha)
  • -
  • - Dropping support for older runtimes (by @fluffynuts and @freeandnil) -
From 9f8a047ad669be080f2ecd4d5e93b460e9c0d2d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Volkan=20Yaz=C4=B1c=C4=B1?= Date: Mon, 4 Mar 2024 09:02:33 +0100 Subject: [PATCH 104/122] Update copyright year in `NOTICE` --- NOTICE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NOTICE b/NOTICE index 468a2f549..eaab50a68 100644 --- a/NOTICE +++ b/NOTICE @@ -1,5 +1,5 @@ Apache log4net - Copyright 2004-2022 The Apache Software Foundation + Copyright 2004-2024 The Apache Software Foundation This product includes software developed at The Apache Software Foundation (https://www.apache.org/). From fe6bf0559c0fb06545a28a5ea974b9fd48786894 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Mon, 4 Mar 2024 11:27:38 +0200 Subject: [PATCH 105/122] :memo: update build docs --- doc/BUILDING.md | 33 +++++++++++++++++++++++++++++++-- src/log4net/log4net.csproj | 9 +-------- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/doc/BUILDING.md b/doc/BUILDING.md index 597aafaf1..87d049166 100644 --- a/doc/BUILDING.md +++ b/doc/BUILDING.md @@ -1,11 +1,36 @@ ## Building log4net Log4net provides support for a wide array of targets, including -- older .net 2 and 3.5 (including client profiles) +- older .net 2 and 3.5 (including client profile for net-40) - more modern net40/net45 - netstandard1.3/2.0 As such, it does require a relatively full .net environment on Windows to build. +I have recently found a fairly freshly-installed win11 machine to work adequately, +after adding the "windows feature" for ".NET Framework 3.5 (includes .NET 2.0 and 3.0)" + +TL;DR (Windows): +- install Visual Studio Build Tools (at least VS2019) +- install nodejs (at least v16) +- install dotnet (v7+) and the .NET SDK (current latest) +- install dotnet 2, 3, 3.5 via "add windows features" +- in the project folder: + - `npm i` + - `npm run build` + +TL;DR (!Windows): +- install the dotnet SDK - v7 or better (at time of writing, v8 is current but + I've had some issues elsewhere, so I'm waiting a bit before recommending it + everywhere +- install Mono (you're going to need it to target certain versions of .NET) +- install nodejs 16+ + - in the project folder: + - `npm i` + - `export DOTNET_CORE=1 npm run build` + - we force using `dotnet` on non-windows targets for now. At some point, + this should become automatic + +## The full story Options: - build locally. Suggested environment: @@ -35,6 +60,10 @@ Options: - `npm run build` - optionally `npm test` to run all tests - optionally `npm run release` to generate release artifacts +- build locally (CLI edition) + - install nodejs (at least v16) + - `npm i` + - `npm run build` - build via docker for windows, using the `build-with-docker-for-windows.bat` script - build via the vs2019 Windows AppVeyer image. There is an appveyer.yml file included which (should) build if you set up AppVeyer to track @@ -54,4 +83,4 @@ The site will be generated in `target/site`, and can be viewed locally. Updates be pushed to the `asf-staging` branch of [https://github.com/apache/logging-log4net-site](https://github.com/apache/logging-log4net-site]) Once the site has been pushed to the `asf-staging` branch, it can be viewed at -[http://logging.staged.apache.org/log4net](http://logging.staged.apache.org/log4net) \ No newline at end of file +[http://logging.staged.apache.org/log4net](http://logging.staged.apache.org/log4net) diff --git a/src/log4net/log4net.csproj b/src/log4net/log4net.csproj index be9355b4f..2c9e4a4e8 100644 --- a/src/log4net/log4net.csproj +++ b/src/log4net/log4net.csproj @@ -72,13 +72,6 @@ false false - - .NETFramework - v3.5 - Client - ..\..\build\$(Configuration)\net35-client - $(DefineConstants);NET_2_0;NET_3_5;CLIENT_PROFILE - .NETFramework v4.0 @@ -212,4 +205,4 @@ - \ No newline at end of file + From f43726a34d28519907f7d2c2a7c676a11d038e36 Mon Sep 17 00:00:00 2001 From: Davyd McColl Date: Mon, 4 Mar 2024 12:25:50 +0200 Subject: [PATCH 106/122] :alembic: enable beta package building --- .zarro-defaults | 11 +++++++++++ doc/BUILDING.md | 2 +- package-lock.json | 14 +++++++------- package.json | 3 ++- pom.xml | 1 + src/log4net.sln | 9 +++++++++ src/log4net/log4net.csproj | 1 + 7 files changed, 32 insertions(+), 9 deletions(-) diff --git a/.zarro-defaults b/.zarro-defaults index 43b612c04..b7bbc3058 100644 --- a/.zarro-defaults +++ b/.zarro-defaults @@ -15,3 +15,14 @@ MAX_CONCURRENCY=1 # specify what to build (prevents accidental build of any other sln) BUILD_INCLUDE=src/log4net.sln + +# using zarro's pack target, tell it what to pack +PACK_INCLUDE_CSPROJ=log4net.csproj +# the pack target increments the PackageVersion node in log4net.csproj +# - setting this "truthy" propagates that change to the Version node +PACK_SYNC_PROJECT_VERSION=1 +# all version changes should be manual, however, it's generally +# accepted that the beta for, eg, 1.2.3 is 1.2.3-{date}-{sha} +# ie beta packages carry the main version of their intended +# release version +PACK_INCREMENT_MINOR_ON_FIRST_RELEASE=0 diff --git a/doc/BUILDING.md b/doc/BUILDING.md index 597aafaf1..aeff9f6bc 100644 --- a/doc/BUILDING.md +++ b/doc/BUILDING.md @@ -54,4 +54,4 @@ The site will be generated in `target/site`, and can be viewed locally. Updates be pushed to the `asf-staging` branch of [https://github.com/apache/logging-log4net-site](https://github.com/apache/logging-log4net-site]) Once the site has been pushed to the `asf-staging` branch, it can be viewed at -[http://logging.staged.apache.org/log4net](http://logging.staged.apache.org/log4net) \ No newline at end of file +[http://logging.staged.apache.org/log4net](http://logging.staged.apache.org/log4net) diff --git a/package-lock.json b/package-lock.json index 04544316f..f7ec4f498 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "typescript": "^5.3.3", "which": "^2.0.2", "yafs": "^1.36.0", - "zarro": "^1.169.0" + "zarro": "^1.168.5" } }, "node_modules/@kwsites/file-exists": { @@ -7926,9 +7926,9 @@ } }, "node_modules/zarro": { - "version": "1.169.0", - "resolved": "https://registry.npmjs.org/zarro/-/zarro-1.169.0.tgz", - "integrity": "sha512-2k89dREJ3XKVefgB7PoXZAjnrRZ8f9RwLLuo3SnXabb9PZb3P1fVCC5S3wjGNsD/LoG7CtI27AUOp3uWg+buhQ==", + "version": "1.168.5", + "resolved": "https://registry.npmjs.org/zarro/-/zarro-1.168.5.tgz", + "integrity": "sha512-MPW/cBPUNnL4+JK+43/+xjlBMLKuJJn6n7X32JdAf7QoY6KkHA4vdqKtla1kX0mPSlEICPEqtHHRA2VQ+d/+9w==", "dev": true, "dependencies": { "@octokit/rest": "^20.0.1", @@ -14373,9 +14373,9 @@ } }, "zarro": { - "version": "1.169.0", - "resolved": "https://registry.npmjs.org/zarro/-/zarro-1.169.0.tgz", - "integrity": "sha512-2k89dREJ3XKVefgB7PoXZAjnrRZ8f9RwLLuo3SnXabb9PZb3P1fVCC5S3wjGNsD/LoG7CtI27AUOp3uWg+buhQ==", + "version": "1.168.5", + "resolved": "https://registry.npmjs.org/zarro/-/zarro-1.168.5.tgz", + "integrity": "sha512-MPW/cBPUNnL4+JK+43/+xjlBMLKuJJn6n7X32JdAf7QoY6KkHA4vdqKtla1kX0mPSlEICPEqtHHRA2VQ+d/+9w==", "dev": true, "requires": { "@octokit/rest": "^20.0.1", diff --git a/package.json b/package.json index a3aa9a9aa..b4217cc3b 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "prepare-build-artifacts": "zarro @", "dump-env": "node -e \"console.log(process.env);\"", "release": "run-s update-version-info build-release prepare-build-artifacts build-site", + "release-beta": "cross-env VERSION_INCREMENT_STRATEGY=prerelease BUILD_CONFIGURATION=Release zarro pack", "zarro": "zarro", "update-version-info": "zarro @", "this-is-an-example": "zarro @" @@ -41,6 +42,6 @@ "typescript": "^5.3.3", "which": "^2.0.2", "yafs": "^1.36.0", - "zarro": "^1.169.0" + "zarro": "^1.168.5" } } diff --git a/pom.xml b/pom.xml index c7f190585..96d4cdc79 100644 --- a/pom.xml +++ b/pom.xml @@ -1,4 +1,5 @@