summary refs log tree commit diff
path: root/ReferenceClientProxyImplementation/Patches/Implementations/JSPatches/CompactSingleExportPathPatch.cs
blob: 9cf81026b5fe188171b1cccb0845ae04d5b16629 (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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
using System.Text;
using System.Text.RegularExpressions;
using ArcaneLibs.Extensions;

namespace ReferenceClientProxyImplementation.Patches.Implementations.JSPatches;

public partial class CompactSingleExportPathPatch : IPatch
{
    public int GetOrder() => 2;

    public string GetName() => "Patch single path export function to be more compact";
    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 = SimpleSingleParamExportRegex().Replace(
        //     stringContent,
        //     m =>
        //         $"{m.Groups[1].Value}({m.Groups[2].Value}) {{ {m.Groups[2].Value}.exports = \"{m.Groups[3].Value}\"; }},"
        // );

        var fnSigLength = new Dictionary<int, int>();
        var lastMatchIdx = new Dictionary<int, int>();
        stringContent = SimpleMultiParamExportRegex().Replace(
            stringContent,
            m =>
            {
                // might aswell make it aligned...
                int argCnt = m.Groups["fnParams"].Value.CountInstances(",");
                lastMatchIdx.TryAdd(argCnt, 0);
                fnSigLength.TryAdd(argCnt, 0);
                
                if (m.Index - lastMatchIdx[argCnt] > 1000) fnSigLength[argCnt] = 0; 
                lastMatchIdx[argCnt] = m.Index;
                var currentFnSigLength = m.Groups["fnName"].Length + m.Groups["fnParams"].Length + 2;
                if (currentFnSigLength > fnSigLength[argCnt]) fnSigLength[argCnt] = currentFnSigLength;
                return
                    $"{m.Groups["fnName"].Value}({m.Groups["fnParams"].Value})".PadLeft(fnSigLength[argCnt]) +
                    $" {{ {m.Groups["exportTarget"].Value}.exports = {m.Groups["exportImpl"].Value}; }},";
            });

        return Encoding.UTF8.GetBytes(stringContent);
    }

    /*
     * 12345(e) {
     *   "use strict";
     *   e.exports = "/abcdef.svg";
     * }
     */
    [GeneratedRegex(@"(\d+)\((.)\) {(?:\n\s+""use strict"";)?\n\s+\2\.exports = ""([/a-z0-9\.]+)"";\n\s+},",
        RegexOptions.Compiled)]
    private static partial Regex SimpleSingleParamExportRegex();

    /*
     * 12345(e, t, n) {
     *   "use strict";
     *   e.exports = n.p + "/abcdef.svg";
     * }
     */
    [GeneratedRegex("""
                    (?<fnName>[a-zA-Z0-9]+)\((?<fnParams>[a-zA-Z0-9\s,]*)\) {
                    (?:\s+"use strict";)?
                    \s+(?<exportTarget>[a-zA-Z0-9]+)\.exports = (?<exportImpl>[^;]+?);
                    \s+},
                    """, RegexOptions.Compiled)]
    private static partial Regex SimpleMultiParamExportRegex();
}