summary refs log tree commit diff
path: root/ReferenceClientProxyImplementation/Patches/Implementations/JSPatches/NullCoalescingPatch.cs
blob: 98156c89d11df4ff5f893e5e246180c9bca76a96 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using System.Text;
using System.Text.RegularExpressions;

namespace ReferenceClientProxyImplementation.Patches.Implementations.JSPatches;

public partial class NullCoalescingPatch : IPatch {
    public int GetOrder() => 1;

    public string GetName() => "Patch null-coalescing expressions in JS";
    public bool Applies(string relativeName, byte[] content) => relativeName.EndsWith(".js");

    public async Task<byte[]> Execute(string relativePath, byte[] content) {
        var stringContent = Encoding.UTF8.GetString(content);

        stringContent = NullCoalescingRegex().Replace(
            stringContent,
            m => $"{m.Groups[1].Value}?.{m.Groups[2].Value}"
        );
        // stringContent = ParenNullCheckRegex().Replace(
        //     stringContent,
        //     m => $"{m.Groups[1].Value} == null"
        // );

        return Encoding.UTF8.GetBytes(stringContent);
    }

    [GeneratedRegex(@"null == ([a-zA-Z0-9_]+?) \? undefined : \1\.([a-zA-Z0-9_]+?)", RegexOptions.Compiled)]
    private static partial Regex NullCoalescingRegex();

    [GeneratedRegex(@"\(([^()]+?)\) == null", RegexOptions.Compiled)]
    private static partial Regex ParenNullCheckRegex();
}