Skip to content

Commit 78668c9

Browse files
authored
Merge pull request #11 from parcel-bundler/fix-napi
Making addIndexedMappings more stable
2 parents cd295b1 + e917ae9 commit 78668c9

12 files changed

+138
-118
lines changed

bench/run.js

+21-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
const Benchmark = require("tiny-benchy");
2+
const MozillaSourceMap = require("source-map");
23
const assert = require("assert");
34
const { default: SourceMap, init } =
45
process.env.BACKEND === "wasm" ? require("../dist/wasm-node") : require("../");
@@ -14,12 +15,12 @@ init.then(() => {
1415
name: "A",
1516
original: {
1617
line: index + 1,
17-
column: 0 + 10 * index
18+
column: 0 + 10 * index,
1819
},
1920
generated: {
2021
line: 1,
21-
column: 15 + 10 * index
22-
}
22+
column: 15 + 10 * index,
23+
},
2324
};
2425
});
2526

@@ -47,6 +48,21 @@ init.then(() => {
4748
map.addIndexedMappings(mappings);
4849
});
4950

51+
suite.add("JS Mappings => vlq (mozilla source-map) => buffer", async () => {
52+
let map = new MozillaSourceMap.SourceMapGenerator({
53+
sourceRoot: "/",
54+
});
55+
56+
for (let mapping of mappings) {
57+
map.addMapping(mapping);
58+
}
59+
60+
let json = map.toJSON();
61+
62+
let sourceMap = new SourceMap();
63+
sourceMap.addRawMappings(json.mappings, json.sources, json.names);
64+
});
65+
5066
suite.add("Save buffer", async () => {
5167
sourcemapInstance.toBuffer();
5268
});
@@ -60,7 +76,7 @@ init.then(() => {
6076
suite.add("stringify", async () => {
6177
await sourcemapInstance.stringify({
6278
file: "index.js.map",
63-
sourceRoot: "/"
79+
sourceRoot: "/",
6480
});
6581
});
6682

@@ -90,7 +106,7 @@ init.then(() => {
90106
}
91107
await map.stringify({
92108
file: "index.js.map",
93-
sourceRoot: "/"
109+
sourceRoot: "/",
94110
});
95111
});
96112

package.json

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@parcel/source-map",
3-
"version": "2.0.0-alpha.4.6",
3+
"version": "2.0.0-alpha.4.7",
44
"main": "./dist/node.js",
55
"browser": "./dist/wasm-browser.js",
66
"license": "MIT",
@@ -41,8 +41,7 @@
4141
},
4242
"dependencies": {
4343
"node-addon-api": "^2.0.0",
44-
"node-gyp-build": "^4.2.1",
45-
"prettier": "^2.0.2"
44+
"node-gyp-build": "^4.2.1"
4645
},
4746
"devDependencies": {
4847
"@babel/cli": "^7.8.4",
@@ -54,6 +53,8 @@
5453
"flow-copy-source": "^2.0.9",
5554
"mocha": "^7.1.0",
5655
"prebuildify": "^3.0.4",
57-
"tiny-benchy": "^1.0.0"
56+
"source-map": "^0.7.3",
57+
"tiny-benchy": "^1.0.0",
58+
"prettier": "^2.0.2"
5859
}
5960
}

src/MappingContainer.cpp

+19
Original file line numberDiff line numberDiff line change
@@ -437,3 +437,22 @@ void MappingContainer::addBufferMappings(const void *buf, int lineOffset, int co
437437
}
438438
}
439439
}
440+
441+
void MappingContainer::addIndexedMapping(int generatedLine, int generatedColumn, int originalLine, int originalColumn,
442+
std::string source, std::string name) {
443+
Position generatedPosition = Position{generatedLine, generatedColumn};
444+
Position originalPosition = Position{originalLine, originalColumn};
445+
int sourceIndex = -1;
446+
int nameIndex = -1;
447+
if (originalPosition.line > -1) {
448+
if (!source.empty()) {
449+
sourceIndex = addSource(source);
450+
}
451+
452+
if (!name.empty()) {
453+
nameIndex = addName(name);
454+
}
455+
}
456+
457+
addMapping(generatedPosition, originalPosition, sourceIndex, nameIndex);
458+
}

src/MappingContainer.h

+2
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ class MappingContainer {
5050

5151
void addBufferMappings(const void *buf, int lineOffset = 0, int columnOffset = 0);
5252

53+
void addIndexedMapping(int generatedLine, int generatedColumn, int originalLine, int originalColumn, std::string source, std::string name);
54+
5355
private:
5456
// Processed mappings, for all kinds of modifying within the sourcemap
5557
std::vector<std::string> _sources;

src/napi/SourceMap.cpp

+21-61
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,14 @@ void SourceMapBinding::addBufferMappings(const Napi::CallbackInfo &info) {
6565
}
6666

6767
if (info.Length() > 1 && !info[1].IsNumber()) {
68-
Napi::TypeError::New(env, "Expected a lineOffset of type integer for the second parameter").ThrowAsJavaScriptException();
68+
Napi::TypeError::New(env,
69+
"Expected a lineOffset of type integer for the second parameter").ThrowAsJavaScriptException();
6970
return;
7071
}
7172

7273
if (info.Length() > 2 && !info[2].IsNumber()) {
73-
Napi::TypeError::New(env, "Expected a columnOffset of type integer for the third parameter").ThrowAsJavaScriptException();
74+
Napi::TypeError::New(env,
75+
"Expected a columnOffset of type integer for the third parameter").ThrowAsJavaScriptException();
7476
return;
7577
}
7678

@@ -205,68 +207,24 @@ Napi::Value SourceMapBinding::getMap(const Napi::CallbackInfo &info) {
205207
return obj;
206208
}
207209

208-
// addIndexedMappings(array<mapping>, lineOffset, columnOffset): uses numbers for source and name with the index specified in the sources/names map/array in SourceMap instance
209-
void SourceMapBinding::addIndexedMappings(const Napi::CallbackInfo &info) {
210+
// addIndexedMapping(generatedLine, generatedColumn, originalLine, originalColumn, source, name)
211+
void SourceMapBinding::addIndexedMapping(const Napi::CallbackInfo &info) {
210212
Napi::Env env = info.Env();
211213
Napi::HandleScope scope(env);
212214

213-
if (info.Length() < 1) {
214-
Napi::TypeError::New(env, "Expected 1-3 parameters").ThrowAsJavaScriptException();
215-
return;
216-
}
217-
218-
if (!info[0].IsArray()) {
219-
Napi::TypeError::New(env, "First parameter should be an array").ThrowAsJavaScriptException();
220-
return;
221-
}
222-
223-
if (info.Length() > 1 && !info[1].IsNumber()) {
224-
Napi::TypeError::New(env,
225-
"Second parameter should be a lineOffset of type integer").ThrowAsJavaScriptException();
226-
return;
227-
}
228-
229-
if (info.Length() > 2 && !info[2].IsNumber()) {
230-
Napi::TypeError::New(env,
231-
"Third parameter should be a lineOffset of type integer").ThrowAsJavaScriptException();
215+
if (info.Length() < 6) {
216+
Napi::TypeError::New(env, "Expected 6 parameters").ThrowAsJavaScriptException();
232217
return;
233218
}
234219

235-
const Napi::Array mappingsArray = info[0].As<Napi::Array>();
236-
int lineOffset = info.Length() > 1 ? info[1].As<Napi::Number>().Int32Value() : 0;
237-
int columnOffset = info.Length() > 2 ? info[2].As<Napi::Number>().Int32Value() : 0;
220+
int generatedLine = info[0].As<Napi::Number>().Int32Value();
221+
int generatedColumn = info[1].As<Napi::Number>().Int32Value();
222+
int originalLine = info[2].As<Napi::Number>().Int32Value();
223+
int originalColumn = info[3].As<Napi::Number>().Int32Value();
224+
std::string source = info[4].As<Napi::String>().Utf8Value();
225+
std::string name = info[5].As<Napi::String>().Utf8Value();
238226

239-
unsigned int length = mappingsArray.Length();
240-
for (unsigned int i = 0; i < length; ++i) {
241-
Napi::Value mapping = mappingsArray.Get(i);
242-
Napi::Object mappingObject = mapping.As<Napi::Object>();
243-
244-
Napi::Object generated = mappingObject.Get("generated").As<Napi::Object>();
245-
int generatedLine = generated.Get("line").As<Napi::Number>().Int32Value() - 1;
246-
int generatedColumn = generated.Get("column").As<Napi::Number>().Int32Value();
247-
Position generatedPosition = Position{generatedLine + lineOffset, generatedColumn + columnOffset};
248-
249-
Napi::Value originalPositionValue = mappingObject.Get("original");
250-
if (originalPositionValue.IsObject()) {
251-
Napi::Object originalPositionObject = originalPositionValue.As<Napi::Object>();
252-
int originalLine = originalPositionObject.Get("line").As<Napi::Number>().Int32Value() - 1;
253-
int originalColumn = originalPositionObject.Get("column").As<Napi::Number>().Int32Value();
254-
Position originalPosition = Position{originalLine, originalColumn};
255-
256-
std::string sourceString = mappingObject.Get("source").As<Napi::String>().Utf8Value();
257-
int source = _mapping_container.addSource(sourceString);
258-
259-
Napi::Value nameValue = mappingObject.Get("name");
260-
if (nameValue.IsString()) {
261-
std::string nameString = nameValue.As<Napi::String>().Utf8Value();
262-
_mapping_container.addMapping(generatedPosition, originalPosition, source, _mapping_container.addName(nameString));
263-
} else {
264-
_mapping_container.addMapping(generatedPosition, originalPosition, source);
265-
}
266-
} else {
267-
_mapping_container.addMapping(generatedPosition);
268-
}
269-
}
227+
_mapping_container.addIndexedMapping(generatedLine, generatedColumn, originalLine, originalColumn, source, name);
270228
}
271229

272230
Napi::Value SourceMapBinding::getSourceIndex(const Napi::CallbackInfo &info) {
@@ -368,7 +326,8 @@ void SourceMapBinding::addEmptyMap(const Napi::CallbackInfo &info) {
368326
}
369327

370328
if (info.Length() == 3 && !info[2].IsNumber()) {
371-
Napi::TypeError::New(env, "Expected third parameter to be a lineOffset of type Integer").ThrowAsJavaScriptException();
329+
Napi::TypeError::New(env,
330+
"Expected third parameter to be a lineOffset of type Integer").ThrowAsJavaScriptException();
372331
return;
373332
}
374333

@@ -387,8 +346,9 @@ Napi::Value SourceMapBinding::findClosestMapping(const Napi::CallbackInfo &info)
387346
Napi::TypeError::New(env, "Expected 1 parameter of type buffer").ThrowAsJavaScriptException();
388347
return env.Null();
389348
}
390-
391-
Mapping m = _mapping_container.findClosestMapping(info[0].As<Napi::Number>().Int32Value() - 1, info[1].As<Napi::Number>().Int32Value());
349+
350+
Mapping m = _mapping_container.findClosestMapping(info[0].As<Napi::Number>().Int32Value() - 1,
351+
info[1].As<Napi::Number>().Int32Value());
392352
return _mappingToObject(env, m);
393353
}
394354

@@ -401,7 +361,7 @@ Napi::Object SourceMapBinding::Init(Napi::Env env, Napi::Object exports) {
401361
InstanceMethod("stringify", &SourceMapBinding::stringify),
402362
InstanceMethod("toBuffer", &SourceMapBinding::toBuffer),
403363
InstanceMethod("getMap", &SourceMapBinding::getMap),
404-
InstanceMethod("addIndexedMappings", &SourceMapBinding::addIndexedMappings),
364+
InstanceMethod("addIndexedMapping", &SourceMapBinding::addIndexedMapping),
405365
InstanceMethod("addNames", &SourceMapBinding::addNames),
406366
InstanceMethod("addSources", &SourceMapBinding::addSources),
407367
InstanceMethod("getSourceIndex", &SourceMapBinding::getSourceIndex),

src/napi/SourceMap.h

+2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ class SourceMapBinding : public Napi::ObjectWrap<SourceMapBinding> {
1515

1616
void addBufferMappings(const Napi::CallbackInfo &info);
1717

18+
void addIndexedMapping(const Napi::CallbackInfo &info);
19+
1820
void addIndexedMappings(const Napi::CallbackInfo &info);
1921

2022
void extends(const Napi::CallbackInfo &info);

src/node.js

+20-6
Original file line numberDiff line numberDiff line change
@@ -65,15 +65,29 @@ export default class SourceMap {
6565

6666
// line numbers start at 1 so we have the same api as `source-map` by mozilla
6767
addIndexedMappings(
68-
mappings: Array<IndexedMapping<number | string>>,
68+
mappings: Array<IndexedMapping<string>>,
6969
lineOffset?: number = 0,
7070
columnOffset?: number = 0
7171
) {
72-
this.sourceMapInstance.addIndexedMappings(
73-
mappings,
74-
lineOffset,
75-
columnOffset
76-
);
72+
for (let mapping of mappings) {
73+
let hasValidOriginal =
74+
mapping.original &&
75+
typeof mapping.original.line === "number" &&
76+
!isNaN(mapping.original.line) &&
77+
typeof mapping.original.column === "number" &&
78+
!isNaN(mapping.original.column);
79+
80+
this.sourceMapInstance.addIndexedMapping(
81+
mapping.generated.line + lineOffset - 1,
82+
mapping.generated.column + columnOffset,
83+
// $FlowFixMe
84+
hasValidOriginal ? mapping.original.line - 1 : -1,
85+
// $FlowFixMe
86+
hasValidOriginal ? mapping.original.column : -1,
87+
mapping.source || "",
88+
mapping.name || ""
89+
);
90+
}
7791
return this;
7892
}
7993

src/wasm.js

+18-13
Original file line numberDiff line numberDiff line change
@@ -100,20 +100,25 @@ export default class SourceMap {
100100
lineOffset?: number = 0,
101101
columnOffset?: number = 0
102102
) {
103-
let mappingsVector = new Module.VectorIndexedMapping();
104-
for (let m of mappings) {
105-
mappingsVector.push_back({
106-
generated: m.generated,
107-
original: m.original || { line: -1, column: -1 },
108-
source: m.source != null ? m.source : "",
109-
name: m.name != null ? m.name : "",
110-
});
103+
for (let mapping of mappings) {
104+
let hasValidOriginal =
105+
mapping.original &&
106+
typeof mapping.original.line === "number" &&
107+
!isNaN(mapping.original.line) &&
108+
typeof mapping.original.column === "number" &&
109+
!isNaN(mapping.original.column);
110+
111+
this.sourceMapInstance.addIndexedMapping(
112+
mapping.generated.line + lineOffset - 1,
113+
mapping.generated.column + columnOffset,
114+
// $FlowFixMe
115+
hasValidOriginal ? mapping.original.line - 1 : -1,
116+
// $FlowFixMe
117+
hasValidOriginal ? mapping.original.column : -1,
118+
mapping.source || "",
119+
mapping.name || ""
120+
);
111121
}
112-
this.sourceMapInstance.addIndexedMappings(
113-
mappingsVector,
114-
lineOffset,
115-
columnOffset
116-
);
117122
return this;
118123
}
119124

src/wasm/SourceMap.cpp

+4-27
Original file line numberDiff line numberDiff line change
@@ -59,32 +59,9 @@ std::vector<Mapping> SourceMap::getMappings(){
5959
return mappings;
6060
}
6161

62-
// addIndexedMappings(array<mapping>, lineOffset, columnOffset): uses numbers for source and name with the index specified in the sources/names map/array in SourceMap instance
63-
void SourceMap::addIndexedMappings(std::vector<IndexedMapping> mappingsArray, int lineOffset, int columnOffset) {
64-
for (auto mapping = mappingsArray.begin(), lineEnd = mappingsArray.end();
65-
mapping != lineEnd; ++mapping) {
66-
67-
68-
int generatedLine = mapping->generated.line - 1;
69-
int generatedColumn = mapping->generated.column;
70-
Position generatedPosition = Position{generatedLine + lineOffset, generatedColumn + columnOffset};
71-
72-
int originalColumn = mapping->original.column;
73-
int originalLine = mapping->original.line - 1;
74-
if (originalColumn >= 0 && originalLine >= 0) {
75-
Position originalPosition = Position{originalLine, originalColumn};
76-
77-
int source = _mapping_container.addSource(mapping->source);
78-
79-
if (mapping->name.size() > 0) {
80-
_mapping_container.addMapping(generatedPosition, originalPosition, source, _mapping_container.addName(mapping->name));
81-
} else {
82-
_mapping_container.addMapping(generatedPosition, originalPosition, source);
83-
}
84-
} else {
85-
_mapping_container.addMapping(generatedPosition);
86-
}
87-
}
62+
// addIndexedMapping(generatedLine, generatedColumn, originalLine, originalColumn, source, name)
63+
void SourceMap::addIndexedMapping(int generatedLine, int generatedColumn, int originalLine, int originalColumn, std::string source, std::string name) {
64+
_mapping_container.addIndexedMapping(generatedLine, generatedColumn, originalLine, originalColumn, source, name);
8865
}
8966

9067
int SourceMap::getSourceIndex(std::string source) {
@@ -131,7 +108,7 @@ EMSCRIPTEN_BINDINGS(my_class_example) {
131108
.constructor<>()
132109
.function("addRawMappings", &SourceMap::addRawMappings)
133110
.function("addBufferMappings", &SourceMap::addBufferMappings)
134-
.function("addIndexedMappings", &SourceMap::addIndexedMappings)
111+
.function("addIndexedMapping", &SourceMap::addIndexedMapping)
135112
.function("getVLQMappings", &SourceMap::getVLQMappings)
136113
.function("getMappings", &SourceMap::getMappings)
137114
.function("getSources", &SourceMap::getSources)

src/wasm/SourceMap.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class SourceMap {
99

1010
void addRawMappings(std::string rawMappings, std::vector<std::string> sources, std::vector<std::string> names, int lineOffset, int columnOffset);
1111
void addBufferMappings(std::string mapbuffer, int lineOffset, int columnOffset);
12-
void addIndexedMappings(std::vector<IndexedMapping> mappingsArray, int lineOffset, int columnOffset);
12+
void addIndexedMapping(int generatedLine, int generatedColumn, int originalLine, int originalColumn, std::string source, std::string name);
1313

1414
void extends(std::string mapBuffer);
1515

0 commit comments

Comments
 (0)