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