Skip to content

Commit 414f565

Browse files
committed
Rename some properties and add atlassian sourcemap test
1 parent c2ffb75 commit 414f565

File tree

7 files changed

+74
-60
lines changed

7 files changed

+74
-60
lines changed

SourceMaps.Tests/Helper.cs

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public static class Helper
1616
Names = new List<string> { "bar", "baz", "n" },
1717
Sources = new List<string> { "one.js", "two.js" },
1818
SourceRoot = "/the/root",
19-
Mappings = "CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA",
19+
MappingsString = "CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA",
2020
};
2121

2222
public static readonly SourceMap TestMapNoSourceRoot = new SourceMap
@@ -25,7 +25,7 @@ public static class Helper
2525
File = "min.js",
2626
Names = new List<string> { "bar", "baz", "n" },
2727
Sources = new List<string> { "one.js", "two.js" },
28-
Mappings =
28+
MappingsString =
2929
"CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA"
3030
};
3131

@@ -36,7 +36,7 @@ public static class Helper
3636
Names = new List<string> { "bar", "baz", "n" },
3737
Sources = new List<string> { "one.js", "two.js" },
3838
SourceRoot = "",
39-
Mappings =
39+
MappingsString =
4040
"CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA"
4141
};
4242

@@ -47,7 +47,7 @@ public static class Helper
4747
Names = new List<string> { "bar", "baz" },
4848
Sources = new List<string> { "one.js" },
4949
SourceRoot = "",
50-
Mappings = "CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID"
50+
MappingsString = "CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID"
5151
};
5252

5353
public static readonly SourceMap TestMapEmptyMappings = new SourceMap
@@ -58,7 +58,7 @@ public static class Helper
5858
Sources = new List<string> { "one.js", "two.js" },
5959
SourcesContent = new List<string> { " ONE.foo = 1;", " TWO.inc = 2;" },
6060
SourceRoot = "",
61-
Mappings = ""
61+
MappingsString = ""
6262
};
6363

6464
public static readonly SourceMap TestMapEmptyMappingsRelativeSources = new SourceMap
@@ -69,7 +69,7 @@ public static class Helper
6969
Sources = new List<string> { "./one.js", "./two.js" },
7070
SourcesContent = new List<string> { " ONE.foo = 1;", " TWO.inc = 2;" },
7171
SourceRoot = "/the/root",
72-
Mappings = ""
72+
MappingsString = ""
7373
};
7474

7575
public static readonly SourceMap TestMapEmptyMappingsRelativeSources_generatedExpected = new SourceMap
@@ -80,7 +80,7 @@ public static class Helper
8080
Sources = new List<string> { "one.js", "two.js" },
8181
SourcesContent = new List<string> { " ONE.foo = 1;", " TWO.inc = 2;" },
8282
SourceRoot = "/the/root",
83-
Mappings = ""
83+
MappingsString = ""
8484
};
8585

8686
public static readonly SourceMap TestMapMultiSourcesMappingRefersSingleSourceOnly = new SourceMap
@@ -90,10 +90,9 @@ public static class Helper
9090
Names = new List<string> { "bar", "baz" },
9191
Sources = new List<string> { "one.js", "withoutMappings.js" },
9292
SourceRoot = "",
93-
Mappings = "CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID"
93+
MappingsString = "CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID"
9494
};
9595

96-
9796
public static readonly SourceMap TestMapWithSourcesContent = new SourceMap
9897
{
9998
Version = 3,
@@ -106,7 +105,7 @@ public static class Helper
106105
" TWO.inc = function (n) {\n return n + 1;\n };"
107106
},
108107
SourceRoot = "/the/root",
109-
Mappings =
108+
MappingsString =
110109
"CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA"
111110
};
112111

@@ -122,7 +121,7 @@ public static class Helper
122121
" TWO.inc = function (n) {\n return n + 1;\n };"
123122
},
124123
SourceRoot = "/the/root",
125-
Mappings =
124+
MappingsString =
126125
"CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA"
127126
};
128127

@@ -132,7 +131,7 @@ public static class Helper
132131
File = "min.js",
133132
Names = new List<string> { },
134133
Sources = new List<string> { },
135-
Mappings = ""
134+
MappingsString = ""
136135
};
137136

138137
public static readonly SourceMap MapWithSourcelessMapping = new SourceMap
@@ -141,7 +140,7 @@ public static class Helper
141140
File = "example.js",
142141
Names = new List<string> { },
143142
Sources = new List<string> { "example.js" },
144-
Mappings = "AAgCA,C"
143+
MappingsString = "AAgCA,C"
145144
};
146145

147146
public static void AssertMapping(
@@ -189,7 +188,7 @@ public static void AssertEqualMaps(SourceMap expected, SourceMap actual)
189188
}
190189

191190
Assert.Equal(expected.SourceRoot, actual.SourceRoot);
192-
Assert.Equal(expected.Mappings, actual.Mappings);
191+
Assert.Equal(expected.MappingsString, actual.MappingsString);
193192

194193
if (expected.SourcesContent != null)
195194
{

SourceMaps.Tests/SourceMapParserTests.cs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ public void ApplyMappingSegment_CorrectlyUpdatesState()
1919
Assert.Equal(1, state.GeneratedLineNumber);
2020
Assert.Equal(6, state.GeneratedColumnNumber);
2121
Assert.Equal(3, state.SourcesListIndex);
22-
Assert.Equal(4, state.OriginalSourceStartingLineNumber);
23-
Assert.Equal(5, state.OriginalSourceStartingColumnNumber);
22+
Assert.Equal(4, state.OriginalLineNumber);
23+
Assert.Equal(5, state.OriginalColumnNumber);
2424
Assert.Equal(6, state.NamesListIndex);
2525

2626
segmentFields = new List<int> { 1, 5, 4, 3 };
@@ -29,8 +29,8 @@ public void ApplyMappingSegment_CorrectlyUpdatesState()
2929
Assert.Equal(1, state.GeneratedLineNumber);
3030
Assert.Equal(7, state.GeneratedColumnNumber);
3131
Assert.Equal(8, state.SourcesListIndex);
32-
Assert.Equal(8, state.OriginalSourceStartingLineNumber);
33-
Assert.Equal(8, state.OriginalSourceStartingColumnNumber);
32+
Assert.Equal(8, state.OriginalLineNumber);
33+
Assert.Equal(8, state.OriginalColumnNumber);
3434
Assert.Equal(6, state.NamesListIndex);
3535

3636
segmentFields = new List<int> { 1, 1, 1, 1, 3 };
@@ -39,15 +39,15 @@ public void ApplyMappingSegment_CorrectlyUpdatesState()
3939
Assert.Equal(1, state.GeneratedLineNumber);
4040
Assert.Equal(8, state.GeneratedColumnNumber);
4141
Assert.Equal(9, state.SourcesListIndex);
42-
Assert.Equal(9, state.OriginalSourceStartingLineNumber);
43-
Assert.Equal(9, state.OriginalSourceStartingColumnNumber);
42+
Assert.Equal(9, state.OriginalLineNumber);
43+
Assert.Equal(9, state.OriginalColumnNumber);
4444
Assert.Equal(9, state.NamesListIndex);
4545
}
4646

4747
[Fact]
4848
public void ParseMappings_CorrectlyParsesSingleMapping()
4949
{
50-
var result = SourceMapParser.ParseMappings(Helper.TestMapWithSourcesContent.Mappings, Helper.TestMapWithSourcesContent.Names, Helper.TestMapWithSourcesContent.Sources);
50+
var result = SourceMapParser.ParseMappings(Helper.TestMapWithSourcesContent.MappingsString, Helper.TestMapWithSourcesContent.Names, Helper.TestMapWithSourcesContent.Sources);
5151

5252
Assert.Equal(13, result.Count);
5353
}
@@ -105,7 +105,7 @@ public void Parse_MappingsAndEndOfLines()
105105
{
106106
var map = new SourceMap
107107
{
108-
ParsedMappings = new List<SourceMapMappingEntry>
108+
Mappings = new List<SourceMapMappingEntry>
109109
{
110110
new SourceMapMappingEntry(1, 1, 1, 1, null, "bar.js"),
111111
new SourceMapMappingEntry(2, 2, 2, 2, null, "bar.js"),
@@ -131,7 +131,7 @@ public void Parse_OriginalPositionFor()
131131
{
132132
var map = new SourceMap
133133
{
134-
ParsedMappings = new List<SourceMapMappingEntry>
134+
Mappings = new List<SourceMapMappingEntry>
135135
{
136136
new SourceMapMappingEntry(2, 2, 1, 1, null,
137137
"foo/bar/bang.coffee"),
@@ -145,6 +145,7 @@ public void Parse_OriginalPositionFor()
145145
}
146146

147147
[Theory]
148+
[InlineData("files/atlassian.sourcemap")]
148149
[InlineData("files/babel.sourcemap")]
149150
[InlineData("files/sass.sourcemap")]
150151
public void Parse_CanParseGeneratedSourcemaps(string path)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"version":3,"sources":["js/init.js"],"names":["define","ProjectIssueNavigator","Meta","WrmData","jQuery","init","element","projectIssueNavigator","el","canCreateIssues","claim","emptyViewContent","start","JIRA","API","getSidebar","done","Sidebar","AUISidebar","getAUISidebar","on","adjustSize","val","get","require","DarkFeatures","skate","REDIRECT_FROM_GLOBAL_TO_PROJECT","enabled","type","CLASSNAME","attached"],"mappings":"AAAAA,OAAO,mCACH,6BACA,sBACA,WACA,UACD,SACCC,EACAC,EACAC,EACAC,GAEA,YAEA,SAASC,GAAKC,GACV,GAAIC,GAAwB,GAAIN,IAC5BO,GAAIJ,EAAOE,GACXG,gBAAiBN,EAAQO,MAAM,sEAC/BC,iBAAkBR,EAAQO,MAAM,4EAEpCH,GAAsBK,QAEtBC,KAAKC,IAAIC,aAAaC,KAAK,SAAUC,GACjC,GAAIC,GAAaD,EAAQE,eAEzBD,GAAWE,GAAG,eAAgB,WAC1Bb,EAAsBc,eAG1BH,EAAWE,GAAG,aAAc,WACxBb,EAAsBc,iBAUlC,MALAjB,GAAO,WAEHA,EAAO,iDAAiDkB,IAAIpB,EAAKqB,IAAI,kBAGlElB,IAGXmB,SACI,oDACA,kCACA,aACA,UACD,SACCC,EACApB,EACAqB,EACAtB,GAEA,YAEA,KAAKqB,EAAaE,gCAAgCC,UAC9CxB,EAAO,WACHC,EAAKD,EAAO,oBAAoBmB,IAAI,UAGxCG,GAAM,wBACFG,KAAMH,EAAMG,KAAKC,UACjBC,SAAU,WACN1B,EAAKD,EAAO,oBAAoBmB,IAAI","file":"js/init-min.js","sourcesContent":["define('jira/projectissuenavigator/init', [\n 'jira/projectissuenavigator',\n 'jira/util/data/meta',\n 'wrm/data',\n 'jquery'\n], function(\n ProjectIssueNavigator,\n Meta,\n WrmData,\n jQuery\n) {\n \"use strict\";\n\n function init(element) {\n var projectIssueNavigator = new ProjectIssueNavigator({\n el: jQuery(element),\n canCreateIssues: WrmData.claim(\"com.atlassian.jira.jira-projects-issue-navigator:can-create-issues\"),\n emptyViewContent: WrmData.claim(\"com.atlassian.jira.jira-projects-issue-navigator:empty-state-panel-html\")\n });\n projectIssueNavigator.start();\n\n JIRA.API.getSidebar().done(function (Sidebar) {\n var AUISidebar = Sidebar.getAUISidebar();\n\n AUISidebar.on('collapse-end', function () {\n projectIssueNavigator.adjustSize();\n });\n\n AUISidebar.on('expand-end', function () {\n projectIssueNavigator.adjustSize();\n });\n });\n }\n\n jQuery(function () {\n // Horrible hack. This should go away during JDEV-31262\n jQuery(\"fieldset.parameters input[title=loggedInUser]\").val(Meta.get(\"remote-user\"));\n });\n\n return init;\n});\n\nrequire([\n 'jira/components/issueviewer/services/darkfeatures',\n 'jira/projectissuenavigator/init',\n 'jira/skate',\n 'jquery'\n], function (\n DarkFeatures,\n init,\n skate,\n jQuery\n) {\n \"use strict\";\n\n if (!DarkFeatures.REDIRECT_FROM_GLOBAL_TO_PROJECT.enabled()) {\n jQuery(function () {\n init(jQuery('.issue-navigator').get(0));\n });\n } else {\n skate('issue-navigator-init', {\n type: skate.type.CLASSNAME,\n attached: function () {\n init(jQuery('.issue-navigator').get(0));\n }\n });\n }\n});\n"],"sourceRoot":"/source/"}

SourceMaps/SourceMap.cs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
namespace SourceMaps
55
{
6-
public class SourceMap
6+
public sealed class SourceMap
77
{
88
[JsonPropertyName("version")]
99
public int Version { get; set; }
@@ -24,17 +24,24 @@ public class SourceMap
2424
public List<string> Names { get; set; }
2525

2626
[JsonPropertyName("mappings")]
27-
public string Mappings { get; set; }
27+
public string MappingsString { get; set; }
2828

2929
[JsonIgnore]
30-
public List<SourceMapMappingEntry> ParsedMappings { get; set; }
30+
public List<SourceMapMappingEntry> Mappings { get; set; }
3131

32+
/// <summary>
33+
/// Returns the original source, line and column information for the generated
34+
/// source's line and column positions provided.
35+
/// </summary>
36+
/// <param name="generatedLineNumber">The line number in the generated source, 1-based.</param>
37+
/// <param name="generatedColumnNumber">The column number in the generated source, 0-based</param>
38+
/// <returns>A struct with the original mappings, or null if no mapping exit for the given line and column number.</returns>
3239
public SourceMapMappingEntry? OriginalPositionFor(int generatedLineNumber, int generatedColumnNumber)
3340
{
34-
if (ParsedMappings == null)
41+
if (Mappings == null)
3542
return null;
3643

37-
var index = ParsedMappings.BinarySearch(
44+
var index = Mappings.BinarySearch(
3845
new SourceMapMappingEntry(generatedLineNumber, generatedColumnNumber, null, null, null, null),
3946
Comparer<SourceMapMappingEntry>.Create((a, b) =>
4047
{
@@ -46,14 +53,14 @@ public class SourceMap
4653
if (index < 0)
4754
{
4855
if (~index - 1 >= 0 &&
49-
ParsedMappings[~index - 1].GeneratedLineNumber == generatedLineNumber &&
50-
ParsedMappings[~index - 1].GeneratedColumnNumber == generatedColumnNumber)
56+
Mappings[~index - 1].GeneratedLineNumber == generatedLineNumber &&
57+
Mappings[~index - 1].GeneratedColumnNumber == generatedColumnNumber)
5158
{
5259
index = ~index - 1;
5360
}
5461
}
5562

56-
return index >= 0 ? ParsedMappings[index] : (SourceMapMappingEntry?)null;
63+
return index >= 0 ? Mappings[index] : (SourceMapMappingEntry?)null;
5764
}
5865
}
5966
}

SourceMaps/SourceMapMappingEntry.cs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,8 @@
22

33
namespace SourceMaps
44
{
5-
public struct SourceMapMappingEntry : IEquatable<SourceMapMappingEntry>
5+
public readonly struct SourceMapMappingEntry : IEquatable<SourceMapMappingEntry>
66
{
7-
public readonly int GeneratedLineNumber;
8-
public readonly int GeneratedColumnNumber;
9-
public readonly int? OriginalLineNumber;
10-
public readonly int? OriginalColumnNumber;
11-
public readonly string OriginalName;
12-
public readonly string OriginalFileName;
13-
147
public SourceMapMappingEntry(int generatedLineNumber, int generatedColumnNumber, int? originalLineNumber, int? originalColumnNumber, string originalName, string originalFileName)
158
{
169
this.GeneratedLineNumber = generatedLineNumber;
@@ -21,6 +14,19 @@ public SourceMapMappingEntry(int generatedLineNumber, int generatedColumnNumber,
2114
this.OriginalFileName = originalFileName;
2215
}
2316

17+
public int GeneratedLineNumber { get; }
18+
public int GeneratedColumnNumber { get; }
19+
public int? OriginalLineNumber { get; }
20+
public int? OriginalColumnNumber { get; }
21+
public string OriginalName { get; }
22+
public string OriginalFileName { get; }
23+
24+
public static bool operator ==(SourceMapMappingEntry left, SourceMapMappingEntry right)
25+
=> Equals(left, right);
26+
27+
public static bool operator !=(SourceMapMappingEntry left, SourceMapMappingEntry right)
28+
=> !Equals(left, right);
29+
2430
public bool Equals(SourceMapMappingEntry other)
2531
{
2632
return GeneratedLineNumber == other.GeneratedLineNumber &&

SourceMaps/SourceMapParser.cs

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,13 @@ public static class SourceMapParser
1111
public static SourceMap Parse(string sourceMapString)
1212
{
1313
var sourceMap = JsonSerializer.Deserialize<SourceMap>(sourceMapString);
14+
if (sourceMap.Version != 3)
15+
throw new ArgumentException($"Unknown source map version: {sourceMap.Version}");
16+
1417
if (!string.IsNullOrEmpty(sourceMap.SourceRoot))
1518
sourceMap.Sources = sourceMap.Sources.Select(source => Path.Combine(sourceMap.SourceRoot, source)).ToList();
16-
sourceMap.ParsedMappings = ParseMappings(sourceMap.Mappings, sourceMap.Names, sourceMap.Sources);
19+
20+
sourceMap.Mappings = ParseMappings(sourceMap.MappingsString, sourceMap.Names, sourceMap.Sources);
1721
return sourceMap;
1822
}
1923

@@ -41,23 +45,18 @@ internal static List<SourceMapMappingEntry> ParseMappings(string mappings, List<
4145

4246
internal static void ApplyMappingSegment(List<int> segmentFields, ref MappingParserState state)
4347
{
44-
if (segmentFields == null)
45-
{
46-
throw new ArgumentNullException(nameof(segmentFields));
47-
}
48+
_ = segmentFields ?? throw new ArgumentNullException(nameof(segmentFields));
4849

49-
if (segmentFields.Count == 0 || segmentFields.Count == 2 || segmentFields.Count == 3)
50-
{
51-
throw new ArgumentOutOfRangeException(nameof(segmentFields));
52-
}
50+
if (segmentFields.Count != 1 && segmentFields.Count != 4 && segmentFields.Count != 5)
51+
throw new ArgumentOutOfRangeException(nameof(segmentFields), $"Expected 1, 4 or 5 fields, got {segmentFields.Count}");
5352

5453
state.GeneratedColumnNumber += segmentFields[0];
5554

5655
if (segmentFields.Count > 1)
5756
{
5857
state.SourcesListIndex = (state.SourcesListIndex ?? 0) + segmentFields[1];
59-
state.OriginalSourceStartingLineNumber = (state.OriginalSourceStartingLineNumber ?? 0) + segmentFields[2];
60-
state.OriginalSourceStartingColumnNumber = (state.OriginalSourceStartingColumnNumber ?? 0) + segmentFields[3];
58+
state.OriginalLineNumber = (state.OriginalLineNumber ?? 0) + segmentFields[2];
59+
state.OriginalColumnNumber = (state.OriginalColumnNumber ?? 0) + segmentFields[3];
6160
}
6261

6362
if (segmentFields.Count >= 5)
@@ -72,32 +71,32 @@ internal struct MappingParserState
7271
public int GeneratedLineNumber;
7372
public int GeneratedColumnNumber;
7473
public int? SourcesListIndex;
75-
public int? OriginalSourceStartingLineNumber;
76-
public int? OriginalSourceStartingColumnNumber;
74+
public int? OriginalLineNumber;
75+
public int? OriginalColumnNumber;
7776
public int? NamesListIndex;
7877

7978
public MappingParserState(
8079
int generatedLineNumber,
8180
int generatedColumnNumber,
8281
int sourcesListIndex,
83-
int originalSourceStartingLineNumber,
84-
int originalSourceStartingColumnNumber,
82+
int originalLineNumber,
83+
int originalColumnNumber,
8584
int namesListIndex)
8685
{
8786
this.GeneratedLineNumber = generatedLineNumber;
8887
this.GeneratedColumnNumber = generatedColumnNumber;
88+
this.OriginalLineNumber = originalLineNumber;
89+
this.OriginalColumnNumber = originalColumnNumber;
8990
this.SourcesListIndex = sourcesListIndex;
90-
this.OriginalSourceStartingLineNumber = originalSourceStartingLineNumber;
91-
this.OriginalSourceStartingColumnNumber = originalSourceStartingColumnNumber;
9291
this.NamesListIndex = namesListIndex;
9392
}
9493

9594
public SourceMapMappingEntry GetCurrentSourceMapMappingEntry(List<string> names, List<string> sources)
9695
=> new SourceMapMappingEntry(
97-
GeneratedLineNumber + 1,
98-
GeneratedColumnNumber + 1,
99-
OriginalSourceStartingLineNumber.HasValue ? OriginalSourceStartingLineNumber.Value + 1 : (int?)null,
100-
OriginalSourceStartingColumnNumber.HasValue ? OriginalSourceStartingColumnNumber.Value + 1 : (int?)null,
96+
GeneratedLineNumber,
97+
GeneratedColumnNumber,
98+
OriginalLineNumber,
99+
OriginalColumnNumber,
101100
NamesListIndex.HasValue ? names[NamesListIndex.Value] : null,
102101
SourcesListIndex.HasValue ? sources[SourcesListIndex.Value] : null);
103102
}

SourceMaps/SourceMaps.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
<PropertyGroup>
44
<TargetFramework>netstandard2.0</TargetFramework>
5+
<LangVersion>8.0</LangVersion>
56
</PropertyGroup>
67

78
<ItemGroup>

0 commit comments

Comments
 (0)